From 5dd1f2e41cb8a34210ce31cb3fe6d2debceb1c0e Mon Sep 17 00:00:00 2001 From: Danny Price Date: Thu, 26 Feb 2026 10:22:58 +0800 Subject: [PATCH 1/5] Adding screenshot of web app --- app/assets/screenshot_v4.0.0.jpg | Bin 0 -> 42428 bytes pyproject.toml | 1 + 2 files changed, 1 insertion(+) create mode 100644 app/assets/screenshot_v4.0.0.jpg diff --git a/app/assets/screenshot_v4.0.0.jpg b/app/assets/screenshot_v4.0.0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80d95578bf28868ee95264cf51827d880588adef GIT binary patch literal 42428 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 M4kqLKRBi3mAAUZTxBvhE literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index ae7ef27..f610ee1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering :: Astronomy", ] dependencies = [ From 8ce00180f46be7e779d09390f19e5cb612750018 Mon Sep 17 00:00:00 2001 From: Danny Price Date: Thu, 26 Feb 2026 10:24:04 +0800 Subject: [PATCH 2/5] Updating requirements.txt --- app/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/requirements.txt b/app/requirements.txt index 4cc6ca7..53875f5 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -12,5 +12,6 @@ gunicorn Pillow requests h5py +hickle numba git+https://github.com/telegraphic/mwprop \ No newline at end of file From a5f8e2c860204706c7746f4a76e6d538710df2ce Mon Sep 17 00:00:00 2001 From: Danny Price Date: Thu, 26 Feb 2026 10:24:13 +0800 Subject: [PATCH 3/5] Updating README.md --- app/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/README.md b/app/README.md index 21abb86..91b13a6 100644 --- a/app/README.md +++ b/app/README.md @@ -5,4 +5,8 @@ docker build --tag pygedm_app . docker run -p 8050:8050 pygedm_app ``` -This will start a web app running on [localhost:8050](http://localhost:8050), which you can access via your browser. \ No newline at end of file +This will start a web app running on [localhost:8050](http://localhost:8050), which you can access via your browser. + +## Screenshots + +![PyGEDM App Screenshot](assets/screenshot_v4.0.0.jpg) \ No newline at end of file From b5b3a03ab95d2bdb50e7b2b8b387911828c84b24 Mon Sep 17 00:00:00 2001 From: Danny Price Date: Thu, 26 Feb 2026 10:55:52 +0800 Subject: [PATCH 4/5] Update pyproject.toml --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f610ee1..0ec302d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,8 @@ dependencies = [ "scipy", "tqdm", "importlib-metadata>=1.0; python_version < '3.8'", - "importlib-resources>=1.3; python_version < '3.9'" + "importlib-resources>=1.3; python_version < '3.9'", + "mwprop @ git+https://github.com/telegraphic/mwprop" ] [project.optional-dependencies] From 88dced98d1abdb0aa2f2ad615407002002b691bc Mon Sep 17 00:00:00 2001 From: Danny Price Date: Thu, 26 Feb 2026 13:33:05 +0800 Subject: [PATCH 5/5] Update unit test with rtol --- tests/test_tau_sc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_tau_sc.py b/tests/test_tau_sc.py index 7604e07..4542b49 100644 --- a/tests/test_tau_sc.py +++ b/tests/test_tau_sc.py @@ -37,8 +37,8 @@ def test_tau_sc_nu(): dm, tau_sc_1GHz = pygedm.dm_to_dist(0, 0, 1000, method="ne2001", nu=1.0) dm, tau_sc_100MHz = pygedm.dm_to_dist(0, 0, 1000, method="ne2001", nu=0.1) - assert np.isclose(tau_sc_1GHz.value, 198.55289306) - assert np.isclose(tau_sc_100MHz.value, 4987423.18015693) + assert np.isclose(tau_sc_1GHz.value, 198.55289306, rtol=1e-3) + assert np.isclose(tau_sc_100MHz.value, 4987423.18015693, rtol=1e-3) if __name__ == "__main__": test_tau_sc_nu()