pyEQL 1.1.5__tar.gz → 1.2.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 (129) hide show
  1. {pyeql-1.1.5 → pyeql-1.2.0}/.github/workflows/post-process.yml +7 -6
  2. {pyeql-1.1.5 → pyeql-1.2.0}/.github/workflows/release.yml +1 -1
  3. {pyeql-1.1.5 → pyeql-1.2.0}/.github/workflows/testing.yaml +3 -7
  4. {pyeql-1.1.5 → pyeql-1.2.0}/.github/workflows/upgrade_dependencies.yml +4 -4
  5. {pyeql-1.1.5 → pyeql-1.2.0}/.pre-commit-config.yaml +7 -7
  6. {pyeql-1.1.5 → pyeql-1.2.0}/AUTHORS.md +7 -4
  7. {pyeql-1.1.5 → pyeql-1.2.0}/CHANGELOG.md +44 -0
  8. {pyeql-1.1.5 → pyeql-1.2.0}/CITATION.cff +6 -6
  9. {pyeql-1.1.5/src/pyEQL.egg-info → pyeql-1.2.0}/PKG-INFO +16 -16
  10. {pyeql-1.1.5 → pyeql-1.2.0}/README.md +2 -2
  11. {pyeql-1.1.5 → pyeql-1.2.0}/docs/authors.md +7 -4
  12. {pyeql-1.1.5 → pyeql-1.2.0}/docs/changelog.md +44 -0
  13. {pyeql-1.1.5 → pyeql-1.2.0}/docs/creating.md +0 -2
  14. {pyeql-1.1.5 → pyeql-1.2.0}/docs/readme.md +2 -2
  15. {pyeql-1.1.5 → pyeql-1.2.0}/docs/requirements.txt +1 -1
  16. {pyeql-1.1.5 → pyeql-1.2.0}/pyproject.toml +13 -13
  17. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.10.txt +21 -21
  18. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.10_extras.txt +36 -36
  19. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.11.txt +21 -21
  20. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.11_extras.txt +35 -35
  21. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.12.txt +21 -21
  22. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.12_extras.txt +35 -35
  23. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.9.txt +22 -21
  24. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/macos-latest_py3.9_extras.txt +37 -36
  25. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.10.txt +21 -21
  26. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.10_extras.txt +36 -36
  27. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.11.txt +21 -21
  28. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.11_extras.txt +35 -35
  29. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.12.txt +21 -21
  30. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.12_extras.txt +35 -35
  31. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.9.txt +22 -21
  32. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/ubuntu-latest_py3.9_extras.txt +37 -36
  33. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.10.txt +21 -21
  34. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.10_extras.txt +36 -36
  35. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.11.txt +21 -21
  36. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.11_extras.txt +35 -35
  37. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.12.txt +21 -21
  38. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.12_extras.txt +35 -35
  39. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.9.txt +22 -21
  40. {pyeql-1.1.5 → pyeql-1.2.0}/requirements/windows-latest_py3.9_extras.txt +37 -36
  41. {pyeql-1.1.5 → pyeql-1.2.0}/setup.py +1 -0
  42. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/database/pyeql_db.json +128 -326
  43. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/functions.py +28 -14
  44. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/presets/Ringers lactate.yaml +3 -3
  45. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/presets/normal saline.yaml +3 -3
  46. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/presets/rainwater.yaml +3 -3
  47. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/presets/seawater.yaml +3 -3
  48. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/presets/urine.yaml +3 -3
  49. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/presets/wastewater.yaml +3 -3
  50. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/solution.py +4 -5
  51. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/utils.py +24 -9
  52. {pyeql-1.1.5 → pyeql-1.2.0/src/pyEQL.egg-info}/PKG-INFO +16 -16
  53. pyeql-1.2.0/src/pyEQL.egg-info/requires.txt +27 -0
  54. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_activity.py +2 -1
  55. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_bulk_properties.py +0 -1
  56. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_debye_length.py +1 -0
  57. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_density.py +1 -0
  58. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_dielectric.py +3 -2
  59. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_effective_pitzer.py +3 -2
  60. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_equilibrium.py +1 -0
  61. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_functions.py +25 -11
  62. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_mixed_electrolyte_activity.py +1 -1
  63. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_phreeqc.py +10 -10
  64. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_salt_matching.py +1 -0
  65. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_solute.py +1 -0
  66. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_solution.py +13 -11
  67. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_utils.py +2 -0
  68. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_volume_concentration.py +5 -5
  69. pyeql-1.1.5/src/pyEQL.egg-info/requires.txt +0 -27
  70. {pyeql-1.1.5 → pyeql-1.2.0}/.coveragerc +0 -0
  71. {pyeql-1.1.5 → pyeql-1.2.0}/.gitattributes +0 -0
  72. {pyeql-1.1.5 → pyeql-1.2.0}/.github/dependabot.yml +0 -0
  73. {pyeql-1.1.5 → pyeql-1.2.0}/.github/pull_request_template.md +0 -0
  74. {pyeql-1.1.5 → pyeql-1.2.0}/.github/release.yml +0 -0
  75. {pyeql-1.1.5 → pyeql-1.2.0}/.gitignore +0 -0
  76. {pyeql-1.1.5 → pyeql-1.2.0}/.readthedocs.yml +0 -0
  77. {pyeql-1.1.5 → pyeql-1.2.0}/.zenodo.json +0 -0
  78. {pyeql-1.1.5 → pyeql-1.2.0}/COPYING +0 -0
  79. {pyeql-1.1.5 → pyeql-1.2.0}/LICENSE.txt +0 -0
  80. {pyeql-1.1.5 → pyeql-1.2.0}/MANIFEST.in +0 -0
  81. {pyeql-1.1.5 → pyeql-1.2.0}/docs/Makefile +0 -0
  82. {pyeql-1.1.5 → pyeql-1.2.0}/docs/_static/.gitignore +0 -0
  83. {pyeql-1.1.5 → pyeql-1.2.0}/docs/amounts.md +0 -0
  84. {pyeql-1.1.5 → pyeql-1.2.0}/docs/arithmetic.md +0 -0
  85. {pyeql-1.1.5 → pyeql-1.2.0}/docs/chemistry.md +0 -0
  86. {pyeql-1.1.5 → pyeql-1.2.0}/docs/class_solution.md +0 -0
  87. {pyeql-1.1.5 → pyeql-1.2.0}/docs/conf.py +0 -0
  88. {pyeql-1.1.5 → pyeql-1.2.0}/docs/contributing.md +0 -0
  89. {pyeql-1.1.5 → pyeql-1.2.0}/docs/database.md +0 -0
  90. {pyeql-1.1.5 → pyeql-1.2.0}/docs/engines.md +0 -0
  91. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/.ipynb_checkpoints/pyEQL_demo_1-checkpoint.ipynb +0 -0
  92. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/.ipynb_checkpoints/pyeql_demo-checkpoint.ipynb +0 -0
  93. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_database-checkpoint.ipynb +0 -0
  94. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/.ipynb_checkpoints/pyeql_tutorial_osmotic_pressure-checkpoint.ipynb +0 -0
  95. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/.ipynb_checkpoints/speedup-checkpoint.ipynb +0 -0
  96. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/pyEQL_demo_1.ipynb +0 -0
  97. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/pyeql_demo.ipynb +0 -0
  98. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/pyeql_tutorial_database.ipynb +0 -0
  99. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/pyeql_tutorial_osmotic_pressure.ipynb +0 -0
  100. {pyeql-1.1.5 → pyeql-1.2.0}/docs/examples/speedup.ipynb +0 -0
  101. {pyeql-1.1.5 → pyeql-1.2.0}/docs/index.md +0 -0
  102. {pyeql-1.1.5 → pyeql-1.2.0}/docs/installation.md +0 -0
  103. {pyeql-1.1.5 → pyeql-1.2.0}/docs/internal.md +0 -0
  104. {pyeql-1.1.5 → pyeql-1.2.0}/docs/license.md +0 -0
  105. {pyeql-1.1.5 → pyeql-1.2.0}/docs/mixing.md +0 -0
  106. {pyeql-1.1.5 → pyeql-1.2.0}/docs/quickstart.md +0 -0
  107. {pyeql-1.1.5 → pyeql-1.2.0}/docs/serialization.md +0 -0
  108. {pyeql-1.1.5 → pyeql-1.2.0}/docs/tutorials.md +0 -0
  109. {pyeql-1.1.5 → pyeql-1.2.0}/docs/units.md +0 -0
  110. {pyeql-1.1.5 → pyeql-1.2.0}/pyeql-logo.png +0 -0
  111. {pyeql-1.1.5 → pyeql-1.2.0}/pyeql-logo.svg +0 -0
  112. {pyeql-1.1.5 → pyeql-1.2.0}/setup.cfg +0 -0
  113. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/__init__.py +0 -0
  114. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/activity_correction.py +0 -0
  115. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/database/geothermal.dat +0 -0
  116. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/database/llnl.dat +0 -0
  117. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/database/phreeqc_license.txt +0 -0
  118. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/engines.py +0 -0
  119. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/equilibrium.py +0 -0
  120. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/salt_ion_match.py +0 -0
  121. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL/solute.py +0 -0
  122. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL.egg-info/SOURCES.txt +0 -0
  123. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL.egg-info/dependency_links.txt +0 -0
  124. {pyeql-1.1.5 → pyeql-1.2.0}/src/pyEQL.egg-info/top_level.txt +0 -0
  125. {pyeql-1.1.5 → pyeql-1.2.0}/tests/conftest.py +0 -0
  126. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_logging.py +0 -0
  127. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_osmotic_coeff.py +0 -0
  128. {pyeql-1.1.5 → pyeql-1.2.0}/tests/test_solute_properties.py +0 -0
  129. {pyeql-1.1.5 → pyeql-1.2.0}/tox.ini +0 -0
@@ -33,26 +33,27 @@ jobs:
33
33
  strategy:
34
34
  max-parallel: 6
35
35
  matrix:
36
- python-version: ["3.9", "3.10", "3.11", "3.12"]
36
+ version:
37
+ - { python: "3.10", resolution: lowest-direct, extras: testing }
38
+ - { python: "3.11", resolution: highest, extras: testing }
39
+ - { python: "3.12", resolution: lowest-direct, extras: testing }
37
40
  os:
38
41
  - ubuntu-latest
39
42
  - macos-latest
40
43
  - windows-latest
41
44
  - macos-14
42
- exclude:
43
- - os: macos-14
44
- python-version: "3.9"
45
45
  runs-on: ${{ matrix.os }}
46
46
  steps:
47
47
  - uses: actions/checkout@v4
48
48
  - name: Setup Python
49
49
  uses: actions/setup-python@v5
50
50
  with:
51
- python-version: ${{ matrix.python-version }}${{ matrix.dev }}
51
+ python-version: ${{ matrix.version.python }}
52
52
  - name: Install test requirements
53
53
  run: |
54
54
  python -m pip install --upgrade pip
55
- pip install -e ".[testing]"
55
+ pip install uv
56
+ uv pip install '.[${{ matrix.version.extras }}]' --system --resolution=${{ matrix.version.resolution }}
56
57
  - name: Run tests
57
58
  run: |
58
59
  pytest -n auto --cov=src/pyEQL --cov-report=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.8.14
60
+ uses: pypa/gh-action-pypi-publish@v1.10.1
@@ -23,7 +23,7 @@ jobs:
23
23
  - name: Set up Python
24
24
  uses: actions/setup-python@v5
25
25
  with:
26
- python-version: 3.11
26
+ python-version: "3.11"
27
27
  cache: pip
28
28
  - name: Run pre-commit
29
29
  run: |
@@ -36,7 +36,7 @@ jobs:
36
36
  max-parallel: 6
37
37
  matrix:
38
38
  # for most PRs, test the min and max supported python on every platform, test all python on ubuntu
39
- python-version: ["3.9", "3.12"]
39
+ python-version: ["3.10", "3.12"]
40
40
  os:
41
41
  - ubuntu-latest
42
42
  - macos-latest
@@ -47,10 +47,6 @@ jobs:
47
47
  python-version: "3.10"
48
48
  - os: ubuntu-latest
49
49
  python-version: "3.11"
50
- # no python 3.9 on the macos-14 runner
51
- exclude:
52
- - os: macos-14
53
- python-version: "3.9"
54
50
  runs-on: ${{ matrix.os }}
55
51
  steps:
56
52
  - uses: actions/checkout@v4
@@ -77,7 +73,7 @@ jobs:
77
73
  - name: Setup Python
78
74
  uses: actions/setup-python@v5
79
75
  with:
80
- python-version: 3.9
76
+ python-version: "3.10"
81
77
  - name: Install tox
82
78
  run: |
83
79
  python -m pip install tox
@@ -6,7 +6,7 @@ on:
6
6
  workflow_dispatch: # Allow running on-demand
7
7
  schedule:
8
8
  # Runs on the 10th day of every month at 8:00 UTC (4:00 Eastern)
9
- - cron: '0 8 10 * *'
9
+ - cron: "0 8 10 * *"
10
10
 
11
11
  jobs:
12
12
  upgrade:
@@ -14,9 +14,9 @@ jobs:
14
14
  runs-on: ${{ matrix.os }}
15
15
  strategy:
16
16
  matrix:
17
- os: ['ubuntu-latest', 'macos-latest', 'windows-latest']
17
+ os: ["ubuntu-latest", "macos-latest", "windows-latest"]
18
18
  package: ["."]
19
- python-version: ["3.9", "3.10", "3.11", "3.12"]
19
+ python-version: ["3.10", "3.11", "3.12"]
20
20
  steps:
21
21
  - uses: actions/checkout@v4
22
22
  with:
@@ -24,7 +24,7 @@ jobs:
24
24
  - uses: actions/setup-python@v5
25
25
  with:
26
26
  python-version: ${{ matrix.python-version }}
27
- cache: 'pip'
27
+ cache: "pip"
28
28
  - name: Upgrade Python dependencies
29
29
  shell: bash
30
30
  run: |
@@ -12,13 +12,13 @@ ci:
12
12
 
13
13
  repos:
14
14
  - repo: https://github.com/astral-sh/ruff-pre-commit
15
- rev: v0.5.5
15
+ rev: v0.6.7
16
16
  hooks:
17
17
  - id: ruff
18
18
  args: [--fix, --ignore, "D,E501", "--show-fixes"]
19
19
 
20
20
  - repo: https://github.com/psf/black-pre-commit-mirror
21
- rev: 24.4.2
21
+ rev: 24.8.0
22
22
  hooks:
23
23
  - id: black
24
24
 
@@ -41,8 +41,8 @@ repos:
41
41
  exclude_types: [svg]
42
42
  - id: trailing-whitespace
43
43
  exclude_types: [svg]
44
-
45
- - repo: https://github.com/pre-commit/mirrors-prettier
46
- rev: v4.0.0-alpha.8
47
- hooks:
48
- - id: prettier
44
+ - id: pretty-format-json
45
+ indent: 4
46
+ exclude_types: [jupyter]
47
+ - id: check-yaml
48
+ - id: check-toml
@@ -5,9 +5,12 @@ developed and maintained by the Kingsbury Lab at Princeton University.
5
5
 
6
6
  Other contributors, listed alphabetically, are:
7
7
 
8
- * Kirill Pushkarev (@kirill-push)
9
- * Dhruv Duseja (@DhruvDuseja)
10
- * Andrew Rosen (@arosen93)
11
- * Hernan Grecco (@hgrecco)
8
+ - Arpit Bhardwaj (@abhardwaj73)
9
+ - Dhruv Duseja (@DhruvDuseja)
10
+ - Hernan Grecco (@hgrecco)
11
+ - Jaebeom Park (@Jaebeom-P)
12
+ - Kirill Pushkarev (@kirill-push)
13
+ - Andrew Rosen (@arosen93)
14
+ - Sui Xiong Tay (@SuixiongTay)
12
15
 
13
16
  (If you think that your name belongs here, please let the maintainer know)
@@ -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.2.0] - 2024-09-24
9
+
10
+ ### Fixed
11
+
12
+ - Database: removed several erroneous species (such as `CO32-` which was really `CO3[-2]`),
13
+ corrected other parsing errors, and updated formula syntax for consistency with recent
14
+ `standardize_formula` changes (e.g., `H4NCl -> NH4Cl`) (#190, @rkingsbury)
15
+
16
+ ### Changed
17
+
18
+ - Bump `pymatgen` to `v2024.9.10` for additional upstream formula fixes. (#188, @abhardwaj73)
19
+
20
+ ### Removed
21
+
22
+ - **BREAKING** - dropped python 3.9 support, in accordance with numpy deprecation policy.
23
+ (#188, @abhardwaj73)
24
+
25
+ ## [1.1.6] - 2024-09-01
26
+
27
+ ### Fixed
28
+
29
+ - `Solution.get_total_amount`: Bugfix that caused an error when called on certain elements
30
+ without specifying an oxidation state. For example, `get_total_amount('N')` could raise
31
+ an exception in a solution containing `Na` (but no `N`) due to a flaw in a logical
32
+ test.
33
+ - `Solution._adjust_charge_balance`: Removed a misleading and redundant log message (#162, @SuixiongTay)
34
+
35
+ ### Added
36
+
37
+ - `gibbs_mix`: A new keyword argument `activity_correction` was added to `gibbs_mix`. It defaults
38
+ to `True` (no change from prior behavior), but can be set to `False` in order to calculate the
39
+ ideal mixing energy, which is equivalent to only considering entropic effects. (#178, @Jaebeom-P)
40
+ - `standardize_formula`: Improve formatting of ammonium sulfate salts. Aqueous ammonium sulfate previously
41
+ standardized to `H8S(NO2)2(aq)`, now it will display as `(NH4)2SO4(aq)`.
42
+
43
+ ### Changed
44
+
45
+ - **BREAKING** `entropy_mix` now returns the ideal mixing _entropy_ in units of J/K rather than the mixing
46
+ _energy_ in J. This was done to improve clarity with respect to the function name. An `activity_correction`
47
+ kwarg was added to `gibbs_mix` so that you can still calculate the ideal mixing energy by setting it to `False`.
48
+ (#178, @Jaebeom-P)
49
+ - Revise documentation of `gibbs_mix`, `entropy_mix`, and `donnan_eql`. (#178, @Jaebeom-P)
50
+ - CI: Improve comprehensiveness of CI dependency testing. (#163, #164, @abhardwaj73)
51
+
8
52
  ## [1.1.5] - 2024-07-28
9
53
 
10
54
  ### Fixed
@@ -1,16 +1,16 @@
1
1
  cff-version: "1.2.0"
2
2
  authors:
3
- - family-names: Kingsbury
4
- given-names: Ryan
5
- orcid: "https://orcid.org/0000-0002-7168-3967"
3
+ - family-names: Kingsbury
4
+ given-names: Ryan
5
+ orcid: "https://orcid.org/0000-0002-7168-3967"
6
6
  doi: 10.5281/zenodo.8332915
7
7
  message: If you use this software, please cite our article in the
8
8
  Journal of Open Source Software.
9
9
  preferred-citation:
10
10
  authors:
11
- - family-names: Kingsbury
12
- given-names: Ryan
13
- orcid: "https://orcid.org/0000-0002-7168-3967"
11
+ - family-names: Kingsbury
12
+ given-names: Ryan
13
+ orcid: "https://orcid.org/0000-0002-7168-3967"
14
14
  date-published: 2024-03-25
15
15
  doi: 10.21105/joss.06295
16
16
  issn: 2475-9066
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyEQL
3
- Version: 1.1.5
3
+ Version: 1.2.0
4
4
  Summary: A python interface for solution chemistry
5
5
  Author-email: Ryan Kingsbury <kingsbury@princeton.edu>
6
6
  Project-URL: Docs, https://pyeql.readthedocs.io/
@@ -15,28 +15,28 @@ Classifier: Development Status :: 4 - Beta
15
15
  Classifier: Intended Audience :: Science/Research
16
16
  Classifier: Operating System :: OS Independent
17
17
  Classifier: Topic :: Scientific/Engineering
18
- Requires-Python: >=3.9
18
+ Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE.txt
21
21
  License-File: COPYING
22
22
  License-File: AUTHORS.md
23
23
  Requires-Dist: pint>=0.19
24
- Requires-Dist: numpy<2
25
- Requires-Dist: scipy
26
- Requires-Dist: pymatgen==2024.5.1
27
- Requires-Dist: iapws
24
+ Requires-Dist: numpy<2,>1.26
25
+ Requires-Dist: scipy>=1.12
26
+ Requires-Dist: pymatgen>=2024.9.10
27
+ Requires-Dist: iapws>=1.5.3
28
28
  Requires-Dist: monty>=2024.7.12
29
29
  Requires-Dist: maggma>=0.67.0
30
- Requires-Dist: phreeqpython
30
+ Requires-Dist: phreeqpython>=1.5.2
31
31
  Provides-Extra: testing
32
- Requires-Dist: setuptools; extra == "testing"
33
- Requires-Dist: pre-commit; extra == "testing"
34
- Requires-Dist: pytest; extra == "testing"
35
- Requires-Dist: pytest-cov; extra == "testing"
36
- Requires-Dist: pytest-xdist; extra == "testing"
32
+ Requires-Dist: setuptools>=68; extra == "testing"
33
+ Requires-Dist: pre-commit>=2; extra == "testing"
34
+ Requires-Dist: pytest>=7; extra == "testing"
35
+ Requires-Dist: pytest-cov>=2.11; extra == "testing"
36
+ Requires-Dist: pytest-xdist>2; extra == "testing"
37
37
  Requires-Dist: black; extra == "testing"
38
- Requires-Dist: mypy; extra == "testing"
39
- Requires-Dist: ruff; extra == "testing"
38
+ Requires-Dist: mypy>1; extra == "testing"
39
+ Requires-Dist: ruff>0.0.100; extra == "testing"
40
40
  Requires-Dist: tox<4; extra == "testing"
41
41
  Provides-Extra: docs
42
42
  Requires-Dist: sphinx>=3.2.1; extra == "docs"
@@ -48,7 +48,7 @@ Requires-Dist: rich; extra == "full"
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)
50
50
  [![codecov](https://codecov.io/gh/KingsburyLab/pyeql/branch/main/graph/badge.svg?token=I7RP0QML6S)](https://codecov.io/gh/KingsburyLab/pyeql)
51
- ![Supported python versions](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue)
51
+ ![Supported python versions](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue)
52
52
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8332915.svg)](https://doi.org/10.5281/zenodo.8332915)
53
53
  [![PyPI version](https://badge.fury.io/py/pyEQL.svg)](https://badge.fury.io/py/pyEQL)
54
54
  [![status](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6/status.svg)](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6)
@@ -112,7 +112,7 @@ Detailed documentation is available at [https://pyeql.readthedocs.io/](https://p
112
112
 
113
113
  ### Dependencies
114
114
 
115
- - Python 3.9+. This project will attempt to adhere to NumPy's
115
+ - Python 3.10+. This project will attempt to adhere to NumPy's
116
116
  [NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html) deprecation policy
117
117
  for older version of Python.
118
118
  - [pint](https://github.com/hgrecco/pint) - for units-aware calculations
@@ -1,7 +1,7 @@
1
1
  [![Read the Docs](https://img.shields.io/readthedocs/pyeql)](https://pyeql.readthedocs.io/en/latest/)
2
2
  [![testing](https://github.com/KingsburyLab/pyeql/workflows/testing/badge.svg)](https://github.com/KingsburyLab/pyeql/actions?query=workflow%3Atesting)
3
3
  [![codecov](https://codecov.io/gh/KingsburyLab/pyeql/branch/main/graph/badge.svg?token=I7RP0QML6S)](https://codecov.io/gh/KingsburyLab/pyeql)
4
- ![Supported python versions](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue)
4
+ ![Supported python versions](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue)
5
5
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8332915.svg)](https://doi.org/10.5281/zenodo.8332915)
6
6
  [![PyPI version](https://badge.fury.io/py/pyEQL.svg)](https://badge.fury.io/py/pyEQL)
7
7
  [![status](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6/status.svg)](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6)
@@ -65,7 +65,7 @@ Detailed documentation is available at [https://pyeql.readthedocs.io/](https://p
65
65
 
66
66
  ### Dependencies
67
67
 
68
- - Python 3.9+. This project will attempt to adhere to NumPy's
68
+ - Python 3.10+. This project will attempt to adhere to NumPy's
69
69
  [NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html) deprecation policy
70
70
  for older version of Python.
71
71
  - [pint](https://github.com/hgrecco/pint) - for units-aware calculations
@@ -5,9 +5,12 @@ developed and maintained by the Kingsbury Lab at Princeton University.
5
5
 
6
6
  Other contributors, listed alphabetically, are:
7
7
 
8
- * Kirill Pushkarev (@kirill-push)
9
- * Dhruv Duseja (@DhruvDuseja)
10
- * Andrew Rosen (@arosen93)
11
- * Hernan Grecco (@hgrecco)
8
+ - Arpit Bhardwaj (@abhardwaj73)
9
+ - Dhruv Duseja (@DhruvDuseja)
10
+ - Hernan Grecco (@hgrecco)
11
+ - Jaebeom Park (@Jaebeom-P)
12
+ - Kirill Pushkarev (@kirill-push)
13
+ - Andrew Rosen (@arosen93)
14
+ - Sui Xiong Tay (@SuixiongTay)
12
15
 
13
16
  (If you think that your name belongs here, please let the maintainer know)
@@ -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.2.0] - 2024-09-24
9
+
10
+ ### Fixed
11
+
12
+ - Database: removed several erroneous species (such as `CO32-` which was really `CO3[-2]`),
13
+ corrected other parsing errors, and updated formula syntax for consistency with recent
14
+ `standardize_formula` changes (e.g., `H4NCl -> NH4Cl`) (#190, @rkingsbury)
15
+
16
+ ### Changed
17
+
18
+ - Bump `pymatgen` to `v2024.9.10` for additional upstream formula fixes. (#188, @abhardwaj73)
19
+
20
+ ### Removed
21
+
22
+ - **BREAKING** - dropped python 3.9 support, in accordance with numpy deprecation policy.
23
+ (#188, @abhardwaj73)
24
+
25
+ ## [1.1.6] - 2024-09-01
26
+
27
+ ### Fixed
28
+
29
+ - `Solution.get_total_amount`: Bugfix that caused an error when called on certain elements
30
+ without specifying an oxidation state. For example, `get_total_amount('N')` could raise
31
+ an exception in a solution containing `Na` (but no `N`) due to a flaw in a logical
32
+ test.
33
+ - `Solution._adjust_charge_balance`: Removed a misleading and redundant log message (#162, @SuixiongTay)
34
+
35
+ ### Added
36
+
37
+ - `gibbs_mix`: A new keyword argument `activity_correction` was added to `gibbs_mix`. It defaults
38
+ to `True` (no change from prior behavior), but can be set to `False` in order to calculate the
39
+ ideal mixing energy, which is equivalent to only considering entropic effects. (#178, @Jaebeom-P)
40
+ - `standardize_formula`: Improve formatting of ammonium sulfate salts. Aqueous ammonium sulfate previously
41
+ standardized to `H8S(NO2)2(aq)`, now it will display as `(NH4)2SO4(aq)`.
42
+
43
+ ### Changed
44
+
45
+ - **BREAKING** `entropy_mix` now returns the ideal mixing _entropy_ in units of J/K rather than the mixing
46
+ _energy_ in J. This was done to improve clarity with respect to the function name. An `activity_correction`
47
+ kwarg was added to `gibbs_mix` so that you can still calculate the ideal mixing energy by setting it to `False`.
48
+ (#178, @Jaebeom-P)
49
+ - Revise documentation of `gibbs_mix`, `entropy_mix`, and `donnan_eql`. (#178, @Jaebeom-P)
50
+ - CI: Improve comprehensiveness of CI dependency testing. (#163, #164, @abhardwaj73)
51
+
8
52
  ## [1.1.5] - 2024-07-28
9
53
 
10
54
  ### Fixed
@@ -2,7 +2,6 @@
2
2
 
3
3
  The `Solution` class defines a pythonic interface for **creating**, **modifying**, and **estimating properties** of electrolyte solutions. It is the core feature of `pyEQL` and the primary user-facing class. There are several ways to create a `Solution`.
4
4
 
5
-
6
5
  ## Empty solution
7
6
 
8
7
  With no input arguments, you get an empty `Solution` at pH 7 and 1 atm pressure.
@@ -29,7 +28,6 @@ passed as a `dict` with amounts given **as strings** that include units (see [un
29
28
 
30
29
  You can also specify conditions such as temperature, pressure, pH, and pE (redox potential).
31
30
 
32
-
33
31
  Finally, you can manually create a solution with any list of solutes, temperature, pressure, etc. that you need:
34
32
 
35
33
  ```python
@@ -1,7 +1,7 @@
1
1
  [![Read the Docs](https://img.shields.io/readthedocs/pyeql)](https://pyeql.readthedocs.io/en/latest/)
2
2
  [![testing](https://github.com/KingsburyLab/pyeql/workflows/testing/badge.svg)](https://github.com/KingsburyLab/pyeql/actions?query=workflow%3Atesting)
3
3
  [![codecov](https://codecov.io/gh/KingsburyLab/pyeql/branch/main/graph/badge.svg?token=I7RP0QML6S)](https://codecov.io/gh/KingsburyLab/pyeql)
4
- ![Supported python versions](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue)
4
+ ![Supported python versions](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue)
5
5
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8332915.svg)](https://doi.org/10.5281/zenodo.8332915)
6
6
  [![PyPI version](https://badge.fury.io/py/pyEQL.svg)](https://badge.fury.io/py/pyEQL)
7
7
  [![status](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6/status.svg)](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6)
@@ -65,7 +65,7 @@ Detailed documentation is available at [https://pyeql.readthedocs.io/](https://p
65
65
 
66
66
  ### Dependencies
67
67
 
68
- - Python 3.9+. This project will attempt to adhere to NumPy's
68
+ - Python 3.10+. This project will attempt to adhere to NumPy's
69
69
  [NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html) deprecation policy
70
70
  for older version of Python.
71
71
  - [pint](https://github.com/hgrecco/pint) - for units-aware calculations
@@ -4,7 +4,7 @@
4
4
  pint>=0.19
5
5
  numpy
6
6
  scipy
7
- pymatgen>=2023.10.11
7
+ pymatgen>=2024.9.10
8
8
  iapws
9
9
  monty
10
10
  maggma
@@ -18,16 +18,16 @@ classifiers=[
18
18
  "Topic :: Scientific/Engineering",
19
19
  ]
20
20
  license = {file = "LICENSE"}
21
- requires-python = ">=3.9"
21
+ requires-python = ">=3.10"
22
22
  dependencies = [
23
23
  "pint>=0.19",
24
- "numpy<2",
25
- "scipy",
26
- "pymatgen==2024.5.1",
27
- "iapws",
24
+ "numpy>1.26,<2",
25
+ "scipy>=1.12",
26
+ "pymatgen>=2024.9.10",
27
+ "iapws>=1.5.3",
28
28
  "monty>=2024.7.12",
29
29
  "maggma>=0.67.0",
30
- "phreeqpython",
30
+ "phreeqpython>=1.5.2",
31
31
  ]
32
32
 
33
33
  [project.urls]
@@ -38,14 +38,14 @@ Package = "https://pypi.org/project/pyEQL"
38
38
 
39
39
  [project.optional-dependencies]
40
40
  testing = [
41
- "setuptools",
42
- "pre-commit",
43
- "pytest",
44
- "pytest-cov",
45
- "pytest-xdist",
41
+ "setuptools>=68",
42
+ "pre-commit>=2",
43
+ "pytest>=7",
44
+ "pytest-cov>=2.11",
45
+ "pytest-xdist>2",
46
46
  "black",
47
- "mypy",
48
- "ruff",
47
+ "mypy>1",
48
+ "ruff>0.0.100",
49
49
  "tox<4",
50
50
  ]
51
51
  docs = [
@@ -10,22 +10,22 @@ annotated-types==0.7.0
10
10
  # via pydantic
11
11
  appdirs==1.4.4
12
12
  # via pint
13
- attrs==23.2.0
13
+ attrs==24.2.0
14
14
  # via
15
15
  # jsonlines
16
16
  # jsonschema
17
17
  # referencing
18
- bcrypt==4.1.3
18
+ bcrypt==4.2.0
19
19
  # via paramiko
20
- boto3==1.34.142
20
+ boto3==1.34.158
21
21
  # via maggma
22
- botocore==1.34.142
22
+ botocore==1.34.158
23
23
  # via
24
24
  # boto3
25
25
  # s3transfer
26
26
  certifi==2024.7.4
27
27
  # via requests
28
- cffi==1.16.0
28
+ cffi==1.17.0
29
29
  # via
30
30
  # cryptography
31
31
  # pynacl
@@ -33,7 +33,7 @@ charset-normalizer==3.3.2
33
33
  # via requests
34
34
  contourpy==1.2.1
35
35
  # via matplotlib
36
- cryptography==42.0.8
36
+ cryptography==43.0.1
37
37
  # via paramiko
38
38
  cycler==0.12.1
39
39
  # via matplotlib
@@ -67,13 +67,13 @@ kiwisolver==1.4.5
67
67
  # via matplotlib
68
68
  latexcodec==3.0.0
69
69
  # via pybtex
70
- maggma==0.69.0
70
+ maggma==0.69.1
71
71
  # via pyEQL (setup.py)
72
- matplotlib==3.9.1
72
+ matplotlib==3.9.1.post1
73
73
  # via pymatgen
74
74
  mongomock==4.1.2
75
75
  # via maggma
76
- monty==2024.5.24
76
+ monty==2024.7.30
77
77
  # via
78
78
  # maggma
79
79
  # pyEQL (setup.py)
@@ -95,7 +95,7 @@ numpy==1.26.4
95
95
  # pymatgen
96
96
  # scipy
97
97
  # spglib
98
- orjson==3.10.6
98
+ orjson==3.10.7
99
99
  # via maggma
100
100
  packaging==24.1
101
101
  # via
@@ -116,9 +116,9 @@ phreeqpython==1.5.2
116
116
  # via pyEQL (setup.py)
117
117
  pillow==10.4.0
118
118
  # via matplotlib
119
- pint==0.24.1
119
+ pint==0.24.3
120
120
  # via pyEQL (setup.py)
121
- plotly==5.22.0
121
+ plotly==5.23.0
122
122
  # via pymatgen
123
123
  pybtex==0.24.0
124
124
  # via pymatgen
@@ -130,9 +130,9 @@ pydantic==2.8.2
130
130
  # pydantic-settings
131
131
  pydantic-core==2.20.1
132
132
  # via pydantic
133
- pydantic-settings==2.3.4
133
+ pydantic-settings==2.4.0
134
134
  # via maggma
135
- pydash==8.0.1
135
+ pydash==8.0.3
136
136
  # via maggma
137
137
  pymatgen==2024.5.1
138
138
  # via pyEQL (setup.py)
@@ -154,9 +154,9 @@ python-dotenv==1.0.1
154
154
  # via pydantic-settings
155
155
  pytz==2024.1
156
156
  # via pandas
157
- pyyaml==6.0.1
157
+ pyyaml==6.0.2
158
158
  # via pybtex
159
- pyzmq==26.0.3
159
+ pyzmq==26.1.0
160
160
  # via maggma
161
161
  referencing==0.35.1
162
162
  # via
@@ -164,7 +164,7 @@ referencing==0.35.1
164
164
  # jsonschema-specifications
165
165
  requests==2.32.3
166
166
  # via pymatgen
167
- rpds-py==0.19.0
167
+ rpds-py==0.20.0
168
168
  # via
169
169
  # jsonschema
170
170
  # referencing
@@ -188,17 +188,17 @@ six==1.16.0
188
188
  # via
189
189
  # pybtex
190
190
  # python-dateutil
191
- spglib==2.4.0
191
+ spglib==2.5.0
192
192
  # via pymatgen
193
193
  sshtunnel==0.4.0
194
194
  # via maggma
195
- sympy==1.13.0
195
+ sympy==1.13.1
196
196
  # via pymatgen
197
197
  tabulate==0.9.0
198
198
  # via pymatgen
199
- tenacity==8.5.0
199
+ tenacity==9.0.0
200
200
  # via plotly
201
- tqdm==4.66.4
201
+ tqdm==4.66.5
202
202
  # via
203
203
  # maggma
204
204
  # pymatgen