PyMieSimX 0.3.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 (117) hide show
  1. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/.github/workflows/deploy_PyPi.yml +3 -3
  2. pymiesimx-0.4.3/.github/workflows/deploy_anaconda.yml +21 -0
  3. {pymiesimx-0.3.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.3.0 → pymiesimx-0.4.3}/.github/workflows/quality.yml +2 -2
  6. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/.github/workflows/tests.yml +6 -2
  7. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/.gitignore +2 -0
  8. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PKG-INFO +15 -1
  9. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/callbacks.py +1 -1
  10. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/PKG-INFO +15 -1
  11. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/SOURCES.txt +11 -0
  12. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/requires.txt +7 -0
  13. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/scm_file_list.json +11 -0
  14. pymiesimx-0.4.3/PyMieSimX.egg-info/scm_version.json +8 -0
  15. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/README.rst +5 -0
  16. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/conda.recipe/meta.yaml +2 -0
  17. pymiesimx-0.4.3/docs/source/_static/favicon.svg +6 -0
  18. pymiesimx-0.4.3/docs/source/_static/logo.svg +39 -0
  19. pymiesimx-0.4.3/docs/source/api.rst +25 -0
  20. pymiesimx-0.4.3/docs/source/conf.py +69 -0
  21. pymiesimx-0.4.3/docs/source/contributing.rst +16 -0
  22. pymiesimx-0.4.3/docs/source/getting_started.rst +60 -0
  23. pymiesimx-0.4.3/docs/source/gui.rst +18 -0
  24. pymiesimx-0.4.3/docs/source/how_it_works.rst +36 -0
  25. pymiesimx-0.4.3/docs/source/index.rst +46 -0
  26. pymiesimx-0.4.3/docs/source/sharing.rst +12 -0
  27. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/makefile +4 -1
  28. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/pyproject.toml +14 -0
  29. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/browser/test_dashboard.py +3 -3
  30. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_sharing.py +1 -1
  31. pymiesimx-0.3.0/.github/workflows/deploy_anaconda.yml +0 -29
  32. pymiesimx-0.3.0/PyMieSimX.egg-info/scm_version.json +0 -8
  33. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/.coveragerc +0 -0
  34. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/.flake8 +0 -0
  35. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/.github/dependabot.yml +0 -0
  36. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/.pre-commit-config.yaml +0 -0
  37. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/AGENTS.md +0 -0
  38. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/CONTRIBUTING.md +0 -0
  39. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/Dockerfile +0 -0
  40. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/LICENSE +0 -0
  41. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/__init__.py +0 -0
  42. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/__main__.py +0 -0
  43. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/api.py +0 -0
  44. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/application/__init__.py +0 -0
  45. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/application/wsgi.py +0 -0
  46. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/__init__.py +0 -0
  47. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/admin.py +0 -0
  48. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/card-state.js +0 -0
  49. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/dashboard.css +0 -0
  50. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/default-settings.json +0 -0
  51. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/home-spf-radial.gif +0 -0
  52. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/home-spf-radial.png +0 -0
  53. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/logo.png +0 -0
  54. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/materials-stock.json +0 -0
  55. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/pymiesim-favicon.svg +0 -0
  56. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/pymiesim-logo-dark.svg +0 -0
  57. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/pymiesim-logo.svg +0 -0
  58. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/assets/simulation-sharing.js +0 -0
  59. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/callback_helpers.py +0 -0
  60. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/components/__init__.py +0 -0
  61. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/components/cards.py +0 -0
  62. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/computation.py +0 -0
  63. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/defaults.py +0 -0
  64. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/experiment_service.py +0 -0
  65. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/interface.py +0 -0
  66. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/jobs.py +0 -0
  67. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/layout.py +0 -0
  68. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/material_catalog.py +0 -0
  69. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/models.py +0 -0
  70. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/__init__.py +0 -0
  71. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/citation.py +0 -0
  72. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/documentation.py +0 -0
  73. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/examples.py +0 -0
  74. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/__init__.py +0 -0
  75. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/page.py +0 -0
  76. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/sections/__init__.py +0 -0
  77. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/experiment/sections/configuration.py +0 -0
  78. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/field_syntax.py +0 -0
  79. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/home.py +0 -0
  80. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/install_local.py +0 -0
  81. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/population.py +0 -0
  82. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/sellmeier.py +0 -0
  83. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/settings.py +0 -0
  84. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/__init__.py +0 -0
  85. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/page.py +0 -0
  86. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/sections/__init__.py +0 -0
  87. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/sections/representations.py +0 -0
  88. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/pages/single/sections/setup.py +0 -0
  89. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/parsing.py +0 -0
  90. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/plotting.py +0 -0
  91. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/population_service.py +0 -0
  92. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/schemas.py +0 -0
  93. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/seo.py +0 -0
  94. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/services.py +0 -0
  95. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/sharing.py +0 -0
  96. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/single_service.py +0 -0
  97. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/usage_metrics.py +0 -0
  98. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX/gui/validation.py +0 -0
  99. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/dependency_links.txt +0 -0
  100. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/entry_points.txt +0 -0
  101. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/PyMieSimX.egg-info/top_level.txt +0 -0
  102. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/pytest.ini +0 -0
  103. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/setup.cfg +0 -0
  104. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/cli.py +0 -0
  105. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_admin.py +0 -0
  106. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_api.py +0 -0
  107. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_dash_callbacks.py +0 -0
  108. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_examples.py +0 -0
  109. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_home.py +0 -0
  110. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_population.py +0 -0
  111. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_seo.py +0 -0
  112. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_services.py +0 -0
  113. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tests/gui/test_usage_metrics.py +0 -0
  114. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tools/generate_home_spf.py +0 -0
  115. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tools/next_release_version.py +0 -0
  116. {pymiesimx-0.3.0 → pymiesimx-0.4.3}/tools/release_tag.py +0 -0
  117. {pymiesimx-0.3.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 }}
@@ -0,0 +1,21 @@
1
+ name: Publish Conda package
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ tags: ["v*"]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ publish:
13
+ uses: MartinPdeS/MPSActions/.github/workflows/publish_compiled_package_to_anaconda.yml@a01969bc5af90666281f9d37acffdf6a4629763a
14
+ with:
15
+ python_versions: '["3.11", "3.12", "3.13", "3.14"]'
16
+ os_list: '["ubuntu-latest", "macos-latest", "windows-latest"]'
17
+ package_name: pymiesimx
18
+ recipe_path: conda.recipe
19
+ test_import: PyMieSimX
20
+ secrets:
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: >-
@@ -12,11 +12,15 @@ permissions:
12
12
  jobs:
13
13
  tests:
14
14
  runs-on: ubuntu-latest
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ python-version: ["3.11", "3.14"]
15
19
  steps:
16
20
  - name: Set up Python and CI dependencies
17
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
21
+ uses: MartinPdeS/MPSActions/actions/setup-python@a01969bc5af90666281f9d37acffdf6a4629763a
18
22
  with:
19
- python-version: "3.11"
23
+ python-version: "${{ matrix.python-version }}"
20
24
  install-command: >-
21
25
  python -m pip install --upgrade pip && python -m pip install -e ".[testing]"
22
26
  - run: python -m PyOptik setup --no-progress
@@ -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,10 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyMieSimX
3
- Version: 0.3.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
7
7
  Project-URL: Repository, https://github.com/MartinPdeS/PyMieSimX
8
+ Classifier: Programming Language :: Python :: 3.11
9
+ Classifier: Programming Language :: Python :: 3.12
10
+ Classifier: Programming Language :: Python :: 3.13
11
+ Classifier: Programming Language :: Python :: 3.14
8
12
  Requires-Python: >=3.11
9
13
  Description-Content-Type: text/x-rst
10
14
  License-File: LICENSE
@@ -14,6 +18,7 @@ Requires-Dist: dash<5,>=4.1.0
14
18
  Requires-Dist: gunicorn<24,>=23.0.0
15
19
  Requires-Dist: numpy<3,>=2.0
16
20
  Requires-Dist: pandas<3,>=2.2
21
+ Requires-Dist: pint<0.26,>=0.24
17
22
  Requires-Dist: plotly<7,>=5.24
18
23
  Requires-Dist: psycopg[binary]<4,>=3.2.9
19
24
  Provides-Extra: testing
@@ -26,11 +31,20 @@ Provides-Extra: dev
26
31
  Requires-Dist: build>=1.2; extra == "dev"
27
32
  Requires-Dist: mypy==1.15.0; extra == "dev"
28
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"
29
38
  Dynamic: license-file
30
39
 
31
40
  PyMieSimX
32
41
  =========
33
42
 
43
+ .. image:: docs/source/_static/logo.svg
44
+ :alt: PyMieSimX
45
+ :align: center
46
+ :width: 420px
47
+
34
48
  PyMieSimX is the standalone graphical interface for `PyMieSim
35
49
  <https://github.com/MartinPdeS/PyMieSim>`_. It provides a Dash application for
36
50
  configuring optical setups, running parameter sweeps, exploring individual
@@ -199,7 +199,7 @@ def register_callbacks(app: Dash, default_measure_options: list[str]) -> None:
199
199
  route = pathname or "/"
200
200
  try:
201
201
  setup = read_simulation(search, route)
202
- share_message = "Shared setup loaded. This simulation runs automatically." if setup else None
202
+ share_message = None
203
203
  except ValueError as error:
204
204
  setup = None
205
205
  share_message = str(error)
@@ -1,10 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyMieSimX
3
- Version: 0.3.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
7
7
  Project-URL: Repository, https://github.com/MartinPdeS/PyMieSimX
8
+ Classifier: Programming Language :: Python :: 3.11
9
+ Classifier: Programming Language :: Python :: 3.12
10
+ Classifier: Programming Language :: Python :: 3.13
11
+ Classifier: Programming Language :: Python :: 3.14
8
12
  Requires-Python: >=3.11
9
13
  Description-Content-Type: text/x-rst
10
14
  License-File: LICENSE
@@ -14,6 +18,7 @@ Requires-Dist: dash<5,>=4.1.0
14
18
  Requires-Dist: gunicorn<24,>=23.0.0
15
19
  Requires-Dist: numpy<3,>=2.0
16
20
  Requires-Dist: pandas<3,>=2.2
21
+ Requires-Dist: pint<0.26,>=0.24
17
22
  Requires-Dist: plotly<7,>=5.24
18
23
  Requires-Dist: psycopg[binary]<4,>=3.2.9
19
24
  Provides-Extra: testing
@@ -26,11 +31,20 @@ Provides-Extra: dev
26
31
  Requires-Dist: build>=1.2; extra == "dev"
27
32
  Requires-Dist: mypy==1.15.0; extra == "dev"
28
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"
29
38
  Dynamic: license-file
30
39
 
31
40
  PyMieSimX
32
41
  =========
33
42
 
43
+ .. image:: docs/source/_static/logo.svg
44
+ :alt: PyMieSimX
45
+ :align: center
46
+ :width: 420px
47
+
34
48
  PyMieSimX is the standalone graphical interface for `PyMieSim
35
49
  <https://github.com/MartinPdeS/PyMieSim>`_. It provides a Dash application for
36
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,10 +20,18 @@ 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
  ]
26
27
 
28
+ classifiers = [
29
+ "Programming Language :: Python :: 3.11",
30
+ "Programming Language :: Python :: 3.12",
31
+ "Programming Language :: Python :: 3.13",
32
+ "Programming Language :: Python :: 3.14",
33
+ ]
34
+
27
35
  [project.urls]
28
36
  Repository = "https://github.com/MartinPdeS/PyMieSimX"
29
37
 
@@ -44,6 +52,12 @@ dev = [
44
52
  "mypy==1.15.0",
45
53
  "ruff==0.11.2",
46
54
  ]
55
+ docs = [
56
+ "MartinPdeS-docs>=0.1.4",
57
+ ]
58
+ documentation = [
59
+ "MartinPdeS-docs>=0.1.4",
60
+ ]
47
61
 
48
62
  [tool.setuptools.packages.find]
49
63
  include = ["PyMieSimX*"]
@@ -534,8 +534,8 @@ def test_shared_sweep_restores_saved_inputs_and_runs_once(dash_duo, viewport, is
534
534
  }
535
535
  link = _shared_url(dash_duo, "/experiment", controls, {"font_size": 22, "show_grid": False, "template": "plotly_dark"})
536
536
  dash_duo.driver.get(link)
537
- dash_duo.wait_for_element(".simulation-link-notice")
538
537
  WebDriverWait(dash_duo.driver, 30).until(lambda _: dash_duo.find_element("#export-csv").is_enabled())
538
+ assert not dash_duo.driver.find_elements("css selector", ".simulation-link-notice")
539
539
  WebDriverWait(dash_duo.driver, 10).until(lambda driver: "diameter" in dash_duo.find_element("#x-axis-select").text)
540
540
  assert "Qsca" in dash_duo.find_element("#measure-select").text
541
541
  assert "Qext" in dash_duo.find_element("#measure-select").text
@@ -588,8 +588,8 @@ def test_shared_single_setup_runs_once_with_restored_projection_and_remains_edit
588
588
  _shared_field_id("single-scatterer", "material"): "1.47+0.02j",
589
589
  "plot-single-font-size": 21, "plot-single-grid": False}
590
590
  dash_duo.driver.get(_shared_url(dash_duo, "/single", controls, {"font_size": 21, "show_grid": False}))
591
- dash_duo.wait_for_element(".simulation-link-notice")
592
591
  WebDriverWait(dash_duo.driver, 30).until(lambda _: dash_duo.find_element("#export-single-csv").is_enabled())
592
+ assert not dash_duo.driver.find_elements("css selector", ".simulation-link-notice")
593
593
  assert len(runs) == 1
594
594
  assert runs[0]["projection"] == "polar_1d"
595
595
  assert runs[0]["sampling"] == "24"
@@ -635,8 +635,8 @@ def test_shared_population_runs_with_restored_values_and_invalid_link_recovers(d
635
635
  "population-diameter": "210", "population-concentration-basis": "volume",
636
636
  "population-concentration": "0.0023"}
637
637
  dash_duo.driver.get(_shared_url(dash_duo, "/population", controls))
638
- dash_duo.wait_for_element(".simulation-link-notice")
639
638
  dash_duo.wait_for_text_to_equal("#population-status", "Completed. All population properties are shown below.")
639
+ assert not dash_duo.driver.find_elements("css selector", ".simulation-link-notice")
640
640
  copied = read_simulation(urlsplit(_copy_shared_link(dash_duo)).query, "/population")
641
641
  assert copied["controls"].items() >= controls.items()
642
642
  assert dash_duo.find_element("#population-export").is_enabled()
@@ -134,7 +134,7 @@ def test_route_restores_controls_and_arms_run_after_restoration():
134
134
  assert armed["expected_controls"] == sweep_payload()["controls"]
135
135
  assert field_key("source", "wavelength") in armed["field_keys"]
136
136
  assert field_key("scatterer", "diameter") in armed["field_keys"]
137
- assert "runs automatically" in str(page)
137
+ assert not any(getattr(item, "className", None) == "simulation-link-notice" for item in components(page))
138
138
  fields = callback(app, "_render_source_fields")("PlaneWaveSet", search_for(sweep_payload()))
139
139
  wavelength = next(item for item in components(fields) if getattr(item, "id", None) == {"kind": "field", "section": "source", "name": "wavelength"})
140
140
  assert wavelength.value == "600:700:3"
@@ -1,29 +0,0 @@
1
- name: Publish Conda package
2
-
3
- on:
4
- workflow_dispatch:
5
- push:
6
- tags: ["v*"]
7
-
8
- permissions:
9
- contents: read
10
-
11
- jobs:
12
- publish:
13
- uses: MartinPdeS/MPSActions/.github/workflows/publish_compiled_package_to_anaconda.yml@v5
14
- with:
15
- python_versions: '["3.11", "3.12", "3.13"]'
16
- os_list: '["ubuntu-latest", "macos-latest", "windows-latest"]'
17
- package_name: pymiesimx
18
- recipe_path: conda.recipe
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
- secrets:
29
- ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_API_TOKEN }}
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.3.0",
3
- "distance": 0,
4
- "node": "g84099b9d294c7cf0842206e0549d4505b313965c",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-05"
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