pyEQL 1.2.0__tar.gz → 1.3.0__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 (136) hide show
  1. {pyeql-1.2.0 → pyeql-1.3.0}/.github/workflows/post-process.yml +3 -2
  2. {pyeql-1.2.0 → pyeql-1.3.0}/.github/workflows/release.yml +1 -1
  3. {pyeql-1.2.0 → pyeql-1.3.0}/.github/workflows/testing.yaml +9 -6
  4. {pyeql-1.2.0 → pyeql-1.3.0}/.pre-commit-config.yaml +15 -11
  5. {pyeql-1.2.0 → pyeql-1.3.0}/.readthedocs.yml +1 -1
  6. pyeql-1.3.0/.zenodo.json +25 -0
  7. {pyeql-1.2.0 → pyeql-1.3.0}/AUTHORS.md +5 -0
  8. {pyeql-1.2.0 → pyeql-1.3.0}/CHANGELOG.md +68 -0
  9. {pyeql-1.2.0/src/pyEQL.egg-info → pyeql-1.3.0}/PKG-INFO +9 -9
  10. {pyeql-1.2.0 → pyeql-1.3.0}/docs/authors.md +5 -0
  11. {pyeql-1.2.0 → pyeql-1.3.0}/docs/changelog.md +68 -0
  12. {pyeql-1.2.0 → pyeql-1.3.0}/docs/class_solution.md +1 -1
  13. {pyeql-1.2.0 → pyeql-1.3.0}/docs/conf.py +37 -37
  14. {pyeql-1.2.0 → pyeql-1.3.0}/docs/contributing.md +11 -11
  15. {pyeql-1.2.0 → pyeql-1.3.0}/docs/database.md +1 -1
  16. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/.ipynb_checkpoints/pyEQL_demo_1-checkpoint.ipynb +10 -12
  17. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/.ipynb_checkpoints/pyeql_demo-checkpoint.ipynb +13 -12
  18. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_database-checkpoint.ipynb +12 -20
  19. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_osmotic_pressure-checkpoint.ipynb +39 -24
  20. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/.ipynb_checkpoints/speedup-checkpoint.ipynb +4 -4
  21. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/pyeql_demo.ipynb +14 -13
  22. pyeql-1.3.0/docs/examples/pyeql_tutorial_activity.ipynb +270 -0
  23. pyeql-1.3.0/docs/examples/pyeql_tutorial_carbonate.ipynb +390 -0
  24. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/pyeql_tutorial_database.ipynb +13 -21
  25. {pyeql-1.2.0 → pyeql-1.3.0}/docs/examples/pyeql_tutorial_osmotic_pressure.ipynb +41 -26
  26. {pyeql-1.2.0 → pyeql-1.3.0}/docs/index.md +1 -0
  27. {pyeql-1.2.0 → pyeql-1.3.0}/docs/installation.md +4 -4
  28. {pyeql-1.2.0 → pyeql-1.3.0}/docs/requirements.txt +1 -0
  29. pyeql-1.3.0/docs/tutorials.md +52 -0
  30. {pyeql-1.2.0 → pyeql-1.3.0}/pyproject.toml +8 -8
  31. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.10.txt +70 -62
  32. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.10_extras.txt +96 -88
  33. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.11.txt +70 -62
  34. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.11_extras.txt +96 -87
  35. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.12.txt +70 -62
  36. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.12_extras.txt +96 -87
  37. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.9.txt +22 -22
  38. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/macos-latest_py3.9_extras.txt +31 -31
  39. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.10.txt +70 -62
  40. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.10_extras.txt +96 -88
  41. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.11.txt +70 -62
  42. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.11_extras.txt +96 -87
  43. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.12.txt +70 -62
  44. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.12_extras.txt +96 -87
  45. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.9.txt +22 -22
  46. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/ubuntu-latest_py3.9_extras.txt +31 -31
  47. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.10.txt +70 -62
  48. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.10_extras.txt +96 -88
  49. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.11.txt +70 -62
  50. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.11_extras.txt +96 -87
  51. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.12.txt +70 -62
  52. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.12_extras.txt +96 -87
  53. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.9.txt +22 -22
  54. {pyeql-1.2.0 → pyeql-1.3.0}/requirements/windows-latest_py3.9_extras.txt +31 -31
  55. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/__init__.py +1 -1
  56. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/activity_correction.py +9 -9
  57. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/database/pyeql_db.json +20839 -20936
  58. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/engines.py +61 -66
  59. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/equilibrium.py +2 -2
  60. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/functions.py +5 -5
  61. pyeql-1.3.0/src/pyEQL/py.typed +0 -0
  62. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/salt_ion_match.py +2 -2
  63. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/solution.py +199 -293
  64. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/utils.py +4 -0
  65. {pyeql-1.2.0 → pyeql-1.3.0/src/pyEQL.egg-info}/PKG-INFO +9 -9
  66. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL.egg-info/SOURCES.txt +3 -3
  67. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL.egg-info/requires.txt +5 -5
  68. pyeql-1.3.0/tests/conftest.py +156 -0
  69. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_activity.py +131 -0
  70. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_mixed_electrolyte_activity.py +13 -5
  71. pyeql-1.3.0/tests/test_osmotic_coeff.py +180 -0
  72. pyeql-1.3.0/tests/test_salt_matching.py +424 -0
  73. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_solution.py +204 -19
  74. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_utils.py +7 -0
  75. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_volume_concentration.py +2 -2
  76. {pyeql-1.2.0 → pyeql-1.3.0}/tox.ini +3 -2
  77. pyeql-1.2.0/.zenodo.json +0 -25
  78. pyeql-1.2.0/docs/examples/pyEQL_demo_1.ipynb +0 -525
  79. pyeql-1.2.0/docs/examples/speedup.ipynb +0 -404
  80. pyeql-1.2.0/docs/readme.md +0 -84
  81. pyeql-1.2.0/docs/tutorials.md +0 -32
  82. pyeql-1.2.0/tests/conftest.py +0 -10
  83. pyeql-1.2.0/tests/test_osmotic_coeff.py +0 -96
  84. pyeql-1.2.0/tests/test_salt_matching.py +0 -134
  85. {pyeql-1.2.0 → pyeql-1.3.0}/.coveragerc +0 -0
  86. {pyeql-1.2.0 → pyeql-1.3.0}/.gitattributes +0 -0
  87. {pyeql-1.2.0 → pyeql-1.3.0}/.github/dependabot.yml +0 -0
  88. {pyeql-1.2.0 → pyeql-1.3.0}/.github/pull_request_template.md +0 -0
  89. {pyeql-1.2.0 → pyeql-1.3.0}/.github/release.yml +0 -0
  90. {pyeql-1.2.0 → pyeql-1.3.0}/.github/workflows/upgrade_dependencies.yml +0 -0
  91. {pyeql-1.2.0 → pyeql-1.3.0}/.gitignore +0 -0
  92. {pyeql-1.2.0 → pyeql-1.3.0}/CITATION.cff +0 -0
  93. {pyeql-1.2.0 → pyeql-1.3.0}/COPYING +0 -0
  94. {pyeql-1.2.0 → pyeql-1.3.0}/LICENSE.txt +0 -0
  95. {pyeql-1.2.0 → pyeql-1.3.0}/MANIFEST.in +0 -0
  96. {pyeql-1.2.0 → pyeql-1.3.0}/README.md +0 -0
  97. {pyeql-1.2.0 → pyeql-1.3.0}/docs/Makefile +0 -0
  98. {pyeql-1.2.0 → pyeql-1.3.0}/docs/_static/.gitignore +0 -0
  99. {pyeql-1.2.0 → pyeql-1.3.0}/docs/amounts.md +0 -0
  100. {pyeql-1.2.0 → pyeql-1.3.0}/docs/arithmetic.md +0 -0
  101. {pyeql-1.2.0 → pyeql-1.3.0}/docs/chemistry.md +0 -0
  102. {pyeql-1.2.0 → pyeql-1.3.0}/docs/creating.md +0 -0
  103. {pyeql-1.2.0 → pyeql-1.3.0}/docs/engines.md +0 -0
  104. {pyeql-1.2.0 → pyeql-1.3.0}/docs/internal.md +0 -0
  105. {pyeql-1.2.0 → pyeql-1.3.0}/docs/license.md +0 -0
  106. {pyeql-1.2.0 → pyeql-1.3.0}/docs/mixing.md +0 -0
  107. {pyeql-1.2.0 → pyeql-1.3.0}/docs/quickstart.md +0 -0
  108. {pyeql-1.2.0 → pyeql-1.3.0}/docs/serialization.md +0 -0
  109. {pyeql-1.2.0 → pyeql-1.3.0}/docs/units.md +0 -0
  110. {pyeql-1.2.0 → pyeql-1.3.0}/pyeql-logo.png +0 -0
  111. {pyeql-1.2.0 → pyeql-1.3.0}/pyeql-logo.svg +0 -0
  112. {pyeql-1.2.0 → pyeql-1.3.0}/setup.cfg +0 -0
  113. {pyeql-1.2.0 → pyeql-1.3.0}/setup.py +0 -0
  114. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/database/geothermal.dat +0 -0
  115. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/database/llnl.dat +0 -0
  116. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/database/phreeqc_license.txt +0 -0
  117. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/presets/Ringers lactate.yaml +0 -0
  118. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/presets/normal saline.yaml +0 -0
  119. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/presets/rainwater.yaml +0 -0
  120. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/presets/seawater.yaml +0 -0
  121. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/presets/urine.yaml +0 -0
  122. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/presets/wastewater.yaml +0 -0
  123. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL/solute.py +0 -0
  124. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL.egg-info/dependency_links.txt +0 -0
  125. {pyeql-1.2.0 → pyeql-1.3.0}/src/pyEQL.egg-info/top_level.txt +0 -0
  126. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_bulk_properties.py +0 -0
  127. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_debye_length.py +0 -0
  128. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_density.py +0 -0
  129. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_dielectric.py +0 -0
  130. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_effective_pitzer.py +0 -0
  131. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_equilibrium.py +0 -0
  132. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_functions.py +0 -0
  133. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_logging.py +0 -0
  134. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_phreeqc.py +0 -0
  135. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_solute.py +0 -0
  136. {pyeql-1.2.0 → pyeql-1.3.0}/tests/test_solute_properties.py +0 -0
@@ -37,6 +37,7 @@ jobs:
37
37
  - { python: "3.10", resolution: lowest-direct, extras: testing }
38
38
  - { python: "3.11", resolution: highest, extras: testing }
39
39
  - { python: "3.12", resolution: lowest-direct, extras: testing }
40
+ - { python: "3.13", resolution: highest, extras: testing }
40
41
  os:
41
42
  - ubuntu-latest
42
43
  - macos-latest
@@ -56,8 +57,8 @@ jobs:
56
57
  uv pip install '.[${{ matrix.version.extras }}]' --system --resolution=${{ matrix.version.resolution }}
57
58
  - name: Run tests
58
59
  run: |
59
- pytest -n auto --cov=src/pyEQL --cov-report=xml
60
- - uses: codecov/codecov-action@v4
60
+ pytest -n auto --cov=src/pyEQL --cov-report=xml --dist=loadscope
61
+ - uses: codecov/codecov-action@v5
61
62
  with:
62
63
  token: ${{ secrets.CODECOV_TOKEN }}
63
64
  file: ./coverage.xml
@@ -57,4 +57,4 @@ jobs:
57
57
  tox -e clean,build
58
58
 
59
59
  - name: Upload to PyPi
60
- uses: pypa/gh-action-pypi-publish@v1.10.1
60
+ uses: pypa/gh-action-pypi-publish@v1.12.4
@@ -4,6 +4,7 @@ on:
4
4
  pull_request:
5
5
  branches:
6
6
  - main
7
+ - pourbaix
7
8
  paths-ignore:
8
9
  - CHANGELOG.md
9
10
 
@@ -36,17 +37,17 @@ jobs:
36
37
  max-parallel: 6
37
38
  matrix:
38
39
  # for most PRs, test the min and max supported python on every platform, test all python on ubuntu
39
- python-version: ["3.10", "3.12"]
40
+ python-version: ["3.10", "3.12","3.13"]
40
41
  os:
41
42
  - ubuntu-latest
42
43
  - macos-latest
43
44
  - macos-14
44
45
  - windows-latest
45
46
  include:
46
- - os: ubuntu-latest
47
- python-version: "3.10"
48
47
  - os: ubuntu-latest
49
48
  python-version: "3.11"
49
+ - os: ubuntu-latest
50
+ python-version: "3.12"
50
51
  runs-on: ${{ matrix.os }}
51
52
  steps:
52
53
  - uses: actions/checkout@v4
@@ -60,8 +61,8 @@ jobs:
60
61
  pip install -e ".[testing]"
61
62
  - name: Run tests
62
63
  run: |
63
- pytest -n auto --cov=src/pyEQL --cov-report=xml
64
- - uses: codecov/codecov-action@v4
64
+ pytest -n auto --cov=src/pyEQL --cov-report=xml --dist=loadscope
65
+ - uses: codecov/codecov-action@v5
65
66
  with:
66
67
  token: ${{ secrets.CODECOV_TOKEN }}
67
68
  file: ./coverage.xml
@@ -73,10 +74,12 @@ jobs:
73
74
  - name: Setup Python
74
75
  uses: actions/setup-python@v5
75
76
  with:
76
- python-version: "3.10"
77
+ python-version: "3.11"
77
78
  - name: Install tox
78
79
  run: |
79
80
  python -m pip install tox
80
81
  - uses: r-lib/actions/setup-pandoc@v2
81
82
  - name: Build docs
82
83
  run: tox -e docs
84
+ - name: Check links
85
+ run: tox -e links
@@ -1,6 +1,6 @@
1
1
  exclude: "^docs/conf.py"
2
2
 
3
- default_stages: [commit]
3
+ default_stages: [pre-commit]
4
4
 
5
5
  default_install_hook_types: [pre-commit, commit-msg]
6
6
 
@@ -12,26 +12,30 @@ ci:
12
12
 
13
13
  repos:
14
14
  - repo: https://github.com/astral-sh/ruff-pre-commit
15
- rev: v0.6.7
15
+ rev: v0.12.7
16
16
  hooks:
17
- - id: ruff
18
- args: [--fix, --ignore, "D,E501", "--show-fixes"]
17
+ # Run the linter. filters are to exclude .ipynb files
18
+ - id: ruff-check
19
+ types_or: [ python, pyi ]
20
+ args: [--fix, --ignore, "D,E501", --show-fixes]
21
+ # Run the formatter. This WILL run on .ipynb files
22
+ - id: ruff-format
19
23
 
20
24
  - repo: https://github.com/psf/black-pre-commit-mirror
21
- rev: 24.8.0
25
+ rev: 25.1.0
22
26
  hooks:
23
27
  - id: black
24
28
 
25
29
  - repo: https://github.com/codespell-project/codespell
26
- rev: v2.3.0
30
+ rev: v2.4.1
27
31
  hooks:
28
32
  - id: codespell
29
- stages: [commit, commit-msg]
33
+ stages: [pre-commit, commit-msg]
30
34
  exclude_types: [html, svg]
31
35
  additional_dependencies: [tomli] # needed to read pyproject.toml below py3.11
32
36
 
33
37
  - repo: https://github.com/pre-commit/pre-commit-hooks
34
- rev: v4.6.0
38
+ rev: v5.0.0
35
39
  hooks:
36
40
  - id: check-case-conflict
37
41
  - id: check-symlinks
@@ -41,8 +45,8 @@ repos:
41
45
  exclude_types: [svg]
42
46
  - id: trailing-whitespace
43
47
  exclude_types: [svg]
48
+ - id: check-yaml
49
+ - id: check-json
44
50
  - id: pretty-format-json
45
- indent: 4
46
51
  exclude_types: [jupyter]
47
- - id: check-yaml
48
- - id: check-toml
52
+ args: [--autofix, --indent=4]
@@ -8,7 +8,7 @@ version: 2
8
8
  build:
9
9
  os: ubuntu-22.04
10
10
  tools:
11
- python: "3.10"
11
+ python: "3.11"
12
12
 
13
13
  # Build documentation in the docs/ directory with Sphinx
14
14
  sphinx:
@@ -0,0 +1,25 @@
1
+ {
2
+ "creators": [
3
+ {
4
+ "affiliation": "Princeton University",
5
+ "name": "Kingsbury, Ryan",
6
+ "orcid": "0000-0002-7168-3967"
7
+ }
8
+ ],
9
+ "rights": [
10
+ {
11
+ "description": {
12
+ "en": ""
13
+ },
14
+ "id": "lgpl-3.0-only",
15
+ "props": {
16
+ "scheme": "spdx",
17
+ "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html"
18
+ },
19
+ "title": {
20
+ "en": "GNU Lesser General Public License v3.0 only"
21
+ }
22
+ }
23
+ ],
24
+ "title": "pyEQL: A python library for water chemistry"
25
+ }
@@ -6,8 +6,13 @@ developed and maintained by the Kingsbury Lab at Princeton University.
6
6
  Other contributors, listed alphabetically, are:
7
7
 
8
8
  - Arpit Bhardwaj (@abhardwaj73)
9
+ - Nikhil Dhruv (@NikhilDhruv)
9
10
  - Dhruv Duseja (@DhruvDuseja)
11
+ - @githubalexliu
10
12
  - Hernan Grecco (@hgrecco)
13
+ - @Ouriel Ndalamba (@Ouriel-N)
14
+ - Ugo Nwosu (@ugognw)
15
+ - Yitong Pan (@YitongPan1)
11
16
  - Jaebeom Park (@Jaebeom-P)
12
17
  - Kirill Pushkarev (@kirill-push)
13
18
  - Andrew Rosen (@arosen93)
@@ -5,6 +5,74 @@ 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.3.0] - 2025-08-08
9
+
10
+ ### Fixed
11
+
12
+ - `Solution.__add__`: engine, solvent, database were not inherited by the sum of `Solution`
13
+ objects (#258, @ugognw)
14
+ - `Solution.get_activity_coefficient`: Fixed bugs where incorrect Pitzer scaling parameters $\alpha_1$
15
+ and $\alpha_2$ parameters were used to calculate activity coefficients and solute molar volumes for salts with multivalent ions (#258, @ugognw)
16
+ - `Solution.get_salt_dict`: fixed errors in the calculation of concentrations for salts
17
+ containing polyvalent cations (#258, @ugognw)
18
+ - `Solution.get_salt_dict` now respects the `cutoff` parameter. Note that `cutoff`
19
+ is now interpreted in units of moles per kilogram of solution (#258, @ugognw)
20
+ - `Solution.get_salt_dict` always returns a salt dictionary sorted in order of decreasing salt concentration (#258, @ugognw)
21
+ - `Solution.__init__`: Raise `ValueError` if a user sets inconsistent `H[+1]` in `solutes` and
22
+ `pH` keyword arguments (#270, @gnuhpdiem, @rkingsbury). Previously, if the user set `H[+1]` in `solutes`, it's value would silently override the `pH` kwarg. Now, you will get a `ValueError`
23
+ if the two are inconsistent, unless the `pH` kwarg is kept at the default value. In that case,
24
+ a warning will be logged.
25
+ - `standardize_formula`: properly interpret ambiguous dash / hyphen characters as "minus" (#264, @rkingsbury)
26
+ - Ensure `Solution.p()` always returns a regular `float` and returns `np.nan` if the
27
+ concentration is zero or negative (#269, @rkingsbury)
28
+ - `Solution.get_diffusion_coefficient`: prevent diffusion coefficient adjustment when temperature
29
+ is within 1 degree of the the reference value (#215, @YitongPan1)
30
+ - Tests: literature data used in `test_mixed_electrolyte_activity.py` was updated to reflect
31
+ corrected we recently became aware of. (#271, @Ouriel-N, @rkingsbury)
32
+ - Docs: Sphinx warnings are cleared (#255, ugognw)
33
+ - Docs: Minor fixes for private / cached methods (#197, @githubalexliu)
34
+ - Docs: Edit documentation of `debye_parameter_B` (#196, @YitongPan1)
35
+
36
+ ### Added
37
+
38
+ - Docs/CI: sphinx linkcheck job and tox environment/command (`tox -e links`) (#255, @ugognw)
39
+ - Docs: add carbonate system tutorial (#204, @NikhilDhruv)
40
+
41
+ ### Changed
42
+
43
+ - **BREAKING** - the return value of `Solution.get_salt_dict` now includes `Salt` objects instead of keys corresponding
44
+ to `cation` and `anion`. See the example in the docstring for how to adapt existing code to accommodate this
45
+ change. (#258, @ugognw)
46
+ - **BREAKING** - `Solution.get_salt_dict` no longer returns an entry for water (#258, @ugognw)
47
+ - **BREAKING** - `Solution.get_salt` will not return water and may return `None` if no salt is present.
48
+ Previously, `Solution.get_salt` would have returned a `Salt` representing water. (#258, @ugognw)
49
+ - Ensure more consistent column formatting in `Solution.print()` (#269, @rkingsbury)
50
+ - Switch `math.log10` to `np.log10` in `Solution.p()` (#269, @rkingsbury)
51
+ - update pre-commit configuration (#269, @rkingsbury)
52
+ - use [`--dist loadscope`](https://pytest-xdist.readthedocs.io/en/latest/distribution.html) in parallelized CI tests. Closes #170. (#269, @rkingsbury)
53
+ - update license specification in `pyproject.toml` to conform to [latest packaging standards](https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license). Closes #233. (#269, @rkingsbury)
54
+ - add `py.typed` to report type checking to other libraries. Closes #179. (#269, @rkingsbury)
55
+ - Support `numpy>2.0`
56
+ - Bump `pint` to `0.24.4` for `numpy` `v2.0` compatibility and to mitigate CI issues (#239, @SuixiongTay, @rkingsbury)
57
+ - CI: add `python` `v3.13` to post-merge unit tests
58
+ - Docs: `tox -e docs` command configured to fail on warning (#255, @ugognw)
59
+ - Docs: ReadTheDocs built with Python 3.11 (#255, ugognw)
60
+ - Use `importlib` to locate test files (#241, @SuixiongTay)
61
+ - Support `numpy>2.0`
62
+ - Bump `pint` to `0.24.4` for `numpy` `v2.0` compatibility and to mitigate CI issues (#239, @SuixiongTay, @rkingsbury)
63
+ - CI: add `python` `v3.13` to post-merge unit tests
64
+ - bump `pymatgen` to `v2025.1.9`
65
+ - bump `maggma` to `v0.71.4`
66
+
67
+ ### Removed
68
+
69
+ - **BREAKING** Methods previously marked for deprecation - `list_solutes`, `list_activities`,
70
+ `list_concentrations`, `list_salts` have been removed.
71
+ - `Solution.add_solvent` has been marked for deprecation and will be removed in a future
72
+ release. Use `add_solute` instead.
73
+ - Python 3.9 version classifier in pyproject.toml (#247, @ugognw)
74
+ - `Solution.list_salts` (use `Solution.get_salt_dict()` instead) (#258)
75
+
8
76
  ## [1.2.0] - 2024-09-24
9
77
 
10
78
  ### Fixed
@@ -1,13 +1,13 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pyEQL
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: A python interface for solution chemistry
5
5
  Author-email: Ryan Kingsbury <kingsbury@princeton.edu>
6
+ License-Expression: LGPL-3.0-or-later
6
7
  Project-URL: Docs, https://pyeql.readthedocs.io/
7
8
  Project-URL: Repo, https://github.com/KingsburyLab/pyEQL
8
9
  Project-URL: Package, https://pypi.org/project/pyEQL
9
10
  Classifier: Programming Language :: Python :: 3
10
- Classifier: Programming Language :: Python :: 3.9
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
@@ -18,15 +18,14 @@ Classifier: Topic :: Scientific/Engineering
18
18
  Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE.txt
21
- License-File: COPYING
22
21
  License-File: AUTHORS.md
23
- Requires-Dist: pint>=0.19
24
- Requires-Dist: numpy<2,>1.26
22
+ Requires-Dist: pint>=0.24.4
23
+ Requires-Dist: numpy>1.26
25
24
  Requires-Dist: scipy>=1.12
26
- Requires-Dist: pymatgen>=2024.9.10
25
+ Requires-Dist: pymatgen>=2025.1.9
27
26
  Requires-Dist: iapws>=1.5.3
28
- Requires-Dist: monty>=2024.7.12
29
- Requires-Dist: maggma>=0.67.0
27
+ Requires-Dist: monty>=2024.12.10
28
+ Requires-Dist: maggma>=0.71.4
30
29
  Requires-Dist: phreeqpython>=1.5.2
31
30
  Provides-Extra: testing
32
31
  Requires-Dist: setuptools>=68; extra == "testing"
@@ -44,6 +43,7 @@ Requires-Dist: sphinx-rtd-theme; extra == "docs"
44
43
  Requires-Dist: myst-parser[linkify]; extra == "docs"
45
44
  Provides-Extra: full
46
45
  Requires-Dist: rich; extra == "full"
46
+ Dynamic: license-file
47
47
 
48
48
  [![Read the Docs](https://img.shields.io/readthedocs/pyeql)](https://pyeql.readthedocs.io/en/latest/)
49
49
  [![testing](https://github.com/KingsburyLab/pyeql/workflows/testing/badge.svg)](https://github.com/KingsburyLab/pyeql/actions?query=workflow%3Atesting)
@@ -6,8 +6,13 @@ developed and maintained by the Kingsbury Lab at Princeton University.
6
6
  Other contributors, listed alphabetically, are:
7
7
 
8
8
  - Arpit Bhardwaj (@abhardwaj73)
9
+ - Nikhil Dhruv (@NikhilDhruv)
9
10
  - Dhruv Duseja (@DhruvDuseja)
11
+ - @githubalexliu
10
12
  - Hernan Grecco (@hgrecco)
13
+ - @Ouriel Ndalamba (@Ouriel-N)
14
+ - Ugo Nwosu (@ugognw)
15
+ - Yitong Pan (@YitongPan1)
11
16
  - Jaebeom Park (@Jaebeom-P)
12
17
  - Kirill Pushkarev (@kirill-push)
13
18
  - Andrew Rosen (@arosen93)
@@ -5,6 +5,74 @@ 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.3.0] - 2025-08-08
9
+
10
+ ### Fixed
11
+
12
+ - `Solution.__add__`: engine, solvent, database were not inherited by the sum of `Solution`
13
+ objects (#258, @ugognw)
14
+ - `Solution.get_activity_coefficient`: Fixed bugs where incorrect Pitzer scaling parameters $\alpha_1$
15
+ and $\alpha_2$ parameters were used to calculate activity coefficients and solute molar volumes for salts with multivalent ions (#258, @ugognw)
16
+ - `Solution.get_salt_dict`: fixed errors in the calculation of concentrations for salts
17
+ containing polyvalent cations (#258, @ugognw)
18
+ - `Solution.get_salt_dict` now respects the `cutoff` parameter. Note that `cutoff`
19
+ is now interpreted in units of moles per kilogram of solution (#258, @ugognw)
20
+ - `Solution.get_salt_dict` always returns a salt dictionary sorted in order of decreasing salt concentration (#258, @ugognw)
21
+ - `Solution.__init__`: Raise `ValueError` if a user sets inconsistent `H[+1]` in `solutes` and
22
+ `pH` keyword arguments (#270, @gnuhpdiem, @rkingsbury). Previously, if the user set `H[+1]` in `solutes`, it's value would silently override the `pH` kwarg. Now, you will get a `ValueError`
23
+ if the two are inconsistent, unless the `pH` kwarg is kept at the default value. In that case,
24
+ a warning will be logged.
25
+ - `standardize_formula`: properly interpret ambiguous dash / hyphen characters as "minus" (#264, @rkingsbury)
26
+ - Ensure `Solution.p()` always returns a regular `float` and returns `np.nan` if the
27
+ concentration is zero or negative (#269, @rkingsbury)
28
+ - `Solution.get_diffusion_coefficient`: prevent diffusion coefficient adjustment when temperature
29
+ is within 1 degree of the the reference value (#215, @YitongPan1)
30
+ - Tests: literature data used in `test_mixed_electrolyte_activity.py` was updated to reflect
31
+ corrected we recently became aware of. (#271, @Ouriel-N, @rkingsbury)
32
+ - Docs: Sphinx warnings are cleared (#255, ugognw)
33
+ - Docs: Minor fixes for private / cached methods (#197, @githubalexliu)
34
+ - Docs: Edit documentation of `debye_parameter_B` (#196, @YitongPan1)
35
+
36
+ ### Added
37
+
38
+ - Docs/CI: sphinx linkcheck job and tox environment/command (`tox -e links`) (#255, @ugognw)
39
+ - Docs: add carbonate system tutorial (#204, @NikhilDhruv)
40
+
41
+ ### Changed
42
+
43
+ - **BREAKING** - the return value of `Solution.get_salt_dict` now includes `Salt` objects instead of keys corresponding
44
+ to `cation` and `anion`. See the example in the docstring for how to adapt existing code to accommodate this
45
+ change. (#258, @ugognw)
46
+ - **BREAKING** - `Solution.get_salt_dict` no longer returns an entry for water (#258, @ugognw)
47
+ - **BREAKING** - `Solution.get_salt` will not return water and may return `None` if no salt is present.
48
+ Previously, `Solution.get_salt` would have returned a `Salt` representing water. (#258, @ugognw)
49
+ - Ensure more consistent column formatting in `Solution.print()` (#269, @rkingsbury)
50
+ - Switch `math.log10` to `np.log10` in `Solution.p()` (#269, @rkingsbury)
51
+ - update pre-commit configuration (#269, @rkingsbury)
52
+ - use [`--dist loadscope`](https://pytest-xdist.readthedocs.io/en/latest/distribution.html) in parallelized CI tests. Closes #170. (#269, @rkingsbury)
53
+ - update license specification in `pyproject.toml` to conform to [latest packaging standards](https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license). Closes #233. (#269, @rkingsbury)
54
+ - add `py.typed` to report type checking to other libraries. Closes #179. (#269, @rkingsbury)
55
+ - Support `numpy>2.0`
56
+ - Bump `pint` to `0.24.4` for `numpy` `v2.0` compatibility and to mitigate CI issues (#239, @SuixiongTay, @rkingsbury)
57
+ - CI: add `python` `v3.13` to post-merge unit tests
58
+ - Docs: `tox -e docs` command configured to fail on warning (#255, @ugognw)
59
+ - Docs: ReadTheDocs built with Python 3.11 (#255, ugognw)
60
+ - Use `importlib` to locate test files (#241, @SuixiongTay)
61
+ - Support `numpy>2.0`
62
+ - Bump `pint` to `0.24.4` for `numpy` `v2.0` compatibility and to mitigate CI issues (#239, @SuixiongTay, @rkingsbury)
63
+ - CI: add `python` `v3.13` to post-merge unit tests
64
+ - bump `pymatgen` to `v2025.1.9`
65
+ - bump `maggma` to `v0.71.4`
66
+
67
+ ### Removed
68
+
69
+ - **BREAKING** Methods previously marked for deprecation - `list_solutes`, `list_activities`,
70
+ `list_concentrations`, `list_salts` have been removed.
71
+ - `Solution.add_solvent` has been marked for deprecation and will be removed in a future
72
+ release. Use `add_solute` instead.
73
+ - Python 3.9 version classifier in pyproject.toml (#247, @ugognw)
74
+ - `Solution.list_salts` (use `Solution.get_salt_dict()` instead) (#258)
75
+
8
76
  ## [1.2.0] - 2024-09-24
9
77
 
10
78
  ### Fixed
@@ -10,7 +10,7 @@ This page contains detailed information on each of the methods, attributes, and
10
10
  .. autoclass:: pyEQL.Solution
11
11
  :members:
12
12
  :inherited-members:
13
- :private-members: _get_property
13
+ :private-members: _get_property, _get_diffusion_coefficient, _get_molar_conductivity, _get_mobility
14
14
  :special-members: __init__
15
15
  :member-order: bysource
16
16
  ```
@@ -8,8 +8,8 @@
8
8
  # serve to show the default.
9
9
 
10
10
  import os
11
- import sys
12
11
  import shutil
12
+ import sys
13
13
 
14
14
  # -- Path setup --------------------------------------------------------------
15
15
 
@@ -28,32 +28,14 @@ sys.path.insert(0, os.path.join(__location__, "../src"))
28
28
  # setup.py install" in the RTD Advanced Settings.
29
29
  # Additionally it helps us to avoid running apidoc manually
30
30
 
31
- try: # for Sphinx >= 1.7
32
- from sphinx.ext import apidoc
33
- except ImportError:
34
- from sphinx import apidoc
35
-
36
31
  output_dir = os.path.join(__location__, "api")
37
32
  module_dir = os.path.join(__location__, "../src/pyEQL")
33
+
38
34
  try:
39
35
  shutil.rmtree(output_dir)
40
36
  except FileNotFoundError:
41
37
  pass
42
38
 
43
- try:
44
- import sphinx
45
-
46
- cmd_line = f"sphinx-apidoc --implicit-namespaces -f -o {output_dir} {module_dir}"
47
-
48
- args = cmd_line.split(" ")
49
- if tuple(sphinx.__version__.split(".")) >= ("1", "7"):
50
- # This is a rudimentary parse_version to avoid external dependencies
51
- args = args[1:]
52
-
53
- apidoc.main(args)
54
- except Exception as e:
55
- print("Running `sphinx-apidoc` failed!\n{}".format(e))
56
-
57
39
  # -- General configuration ---------------------------------------------------
58
40
 
59
41
  # If your documentation needs a minimal Sphinx version, state it here.
@@ -76,6 +58,7 @@ extensions = [
76
58
  "sphinx.ext.mathjax",
77
59
  "sphinx.ext.napoleon",
78
60
  "nbsphinx",
61
+ "IPython.sphinxext.ipython_console_highlighting",
79
62
  ]
80
63
 
81
64
  # Enable markdown
@@ -94,6 +77,8 @@ myst_enable_extensions = [
94
77
  "substitution",
95
78
  "tasklist",
96
79
  ]
80
+ # Required to cross-reference header anchors in markdown files
81
+ myst_heading_anchors = 3
97
82
 
98
83
  # always execute notebooks when compiling docs
99
84
  # nbsphinx_execute = 'always'
@@ -166,6 +151,13 @@ pygments_style = "sphinx"
166
151
  # If true, keep warnings as "system message" paragraphs in the built documents.
167
152
  # keep_warnings = False
168
153
 
154
+ # A list of modules from which warnings will be suppressed
155
+ suppress_warnings = [
156
+ # This ignores a warning resulting from some extensions storing function, class, or module objects in html_context
157
+ # see https://github.com/sphinx-doc/sphinx/issues/12300 for details
158
+ "config.cache"
159
+ ]
160
+
169
161
  # If this is True, todo emits a warning for each TODO entries. The default is False.
170
162
  todo_emit_warnings = True
171
163
 
@@ -182,21 +174,19 @@ html_theme = "sphinx_material"
182
174
  html_theme_options = {
183
175
  # "sidebar_width": "300px",
184
176
  # "page_width": "1200px",
185
- 'base_url': 'https://pyeql.readthedocs.io/en/latest/',
186
- 'repo_url': 'https://github.com/KingsburyLab/pyEQL/',
187
- 'repo_name': 'pyEQL',
177
+ "base_url": "https://pyeql.readthedocs.io/en/latest/",
178
+ "repo_url": "https://github.com/KingsburyLab/pyEQL/",
179
+ "repo_name": "pyEQL",
188
180
  # 'logo_icon': 'e798',
189
- 'html_minify': True,
190
- 'css_minify': True,
191
- 'nav_title': 'pyEQL: a python interface for water chemistry',
192
- 'color_primary': "blue",
193
- 'color_accent': "light-blue",
194
- 'globaltoc_depth': 2,
195
- 'globaltoc_collapse': True,
196
- }
197
- html_sidebars = {
198
- "**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"]
181
+ "html_minify": True,
182
+ "css_minify": True,
183
+ "nav_title": "pyEQL: a python interface for water chemistry",
184
+ "color_primary": "blue",
185
+ "color_accent": "light-blue",
186
+ "globaltoc_depth": 2,
187
+ "globaltoc_collapse": True,
199
188
  }
189
+ html_sidebars = {"**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"]}
200
190
 
201
191
  # Add any paths that contain custom themes here, relative to this directory.
202
192
  # html_theme_path = []
@@ -280,9 +270,7 @@ latex_elements = {
280
270
 
281
271
  # Grouping the document tree into LaTeX files. List of tuples
282
272
  # (source start file, target name, title, author, documentclass [howto/manual]).
283
- latex_documents = [
284
- ("index", "user_guide.tex", "pyEQL Documentation", "Ryan Kingsbury", "manual")
285
- ]
273
+ latex_documents = [("index", "user_guide.tex", "pyEQL Documentation", "Ryan Kingsbury", "manual")]
286
274
 
287
275
  # The name of an image file (relative to this directory) to place at the top of
288
276
  # the title page.
@@ -309,7 +297,7 @@ python_version = ".".join(map(str, sys.version_info[0:2]))
309
297
  intersphinx_mapping = {
310
298
  "sphinx": ("https://www.sphinx-doc.org/en/master", None),
311
299
  "python": ("https://docs.python.org/" + python_version, None),
312
- "matplotlib": ("https://matplotlib.org", None),
300
+ "matplotlib": ("https://matplotlib.org/stable", None),
313
301
  "numpy": ("https://numpy.org/doc/stable", None),
314
302
  "sklearn": ("https://scikit-learn.org/stable", None),
315
303
  "pandas": ("https://pandas.pydata.org/pandas-docs/stable", None),
@@ -318,4 +306,16 @@ intersphinx_mapping = {
318
306
  "pyscaffold": ("https://pyscaffold.org/en/stable", None),
319
307
  }
320
308
 
309
+ # -- Linkcheck options -------------------------------------------------------
310
+ linkcheck_allowed_redirects = {
311
+ r"http://dx\.doi\.org/10\.1016/S0927-5193\(04\)80033-0": r"https://linkinghub\.elsevier\.com/retrieve/pii/S0927519304800330",
312
+ r"https://doi\.org/10\.1016/j\.desal\.2013\.03\.015": r"https://linkinghub\.elsevier\.com/retrieve/pii/S0011916413001409",
313
+ r"https://dx\.doi\.org/10\.1016/j\.cemconres\.2017\.08\.030": r"https://linkinghub\.elsevier\.com/retrieve/pii/S0008884617301965",
314
+ r"https://doi\.org/10\.1016/j\.earscirev\.2021\.103888": r"https://linkinghub.elsevier\.com/retrieve/pii/S0012825221003895",
315
+ r"http://pint\.readthedocs\.io": r"https://pint\.readthedocs\.io/.*/stable",
316
+ r"https://tox\.wiki": r"https://tox\.wiki/.*",
317
+ }
318
+ linkcheck_ignore = [r"https://localhost:\d+/"]
319
+ linkcheck_rate_limit_timeout = 500
320
+
321
321
  print(f"loading configurations for {project} {version} ...", file=sys.stderr)
@@ -39,22 +39,22 @@ submit your proposal.
39
39
  ```
40
40
 
41
41
  When working on documentation changes in your local machine, you can
42
- compile them using [tox] :
42
+ compile them using [tox](https://tox.wiki):
43
43
 
44
- ```
44
+ ```shell
45
45
  tox -e docs
46
46
  ```
47
47
 
48
- and use Python's built-in web server for a preview in your web browser
48
+ then use Python's built-in web server for a preview in your web browser
49
49
  (`http://localhost:8000`):
50
50
 
51
- ```
51
+ ```shell
52
52
  python3 -m http.server --directory 'docs/_build/html'
53
53
  ```
54
54
 
55
55
  ## Contributing Code
56
56
 
57
- To contribute bug fixes, documentation enhancements, or new code, please fork pyEQL and send us a pull request. It's not as hard as it sounds! Beginning with version 0.6.0, we follow the [GitHub flow](https://docs.github.com/en/get-started/quickstart/github-flow) workflow model.
57
+ To contribute bug fixes, documentation enhancements, or new code, please fork pyEQL and send us a pull request. It's not as hard as it sounds! Beginning with version 0.6.0, we follow the [GitHub flow](https://docs.github.com/en/get-started/using-github/github-flow) workflow model.
58
58
 
59
59
  The [Scientific Python Guide](https://learn.scientific-python.org/development/guides/) is also an excellent technical reference for new and longtime developers.
60
60
 
@@ -65,7 +65,7 @@ a report in the [issue tracker](https://github.com/KingsburyLab/pyEQL/issues) to
65
65
 
66
66
  ### Hacking pyEQL, step by step
67
67
 
68
- 1. [Fork the pyEQL repository](https://help.github.com/articles/fork-a-repo/) on Github
68
+ 1. [Fork the pyEQL repository](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) on Github
69
69
 
70
70
  2. Clone your repository to a directory of your choice:
71
71
 
@@ -112,13 +112,13 @@ a report in the [issue tracker](https://github.com/KingsburyLab/pyEQL/issues) to
112
112
 
113
113
  Please abide by the following guidelines when contributing code to `pyEQL`:
114
114
 
115
- - All changes you make to quacc should be accompanied by unit tests and should not break existing tests. To run the full test suite, run `pytest tests/` from the repository directory.
115
+ - All changes you make to `pyEQL` should be accompanied by unit tests and should not break existing tests. To run the full test suite, run `pytest tests/` from the repository directory.
116
116
 
117
- - Code coverage should be maintained or increase. Each PR will report code coverage after the tests pass, but you can check locally using [pytest-cov](https://pytest-cov.readthedocs.io/en/latest/), by running `pytest --cov tests/`
117
+ - Code coverage should be maintained or increase. Each PR will report code coverage after the tests pass, but you can check locally using [pytest-cov](https://pytest-cov.readthedocs.io/en/latest/), by running `pytest --cov tests/`. To produce a detailed HTML report with line and branch coverage statistics, run `pytest --cov-branch --cov=src/pyEQL --cov-report=html -n auto tests`.
118
118
 
119
119
  - All code should include type hints and have internally consistent documentation for the inputs and outputs.
120
120
 
121
- - Use Google style docstrings
121
+ - Use [Google style docstrings](https://google.github.io/styleguide/pyguide.html)
122
122
 
123
123
  - Lint your code with [`ruff`](https://github.com/astral-sh/ruff) by running `ruff check --fix src/` from the repo directory. Alternatively, you can install the `pre-commit` hooks by running `pre-commit install` from the repository directory. This will prevent committing new changes until all linting errors are fixed.
124
124
 
@@ -128,8 +128,8 @@ Please abide by the following guidelines when contributing code to `pyEQL`:
128
128
 
129
129
  ## Documentation
130
130
 
131
- Improvements to the documentation are most welcome! Our documentation system uses `sphinx` with the [Materials for Sphinx](https://bashtage.github.io/sphinx-material/) theme. To edit the documentation locally, run `tox -e autodocs` from the repository root directory. This will serve the documents to http://localhost:8000/ so you can view them in your web browser. When you make changes to the files in the `docs/` directory, the documentation will automatically rebuild and update in your browser (you might have to refresh the page to see changes).
131
+ Improvements to the documentation are most welcome! Our documentation system uses `sphinx` with the [Materials for Sphinx](https://bashtage.github.io/sphinx-material/) theme. To edit the documentation locally, run `tox -e autodocs` from the repository root directory. This will serve the documents to `http://localhost:8000/` so you can view them in your web browser. When you make changes to the files in the `docs/` directory, the documentation will automatically rebuild and update in your browser (you might have to refresh the page to see changes).
132
132
 
133
133
  ## Changelog
134
134
 
135
- We keep a `CHANGELOG.md` file in the base directory of the repository. Before submitting your PR, be sure to update the `CHANGELOG.md` file under the "Unreleased" section with a brief description of your changes. Our `CHANGELOG.md` file lossely follows the [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format, beginning with `v0.6.0`.
135
+ We keep a `CHANGELOG.md` file in the base directory of the repository. Before submitting your PR, be sure to update the `CHANGELOG.md` file under the "Unreleased" section with a brief description of your changes. Our `CHANGELOG.md` file loosely follows the [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format, beginning with `v0.6.0`.
@@ -14,7 +14,7 @@ its calculations. The database includes:
14
14
  - Dielectric constant model parameters for 18 ions
15
15
  - Partial molar volumes for 24 ions
16
16
 
17
- `pyEQL` can automatically infer basic chemical informatics such as molecular weight and charge by passing a solute's formula to `pymatgen.core.ion.Ion` (See [chemical formulas](#chemistry)). For other physicochemical properties, it relies on data compiled into the included database. A list of the data and species covered is available [below](#species-included)
17
+ `pyEQL` can automatically infer basic chemical informatics such as molecular weight and charge by passing a solute's formula to `pymatgen.core.ion.Ion` (See [chemical formulas](chemistry.md)). For other physicochemical properties, it relies on data compiled into the included database. A list of the data and species covered is available [below](#species-included)
18
18
 
19
19
  ## Format
20
20