PyMieSimX 0.4.0__tar.gz → 0.4.3__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.

Potentially problematic release.


This version of PyMieSimX might be problematic. Click here for more details.

Files changed (116) hide show
  1. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.github/workflows/deploy_PyPi.yml +3 -3
  2. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.github/workflows/deploy_anaconda.yml +1 -9
  3. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.github/workflows/deploy_coverage.yml +5 -10
  4. pymiesimx-0.4.3/.github/workflows/deploy_documentation.yml +26 -0
  5. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.github/workflows/quality.yml +2 -2
  6. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.github/workflows/tests.yml +1 -1
  7. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.gitignore +2 -0
  8. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PKG-INFO +11 -1
  9. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/PKG-INFO +11 -1
  10. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/SOURCES.txt +11 -0
  11. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/requires.txt +7 -0
  12. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/scm_file_list.json +11 -0
  13. pymiesimx-0.4.3/PyMieSimX.egg-info/scm_version.json +8 -0
  14. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/README.rst +5 -0
  15. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/conda.recipe/meta.yaml +2 -0
  16. pymiesimx-0.4.3/docs/source/_static/favicon.svg +6 -0
  17. pymiesimx-0.4.3/docs/source/_static/logo.svg +39 -0
  18. pymiesimx-0.4.3/docs/source/api.rst +25 -0
  19. pymiesimx-0.4.3/docs/source/conf.py +69 -0
  20. pymiesimx-0.4.3/docs/source/contributing.rst +16 -0
  21. pymiesimx-0.4.3/docs/source/getting_started.rst +60 -0
  22. pymiesimx-0.4.3/docs/source/gui.rst +18 -0
  23. pymiesimx-0.4.3/docs/source/how_it_works.rst +36 -0
  24. pymiesimx-0.4.3/docs/source/index.rst +46 -0
  25. pymiesimx-0.4.3/docs/source/sharing.rst +12 -0
  26. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/makefile +4 -1
  27. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/pyproject.toml +7 -0
  28. pymiesimx-0.4.0/PyMieSimX.egg-info/scm_version.json +0 -8
  29. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.coveragerc +0 -0
  30. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.flake8 +0 -0
  31. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.github/dependabot.yml +0 -0
  32. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/.pre-commit-config.yaml +0 -0
  33. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/AGENTS.md +0 -0
  34. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/CONTRIBUTING.md +0 -0
  35. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/Dockerfile +0 -0
  36. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/LICENSE +0 -0
  37. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/__init__.py +0 -0
  38. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/__main__.py +0 -0
  39. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/api.py +0 -0
  40. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/application/__init__.py +0 -0
  41. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/application/wsgi.py +0 -0
  42. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/__init__.py +0 -0
  43. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/admin.py +0 -0
  44. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/card-state.js +0 -0
  45. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/dashboard.css +0 -0
  46. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/default-settings.json +0 -0
  47. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/home-spf-radial.gif +0 -0
  48. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/home-spf-radial.png +0 -0
  49. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/logo.png +0 -0
  50. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/materials-stock.json +0 -0
  51. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/pymiesim-favicon.svg +0 -0
  52. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/pymiesim-logo-dark.svg +0 -0
  53. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/pymiesim-logo.svg +0 -0
  54. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/simulation-sharing.js +0 -0
  55. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/callback_helpers.py +0 -0
  56. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/callbacks.py +0 -0
  57. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/components/__init__.py +0 -0
  58. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/components/cards.py +0 -0
  59. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/computation.py +0 -0
  60. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/defaults.py +0 -0
  61. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/experiment_service.py +0 -0
  62. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/interface.py +0 -0
  63. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/jobs.py +0 -0
  64. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/layout.py +0 -0
  65. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/material_catalog.py +0 -0
  66. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/models.py +0 -0
  67. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/__init__.py +0 -0
  68. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/citation.py +0 -0
  69. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/documentation.py +0 -0
  70. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/examples.py +0 -0
  71. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/__init__.py +0 -0
  72. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/page.py +0 -0
  73. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/sections/__init__.py +0 -0
  74. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/sections/configuration.py +0 -0
  75. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/field_syntax.py +0 -0
  76. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/home.py +0 -0
  77. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/install_local.py +0 -0
  78. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/population.py +0 -0
  79. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/sellmeier.py +0 -0
  80. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/settings.py +0 -0
  81. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/__init__.py +0 -0
  82. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/page.py +0 -0
  83. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/sections/__init__.py +0 -0
  84. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/sections/representations.py +0 -0
  85. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/sections/setup.py +0 -0
  86. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/parsing.py +0 -0
  87. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/plotting.py +0 -0
  88. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/population_service.py +0 -0
  89. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/schemas.py +0 -0
  90. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/seo.py +0 -0
  91. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/services.py +0 -0
  92. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/sharing.py +0 -0
  93. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/single_service.py +0 -0
  94. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/usage_metrics.py +0 -0
  95. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX/gui/validation.py +0 -0
  96. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/dependency_links.txt +0 -0
  97. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/entry_points.txt +0 -0
  98. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/top_level.txt +0 -0
  99. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/pytest.ini +0 -0
  100. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/setup.cfg +0 -0
  101. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/browser/test_dashboard.py +0 -0
  102. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/cli.py +0 -0
  103. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_admin.py +0 -0
  104. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_api.py +0 -0
  105. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_dash_callbacks.py +0 -0
  106. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_examples.py +0 -0
  107. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_home.py +0 -0
  108. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_population.py +0 -0
  109. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_seo.py +0 -0
  110. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_services.py +0 -0
  111. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_sharing.py +0 -0
  112. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tests/gui/test_usage_metrics.py +0 -0
  113. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tools/generate_home_spf.py +0 -0
  114. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tools/next_release_version.py +0 -0
  115. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tools/release_tag.py +0 -0
  116. {pymiesimx-0.4.0 → pymiesimx-0.4.3}/tools/verify_conda_artifact.py +0 -0
@@ -9,9 +9,9 @@ permissions:
9
9
 
10
10
  jobs:
11
11
  publish:
12
- uses: MartinPdeS/MPSActions/.github/workflows/publish_pure_package_to_PyPi.yml@v5
12
+ uses: MartinPdeS/MPSActions/.github/workflows/publish_pure_package_to_PyPi.yml@a01969bc5af90666281f9d37acffdf6a4629763a
13
13
  with:
14
- python-version: "3.11"
15
- test-command: python -c 'import PyMieSimX'
14
+ python-version: "3.13"
15
+ test-command: python -c "import PyMieSimX"
16
16
  secrets:
17
17
  PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
@@ -10,20 +10,12 @@ permissions:
10
10
 
11
11
  jobs:
12
12
  publish:
13
- uses: MartinPdeS/MPSActions/.github/workflows/publish_compiled_package_to_anaconda.yml@v6
13
+ uses: MartinPdeS/MPSActions/.github/workflows/publish_compiled_package_to_anaconda.yml@a01969bc5af90666281f9d37acffdf6a4629763a
14
14
  with:
15
15
  python_versions: '["3.11", "3.12", "3.13", "3.14"]'
16
16
  os_list: '["ubuntu-latest", "macos-latest", "windows-latest"]'
17
17
  package_name: pymiesimx
18
18
  recipe_path: conda.recipe
19
19
  test_import: PyMieSimX
20
- # Shell startup in the reusable workflow reactivates base, even through
21
- # conda run. Invoke the installed environment's interpreter directly.
22
- test_command: >-
23
- if [ -f '${test_prefix}/python.exe' ]; then
24
- '${test_prefix}/python.exe' '${GITHUB_WORKSPACE}/tools/verify_conda_artifact.py';
25
- else
26
- '${test_prefix}/bin/python' '${GITHUB_WORKSPACE}/tools/verify_conda_artifact.py';
27
- fi
28
20
  secrets:
29
21
  ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_API_TOKEN }}
@@ -16,18 +16,13 @@ jobs:
16
16
  name: Run GUI tests and publish coverage
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
20
- with:
21
- fetch-depth: 0
22
-
23
- - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
19
+ - name: Set up Python and CI dependencies
20
+ uses: MartinPdeS/MPSActions/actions/setup-python@a01969bc5af90666281f9d37acffdf6a4629763a
24
21
  with:
25
22
  python-version: "3.11"
26
-
27
- - name: Install package and test dependencies
28
- run: |
29
- python -m pip install --upgrade pip wheel build
30
- python -m pip install -e ".[testing]"
23
+ install-command: >-
24
+ python -m pip install --upgrade pip wheel build && python -m pip install -e ".[testing]"
25
+ fetch-depth: 0
31
26
 
32
27
  - name: Initialize material catalog
33
28
  run: python -m PyOptik setup --no-progress
@@ -0,0 +1,26 @@
1
+ # Build and publish the versioned documentation site.
2
+ name: Documentation
3
+
4
+ on:
5
+ push:
6
+ branches: ["**"]
7
+ tags: ["v*"]
8
+ pull_request:
9
+ branches: ["master"]
10
+
11
+ concurrency:
12
+ group: documentation-build-${{ github.repository }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ permissions:
16
+ contents: write
17
+ pages: write
18
+ id-token: write
19
+
20
+ jobs:
21
+ documentation:
22
+ uses: MartinPdeS/MPSActions/.github/workflows/publish_documentation.yml@a01969bc5af90666281f9d37acffdf6a4629763a
23
+ with:
24
+ python-version: "3.13"
25
+ package-name: "PyMieSimX"
26
+ deploy-pages: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')) }}
@@ -17,7 +17,7 @@ jobs:
17
17
  python-version: ["3.11", "3.13"]
18
18
  steps:
19
19
  - name: Set up Python and CI dependencies
20
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
20
+ uses: MartinPdeS/MPSActions/actions/setup-python@a01969bc5af90666281f9d37acffdf6a4629763a
21
21
  with:
22
22
  python-version: "${{ matrix.python-version }}"
23
23
  install-command: >-
@@ -35,7 +35,7 @@ jobs:
35
35
  runs-on: ubuntu-latest
36
36
  steps:
37
37
  - name: Set up Python and CI dependencies
38
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
38
+ uses: MartinPdeS/MPSActions/actions/setup-python@a01969bc5af90666281f9d37acffdf6a4629763a
39
39
  with:
40
40
  python-version: "3.11"
41
41
  install-command: >-
@@ -18,7 +18,7 @@ jobs:
18
18
  python-version: ["3.11", "3.14"]
19
19
  steps:
20
20
  - name: Set up Python and CI dependencies
21
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
21
+ uses: MartinPdeS/MPSActions/actions/setup-python@a01969bc5af90666281f9d37acffdf6a4629763a
22
22
  with:
23
23
  python-version: "${{ matrix.python-version }}"
24
24
  install-command: >-
@@ -9,6 +9,8 @@ build/
9
9
  dist/
10
10
  .coverage
11
11
  htmlcov/
12
+ docs/_build/
13
+ docs/source/generated/
12
14
  .DS_Store
13
15
  !conda.recipe/
14
16
  !conda.recipe/meta.yaml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyMieSimX
3
- Version: 0.4.0
3
+ Version: 0.4.3
4
4
  Summary: Graphical Dash interface for PyMieSim.
5
5
  Author-email: Martin Poinsinet de Sivry-Houle <martin.poinsinet.de.sivry@gmail.com>
6
6
  License-Expression: MIT
@@ -18,6 +18,7 @@ Requires-Dist: dash<5,>=4.1.0
18
18
  Requires-Dist: gunicorn<24,>=23.0.0
19
19
  Requires-Dist: numpy<3,>=2.0
20
20
  Requires-Dist: pandas<3,>=2.2
21
+ Requires-Dist: pint<0.26,>=0.24
21
22
  Requires-Dist: plotly<7,>=5.24
22
23
  Requires-Dist: psycopg[binary]<4,>=3.2.9
23
24
  Provides-Extra: testing
@@ -30,11 +31,20 @@ Provides-Extra: dev
30
31
  Requires-Dist: build>=1.2; extra == "dev"
31
32
  Requires-Dist: mypy==1.15.0; extra == "dev"
32
33
  Requires-Dist: ruff==0.11.2; extra == "dev"
34
+ Provides-Extra: docs
35
+ Requires-Dist: MartinPdeS-docs>=0.1.4; extra == "docs"
36
+ Provides-Extra: documentation
37
+ Requires-Dist: MartinPdeS-docs>=0.1.4; extra == "documentation"
33
38
  Dynamic: license-file
34
39
 
35
40
  PyMieSimX
36
41
  =========
37
42
 
43
+ .. image:: docs/source/_static/logo.svg
44
+ :alt: PyMieSimX
45
+ :align: center
46
+ :width: 420px
47
+
38
48
  PyMieSimX is the standalone graphical interface for `PyMieSim
39
49
  <https://github.com/MartinPdeS/PyMieSim>`_. It provides a Dash application for
40
50
  configuring optical setups, running parameter sweeps, exploring individual
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyMieSimX
3
- Version: 0.4.0
3
+ Version: 0.4.3
4
4
  Summary: Graphical Dash interface for PyMieSim.
5
5
  Author-email: Martin Poinsinet de Sivry-Houle <martin.poinsinet.de.sivry@gmail.com>
6
6
  License-Expression: MIT
@@ -18,6 +18,7 @@ Requires-Dist: dash<5,>=4.1.0
18
18
  Requires-Dist: gunicorn<24,>=23.0.0
19
19
  Requires-Dist: numpy<3,>=2.0
20
20
  Requires-Dist: pandas<3,>=2.2
21
+ Requires-Dist: pint<0.26,>=0.24
21
22
  Requires-Dist: plotly<7,>=5.24
22
23
  Requires-Dist: psycopg[binary]<4,>=3.2.9
23
24
  Provides-Extra: testing
@@ -30,11 +31,20 @@ Provides-Extra: dev
30
31
  Requires-Dist: build>=1.2; extra == "dev"
31
32
  Requires-Dist: mypy==1.15.0; extra == "dev"
32
33
  Requires-Dist: ruff==0.11.2; extra == "dev"
34
+ Provides-Extra: docs
35
+ Requires-Dist: MartinPdeS-docs>=0.1.4; extra == "docs"
36
+ Provides-Extra: documentation
37
+ Requires-Dist: MartinPdeS-docs>=0.1.4; extra == "documentation"
33
38
  Dynamic: license-file
34
39
 
35
40
  PyMieSimX
36
41
  =========
37
42
 
43
+ .. image:: docs/source/_static/logo.svg
44
+ :alt: PyMieSimX
45
+ :align: center
46
+ :width: 420px
47
+
38
48
  PyMieSimX is the standalone graphical interface for `PyMieSim
39
49
  <https://github.com/MartinPdeS/PyMieSim>`_. It provides a Dash application for
40
50
  configuring optical setups, running parameter sweeps, exploring individual
@@ -14,6 +14,7 @@ pytest.ini
14
14
  .github/workflows/deploy_PyPi.yml
15
15
  .github/workflows/deploy_anaconda.yml
16
16
  .github/workflows/deploy_coverage.yml
17
+ .github/workflows/deploy_documentation.yml
17
18
  .github/workflows/quality.yml
18
19
  .github/workflows/tests.yml
19
20
  PyMieSimX/__init__.py
@@ -84,6 +85,16 @@ PyMieSimX/gui/pages/single/sections/__init__.py
84
85
  PyMieSimX/gui/pages/single/sections/representations.py
85
86
  PyMieSimX/gui/pages/single/sections/setup.py
86
87
  conda.recipe/meta.yaml
88
+ docs/source/api.rst
89
+ docs/source/conf.py
90
+ docs/source/contributing.rst
91
+ docs/source/getting_started.rst
92
+ docs/source/gui.rst
93
+ docs/source/how_it_works.rst
94
+ docs/source/index.rst
95
+ docs/source/sharing.rst
96
+ docs/source/_static/favicon.svg
97
+ docs/source/_static/logo.svg
87
98
  tests/browser/test_dashboard.py
88
99
  tests/gui/cli.py
89
100
  tests/gui/test_admin.py
@@ -4,6 +4,7 @@ dash<5,>=4.1.0
4
4
  gunicorn<24,>=23.0.0
5
5
  numpy<3,>=2.0
6
6
  pandas<3,>=2.2
7
+ pint<0.26,>=0.24
7
8
  plotly<7,>=5.24
8
9
  psycopg[binary]<4,>=3.2.9
9
10
 
@@ -15,6 +16,12 @@ build>=1.2
15
16
  mypy==1.15.0
16
17
  ruff==0.11.2
17
18
 
19
+ [docs]
20
+ MartinPdeS-docs>=0.1.4
21
+
22
+ [documentation]
23
+ MartinPdeS-docs>=0.1.4
24
+
18
25
  [testing]
19
26
  pytest>=8.0
20
27
  pytest-cov>=5.0
@@ -6,6 +6,7 @@
6
6
  ".github/workflows/deploy_PyPi.yml",
7
7
  ".github/workflows/deploy_anaconda.yml",
8
8
  ".github/workflows/deploy_coverage.yml",
9
+ ".github/workflows/deploy_documentation.yml",
9
10
  ".github/workflows/quality.yml",
10
11
  ".github/workflows/tests.yml",
11
12
  ".gitignore",
@@ -75,6 +76,16 @@
75
76
  "PyMieSimX/gui/validation.py",
76
77
  "README.rst",
77
78
  "conda.recipe/meta.yaml",
79
+ "docs/source/_static/favicon.svg",
80
+ "docs/source/_static/logo.svg",
81
+ "docs/source/api.rst",
82
+ "docs/source/conf.py",
83
+ "docs/source/contributing.rst",
84
+ "docs/source/getting_started.rst",
85
+ "docs/source/gui.rst",
86
+ "docs/source/how_it_works.rst",
87
+ "docs/source/index.rst",
88
+ "docs/source/sharing.rst",
78
89
  "makefile",
79
90
  "pyproject.toml",
80
91
  "pytest.ini",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.4.3",
3
+ "distance": 0,
4
+ "node": "gf35ae79ff04e77139b7c11a653cdf9e2728cf7ea",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-20"
8
+ }
@@ -1,6 +1,11 @@
1
1
  PyMieSimX
2
2
  =========
3
3
 
4
+ .. image:: docs/source/_static/logo.svg
5
+ :alt: PyMieSimX
6
+ :align: center
7
+ :width: 420px
8
+
4
9
  PyMieSimX is the standalone graphical interface for `PyMieSim
5
10
  <https://github.com/MartinPdeS/PyMieSim>`_. It provides a Dash application for
6
11
  configuring optical setups, running parameter sweeps, exploring individual
@@ -7,6 +7,7 @@ source:
7
7
 
8
8
  build:
9
9
  number: 0
10
+ string: py{{ PY_VER | replace('.', '') }}_{{ PKG_BUILDNUM }}
10
11
  script_env:
11
12
  - SETUPTOOLS_SCM_PRETEND_VERSION={{ GIT_DESCRIBE_TAG | replace("v", "") }}
12
13
  entry_points:
@@ -27,6 +28,7 @@ requirements:
27
28
  - gunicorn >=23.0.0,<24 # [not win]
28
29
  - numpy >=2.0,<3
29
30
  - pandas >=2.2,<3
31
+ - pint >=0.24,<0.26
30
32
  - plotly >=5.24,<7
31
33
  - psycopg >=3.2.9,<4
32
34
 
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="PMS favicon">
3
+ <title>PMS</title>
4
+ <rect width="64" height="64" rx="12" fill="#000000"/>
5
+ <text x="32" y="41" text-anchor="middle" fill="#2f80ff" font-family="Arial, Helvetica, sans-serif" font-size="24" font-weight="800" letter-spacing="1">PMS</text>
6
+ </svg>
@@ -0,0 +1,39 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg"
3
+ width="1100" height="400"
4
+ viewBox="200 50 700 400"
5
+ role="img"
6
+ aria-label="PyMieSim Flow-cytometry Calibration logo">
7
+ <title>PyMieSim Flow-cytometry Calibration</title>
8
+ <style>
9
+ .logo-main {
10
+ font-family: "Avenir Next", "Century Gothic", Futura, Montserrat, Arial, serif;
11
+ font-size: 186px;
12
+ font-weight: 560;
13
+ letter-spacing: -3px;
14
+ fill: #26272a;
15
+ }
16
+ .logo-subtitle {
17
+ font-family: "Avenir Next", "Century Gothic", Futura, Montserrat, Arial, sans-serif;
18
+ font-size: 55px;
19
+ font-weight: 350;
20
+ letter-spacing: -1.2px;
21
+ fill: #26272a;
22
+ text-anchor: end;
23
+ }
24
+ </style>
25
+
26
+ <text class="logo-main" x="35" y="290"><tspan>P</tspan><tspan dx="9">yMieSim</tspan></text>
27
+
28
+ <!-- Original blue/cyan chevron X preserved as vector paths, shifted slightly right for better spacing -->
29
+ <g transform="translate(-108,0)">
30
+ <path d="m 975.8673,149.6464 h 26 l 64,88 -64,88 h -26 l 64,-88 z"
31
+ fill="#2d6df6"/>
32
+ <path d="m 1135.8673,149.6464 h 28 l -64,88 64,88 h -28 l -62,-88 z"
33
+ fill="#16c9dc"/>
34
+ </g>
35
+
36
+ <text class="logo-subtitle" x="1078" y="397">Light Scattering Simulation</text>
37
+ <line x1="460" y1="416" x2="1078" y2="416"
38
+ stroke="#26272a" stroke-width="5" stroke-linecap="butt" />
39
+ </svg>
@@ -0,0 +1,25 @@
1
+ Python API
2
+ ==========
3
+
4
+ The top-level API is independent of the Dash server and is useful in scripts,
5
+ notebooks, and automated workflows.
6
+
7
+ .. autosummary::
8
+ :toctree: generated
9
+
10
+ PyMieSimX.api.run_experiment
11
+ PyMieSimX.api.compute_population_optics
12
+ PyMieSimX.api.validate_experiment_inputs
13
+ PyMieSimX.api.available_measures
14
+ PyMieSimX.api.export_result_to_csv
15
+ PyMieSimX.api.export_single_result_to_csv
16
+ PyMieSimX.api.export_population_to_csv
17
+ PyMieSimX.api.estimate_result_size
18
+ PyMieSimX.api.estimate_sweep_size
19
+
20
+ API module
21
+ ----------
22
+
23
+ .. automodule:: PyMieSimX.api
24
+ :no-members:
25
+ :show-inheritance:
@@ -0,0 +1,69 @@
1
+ """Sphinx configuration for PyMieSimX."""
2
+
3
+ import os
4
+ import subprocess
5
+ import sys
6
+ from importlib.metadata import PackageNotFoundError, version as distribution_version
7
+ from pathlib import Path
8
+
9
+ from martinpdes_docs import configure
10
+
11
+
12
+ # API autodoc imports the calculation services, which resolve named PyOptik
13
+ # materials. Populate the catalogue on a fresh documentation runner.
14
+ try:
15
+ from PyOptik.directories import user_data_path
16
+ except ImportError:
17
+ user_data_path = None
18
+ else:
19
+ catalog_path = Path(user_data_path) / "rii" / "catalog-nk.yml"
20
+ if not catalog_path.is_file():
21
+ subprocess.run(
22
+ [sys.executable, "-m", "PyOptik", "setup", "--no-progress"],
23
+ check=True,
24
+ )
25
+
26
+
27
+ project = "PyMieSimX"
28
+ package = "PyMieSimX"
29
+ repository = "MartinPdeS/PyMieSimX"
30
+ author = "Martin Poinsinet de Sivry-Houle"
31
+
32
+ try:
33
+ installed_version = distribution_version(package)
34
+ except PackageNotFoundError:
35
+ installed_version = "latest"
36
+
37
+ version = os.getenv("tag", installed_version)
38
+
39
+ # PyMieSimX documents a stable Python API and its Dash application; it does
40
+ # not currently have executable gallery examples.
41
+ globals().update(
42
+ configure(
43
+ project=project,
44
+ package=package,
45
+ author=author,
46
+ repository=repository,
47
+ version=version,
48
+ logo="_static/logo.svg",
49
+ favicon="_static/favicon.svg",
50
+ extensions=[
51
+ "sphinx.ext.autodoc",
52
+ "sphinx.ext.autosummary",
53
+ "sphinx.ext.intersphinx",
54
+ "sphinx.ext.napoleon",
55
+ "sphinx.ext.viewcode",
56
+ "sphinx.ext.todo",
57
+ "sphinx_design",
58
+ ],
59
+ )
60
+ )
61
+
62
+ autodoc_default_options.update({"members": True})
63
+ html_context.update({"doc_path": "docs/source", "default_mode": "dark"})
64
+
65
+ intersphinx_mapping = {
66
+ "numpy": ("https://numpy.org/devdocs", None),
67
+ "pandas": ("https://pandas.pydata.org/docs", None),
68
+ "plotly": ("https://plotly.com/python-api-reference", None),
69
+ }
@@ -0,0 +1,16 @@
1
+ Contributing
2
+ ============
3
+
4
+ Install the development dependencies in an editable environment::
5
+
6
+ python -m pip install -e ".[testing,dev,docs]"
7
+
8
+ Run the checks locally with::
9
+
10
+ make quality
11
+ make test
12
+ make docs
13
+
14
+ The project uses Ruff for formatting and linting, mypy for selected typed
15
+ modules, and pytest for the GUI and API tests. Pull requests run these checks
16
+ through GitHub Actions.
@@ -0,0 +1,60 @@
1
+ Getting started
2
+ ===============
3
+
4
+ Installation
5
+ ------------
6
+
7
+ Install the application from PyPI::
8
+
9
+ python -m pip install PyMieSimX
10
+
11
+ PyMieSimX uses PyOptik's material catalogue. Initialize the local catalogue
12
+ explicitly when setting up a new environment::
13
+
14
+ python -m PyOptik setup --no-progress
15
+
16
+ Start the dashboard with::
17
+
18
+ pymiesimx
19
+
20
+ The command accepts ``--host``, ``--port``, ``--no-browser``, and ``--debug``.
21
+ Run ``pymiesimx --help`` for the complete list.
22
+
23
+ First workflow
24
+ --------------
25
+
26
+ #. Open **Single scatterer** to configure a wavelength, source, particle, and
27
+ detector.
28
+ #. Choose a named material from PyOptik or enter a complex refractive index.
29
+ #. Select a measure such as ``Qsca`` or ``Qext`` and press **Run**.
30
+ #. Use the plot controls to inspect the result and export the data as CSV.
31
+
32
+ For parameter studies, use **Parameter scan** to select the varied quantities
33
+ and their ranges. PyMieSimX validates the sweep size before submitting it to a
34
+ bounded background worker, so the interface remains responsive while a run is
35
+ queued or executing.
36
+
37
+ Python API
38
+ ----------
39
+
40
+ The calculation layer is available without creating a Dash application::
41
+
42
+ from PyMieSimX import run_experiment
43
+
44
+ result = run_experiment(
45
+ source_type="GaussianSet",
46
+ source_values={
47
+ "wavelength": "650",
48
+ "polarization": "0",
49
+ "optical_power": "1e-3",
50
+ "numerical_aperture": "0.2",
51
+ },
52
+ scatterer_type="SphereSet",
53
+ scatterer_values={"diameter": "500", "material": "1.4", "medium": "1.0"},
54
+ detector_type="None",
55
+ detector_values={},
56
+ measure="Qsca",
57
+ )
58
+
59
+ See :doc:`api` for result-size validation, multiple measures, population
60
+ optics, and CSV export helpers.
@@ -0,0 +1,18 @@
1
+ Graphical interface
2
+ ===================
3
+
4
+ The optional Dash interface is exposed through two helpers:
5
+
6
+ ``create_dash_app``
7
+ Create the configured Dash application for embedding in another service.
8
+
9
+ ``OpticalSetupGUI``
10
+ Construct the application wrapper used by the ``pymiesimx`` command.
11
+
12
+ These objects are imported lazily, so importing :mod:`PyMieSimX` for its
13
+ calculation API does not start a web server. The command-line entry point is
14
+ the recommended way to launch the complete interface.
15
+
16
+ .. automodule:: PyMieSimX.gui.interface
17
+ :members: create_dash_app, OpticalSetupGUI
18
+ :show-inheritance:
@@ -0,0 +1,36 @@
1
+ How it works
2
+ ============
3
+
4
+ PyMieSimX separates the interactive application from the optical calculations.
5
+ The Dash pages collect user input, validate it, and pass normalized values to
6
+ PyMieSim. Results are converted into tables and Plotly figures for the browser.
7
+
8
+ The main pieces are:
9
+
10
+ * **Setup and validation** normalize units, material choices, source settings,
11
+ detector settings, and sweep bounds before a calculation starts.
12
+ * **PyMieSim** constructs the scatterer, source, and detector objects and
13
+ computes the requested observables.
14
+ * **Background jobs** keep larger parameter scans away from the request thread
15
+ and report queued, running, completed, and failed states to the UI.
16
+ * **Result guards** estimate dataframe and serialized payload sizes before a
17
+ run, then check the actual result before it is sent to the browser.
18
+ * **Sharing** stores a validated configuration in a URL. Opening a shared URL
19
+ restores the inputs and runs the setup again with the installed dependencies.
20
+
21
+ Material names are resolved by PyOptik and therefore follow the catalogue
22
+ available in the current environment. A direct ``n+ik`` value can be used when
23
+ an entry is not available.
24
+
25
+ Ensemble optics
26
+ ---------------
27
+
28
+ The ensemble workflow evaluates a population of homogeneous spherical
29
+ particles at one wavelength. It supports monodisperse, truncated Gaussian,
30
+ lognormal, and uniform number-based diameter distributions. Cross sections are
31
+ averaged over the sampled population; effective anisotropy is weighted by
32
+ scattering cross section, and population albedo is the ratio of mean scattering
33
+ to mean extinction cross section.
34
+
35
+ Use dilute-population assumptions: particle interactions, multiple scattering,
36
+ and host-medium absorption are outside this model.
@@ -0,0 +1,46 @@
1
+ PyMieSimX
2
+ =========
3
+
4
+ .. image:: _static/logo.svg
5
+ :alt: PyMieSimX
6
+ :align: center
7
+ :width: 520px
8
+
9
+ PyMieSimX is a Dash interface for configuring and exploring
10
+ `PyMieSim <https://martinpdes.github.io/PyMieSim/>`_ scattering simulations.
11
+ Use the web interface for interactive work, or call the lightweight Python API
12
+ from scripts and notebooks.
13
+
14
+ .. toctree::
15
+ :maxdepth: 2
16
+ :caption: User guide
17
+
18
+ getting_started
19
+ how_it_works
20
+ sharing
21
+
22
+ .. toctree::
23
+ :maxdepth: 2
24
+ :caption: Reference
25
+
26
+ api
27
+ gui
28
+
29
+ .. toctree::
30
+ :maxdepth: 1
31
+ :caption: Project
32
+
33
+ contributing
34
+
35
+ Key features
36
+ ------------
37
+
38
+ * Configure single scatterer, parameter-scan, and ensemble optics studies.
39
+ * Explore scattering, absorption, extinction, efficiencies, and angular plots.
40
+ * Share a complete simulation setup with a URL and export computed results as
41
+ CSV files.
42
+ * Use the same calculations without starting Dash through the Python API.
43
+
44
+ The scientific solver and material catalogue are provided by PyMieSim and
45
+ PyOptik. PyMieSimX focuses on the user interface, validation, plotting, and
46
+ export workflows around them.
@@ -0,0 +1,12 @@
1
+ Sharing simulations
2
+ ===================
3
+
4
+ Use **Copy simulation link** in Single scatterer, Parameter scan, or Ensemble
5
+ optics to share the current setup. A link contains the configuration, sweep
6
+ ranges, selected measures, and plot settings; it does not contain a snapshot of
7
+ the computed result.
8
+
9
+ When a link is opened, PyMieSimX restores the inputs and recalculates the
10
+ simulation with the installed PyMieSim and PyOptik versions. Results can change
11
+ when those dependencies or material data are updated. Use **Run** after editing
12
+ any restored value.
@@ -1,7 +1,7 @@
1
1
  PYTHON ?= python3
2
2
  BUILD_DIR ?= build
3
3
 
4
- .PHONY: quality test build install editable run docker-build docker-run clean release tag patch minor major
4
+ .PHONY: quality test docs build install editable run docker-build docker-run clean release tag patch minor major
5
5
 
6
6
  quality:
7
7
  $(PYTHON) -m ruff check PyMieSimX tests
@@ -10,6 +10,9 @@ quality:
10
10
  test:
11
11
  $(PYTHON) -m pytest
12
12
 
13
+ docs:
14
+ $(PYTHON) -m sphinx -M html docs/source docs/_build
15
+
13
16
  build:
14
17
  $(PYTHON) -m build --outdir $(BUILD_DIR)
15
18
 
@@ -20,6 +20,7 @@ dependencies = [
20
20
  "gunicorn>=23.0.0,<24",
21
21
  "numpy>=2.0,<3",
22
22
  "pandas>=2.2,<3",
23
+ "pint>=0.24,<0.26",
23
24
  "plotly>=5.24,<7",
24
25
  "psycopg[binary]>=3.2.9,<4",
25
26
  ]
@@ -51,6 +52,12 @@ dev = [
51
52
  "mypy==1.15.0",
52
53
  "ruff==0.11.2",
53
54
  ]
55
+ docs = [
56
+ "MartinPdeS-docs>=0.1.4",
57
+ ]
58
+ documentation = [
59
+ "MartinPdeS-docs>=0.1.4",
60
+ ]
54
61
 
55
62
  [tool.setuptools.packages.find]
56
63
  include = ["PyMieSimX*"]
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.4.0",
3
- "distance": 0,
4
- "node": "g6131b4aa6a95ee2656d32918dffe6f87541c13cf",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-13"
8
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes