gratinglab 0.1.7__tar.gz → 0.1.8__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 (155) hide show
  1. {gratinglab-0.1.7/src/gratinglab.egg-info → gratinglab-0.1.8}/PKG-INFO +5 -3
  2. {gratinglab-0.1.7 → gratinglab-0.1.8}/README.md +1 -1
  3. {gratinglab-0.1.7 → gratinglab-0.1.8}/pyproject.toml +15 -1
  4. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/__init__.py +1 -1
  5. {gratinglab-0.1.7 → gratinglab-0.1.8/src/gratinglab.egg-info}/PKG-INFO +5 -3
  6. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab.egg-info/SOURCES.txt +1 -0
  7. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab.egg-info/requires.txt +6 -1
  8. gratinglab-0.1.8/tests/test_changelog.py +34 -0
  9. {gratinglab-0.1.7 → gratinglab-0.1.8}/LICENSE +0 -0
  10. {gratinglab-0.1.7 → gratinglab-0.1.8}/setup.cfg +0 -0
  11. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/checks.py +0 -0
  12. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/compare.py +0 -0
  13. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/convergence.py +0 -0
  14. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/geometry.py +0 -0
  15. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/__init__.py +0 -0
  16. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/app.py +0 -0
  17. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/diagram.py +0 -0
  18. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/diagram3d.py +0 -0
  19. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/docs.py +0 -0
  20. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/icon.py +0 -0
  21. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/integral_options.py +0 -0
  22. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/mathtext.py +0 -0
  23. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/orders.py +0 -0
  24. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/provenance.py +0 -0
  25. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/__init__.py +0 -0
  26. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/gc_guard.py +0 -0
  27. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/geometry_panel.py +0 -0
  28. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/geometry_tab.py +0 -0
  29. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/integral_tab.py +0 -0
  30. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/main_window.py +0 -0
  31. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/profile_plot_panel.py +0 -0
  32. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/scalar_tab.py +0 -0
  33. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/scene3d_panel.py +0 -0
  34. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/setup_tab.py +0 -0
  35. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/sizing.py +0 -0
  36. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/theory_viewer.py +0 -0
  37. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/qt/worker.py +0 -0
  38. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/richtext.py +0 -0
  39. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/scalar_options.py +0 -0
  40. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/gui/state.py +0 -0
  41. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/illumination.py +0 -0
  42. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/io/__init__.py +0 -0
  43. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/io/boundary.py +0 -0
  44. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/io/efficiency_table.py +0 -0
  45. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/io/ggp.py +0 -0
  46. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/materials/__init__.py +0 -0
  47. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/materials/data/SOURCES.md +0 -0
  48. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/materials/fresnel.py +0 -0
  49. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/materials/optical.py +0 -0
  50. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/materials/refractiveindex.py +0 -0
  51. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/__init__.py +0 -0
  52. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/analyzer.py +0 -0
  53. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/boundary/__init__.py +0 -0
  54. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/boundary/average.py +0 -0
  55. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/boundary/pipeline.py +0 -0
  56. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/boundary/swaths.py +0 -0
  57. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/cli.py +0 -0
  58. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/config.py +0 -0
  59. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/core/__init__.py +0 -0
  60. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/core/analysis.py +0 -0
  61. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/core/image_flatten.py +0 -0
  62. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/core/processing.py +0 -0
  63. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/core/tip.py +0 -0
  64. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/data/__init__.py +0 -0
  65. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/data/aggregation.py +0 -0
  66. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/__init__.py +0 -0
  67. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/icon.py +0 -0
  68. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/__init__.py +0 -0
  69. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/app.py +0 -0
  70. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/boundary_view.py +0 -0
  71. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/canvas.py +0 -0
  72. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/efficiency_dialog.py +0 -0
  73. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/import_view.py +0 -0
  74. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/main_window.py +0 -0
  75. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/swath_dialog.py +0 -0
  76. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/wiki_view.py +0 -0
  77. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/qt/worker.py +0 -0
  78. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/gui/state.py +0 -0
  79. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/io/__init__.py +0 -0
  80. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/io/file_io.py +0 -0
  81. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/io/metrics.py +0 -0
  82. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/io/spm.py +0 -0
  83. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/settings.py +0 -0
  84. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/stats/__init__.py +0 -0
  85. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/stats/analysis.py +0 -0
  86. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/stats/icc.py +0 -0
  87. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/visualization/__init__.py +0 -0
  88. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/visualization/diagnostics.py +0 -0
  89. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/visualization/profiles.py +0 -0
  90. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/visualization/statistics.py +0 -0
  91. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/__init__.py +0 -0
  92. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/facet-fitting.md +0 -0
  93. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/file-formats.md +0 -0
  94. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/flattening.md +0 -0
  95. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/icc-correction.md +0 -0
  96. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/overview.md +0 -0
  97. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/reading-outputs.md +0 -0
  98. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/row-groups.md +0 -0
  99. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/swath-statistics.md +0 -0
  100. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/wiki/tip-correction.md +0 -0
  101. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/metrology/workflows.py +0 -0
  102. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/problem.py +0 -0
  103. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/profiles.py +0 -0
  104. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/resolution.py +0 -0
  105. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/result.py +0 -0
  106. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/__init__.py +0 -0
  107. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/base.py +0 -0
  108. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/integral/__init__.py +0 -0
  109. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/integral/_boundary.py +0 -0
  110. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/integral/_core.py +0 -0
  111. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/integral/_finite.py +0 -0
  112. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/integral/_greens.py +0 -0
  113. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/integral/_kernels.py +0 -0
  114. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/integral/_nystrom.py +0 -0
  115. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab/solvers/scalar.py +0 -0
  116. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab.egg-info/dependency_links.txt +0 -0
  117. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab.egg-info/entry_points.txt +0 -0
  118. {gratinglab-0.1.7 → gratinglab-0.1.8}/src/gratinglab.egg-info/top_level.txt +0 -0
  119. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_checks.py +0 -0
  120. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_compare.py +0 -0
  121. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_convergence.py +0 -0
  122. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_cross_method.py +0 -0
  123. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_efficiency_table.py +0 -0
  124. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_fresnel.py +0 -0
  125. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_geometry.py +0 -0
  126. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_ggp.py +0 -0
  127. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_diagram.py +0 -0
  128. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_diagram3d.py +0 -0
  129. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_docs.py +0 -0
  130. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_integral_options.py +0 -0
  131. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_mathtext.py +0 -0
  132. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_orders.py +0 -0
  133. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_provenance.py +0 -0
  134. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_qt.py +0 -0
  135. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_richtext.py +0 -0
  136. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_scalar_options.py +0 -0
  137. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_gui_state.py +0 -0
  138. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_illumination.py +0 -0
  139. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_integral_core.py +0 -0
  140. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_integral_corpus.py +0 -0
  141. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_integral_finite.py +0 -0
  142. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_integral_greens.py +0 -0
  143. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_integral_kernels.py +0 -0
  144. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_integral_operators.py +0 -0
  145. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_integral_solver.py +0 -0
  146. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_io_boundary.py +0 -0
  147. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_materials.py +0 -0
  148. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_perturbation.py +0 -0
  149. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_profiles.py +0 -0
  150. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_refractiveindex.py +0 -0
  151. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_resolution.py +0 -0
  152. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_result.py +0 -0
  153. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_scalar.py +0 -0
  154. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_solver_conformance.py +0 -0
  155. {gratinglab-0.1.7 → gratinglab-0.1.8}/tests/test_solver_progress.py +0 -0
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gratinglab
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: Open platform for diffraction grating groove metrology and efficiency analysis
5
5
  Author: Jake McCoy
6
6
  License: BSD-3-Clause
7
7
  Project-URL: Homepage, https://github.com/jamccoy/gratinglab
8
+ Project-URL: Changelog, https://github.com/jamccoy/gratinglab/blob/master/CHANGELOG.md
8
9
  Keywords: diffraction,grating,efficiency,rcwa,x-ray,spectroscopy,afm,metrology,blaze,pcgrate
9
10
  Classifier: Development Status :: 2 - Pre-Alpha
10
11
  Classifier: Intended Audience :: Science/Research
@@ -27,7 +28,8 @@ Requires-Dist: pandas>=2.1; extra == "dev"
27
28
  Requires-Dist: ruff>=0.16; extra == "dev"
28
29
  Provides-Extra: gui
29
30
  Requires-Dist: matplotlib>=3.8; extra == "gui"
30
- Requires-Dist: PySide6-Essentials>=6.7; extra == "gui"
31
+ Requires-Dist: PySide6-Essentials!=6.12.0,>=6.7; python_version < "3.12" and extra == "gui"
32
+ Requires-Dist: PySide6-Essentials>=6.7; python_version >= "3.12" and extra == "gui"
31
33
  Requires-Dist: endstation[qt]>=0.2.2; extra == "gui"
32
34
  Provides-Extra: metrology
33
35
  Requires-Dist: matplotlib>=3.9; extra == "metrology"
@@ -44,7 +46,7 @@ Dynamic: license-file
44
46
  [![tests](https://github.com/jamccoy/gratinglab/actions/workflows/test.yml/badge.svg)](https://github.com/jamccoy/gratinglab/actions/workflows/test.yml)
45
47
  [![License: BSD-3-Clause](https://img.shields.io/badge/license-BSD--3--Clause-blue)](https://github.com/jamccoy/gratinglab/blob/master/LICENSE)
46
48
 
47
- **[PyPI](https://pypi.org/project/gratinglab/)** · **[Documentation](https://github.com/jamccoy/gratinglab/wiki)** · **[Releases](https://github.com/jamccoy/gratinglab/releases)** · **[Issues](https://github.com/jamccoy/gratinglab/issues)**
49
+ **[PyPI](https://pypi.org/project/gratinglab/)** · **[Documentation](https://github.com/jamccoy/gratinglab/wiki)** · **[Changelog](https://github.com/jamccoy/gratinglab/blob/master/CHANGELOG.md)** · **[Releases](https://github.com/jamccoy/gratinglab/releases)** · **[Issues](https://github.com/jamccoy/gratinglab/issues)**
48
50
 
49
51
  gratinglab is a Python package for measuring the groove profiles of diffraction
50
52
  gratings from atomic force microscope (AFM) scans and for computing the diffraction
@@ -5,7 +5,7 @@
5
5
  [![tests](https://github.com/jamccoy/gratinglab/actions/workflows/test.yml/badge.svg)](https://github.com/jamccoy/gratinglab/actions/workflows/test.yml)
6
6
  [![License: BSD-3-Clause](https://img.shields.io/badge/license-BSD--3--Clause-blue)](https://github.com/jamccoy/gratinglab/blob/master/LICENSE)
7
7
 
8
- **[PyPI](https://pypi.org/project/gratinglab/)** · **[Documentation](https://github.com/jamccoy/gratinglab/wiki)** · **[Releases](https://github.com/jamccoy/gratinglab/releases)** · **[Issues](https://github.com/jamccoy/gratinglab/issues)**
8
+ **[PyPI](https://pypi.org/project/gratinglab/)** · **[Documentation](https://github.com/jamccoy/gratinglab/wiki)** · **[Changelog](https://github.com/jamccoy/gratinglab/blob/master/CHANGELOG.md)** · **[Releases](https://github.com/jamccoy/gratinglab/releases)** · **[Issues](https://github.com/jamccoy/gratinglab/issues)**
9
9
 
10
10
  gratinglab is a Python package for measuring the groove profiles of diffraction
11
11
  gratings from atomic force microscope (AFM) scans and for computing the diffraction
@@ -48,7 +48,20 @@ dev = ["pytest>=7", "pytest-qt>=4.5", "matplotlib>=3.8", "pandas>=2.1", "ruff>=0
48
48
  #
49
49
  # PySide6 (LGPLv3) rather than PyQt6 (GPL): this package is BSD-3, and an
50
50
  # optional dynamically-linked dependency keeps it that way.
51
- gui = ["matplotlib>=3.8", "PySide6-Essentials>=6.7", "endstation[qt]>=0.2.2"]
51
+ #
52
+ # PySide6 6.12.0 on Python 3.11 aborts the interpreter at exit (Fatal Python
53
+ # error: bool_dealloc) after heavy GUI use: it releases a reference to True or
54
+ # False that it does not own, which on 3.11 eventually frees the object during
55
+ # finalization. On 3.12 and later True and False are immortal and the bug is
56
+ # harmless. Measured in CI on 2026-10-22: 6.9.3, 6.10.3 and 6.11.2 passed twice
57
+ # each and 6.12.0 crashed twice. Only that release is excluded, and only on 3.11,
58
+ # so a fixed 6.12.x is taken as soon as it exists.
59
+ gui = [
60
+ "matplotlib>=3.8",
61
+ "PySide6-Essentials>=6.7,!=6.12.0; python_version < '3.12'",
62
+ "PySide6-Essentials>=6.7; python_version >= '3.12'",
63
+ "endstation[qt]>=0.2.2",
64
+ ]
52
65
  # Groove metrology: reading AFM scans and averaging them into a boundary
53
66
  # profile. An extra for the same reason the GUI is one -- `pip install
54
67
  # gratinglab` must stay numpy/scipy/pydantic, so a solver-only user never
@@ -76,6 +89,7 @@ gratinglab-metrology = "gratinglab.metrology.cli:main"
76
89
 
77
90
  [project.urls]
78
91
  Homepage = "https://github.com/jamccoy/gratinglab"
92
+ Changelog = "https://github.com/jamccoy/gratinglab/blob/master/CHANGELOG.md"
79
93
 
80
94
  # Solver backends register here. A backend may live in its own distribution.
81
95
  [project.entry-points."gratinglab.solvers"]
@@ -21,7 +21,7 @@ from .illumination import Illumination, Polarization
21
21
  from .resolution import ResolvingPower, resolving_power
22
22
  from .result import EfficiencyScan, OrderEfficiency, Provenance
23
23
 
24
- __version__ = "0.1.7"
24
+ __version__ = "0.1.8"
25
25
 
26
26
  __all__ = [
27
27
  "Illumination",
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gratinglab
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: Open platform for diffraction grating groove metrology and efficiency analysis
5
5
  Author: Jake McCoy
6
6
  License: BSD-3-Clause
7
7
  Project-URL: Homepage, https://github.com/jamccoy/gratinglab
8
+ Project-URL: Changelog, https://github.com/jamccoy/gratinglab/blob/master/CHANGELOG.md
8
9
  Keywords: diffraction,grating,efficiency,rcwa,x-ray,spectroscopy,afm,metrology,blaze,pcgrate
9
10
  Classifier: Development Status :: 2 - Pre-Alpha
10
11
  Classifier: Intended Audience :: Science/Research
@@ -27,7 +28,8 @@ Requires-Dist: pandas>=2.1; extra == "dev"
27
28
  Requires-Dist: ruff>=0.16; extra == "dev"
28
29
  Provides-Extra: gui
29
30
  Requires-Dist: matplotlib>=3.8; extra == "gui"
30
- Requires-Dist: PySide6-Essentials>=6.7; extra == "gui"
31
+ Requires-Dist: PySide6-Essentials!=6.12.0,>=6.7; python_version < "3.12" and extra == "gui"
32
+ Requires-Dist: PySide6-Essentials>=6.7; python_version >= "3.12" and extra == "gui"
31
33
  Requires-Dist: endstation[qt]>=0.2.2; extra == "gui"
32
34
  Provides-Extra: metrology
33
35
  Requires-Dist: matplotlib>=3.9; extra == "metrology"
@@ -44,7 +46,7 @@ Dynamic: license-file
44
46
  [![tests](https://github.com/jamccoy/gratinglab/actions/workflows/test.yml/badge.svg)](https://github.com/jamccoy/gratinglab/actions/workflows/test.yml)
45
47
  [![License: BSD-3-Clause](https://img.shields.io/badge/license-BSD--3--Clause-blue)](https://github.com/jamccoy/gratinglab/blob/master/LICENSE)
46
48
 
47
- **[PyPI](https://pypi.org/project/gratinglab/)** · **[Documentation](https://github.com/jamccoy/gratinglab/wiki)** · **[Releases](https://github.com/jamccoy/gratinglab/releases)** · **[Issues](https://github.com/jamccoy/gratinglab/issues)**
49
+ **[PyPI](https://pypi.org/project/gratinglab/)** · **[Documentation](https://github.com/jamccoy/gratinglab/wiki)** · **[Changelog](https://github.com/jamccoy/gratinglab/blob/master/CHANGELOG.md)** · **[Releases](https://github.com/jamccoy/gratinglab/releases)** · **[Issues](https://github.com/jamccoy/gratinglab/issues)**
48
50
 
49
51
  gratinglab is a Python package for measuring the groove profiles of diffraction
50
52
  gratings from atomic force microscope (AFM) scans and for computing the diffraction
@@ -113,6 +113,7 @@ src/gratinglab/solvers/integral/_finite.py
113
113
  src/gratinglab/solvers/integral/_greens.py
114
114
  src/gratinglab/solvers/integral/_kernels.py
115
115
  src/gratinglab/solvers/integral/_nystrom.py
116
+ tests/test_changelog.py
116
117
  tests/test_checks.py
117
118
  tests/test_compare.py
118
119
  tests/test_convergence.py
@@ -12,9 +12,14 @@ ruff>=0.16
12
12
 
13
13
  [gui]
14
14
  matplotlib>=3.8
15
- PySide6-Essentials>=6.7
16
15
  endstation[qt]>=0.2.2
17
16
 
17
+ [gui:python_version < "3.12"]
18
+ PySide6-Essentials!=6.12.0,>=6.7
19
+
20
+ [gui:python_version >= "3.12"]
21
+ PySide6-Essentials>=6.7
22
+
18
23
  [metrology]
19
24
  matplotlib>=3.9
20
25
 
@@ -0,0 +1,34 @@
1
+ """The changelog has a section for the version being released.
2
+
3
+ A release commit moves the "Unreleased" entries under a heading named for the
4
+ new version. This test fails on the bump commit if that step was forgotten,
5
+ which is the point at which it is cheapest to fix, the same arrangement as the
6
+ CITATION.cff test.
7
+ """
8
+ import re
9
+ from pathlib import Path
10
+
11
+ import gratinglab
12
+
13
+ ROOT = Path(__file__).resolve().parent.parent
14
+ CHANGELOG = ROOT / "CHANGELOG.md"
15
+
16
+
17
+ def _sections():
18
+ text = CHANGELOG.read_text(encoding="utf-8")
19
+ return re.findall(r"^## (\S+)", text, re.M)
20
+
21
+
22
+ def test_the_current_version_has_a_section():
23
+ assert gratinglab.__version__ in _sections(), (
24
+ f"CHANGELOG.md has no '## {gratinglab.__version__}' section; move the "
25
+ "Unreleased entries under it in the release commit")
26
+
27
+
28
+ def test_unreleased_comes_first_and_versions_descend():
29
+ sections = _sections()
30
+ versions = [s for s in sections if s != "Unreleased"]
31
+ if "Unreleased" in sections:
32
+ assert sections[0] == "Unreleased", "Unreleased must be the first section"
33
+ key = [tuple(int(p) for p in v.split(".")) for v in versions]
34
+ assert key == sorted(key, reverse=True), "versions must be listed newest first"
File without changes
File without changes
File without changes