PyFiberModes 0.17.4__tar.gz → 0.17.7__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 (182) hide show
  1. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/.github/workflows/deploy_coverage.yml +1 -1
  2. pyfibermodes-0.17.7/.github/workflows/deploy_documentation.yml +20 -0
  3. pyfibermodes-0.17.7/.github/workflows/deploy_release.yml +35 -0
  4. pyfibermodes-0.17.7/.github/workflows/quality.yml +21 -0
  5. pyfibermodes-0.17.7/.github/workflows/tests.yml +19 -0
  6. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/.zenodo.json +2 -2
  7. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/CHANGELOG.md +10 -1
  8. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PKG-INFO +3 -3
  9. pyfibermodes-0.17.7/PyFiberModes/_version.py +34 -0
  10. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes.egg-info/PKG-INFO +3 -3
  11. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes.egg-info/SOURCES.txt +1 -4
  12. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes.egg-info/requires.txt +1 -1
  13. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/README.rst +1 -1
  14. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/conda.recipe/meta.yaml +1 -1
  15. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/_static/default.css +9 -0
  16. pyfibermodes-0.17.7/docs/source/_static/favicon.png +0 -0
  17. pyfibermodes-0.17.7/docs/source/_static/logo.png +0 -0
  18. pyfibermodes-0.17.7/docs/source/_static/thumbnail.png +0 -0
  19. pyfibermodes-0.17.7/docs/source/conf.py +41 -0
  20. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/index.rst +1 -1
  21. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/pyproject.toml +2 -3
  22. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tools/release_tag.py +12 -1
  23. pyfibermodes-0.17.4/.github/workflows/deploy_PyPi.yml +0 -29
  24. pyfibermodes-0.17.4/.github/workflows/deploy_anaconda.yml +0 -36
  25. pyfibermodes-0.17.4/.github/workflows/deploy_documentation.yml +0 -40
  26. pyfibermodes-0.17.4/.github/workflows/quality.yml +0 -24
  27. pyfibermodes-0.17.4/.github/workflows/tests.yml +0 -29
  28. pyfibermodes-0.17.4/PyFiberModes/_version.py +0 -24
  29. pyfibermodes-0.17.4/docs/source/_static/favicon.png +0 -0
  30. pyfibermodes-0.17.4/docs/source/_static/favicon.svg +0 -1
  31. pyfibermodes-0.17.4/docs/source/_static/logo.png +0 -0
  32. pyfibermodes-0.17.4/docs/source/_static/logo.svg +0 -1
  33. pyfibermodes-0.17.4/docs/source/_static/thumbnail.png +0 -0
  34. pyfibermodes-0.17.4/docs/source/conf.py +0 -55
  35. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/.coveragerc +0 -0
  36. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/.github/dependabot.yml +0 -0
  37. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/.gitignore +0 -0
  38. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/CITATION.cff +0 -0
  39. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/CONTRIBUTING.md +0 -0
  40. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/LICENSE +0 -0
  41. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/MANIFEST.in +0 -0
  42. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/Makefile +0 -0
  43. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/__init__.py +0 -0
  44. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/analysis.py +0 -0
  45. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/coordinates.py +0 -0
  46. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/directories.py +0 -0
  47. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/exceptions.py +0 -0
  48. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/factory.py +0 -0
  49. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber.py +0 -0
  50. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/1550BHP.yaml +0 -0
  51. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/DCF13.yaml +0 -0
  52. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/DCF1300S_20.yaml +0 -0
  53. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/DCF1300S_26.yaml +0 -0
  54. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/DCF1300S_33.yaml +0 -0
  55. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/DCF1300S_42.yaml +0 -0
  56. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/F2028M12.yaml +0 -0
  57. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/F2028M21.yaml +0 -0
  58. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/F2028M24.yaml +0 -0
  59. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/F2058G1.yaml +0 -0
  60. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/F2058L1.yaml +0 -0
  61. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/HI1060.yaml +0 -0
  62. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/HP630.yaml +0 -0
  63. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/SM1950.yaml +0 -0
  64. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/SMF28.yaml +0 -0
  65. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/fluorine_doped_1%_capillary.yaml +0 -0
  66. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/fluorine_doped_2%_capillary.yaml +0 -0
  67. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/test_fiber.yaml +0 -0
  68. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fiber_files/test_multimode_fiber.yaml +0 -0
  69. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/field.py +0 -0
  70. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/fundamentals.py +0 -0
  71. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/loader.py +0 -0
  72. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/materials.py +0 -0
  73. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/mode.py +0 -0
  74. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/mode_instances.py +0 -0
  75. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/models.py +0 -0
  76. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/optimization.py +0 -0
  77. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/plotting.py +0 -0
  78. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/propagation.py +0 -0
  79. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/services.py +0 -0
  80. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/__init__.py +0 -0
  81. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/base_solver.py +0 -0
  82. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/multilayer/__init__.py +0 -0
  83. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/multilayer/effective_index.py +0 -0
  84. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/protocols.py +0 -0
  85. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/results.py +0 -0
  86. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/three_layer/__init__.py +0 -0
  87. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/three_layer/cutoff.py +0 -0
  88. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/two_layer/__init__.py +0 -0
  89. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/two_layer/cutoff.py +0 -0
  90. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/solver/two_layer/effective_index.py +0 -0
  91. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/source.py +0 -0
  92. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes/stepindex.py +0 -0
  93. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes.egg-info/dependency_links.txt +0 -0
  94. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/PyFiberModes.egg-info/top_level.txt +0 -0
  95. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/benchmarks/README.md +0 -0
  96. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/benchmarks/test_field_performance.py +0 -0
  97. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/Makefile +0 -0
  98. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/README.rst +0 -0
  99. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/SMF28/README.rst +0 -0
  100. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/SMF28/plot_smf28.py +0 -0
  101. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/SMF28/plot_smf28_dispersion_vs_wavelength.py +0 -0
  102. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/SMF28/plot_smf28_group_index_vs_wavelength.py +0 -0
  103. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/analysis/README.rst +0 -0
  104. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/analysis/plot_coupled_mode_exchange.py +0 -0
  105. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/analysis/plot_guided_mode_discovery.py +0 -0
  106. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/analysis/plot_structured_wavelength_sweep.py +0 -0
  107. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/README.rst +0 -0
  108. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_U_vs_V.py +0 -0
  109. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_comparison_solvers.py +0 -0
  110. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_dispersion.py +0 -0
  111. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_effective_index.py +0 -0
  112. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_fiber_LP_modes.py +0 -0
  113. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_group_index.py +0 -0
  114. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_mode_field.py +0 -0
  115. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_mode_field_1.py +0 -0
  116. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_mode_field_2.py +0 -0
  117. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/basic/plot_neff_tapered_fiber.py +0 -0
  118. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/benchmarks/README.rst +0 -0
  119. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/benchmarks/plot_component_batching_speedup.py +0 -0
  120. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/benchmarks/plot_field_grid_scaling.py +0 -0
  121. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/benchmarks/plot_modal_cache_speedup.py +0 -0
  122. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/fields/README.rst +0 -0
  123. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/fields/plot_confinement_by_radius.py +0 -0
  124. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/fields/plot_polarization_rotation.py +0 -0
  125. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/fields/plot_vector_components.py +0 -0
  126. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/specialty_fibers/README.rst +0 -0
  127. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/specialty_fibers/plot_refractive_index_profile.py +0 -0
  128. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/specialty_fibers/plot_specialty_fiber_catalog.py +0 -0
  129. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/specialty_fibers/plot_specialty_mode_indices.py +0 -0
  130. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/validation/README.rst +0 -0
  131. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/validation/plot_effective_index_bounds.py +0 -0
  132. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/validation/plot_field_area_convergence.py +0 -0
  133. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/examples/validation/plot_normalized_effective_index.py +0 -0
  134. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/make.bat +0 -0
  135. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/redirect.html +0 -0
  136. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/api_policy.rst +0 -0
  137. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/architecture.rst +0 -0
  138. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/code/analysis.rst +0 -0
  139. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/code/fibers.rst +0 -0
  140. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/code/fields.rst +0 -0
  141. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/code/fundamentals.rst +0 -0
  142. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/code.rst +0 -0
  143. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/examples.rst +0 -0
  144. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/getting_started.rst +0 -0
  145. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/guide.rst +0 -0
  146. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/migration_guide.rst +0 -0
  147. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/performance.rst +0 -0
  148. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/public_api_contract.rst +0 -0
  149. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/references.rst +0 -0
  150. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/resources.rst +0 -0
  151. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/theory.rst +0 -0
  152. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/troubleshooting.rst +0 -0
  153. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/user_guide/fibers.rst +0 -0
  154. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/user_guide/fields.rst +0 -0
  155. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/user_guide/index.rst +0 -0
  156. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/user_guide/modes.rst +0 -0
  157. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/user_guide/reproducibility.rst +0 -0
  158. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/user_guide/sweeps.rst +0 -0
  159. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/user_guide/units.rst +0 -0
  160. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/docs/source/workflows.rst +0 -0
  161. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/pytest.ini +0 -0
  162. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/setup.cfg +0 -0
  163. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/__init__.py +0 -0
  164. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/api_snapshot.json +0 -0
  165. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/helpers.py +0 -0
  166. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_advanced_features.py +0 -0
  167. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_api.py +0 -0
  168. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_architecture.py +0 -0
  169. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_architecture_enhancements.py +0 -0
  170. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_coordinates.py +0 -0
  171. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_docstrings.py +0 -0
  172. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_fiber.py +0 -0
  173. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_field.py +0 -0
  174. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_file_loading.py +0 -0
  175. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_physics_regression.py +0 -0
  176. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_public_api.py +0 -0
  177. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_release_tools.py +0 -0
  178. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_three_layer_solver.py +0 -0
  179. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_two_layer_solver.py +0 -0
  180. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tests/test_validation.py +0 -0
  181. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tools/check_release.py +0 -0
  182. {pyfibermodes-0.17.4 → pyfibermodes-0.17.7}/tools/next_release_version.py +0 -0
@@ -12,7 +12,7 @@ permissions:
12
12
 
13
13
  jobs:
14
14
  coverage:
15
- uses: MartinPdeS/MPSActions/.github/workflows/publish_coverage.yml@v5
15
+ uses: MartinPdeS/MPSActions/.github/workflows/publish_coverage.yml@v2
16
16
  with:
17
17
  python-version: "3.11"
18
18
  apt-package: xvfb
@@ -0,0 +1,20 @@
1
+ name: Publish documentation
2
+ 'on':
3
+ push:
4
+ branches:
5
+ - master
6
+ pull_request:
7
+ branches:
8
+ - master
9
+ permissions:
10
+ contents: read
11
+ jobs:
12
+ documentation:
13
+ permissions:
14
+ contents: read
15
+ uses: MartinPdeS/MPSActions/.github/workflows/build_documentation.yml@v2
16
+ with:
17
+ python-version: '3.11'
18
+ package-name: PyFiberModes
19
+ apt-package: xvfb jq
20
+ debug: true
@@ -0,0 +1,35 @@
1
+ name: Publish release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ release:
12
+ permissions:
13
+ contents: write
14
+ pages: write
15
+ id-token: write
16
+ uses: MartinPdeS/MPSActions/.github/workflows/publish_release.yml@v2
17
+ with:
18
+ documentation: true
19
+ documentation_package_name: PyFiberModes
20
+ documentation_python_version: "3.11"
21
+ documentation_apt_package: xvfb jq
22
+ documentation_retain_versions: 5
23
+ debug: true
24
+ pypi_package_type: pure
25
+ pypi_python_version: "3.11"
26
+ pypi_test_command: 'python -c "import PyFiberModes"'
27
+ release_validation_command: 'python tools/check_release.py --version "${GITHUB_REF_NAME}"'
28
+ conda_python_versions: '["3.14"]'
29
+ conda_os_list: '["ubuntu-latest"]'
30
+ conda_package_name: pyfibermodes
31
+ conda_recipe_path: conda.recipe
32
+ conda_test_import: PyFiberModes
33
+ secrets:
34
+ PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
35
+ ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_API_TOKEN }}
@@ -0,0 +1,21 @@
1
+ name: Quality
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ quality:
14
+ uses: MartinPdeS/MPSActions/.github/workflows/run_quality.yml@v2
15
+ with:
16
+ install-command: >-
17
+ python -m pip install --upgrade pip && python -m pip install -e ".[dev]"
18
+ quality-command: |
19
+ python -m ruff check PyFiberModes tests tools
20
+ python -m mypy
21
+ python tools/check_release.py
@@ -0,0 +1,19 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ tests:
14
+ uses: MartinPdeS/MPSActions/.github/workflows/run_tests.yml@v2
15
+ with:
16
+ python-versions: '["3.11", "3.12", "3.13", "3.14"]'
17
+ install-command: >-
18
+ python -m pip install --upgrade pip && python -m pip install -e ".[testing]"
19
+ test-command: python -m pytest -q
@@ -9,8 +9,8 @@
9
9
  "license": "MIT",
10
10
  "upload_type": "software",
11
11
  "access_right": "open",
12
- "version": "0.17.4",
13
- "publication_date": "2026-10-20",
12
+ "version": "0.17.7",
13
+ "publication_date": "2026-10-23",
14
14
  "keywords": [
15
15
  "optical fibers",
16
16
  "guided modes",
@@ -6,6 +6,12 @@ use [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.17.7] - 2026-10-23
10
+
11
+ ## [0.17.6] - 2026-10-22
12
+
13
+ ## [0.17.5] - 2026-10-22
14
+
9
15
  ## [0.17.4] - 2026-10-20
10
16
 
11
17
  ## [0.17.3] - 2026-10-16
@@ -169,7 +175,10 @@ use [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
169
175
 
170
176
  - Established the current tagged baseline for subsequent documented releases.
171
177
 
172
- [Unreleased]: https://github.com/MartinPdeS/PyFiberModes/compare/v0.17.4...HEAD
178
+ [Unreleased]: https://github.com/MartinPdeS/PyFiberModes/compare/v0.17.7...HEAD
179
+ [0.17.7]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.17.7
180
+ [0.17.6]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.17.6
181
+ [0.17.5]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.17.5
173
182
  [0.17.4]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.17.4
174
183
  [0.17.3]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.17.3
175
184
  [0.17.2]: https://github.com/MartinPdeS/PyFiberModes/releases/tag/v0.17.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFiberModes
3
- Version: 0.17.4
3
+ Version: 0.17.7
4
4
  Summary: Guided-mode analysis and design for circular optical fibers.
5
5
  Author-email: Martin Poinsinet de Sivry-Houle <martin.poinsinet.de.sivry@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -715,14 +715,14 @@ Requires-Dist: matplotlib>=3.8; extra == "plotting"
715
715
  Provides-Extra: benchmarking
716
716
  Requires-Dist: pytest-benchmark<6,>=5; extra == "benchmarking"
717
717
  Provides-Extra: documentation
718
- Requires-Dist: MartinPdeS-docs<0.2,>=0.1.4; extra == "documentation"
718
+ Requires-Dist: MartinPdeS-docs<0.3,>=0.2.5; extra == "documentation"
719
719
  Requires-Dist: matplotlib>=3.8; extra == "documentation"
720
720
  Provides-Extra: dev
721
721
  Requires-Dist: ruff<1,>=0.8; extra == "dev"
722
722
  Requires-Dist: mypy<3,>=1.15; extra == "dev"
723
723
  Dynamic: license-file
724
724
 
725
- .. image:: https://raw.githubusercontent.com/MartinPdeS/PyFiberModes/master/docs/source/_static/logo.svg
725
+ .. image:: https://raw.githubusercontent.com/MartinPdeS/PyFiberModes/master/docs/source/_static/logo.png
726
726
  :width: 620
727
727
  :align: center
728
728
  :alt: PyFiberModes logo
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '0.17.7'
32
+ __version_tuple__ = version_tuple = (0, 17, 7)
33
+
34
+ __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFiberModes
3
- Version: 0.17.4
3
+ Version: 0.17.7
4
4
  Summary: Guided-mode analysis and design for circular optical fibers.
5
5
  Author-email: Martin Poinsinet de Sivry-Houle <martin.poinsinet.de.sivry@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -715,14 +715,14 @@ Requires-Dist: matplotlib>=3.8; extra == "plotting"
715
715
  Provides-Extra: benchmarking
716
716
  Requires-Dist: pytest-benchmark<6,>=5; extra == "benchmarking"
717
717
  Provides-Extra: documentation
718
- Requires-Dist: MartinPdeS-docs<0.2,>=0.1.4; extra == "documentation"
718
+ Requires-Dist: MartinPdeS-docs<0.3,>=0.2.5; extra == "documentation"
719
719
  Requires-Dist: matplotlib>=3.8; extra == "documentation"
720
720
  Provides-Extra: dev
721
721
  Requires-Dist: ruff<1,>=0.8; extra == "dev"
722
722
  Requires-Dist: mypy<3,>=1.15; extra == "dev"
723
723
  Dynamic: license-file
724
724
 
725
- .. image:: https://raw.githubusercontent.com/MartinPdeS/PyFiberModes/master/docs/source/_static/logo.svg
725
+ .. image:: https://raw.githubusercontent.com/MartinPdeS/PyFiberModes/master/docs/source/_static/logo.png
726
726
  :width: 620
727
727
  :align: center
728
728
  :alt: PyFiberModes logo
@@ -11,10 +11,9 @@ README.rst
11
11
  pyproject.toml
12
12
  pytest.ini
13
13
  .github/dependabot.yml
14
- .github/workflows/deploy_PyPi.yml
15
- .github/workflows/deploy_anaconda.yml
16
14
  .github/workflows/deploy_coverage.yml
17
15
  .github/workflows/deploy_documentation.yml
16
+ .github/workflows/deploy_release.yml
18
17
  .github/workflows/quality.yml
19
18
  .github/workflows/tests.yml
20
19
  PyFiberModes/__init__.py
@@ -133,9 +132,7 @@ docs/source/troubleshooting.rst
133
132
  docs/source/workflows.rst
134
133
  docs/source/_static/default.css
135
134
  docs/source/_static/favicon.png
136
- docs/source/_static/favicon.svg
137
135
  docs/source/_static/logo.png
138
- docs/source/_static/logo.svg
139
136
  docs/source/_static/thumbnail.png
140
137
  docs/source/code/analysis.rst
141
138
  docs/source/code/fibers.rst
@@ -11,7 +11,7 @@ ruff<1,>=0.8
11
11
  mypy<3,>=1.15
12
12
 
13
13
  [documentation]
14
- MartinPdeS-docs<0.2,>=0.1.4
14
+ MartinPdeS-docs<0.3,>=0.2.5
15
15
  matplotlib>=3.8
16
16
 
17
17
  [plotting]
@@ -1,4 +1,4 @@
1
- .. image:: https://raw.githubusercontent.com/MartinPdeS/PyFiberModes/master/docs/source/_static/logo.svg
1
+ .. image:: https://raw.githubusercontent.com/MartinPdeS/PyFiberModes/master/docs/source/_static/logo.png
2
2
  :width: 620
3
3
  :align: center
4
4
  :alt: PyFiberModes logo
@@ -1,6 +1,6 @@
1
1
  package:
2
2
  name: pyfibermodes
3
- version: 0.17.4
3
+ version: 0.17.7
4
4
 
5
5
  source:
6
6
  path: ../
@@ -32,3 +32,12 @@ div.highlight a {
32
32
  .bd-content img[alt="PyFiberModes logo"] {
33
33
  filter: drop-shadow(0 0.7rem 1rem rgb(20 217 255 / 20%));
34
34
  }
35
+
36
+ .bd-header .navbar-brand img.logo__image {
37
+ filter: none !important;
38
+ width: 15rem !important;
39
+ max-width: 100% !important;
40
+ height: auto !important;
41
+ max-height: 5.5rem !important;
42
+ object-fit: contain;
43
+ }
@@ -0,0 +1,41 @@
1
+ """PyFiberModes documentation, using the shared MartinPdeS-docs theme."""
2
+
3
+ from pathlib import Path
4
+ import sys
5
+ import tomllib
6
+
7
+ from martinpdes_docs import configure
8
+
9
+
10
+ ROOT = Path(__file__).resolve().parents[2]
11
+ # Gallery examples and autodoc must describe this checkout.
12
+ sys.path.insert(0, str(ROOT))
13
+
14
+ gallery_sections = [
15
+ "basic",
16
+ "SMF28",
17
+ "specialty_fibers",
18
+ "fields",
19
+ "analysis",
20
+ "validation",
21
+ "benchmarks",
22
+ ]
23
+
24
+ globals().update(
25
+ configure(
26
+ project="PyFiberModes",
27
+ package="PyFiberModes",
28
+ repository="MartinPdeS/PyFiberModes",
29
+ logo="_static/logo.png",
30
+ favicon="_static/favicon.png",
31
+ gallery_sections=gallery_sections,
32
+ gallery_default_thumb="_static/thumbnail.png",
33
+ gallery_options={"abort_on_example_error": True},
34
+ logo_text="",
35
+ autodoc_default_options={"members": True},
36
+ )
37
+ )
38
+
39
+ # Keep page substitutions independent of importing the numerical package.
40
+ metadata = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
41
+ version = release = metadata["project"]["version"]
@@ -1,6 +1,6 @@
1
1
  **Date**: |today|, **Version**: |version|
2
2
 
3
- .. image:: _static/logo.svg
3
+ .. image:: _static/logo.png
4
4
  :width: 620
5
5
  :align: center
6
6
  :alt: PyFiberModes logo
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "PyFiberModes"
7
- version = "0.17.4"
7
+ version = "0.17.7"
8
8
  description = "Guided-mode analysis and design for circular optical fibers."
9
9
  license = {file = "LICENSE"}
10
10
  readme = "README.rst"
@@ -54,7 +54,6 @@ include-package-data = true
54
54
 
55
55
 
56
56
  [tool.setuptools_scm]
57
- write_to = "PyFiberModes/_version.py"
58
57
  version_scheme = "only-version"
59
58
  local_scheme = "no-local-version"
60
59
 
@@ -79,7 +78,7 @@ benchmarking = [
79
78
 
80
79
 
81
80
  documentation = [
82
- "MartinPdeS-docs>=0.1.4,<0.2",
81
+ "MartinPdeS-docs>=0.2.5,<0.3",
83
82
  "matplotlib>=3.8",
84
83
  ]
85
84
 
@@ -11,6 +11,7 @@ import subprocess
11
11
  import sys
12
12
 
13
13
  ROOT = Path(__file__).resolve().parents[1]
14
+ VERSION_FILE = ROOT / "PyFiberModes" / "_version.py"
14
15
  TAG_PATTERN = re.compile(r"v(?P<version>(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*))$")
15
16
 
16
17
 
@@ -82,7 +83,17 @@ def update_changelog(version: str) -> None:
82
83
  def generate_version_file(version: str) -> None:
83
84
  environment = os.environ.copy()
84
85
  environment["SETUPTOOLS_SCM_PRETEND_VERSION"] = version
85
- run(sys.executable, "-m", "vcs_versioning", "--force-write-version-files", env=environment)
86
+ run(
87
+ sys.executable,
88
+ "-c",
89
+ (
90
+ "import setuptools_scm; "
91
+ f"setuptools_scm.get_version(root={str(ROOT)!r}, "
92
+ f"write_to={str(VERSION_FILE.relative_to(ROOT))!r}, "
93
+ "version_scheme='only-version', local_scheme='no-local-version')"
94
+ ),
95
+ env=environment,
96
+ )
86
97
 
87
98
 
88
99
  def create_release(tag: str, version: str) -> None:
@@ -1,29 +0,0 @@
1
- name: Publish to PyPI
2
-
3
- on:
4
- push:
5
- tags: ["v*"]
6
-
7
- permissions:
8
- contents: read
9
-
10
- jobs:
11
- validate-release:
12
- runs-on: ubuntu-latest
13
- steps:
14
- - name: Set up Python for release validation
15
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
16
- with:
17
- python-version: "3.11"
18
- install-command: "true"
19
- fetch-depth: 0
20
- - run: python tools/check_release.py --version "${GITHUB_REF_NAME}"
21
-
22
- publish:
23
- needs: validate-release
24
- uses: MartinPdeS/MPSActions/.github/workflows/publish_pure_package_to_PyPi.yml@v5
25
- with:
26
- python-version: "3.11"
27
- test-command: python -c 'import PyFiberModes'
28
- secrets:
29
- PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
@@ -1,36 +0,0 @@
1
- name: Publish Conda package
2
-
3
- on:
4
- push:
5
- tags: ["v*"]
6
-
7
- permissions:
8
- contents: read
9
-
10
- jobs:
11
- validate-release:
12
- runs-on: ubuntu-latest
13
- steps:
14
- - name: Set up Python for release validation
15
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
16
- with:
17
- python-version: "3.11"
18
- install-command: "true"
19
- fetch-depth: 0
20
- - run: python tools/check_release.py --version "${GITHUB_REF_NAME}"
21
-
22
- publish:
23
- needs: validate-release
24
- uses: MartinPdeS/MPSActions/.github/workflows/publish_compiled_package_to_anaconda.yml@v6
25
- with:
26
- # The recipe is ``noarch: python``. Building it in a platform/version
27
- # matrix creates several artifacts with the same archive path, which
28
- # collide when the reusable workflow merges them before upload.
29
- # One noarch archive supports all declared Python versions; test it on 3.14.
30
- python_versions: '["3.14"]'
31
- os_list: '["ubuntu-latest"]'
32
- package_name: pyfibermodes
33
- recipe_path: conda.recipe
34
- test_import: PyFiberModes
35
- secrets:
36
- ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_API_TOKEN }}
@@ -1,40 +0,0 @@
1
- name: Publish documentation
2
-
3
- on:
4
- push:
5
- branches: [master]
6
- tags: ["v*"]
7
-
8
- permissions:
9
- contents: write
10
- pages: write
11
- id-token: write
12
-
13
- jobs:
14
- documentation:
15
- uses: MartinPdeS/MPSActions/.github/workflows/publish_documentation.yml@a01969bc5af90666281f9d37acffdf6a4629763a
16
- with:
17
- python-version: "3.11"
18
- package-name: PyFiberModes
19
- apt-package: xvfb jq
20
-
21
- maintain_documentation:
22
- needs: documentation
23
- if: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')) }}
24
- runs-on: ubuntu-latest
25
- steps:
26
- - name: Install documentation landing page
27
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
28
- with:
29
- ref: documentation_page
30
- fetch-depth: 0
31
- - run: |
32
- set -Eeuo pipefail
33
- git show "${GITHUB_SHA}:docs/redirect.html" > index.html
34
- test -s docs/latest/index.html
35
- git config user.name "github-actions[bot]"
36
- git config user.email "github-actions[bot]@users.noreply.github.com"
37
- git add index.html
38
- if git diff --cached --quiet; then exit 0; fi
39
- git commit -m "Update documentation landing page [skip ci]"
40
- git push origin HEAD:documentation_page
@@ -1,24 +0,0 @@
1
- name: Static quality checks
2
-
3
- on:
4
- push:
5
- branches: [master]
6
- pull_request:
7
- branches: [master]
8
-
9
- permissions:
10
- contents: read
11
-
12
- jobs:
13
- quality:
14
- runs-on: ubuntu-latest
15
- steps:
16
- - name: Set up Python and CI dependencies
17
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
18
- with:
19
- python-version: "3.11"
20
- install-command: >-
21
- python -m pip install --upgrade pip && python -m pip install -e ".[dev]"
22
- - run: python -m ruff check PyFiberModes tests tools
23
- - run: python -m mypy
24
- - run: python tools/check_release.py
@@ -1,29 +0,0 @@
1
- name: Tests
2
-
3
- on:
4
- push:
5
- branches: [master]
6
- pull_request:
7
- branches: [master]
8
-
9
- permissions:
10
- contents: read
11
-
12
- jobs:
13
- tests:
14
- name: Python ${{ matrix.python-version }}
15
- runs-on: ubuntu-latest
16
- strategy:
17
- fail-fast: false
18
- matrix:
19
- python-version: ["3.11", "3.12", "3.13", "3.14"]
20
- steps:
21
- - name: Set up Python and CI dependencies
22
- uses: MartinPdeS/MPSActions/actions/setup-python@0f5927acf88b25b5d253421e508387897096a2cc
23
- with:
24
- python-version: "${{ matrix.python-version }}"
25
- install-command: >-
26
- python -m pip install --upgrade pip && python -m pip install -e ".[testing]"
27
- - run: python -m pytest -q
28
- env:
29
- MPLBACKEND: Agg
@@ -1,24 +0,0 @@
1
- # file generated by vcs-versioning
2
- # don't change, don't track in version control
3
- from __future__ import annotations
4
-
5
- __all__ = [
6
- "__version__",
7
- "__version_tuple__",
8
- "version",
9
- "version_tuple",
10
- "__commit_id__",
11
- "commit_id",
12
- ]
13
-
14
- version: str
15
- __version__: str
16
- __version_tuple__: tuple[int | str, ...]
17
- version_tuple: tuple[int | str, ...]
18
- commit_id: str | None
19
- __commit_id__: str | None
20
-
21
- __version__ = version = '0.17.4'
22
- __version_tuple__ = version_tuple = (0, 17, 4)
23
-
24
- __commit_id__ = commit_id = None
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><linearGradient id="r" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#8cecff"/><stop offset=".5" stop-color="#16a8d0"/><stop offset="1" stop-color="#172c68"/></linearGradient><radialGradient id="c" cx="35%" cy="32%"><stop stop-color="#d9fbff"/><stop offset="1" stop-color="#08759d"/></radialGradient><radialGradient id="v" cx="35%" cy="32%"><stop stop-color="#f1edff"/><stop offset="1" stop-color="#3c277e"/></radialGradient></defs><rect width="128" height="128" rx="28" fill="#071632"/><circle cx="64" cy="64" r="48" fill="#071632" stroke="url(#r)" stroke-width="10"/><ellipse cx="52" cy="64" rx="23" ry="34" fill="url(#c)"/><ellipse cx="76" cy="64" rx="23" ry="34" fill="url(#v)" opacity=".92"/><circle cx="64" cy="64" r="7" fill="#fff" opacity=".85"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 560 130" role="img" aria-labelledby="t"><title id="t">PyFiberModes</title><defs><linearGradient id="r" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#8cecff"/><stop offset=".5" stop-color="#16a8d0"/><stop offset="1" stop-color="#172c68"/></linearGradient><radialGradient id="c" cx="35%" cy="32%"><stop stop-color="#d9fbff"/><stop offset=".2" stop-color="#31d5ed"/><stop offset="1" stop-color="#08759d"/></radialGradient><radialGradient id="v" cx="35%" cy="32%"><stop stop-color="#f1edff"/><stop offset=".2" stop-color="#a88cff"/><stop offset="1" stop-color="#3c277e"/></radialGradient><filter id="s"><feDropShadow dx="0" dy="7" stdDeviation="5" flood-color="#07152e" flood-opacity=".7"/></filter></defs><g filter="url(#s)"><circle cx="98" cy="65" r="55" fill="#071632" stroke="url(#r)" stroke-width="11"/><ellipse cx="82" cy="65" rx="27" ry="39" fill="url(#c)"/><ellipse cx="113" cy="65" rx="27" ry="39" fill="url(#v)" opacity=".92"/><circle cx="98" cy="65" r="8" fill="#fff" opacity=".8"/><path d="M40 65H20M156 65h20" stroke="#efa31e" stroke-width="10" stroke-linecap="round"/></g><text x="205" y="82" fill="#10244b" font-family="Arial,sans-serif" font-size="42" font-weight="700">PyFiberModes</text></svg>