gwpy 3.0.10__tar.gz → 3.0.12__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 gwpy might be problematic. Click here for more details.

Files changed (377) hide show
  1. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/compatibility.yml +28 -2
  2. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/python-dist.yml +4 -3
  3. gwpy-3.0.12/.gitlab/ci/qa.yml +109 -0
  4. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/rules.yml +14 -3
  5. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/test-job.yml +4 -0
  6. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/test.yml +8 -4
  7. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/twine.yml +6 -5
  8. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab-ci.yml +14 -0
  9. {gwpy-3.0.10 → gwpy-3.0.12}/CONTRIBUTING.md +3 -3
  10. {gwpy-3.0.10/gwpy.egg-info → gwpy-3.0.12}/PKG-INFO +8 -8
  11. {gwpy-3.0.10 → gwpy-3.0.12}/docs/conf.py +1 -1
  12. {gwpy-3.0.10 → gwpy-3.0.12}/docs/install.rst +3 -3
  13. {gwpy-3.0.10 → gwpy-3.0.12}/docs/references.rst +8 -5
  14. {gwpy-3.0.10 → gwpy-3.0.12}/docs/segments/index.rst +1 -1
  15. {gwpy-3.0.10 → gwpy-3.0.12}/docs/timeseries/io.rst +2 -1
  16. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/_version.py +2 -2
  17. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/datafind.py +2 -2
  18. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/ffldatafind.py +1 -1
  19. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_datafind.py +0 -53
  20. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/axes.py +6 -2
  21. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/segments.py +8 -8
  22. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_axes.py +4 -2
  23. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/__init__.py +1 -1
  24. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/io/hdf5.py +1 -1
  25. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/segments.py +1 -1
  26. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/marks.py +1 -1
  27. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/core.py +3 -0
  28. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/gwf/__init__.py +1 -1
  29. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/losc.py +10 -3
  30. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/test_timeseries.py +2 -0
  31. {gwpy-3.0.10 → gwpy-3.0.12/gwpy.egg-info}/PKG-INFO +8 -8
  32. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy.egg-info/SOURCES.txt +0 -2
  33. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy.egg-info/requires.txt +5 -4
  34. {gwpy-3.0.10 → gwpy-3.0.12}/pyproject.toml +51 -6
  35. gwpy-3.0.10/.flake8 +0 -30
  36. gwpy-3.0.10/.gitlab/ci/init-cvmfs.sh +0 -42
  37. gwpy-3.0.10/.gitlab/ci/qa.yml +0 -52
  38. {gwpy-3.0.10 → gwpy-3.0.12}/.gitattributes +0 -0
  39. {gwpy-3.0.10 → gwpy-3.0.12}/.gitignore +0 -0
  40. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/coverage.yml +0 -0
  41. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/init-creds.sh +0 -0
  42. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/platforms.yml +0 -0
  43. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/python-base.yml +0 -0
  44. {gwpy-3.0.10 → gwpy-3.0.12}/.gitlab/ci/sphinx.yml +0 -0
  45. {gwpy-3.0.10 → gwpy-3.0.12}/CODE_OF_CONDUCT.rst +0 -0
  46. {gwpy-3.0.10 → gwpy-3.0.12}/LICENSE +0 -0
  47. {gwpy-3.0.10 → gwpy-3.0.12}/MANIFEST.in +0 -0
  48. {gwpy-3.0.10 → gwpy-3.0.12}/README.md +0 -0
  49. {gwpy-3.0.10 → gwpy-3.0.12}/docs/Makefile +0 -0
  50. {gwpy-3.0.10 → gwpy-3.0.12}/docs/_static/css/gwpy-sphinx.css +0 -0
  51. {gwpy-3.0.10 → gwpy-3.0.12}/docs/_static/favicon.png +0 -0
  52. {gwpy-3.0.10 → gwpy-3.0.12}/docs/_static/gwpy_white_24.png +0 -0
  53. {gwpy-3.0.10 → gwpy-3.0.12}/docs/_templates/autoclass/class.rst +0 -0
  54. {gwpy-3.0.10 → gwpy-3.0.12}/docs/_templates/autosummary/base.rst +0 -0
  55. {gwpy-3.0.10 → gwpy-3.0.12}/docs/_templates/autosummary/class.rst +0 -0
  56. {gwpy-3.0.10 → gwpy-3.0.12}/docs/_templates/autosummary/module.rst +0 -0
  57. {gwpy-3.0.10 → gwpy-3.0.12}/docs/astro/index.rst +0 -0
  58. {gwpy-3.0.10 → gwpy-3.0.12}/docs/citing.rst.in +0 -0
  59. {gwpy-3.0.10 → gwpy-3.0.12}/docs/cli/examples.ini +0 -0
  60. {gwpy-3.0.10 → gwpy-3.0.12}/docs/cli/index.rst +0 -0
  61. {gwpy-3.0.10 → gwpy-3.0.12}/docs/detector/channel.rst +0 -0
  62. {gwpy-3.0.10 → gwpy-3.0.12}/docs/dev/release.rst +0 -0
  63. {gwpy-3.0.10 → gwpy-3.0.12}/docs/env.rst +0 -0
  64. {gwpy-3.0.10 → gwpy-3.0.12}/docs/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  65. {gwpy-3.0.10 → gwpy-3.0.12}/docs/external/framecpp.rst +0 -0
  66. {gwpy-3.0.10 → gwpy-3.0.12}/docs/external/framel.rst +0 -0
  67. {gwpy-3.0.10 → gwpy-3.0.12}/docs/external/lalsuite.rst +0 -0
  68. {gwpy-3.0.10 → gwpy-3.0.12}/docs/external/nds2.rst +0 -0
  69. {gwpy-3.0.10 → gwpy-3.0.12}/docs/gwpy-docs-logo.png +0 -0
  70. {gwpy-3.0.10 → gwpy-3.0.12}/docs/index.rst +0 -0
  71. {gwpy-3.0.10 → gwpy-3.0.12}/docs/overview.rst +0 -0
  72. {gwpy-3.0.10 → gwpy-3.0.12}/docs/plot/colorbars.rst +0 -0
  73. {gwpy-3.0.10 → gwpy-3.0.12}/docs/plot/colors.rst +0 -0
  74. {gwpy-3.0.10 → gwpy-3.0.12}/docs/plot/filter.rst +0 -0
  75. {gwpy-3.0.10 → gwpy-3.0.12}/docs/plot/gps.rst +0 -0
  76. {gwpy-3.0.10 → gwpy-3.0.12}/docs/plot/index.rst +0 -0
  77. {gwpy-3.0.10 → gwpy-3.0.12}/docs/plot/legend.rst +0 -0
  78. {gwpy-3.0.10 → gwpy-3.0.12}/docs/plot/log.rst +0 -0
  79. {gwpy-3.0.10 → gwpy-3.0.12}/docs/segments/dqsegdb.rst +0 -0
  80. {gwpy-3.0.10 → gwpy-3.0.12}/docs/segments/io.rst +0 -0
  81. {gwpy-3.0.10 → gwpy-3.0.12}/docs/segments/thresholding.rst +0 -0
  82. {gwpy-3.0.10 → gwpy-3.0.12}/docs/signal/index.rst +0 -0
  83. {gwpy-3.0.10 → gwpy-3.0.12}/docs/spectrogram/index.rst +0 -0
  84. {gwpy-3.0.10 → gwpy-3.0.12}/docs/spectrum/filtering.rst +0 -0
  85. {gwpy-3.0.10 → gwpy-3.0.12}/docs/spectrum/index.rst +0 -0
  86. {gwpy-3.0.10 → gwpy-3.0.12}/docs/spectrum/io.rst +0 -0
  87. {gwpy-3.0.10 → gwpy-3.0.12}/docs/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  88. {gwpy-3.0.10 → gwpy-3.0.12}/docs/table/filter.rst +0 -0
  89. {gwpy-3.0.10 → gwpy-3.0.12}/docs/table/histogram.rst +0 -0
  90. {gwpy-3.0.10 → gwpy-3.0.12}/docs/table/index.rst +0 -0
  91. {gwpy-3.0.10 → gwpy-3.0.12}/docs/table/io.rst +0 -0
  92. {gwpy-3.0.10 → gwpy-3.0.12}/docs/table/plot.rst +0 -0
  93. {gwpy-3.0.10 → gwpy-3.0.12}/docs/table/rate.rst +0 -0
  94. {gwpy-3.0.10 → gwpy-3.0.12}/docs/time/index.rst +0 -0
  95. {gwpy-3.0.10 → gwpy-3.0.12}/docs/timeseries/datafind.rst +0 -0
  96. {gwpy-3.0.10 → gwpy-3.0.12}/docs/timeseries/index.rst +0 -0
  97. {gwpy-3.0.10 → gwpy-3.0.12}/docs/timeseries/opendata.rst +0 -0
  98. {gwpy-3.0.10 → gwpy-3.0.12}/docs/timeseries/plot.rst +0 -0
  99. {gwpy-3.0.10 → gwpy-3.0.12}/docs/timeseries/statevector.rst +0 -0
  100. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/coherence.py +0 -0
  101. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/hoff.py +0 -0
  102. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/index.rst +0 -0
  103. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/inject.py +0 -0
  104. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/percentiles.py +0 -0
  105. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/rayleigh.py +0 -0
  106. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/transfer_function.py +0 -0
  107. {gwpy-3.0.10 → gwpy-3.0.12}/examples/frequencyseries/variance.py +0 -0
  108. {gwpy-3.0.10 → gwpy-3.0.12}/examples/miscellaneous/index.rst +0 -0
  109. {gwpy-3.0.10 → gwpy-3.0.12}/examples/miscellaneous/open-data-spectrogram.py +0 -0
  110. {gwpy-3.0.10 → gwpy-3.0.12}/examples/miscellaneous/range-spectrogram.py +0 -0
  111. {gwpy-3.0.10 → gwpy-3.0.12}/examples/miscellaneous/range-timeseries.py +0 -0
  112. {gwpy-3.0.10 → gwpy-3.0.12}/examples/segments/index.rst +0 -0
  113. {gwpy-3.0.10 → gwpy-3.0.12}/examples/segments/open-data.py +0 -0
  114. {gwpy-3.0.10 → gwpy-3.0.12}/examples/signal/gw150914.py +0 -0
  115. {gwpy-3.0.10 → gwpy-3.0.12}/examples/signal/index.rst +0 -0
  116. {gwpy-3.0.10 → gwpy-3.0.12}/examples/signal/qscan.py +0 -0
  117. {gwpy-3.0.10 → gwpy-3.0.12}/examples/spectrogram/coherence.py +0 -0
  118. {gwpy-3.0.10 → gwpy-3.0.12}/examples/spectrogram/index.rst +0 -0
  119. {gwpy-3.0.10 → gwpy-3.0.12}/examples/spectrogram/plot.py +0 -0
  120. {gwpy-3.0.10 → gwpy-3.0.12}/examples/spectrogram/ratio.py +0 -0
  121. {gwpy-3.0.10 → gwpy-3.0.12}/examples/spectrogram/rayleigh.py +0 -0
  122. {gwpy-3.0.10 → gwpy-3.0.12}/examples/spectrogram/spectrogram2.py +0 -0
  123. {gwpy-3.0.10 → gwpy-3.0.12}/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  124. {gwpy-3.0.10 → gwpy-3.0.12}/examples/table/histogram.py +0 -0
  125. {gwpy-3.0.10 → gwpy-3.0.12}/examples/table/index.rst +0 -0
  126. {gwpy-3.0.10 → gwpy-3.0.12}/examples/table/rate.py +0 -0
  127. {gwpy-3.0.10 → gwpy-3.0.12}/examples/table/rate_binned.py +0 -0
  128. {gwpy-3.0.10 → gwpy-3.0.12}/examples/table/scatter.py +0 -0
  129. {gwpy-3.0.10 → gwpy-3.0.12}/examples/table/tiles.py +0 -0
  130. {gwpy-3.0.10 → gwpy-3.0.12}/examples/test_examples.py +0 -0
  131. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/blrms.py +0 -0
  132. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/correlate.py +0 -0
  133. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/filter.py +0 -0
  134. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/index.rst +0 -0
  135. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/inject.py +0 -0
  136. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/public.py +0 -0
  137. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/pycbc-snr.py +0 -0
  138. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/qscan.py +0 -0
  139. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/statevector.py +0 -0
  140. {gwpy-3.0.10 → gwpy-3.0.12}/examples/timeseries/whiten.py +0 -0
  141. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/__init__.py +0 -0
  142. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/astro/__init__.py +0 -0
  143. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/astro/range.py +0 -0
  144. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/astro/tests/__init__.py +0 -0
  145. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/astro/tests/test_range.py +0 -0
  146. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/__init__.py +0 -0
  147. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/cliproduct.py +0 -0
  148. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/coherence.py +0 -0
  149. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/coherencegram.py +0 -0
  150. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/gwpy_plot.py +0 -0
  151. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/qtransform.py +0 -0
  152. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/spectrogram.py +0 -0
  153. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/spectrum.py +0 -0
  154. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/__init__.py +0 -0
  155. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/base.py +0 -0
  156. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_coherence.py +0 -0
  157. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_coherencegram.py +0 -0
  158. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_gwpy_plot.py +0 -0
  159. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_qtransform.py +0 -0
  160. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_spectrogram.py +0 -0
  161. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_spectrum.py +0 -0
  162. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_timeseries.py +0 -0
  163. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/tests/test_transferfunction.py +0 -0
  164. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/timeseries.py +0 -0
  165. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/cli/transferfunction.py +0 -0
  166. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/conftest.py +0 -0
  167. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/__init__.py +0 -0
  168. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/channel.py +0 -0
  169. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/io/__init__.py +0 -0
  170. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/io/cis.py +0 -0
  171. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/io/clf.py +0 -0
  172. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/io/omega.py +0 -0
  173. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/tests/__init__.py +0 -0
  174. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/tests/test_channel.py +0 -0
  175. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/tests/test_units.py +0 -0
  176. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/detector/units.py +0 -0
  177. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/__init__.py +0 -0
  178. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/_fdcommon.py +0 -0
  179. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/frequencyseries.py +0 -0
  180. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/hist.py +0 -0
  181. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/io/__init__.py +0 -0
  182. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/io/ascii.py +0 -0
  183. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/io/hdf5.py +0 -0
  184. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/io/ligolw.py +0 -0
  185. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/tests/__init__.py +0 -0
  186. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/tests/test_frequencyseries.py +0 -0
  187. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/frequencyseries/tests/test_hist.py +0 -0
  188. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/__init__.py +0 -0
  189. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/_framecpp.py +0 -0
  190. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/cache.py +0 -0
  191. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/gwf.py +0 -0
  192. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/hdf5.py +0 -0
  193. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/kerberos.py +0 -0
  194. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/ligolw.py +0 -0
  195. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/mp.py +0 -0
  196. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/nds2.py +0 -0
  197. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/registry.py +0 -0
  198. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/__init__.py +0 -0
  199. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_cache.py +0 -0
  200. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_ffldatafind.py +0 -0
  201. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_gwf.py +0 -0
  202. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_kerberos.py +0 -0
  203. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_ligolw.py +0 -0
  204. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_mp.py +0 -0
  205. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_nds2.py +0 -0
  206. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/tests/test_utils.py +0 -0
  207. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/io/utils.py +0 -0
  208. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/__init__.py +0 -0
  209. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/bode.py +0 -0
  210. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/colorbar.py +0 -0
  211. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/colors.py +0 -0
  212. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/gps.py +0 -0
  213. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/legend.py +0 -0
  214. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/log.py +0 -0
  215. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/plot.py +0 -0
  216. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/rc.py +0 -0
  217. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/__init__.py +0 -0
  218. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_bode.py +0 -0
  219. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_colors.py +0 -0
  220. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_gps.py +0 -0
  221. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_log.py +0 -0
  222. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_plot.py +0 -0
  223. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_rc.py +0 -0
  224. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_segments.py +0 -0
  225. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_tex.py +0 -0
  226. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_text.py +0 -0
  227. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/test_utils.py +0 -0
  228. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tests/utils.py +0 -0
  229. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/tex.py +0 -0
  230. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/text.py +0 -0
  231. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/units.py +0 -0
  232. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/plot/utils.py +0 -0
  233. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/flag.py +0 -0
  234. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/io/__init__.py +0 -0
  235. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/io/json.py +0 -0
  236. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/io/ligolw.py +0 -0
  237. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/io/segwizard.py +0 -0
  238. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/tests/__init__.py +0 -0
  239. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/tests/test_flag.py +0 -0
  240. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/segments/tests/test_segments.py +0 -0
  241. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/__init__.py +0 -0
  242. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/fft.py +0 -0
  243. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/filter_design.py +0 -0
  244. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/qtransform.py +0 -0
  245. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/__init__.py +0 -0
  246. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/_lal.py +0 -0
  247. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/_median_mean.py +0 -0
  248. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/_pycbc.py +0 -0
  249. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/_registry.py +0 -0
  250. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/_scipy.py +0 -0
  251. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/_ui.py +0 -0
  252. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/spectral/_utils.py +0 -0
  253. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/__init__.py +0 -0
  254. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_coherence.py +0 -0
  255. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_filter_design.py +0 -0
  256. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_qtransform.py +0 -0
  257. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_spectral_lal.py +0 -0
  258. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_spectral_median_mean.py +0 -0
  259. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_spectral_pycbc.py +0 -0
  260. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_spectral_registry.py +0 -0
  261. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_spectral_scipy.py +0 -0
  262. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_spectral_ui.py +0 -0
  263. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_spectral_utils.py +0 -0
  264. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/tests/test_window.py +0 -0
  265. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/signal/window.py +0 -0
  266. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/spectrogram/__init__.py +0 -0
  267. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/spectrogram/coherence.py +0 -0
  268. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/spectrogram/io/__init__.py +0 -0
  269. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/spectrogram/io/hdf5.py +0 -0
  270. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/spectrogram/spectrogram.py +0 -0
  271. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/spectrogram/tests/__init__.py +0 -0
  272. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/spectrogram/tests/test_spectrogram.py +0 -0
  273. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/__init__.py +0 -0
  274. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/filter.py +0 -0
  275. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/filters.py +0 -0
  276. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/gravityspy.py +0 -0
  277. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/__init__.py +0 -0
  278. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/cwb.py +0 -0
  279. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/fetch.py +0 -0
  280. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/gravityspy.py +0 -0
  281. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/gstlal.py +0 -0
  282. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/gwf.py +0 -0
  283. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/hacr.py +0 -0
  284. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/ligolw.py +0 -0
  285. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/losc.py +0 -0
  286. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/omega.py +0 -0
  287. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/omicron.py +0 -0
  288. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/pycbc.py +0 -0
  289. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/root.py +0 -0
  290. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/snax.py +0 -0
  291. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/sql.py +0 -0
  292. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/io/utils.py +0 -0
  293. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/table.py +0 -0
  294. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/tests/__init__.py +0 -0
  295. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/tests/test_gravityspy.py +0 -0
  296. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/tests/test_io_gstlal.py +0 -0
  297. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/tests/test_io_ligolw.py +0 -0
  298. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/tests/test_io_pycbc.py +0 -0
  299. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/table/tests/test_table.py +0 -0
  300. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/__init__.py +0 -0
  301. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/data/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  302. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/data/HLV-HW100916-968654552-1.gwf +0 -0
  303. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/data/HLV-HW100916-968654552-1.hdf +0 -0
  304. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.txt +0 -0
  305. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.xml.gz +0 -0
  306. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/errors.py +0 -0
  307. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/fixtures.py +0 -0
  308. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/mocks.py +0 -0
  309. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/testing/utils.py +0 -0
  310. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/time/__init__.py +0 -0
  311. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/time/__main__.py +0 -0
  312. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/time/_tconvert.py +0 -0
  313. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/time/tests/__init__.py +0 -0
  314. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/time/tests/test_main.py +0 -0
  315. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/time/tests/test_time.py +0 -0
  316. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/__init__.py +0 -0
  317. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/__init__.py +0 -0
  318. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/ascii.py +0 -0
  319. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/cache.py +0 -0
  320. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/core.py +0 -0
  321. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/gwf/framecpp.py +0 -0
  322. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/gwf/framel.py +0 -0
  323. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/gwf/lalframe.py +0 -0
  324. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/hdf5.py +0 -0
  325. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/nds2.py +0 -0
  326. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/io/wav.py +0 -0
  327. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/statevector.py +0 -0
  328. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/__init__.py +0 -0
  329. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/test_core.py +0 -0
  330. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/test_io_cache.py +0 -0
  331. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/test_io_gwf_framecpp.py +0 -0
  332. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/test_io_gwf_lalframe.py +0 -0
  333. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/test_io_losc.py +0 -0
  334. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/tests/test_statevector.py +0 -0
  335. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/timeseries/timeseries.py +0 -0
  336. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/__init__.py +0 -0
  337. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/array.py +0 -0
  338. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/array2d.py +0 -0
  339. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/index.py +0 -0
  340. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/io/__init__.py +0 -0
  341. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/io/ascii.py +0 -0
  342. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/io/hdf5.py +0 -0
  343. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/io/ligolw.py +0 -0
  344. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/series.py +0 -0
  345. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/sliceutils.py +0 -0
  346. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/tests/__init__.py +0 -0
  347. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/tests/test_array.py +0 -0
  348. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/tests/test_array2d.py +0 -0
  349. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/tests/test_index.py +0 -0
  350. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/types/tests/test_series.py +0 -0
  351. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/__init__.py +0 -0
  352. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/decorators.py +0 -0
  353. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/enum.py +0 -0
  354. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/env.py +0 -0
  355. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/lal.py +0 -0
  356. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/misc.py +0 -0
  357. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/mp.py +0 -0
  358. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/progress.py +0 -0
  359. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/shell.py +0 -0
  360. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/sphinx/__init__.py +0 -0
  361. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/sphinx/ex2rst.py +0 -0
  362. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/sphinx/zenodo.py +0 -0
  363. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/__init__.py +0 -0
  364. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_decorators.py +0 -0
  365. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_enum.py +0 -0
  366. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_env.py +0 -0
  367. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_lal.py +0 -0
  368. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_misc.py +0 -0
  369. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_mp.py +0 -0
  370. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_shell.py +0 -0
  371. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_sphinx_ex2rst.py +0 -0
  372. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy/utils/tests/test_sphinx_zenodo.py +0 -0
  373. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy.egg-info/dependency_links.txt +0 -0
  374. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy.egg-info/entry_points.txt +0 -0
  375. {gwpy-3.0.10 → gwpy-3.0.12}/gwpy.egg-info/top_level.txt +0 -0
  376. {gwpy-3.0.10 → gwpy-3.0.12}/setup.cfg +0 -0
  377. {gwpy-3.0.10 → gwpy-3.0.12}/setup_utils.py +0 -0
@@ -16,7 +16,7 @@ spec:
16
16
  description: "Extra options to pass to pytest"
17
17
  type: string
18
18
  minimum_python_version:
19
- default: "3.8"
19
+ default: "3.9"
20
20
  description: "Python version for minimum dependency compatibility check"
21
21
  type: string
22
22
 
@@ -45,6 +45,14 @@ include:
45
45
  pip_options: "--upgrade --upgrade-strategy=eager --pre"
46
46
  pytest_options: $[[ inputs.pytest_options ]]
47
47
 
48
+ # configure dependency scanning
49
+ - component: gitlab.com/components/dependency-scanning/main@~latest
50
+ inputs:
51
+ # dependency-scanning needs to run _after_ the test job that generated
52
+ # the requirements.txt file
53
+ stage: $[[ inputs.stage ]]
54
+ job_name: "dependency-scanning"
55
+
48
56
  .compat_rules:
49
57
  rules:
50
58
  - if: '$CI_COMMIT_MESSAGE =~ /\[skip compat\]/'
@@ -70,10 +78,28 @@ compat_minimum:
70
78
  - sed -i -E
71
79
  -e 's/requires-python = "==/requires-python = ">=/'
72
80
  pyproject.toml
81
+ # use pip-compile to generate requirements.txt for dependency scanning
82
+ - python -m venv .piptools
83
+ - .piptools/bin/python -m pip install pip-tools
84
+ - .piptools/bin/pip-compile
85
+ --extra test
86
+ --output-file requirements.txt
87
+ --verbose
88
+ - rm -rf .piptools
89
+ artifacts:
90
+ paths:
91
+ - .coverage*
92
+ - requirements.txt
73
93
 
74
94
  # test against latest/pre-release versions
75
95
  compat_experimental:
76
96
  extends:
77
97
  - .compat_experimental
78
98
  - .compat_rules
79
- image: python:3
99
+ image: python:3.12
100
+
101
+ # run dependency scanning against minimum specified requirements
102
+ # (most likely to highlight issues)
103
+ dependency-scanning:
104
+ needs: ["compat_minimum"]
105
+ rules: !reference [.compat_rules, rules]
@@ -23,14 +23,15 @@ build:
23
23
  before_script:
24
24
  - python -m pip install
25
25
  build
26
- setuptools
27
26
  script:
28
27
  # if running a default branch push pipeline, strip the +g<HASH> suffix
29
28
  # from the version to give something that test.pypi.org will accept
30
29
  - |
31
30
  if [ "${CI_COMMIT_TAG}" = "" ] && [ "${CI_PIPELINE_SOURCE}" = "push" ] && [ "${CI_COMMIT_BRANCH}" = "${CI_DEFAULT_BRANCH}" ]; then
32
- VERSION=$(python3 -c "from setuptools import setup; setup()" --version)
33
- export SETUPTOOLS_SCM_PRETEND_VERSION=${VERSION%%+*}
31
+ python -m pip install -q setuptools setuptools-scm
32
+ echo "Real version is '$(python -m setuptools_scm)'";
33
+ export SETUPTOOLS_SCM_PRETEND_VERSION=$(python3 -c "from setuptools import setup; setup(use_scm_version={'local_scheme': 'no-local-version'})" --version);
34
+ echo "Pretending version is '${SETUPTOOLS_SCM_PRETEND_VERSION}'";
34
35
  fi
35
36
  # generate the distributions
36
37
  - python -m build . -o .
@@ -0,0 +1,109 @@
1
+ # -- Quality Assurance jobs
2
+
3
+ spec:
4
+ inputs:
5
+ stage:
6
+ default: test
7
+ description: "Pipeline stage in which to add jobs"
8
+ type: string
9
+ project_dir:
10
+ default: "."
11
+ description: "Project directory to scan"
12
+ type: string
13
+ requirements:
14
+ default: ""
15
+ description: "Extra requirements to install with pip"
16
+ type: string
17
+ ruff_options:
18
+ default: ""
19
+ description: "Extra options to pass to ruff check"
20
+ type: string
21
+ mypy_options:
22
+ default: ""
23
+ description: "Extra options to pass to mypy"
24
+ type: string
25
+
26
+ ---
27
+
28
+ include:
29
+ - component: gitlab.com/components/sast/sast@~latest
30
+ inputs:
31
+ stage: $[[ inputs.stage ]]
32
+ run_advanced_sast: true
33
+ rules:
34
+ - if: '$GITLAB_FEATURES =~ /\bsast_advanced\b/'
35
+ - component: gitlab.com/components/sast/sast@~latest
36
+ inputs:
37
+ stage: $[[ inputs.stage ]]
38
+ run_advanced_sast: false
39
+ rules:
40
+ - if: '$GITLAB_FEATURES !~ /\bsast_advanced\b/'
41
+ - local: .gitlab/ci/rules.yml
42
+
43
+ .qa:
44
+ extends: .rules_qa_security
45
+ stage: $[[ inputs.stage ]]
46
+ needs: []
47
+
48
+ gitlab-advanced-sast:
49
+ needs: !reference [.qa, needs]
50
+ rules:
51
+ # skip if we just can't run advanced sast
52
+ - if: '$GITLAB_FEATURES !~ /\bsast_advanced\b/'
53
+ when: never
54
+ - !reference [.qa, rules]
55
+
56
+ semgrep-sast:
57
+ needs: !reference [.qa, needs]
58
+ rules:
59
+ # skip if we can run advanced sast
60
+ - if: '$GITLAB_FEATURES =~ /\bsast_advanced\b/'
61
+ when: never
62
+ - !reference [.qa, rules]
63
+
64
+ ruff:
65
+ extends: .qa
66
+ image: python
67
+ script:
68
+ - python -m pip install
69
+ ruff
70
+ $[[ inputs.requirements ]]
71
+ - python -m ruff check
72
+ $[[ inputs.ruff_options ]]
73
+ $[[ inputs.project_dir ]]
74
+ --exit-zero
75
+ - python -m ruff check
76
+ $[[ inputs.ruff_options ]]
77
+ $[[ inputs.project_dir ]]
78
+ --exit-zero
79
+ --output-format gitlab
80
+ --output-file gl-ruff.json
81
+ artifacts:
82
+ reports:
83
+ codequality: gl-ruff.json
84
+
85
+ mypy:
86
+ extends: .qa
87
+ image: python
88
+ script:
89
+ - python -m pip install
90
+ mypy
91
+ mypy-gitlab-code-quality
92
+ # run mypy and print to console
93
+ - python -m mypy
94
+ $[[ inputs.mypy_options ]]
95
+ --install-types
96
+ --non-interactive
97
+ $[[ inputs.project_dir ]]
98
+ || exitcode="$?"
99
+ # run mypy again and format as code quality report
100
+ - python -m mypy
101
+ $[[ inputs.mypy_options ]]
102
+ --no-error-summary
103
+ $[[ inputs.project_dir ]]
104
+ | mypy-gitlab-code-quality > gl-mypy-code-quality.json || true
105
+ # propagate fatal exitcode
106
+ - if [ "${exitcode:-0}" -gt 1 ]; then exit ${exitcode}; fi
107
+ artifacts:
108
+ reports:
109
+ codequality: gl-mypy-code-quality.json
@@ -15,10 +15,15 @@ spec:
15
15
  rules:
16
16
  - if: $CI_COMMIT_TAG
17
17
 
18
- # default branch
18
+ # default branch (all pipelines)
19
19
  .rules_default:
20
20
  rules:
21
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
21
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
22
+
23
+ # default branch push (not schedules)
24
+ .rules_default_push:
25
+ rules:
26
+ - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
22
27
 
23
28
  # schedules on default branch
24
29
  .rules_default_schedule:
@@ -54,7 +59,7 @@ spec:
54
59
  .rules_build:
55
60
  rules:
56
61
  - !reference [.rules_tag, rules]
57
- - !reference [.rules_default, rules]
62
+ - !reference [.rules_default_push, rules]
58
63
  - !reference [.rules_merge_request, rules]
59
64
  - !reference [.rules_branch, rules]
60
65
 
@@ -68,3 +73,9 @@ spec:
68
73
  .rules_basic_test:
69
74
  rules:
70
75
  - !reference [.rules_branch, rules]
76
+
77
+ .rules_qa_security:
78
+ rules:
79
+ - !reference [.rules_default, rules]
80
+ - !reference [.rules_nightly, rules]
81
+ - !reference [.rules_merge_request, rules]
@@ -47,6 +47,10 @@ include:
47
47
  # store caches in .cache
48
48
  XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache"
49
49
  script:
50
+ # print some basic information about python
51
+ - python --version
52
+ - python -m site
53
+ - python -m sysconfig
50
54
  # create the cache directory (so that astropy will actually use it)
51
55
  # (this isn't just 'mkdir -p ...' because Windows)
52
56
  - python -c "import os;
@@ -21,7 +21,7 @@ include:
21
21
  - local: .gitlab/ci/compatibility.yml
22
22
  inputs:
23
23
  stage: test
24
- minimum_python_version: "3.8"
24
+ minimum_python_version: "3.9"
25
25
  pytest_options: "--color yes --cov gwpy --numprocesses auto gwpy/"
26
26
 
27
27
  # measure coverage over all jobs
@@ -35,7 +35,6 @@ include:
35
35
  parallel:
36
36
  matrix:
37
37
  - PYTHON_VERSION:
38
- - "3.8"
39
38
  - "3.9"
40
39
  - "3.10"
41
40
  - "3.11"
@@ -49,6 +48,7 @@ include:
49
48
  - PYTHON_VERSION:
50
49
  - "3.10"
51
50
  - "3.11"
51
+ - "3.12"
52
52
 
53
53
  .brew:
54
54
  extends: .macos
@@ -115,6 +115,12 @@ python_test_macos:
115
115
  rules:
116
116
  - !reference [.macos, rules]
117
117
  - !reference [.rules_full_test, rules]
118
+ parallel:
119
+ matrix:
120
+ - PYTHON_VERSION:
121
+ - "3.10"
122
+ - "3.11"
123
+ #- "3.12" <-- cannot build ligo-segments on macOS
118
124
  before_script:
119
125
  # install Python using Homebrew
120
126
  - brew install python@${PYTHON_VERSION}
@@ -195,8 +201,6 @@ conda_test_linux:
195
201
  - !reference [.rules_full_test, rules]
196
202
  image: condaforge/miniforge3
197
203
  before_script:
198
- # configure CVMFS
199
- - bash -ex .gitlab/ci/init-cvmfs.sh
200
204
  # init conda
201
205
  - . $(conda info --base)/etc/profile.d/conda.sh
202
206
  # create test environment using pip2conda
@@ -13,6 +13,7 @@ include:
13
13
  - local: .gitlab/ci/rules.yml
14
14
 
15
15
  twine:
16
+ interruptible: false
16
17
  rules:
17
18
  - if: '$CI_COMMIT_MESSAGE =~ /\[skip deploy\]/'
18
19
  when: never
@@ -33,8 +34,6 @@ twine:
33
34
  PYPI_HOSTNAME: "pypi.org"
34
35
  # don't ask questions
35
36
  TWINE_NON_INTERACTIVE: "1"
36
- # PyPI username
37
- TWINE_USERNAME: "__token__"
38
37
  before_script:
39
38
  - python -m pip install id twine
40
39
  script:
@@ -42,12 +41,14 @@ twine:
42
41
  - python -m twine check *.tar.* *.whl
43
42
  # get API token
44
43
  - oidc_token=$(python -m id pypi)
45
- - resp=$(curl -X POST https://${PYPI_HOSTNAME}.org/_/oidc/mint-token -d "{\"token\":\"${oidc_token}\"}")
44
+ - resp=$(curl -X POST https://${PYPI_HOSTNAME}/_/oidc/mint-token -d "{\"token\":\"${oidc_token}\"}")
46
45
  - api_token=$(python3 -c "import json,sys; data = json.load(sys.stdin); print(data['token'])" <<< "${resp}")
47
46
  # upload
48
47
  - python -m twine
49
48
  upload
50
- --repository ${PYPI_REPOSITORY}
49
+ --username "__token__"
50
+ --password "${api_token}"
51
+ --repository "${PYPI_REPOSITORY}"
51
52
  ${TWINE_OPTIONS:-}
52
53
  *.tar.*
53
54
  *.whl
@@ -58,7 +59,7 @@ twine_test:
58
59
  rules:
59
60
  - if: '$CI_COMMIT_MESSAGE =~ /\[skip deploy\]/'
60
61
  when: never
61
- - !reference [.rules_default, rules]
62
+ - !reference [.rules_default_push, rules]
62
63
  variables:
63
64
  PYPI_REPOSITORY: "testpypi"
64
65
  PYPI_HOSTNAME: "test.pypi.org"
@@ -14,6 +14,20 @@ stages:
14
14
  - docs
15
15
  - deploy
16
16
 
17
+ default:
18
+ # all jobs are, by default, interruptible
19
+ interruptible: true
20
+ # retry all jobs at most twice when gitlab-ci fails to start the job properly
21
+ # see https://docs.gitlab.com/ee/ci/yaml/#retry
22
+ retry:
23
+ max: 2
24
+ when:
25
+ - job_execution_timeout
26
+ - runner_system_failure
27
+ - stuck_or_timeout_failure
28
+ # no job should take more than an hour
29
+ timeout: 1h
30
+
17
31
  include:
18
32
  # -- Quality assurance checks
19
33
 
@@ -130,7 +130,7 @@ branch:
130
130
 
131
131
  ### Python compatibility
132
132
 
133
- **GWpy code must be compatible with Python >= 3.8.**
133
+ **GWpy code must be compatible with Python >= 3.9.**
134
134
 
135
135
  ### Style
136
136
 
@@ -138,11 +138,11 @@ This package follows [PEP 8](https://www.python.org/dev/peps/pep-0008/),
138
138
  and all code should adhere to that as far as is reasonable.
139
139
 
140
140
  The first stage in the automated testing of merge requests is a job that runs
141
- the [`flake8`](http://flake8.pycqa.org) linter, which checks the style of code
141
+ the [Ruff](https://docs.astral.sh/ruff/) linter, which checks the style of code
142
142
  in the repo. You can run this locally before committing changes via:
143
143
 
144
144
  ```bash
145
- python3 -m flake8
145
+ python -m ruff .
146
146
  ```
147
147
 
148
148
  ### Testing
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: gwpy
3
- Version: 3.0.10
3
+ Version: 3.0.12
4
4
  Summary: A python package for gravitational-wave astrophysics
5
5
  Author-email: Duncan Macleod <duncan.macleod@ligo.org>
6
6
  License: GPL-3.0-or-later
@@ -15,14 +15,13 @@ Classifier: Natural Language :: English
15
15
  Classifier: Operating System :: OS Independent
16
16
  Classifier: Programming Language :: Python
17
17
  Classifier: Programming Language :: Python :: 3
18
- Classifier: Programming Language :: Python :: 3.8
19
18
  Classifier: Programming Language :: Python :: 3.9
20
19
  Classifier: Programming Language :: Python :: 3.10
21
20
  Classifier: Programming Language :: Python :: 3.11
22
21
  Classifier: Programming Language :: Python :: 3.12
23
22
  Classifier: Topic :: Scientific/Engineering :: Astronomy
24
23
  Classifier: Topic :: Scientific/Engineering :: Physics
25
- Requires-Python: >=3.8
24
+ Requires-Python: >=3.9
26
25
  Description-Content-Type: text/markdown
27
26
  License-File: LICENSE
28
27
  Requires-Dist: astropy>=4.3.0
@@ -31,14 +30,15 @@ Requires-Dist: dqsegdb2
31
30
  Requires-Dist: gwdatafind>=1.1.0
32
31
  Requires-Dist: gwosc>=0.5.3
33
32
  Requires-Dist: h5py>=3.0.0
34
- Requires-Dist: ligo-segments>=1.0.0
33
+ Requires-Dist: igwn-segments>=2.0.0
35
34
  Requires-Dist: ligotimegps>=1.2.1
36
35
  Requires-Dist: matplotlib>=3.3.0
37
- Requires-Dist: numpy>=1.19
36
+ Requires-Dist: numpy>=1.19.5
37
+ Requires-Dist: packaging>=24.1
38
38
  Requires-Dist: python-dateutil
39
39
  Requires-Dist: requests>=2.20.0
40
40
  Requires-Dist: scipy>=1.6.0
41
- Requires-Dist: tqdm>=4.10.0
41
+ Requires-Dist: tqdm>=4.52.0
42
42
  Provides-Extra: test
43
43
  Requires-Dist: coverage[toml]>=5.0; extra == "test"
44
44
  Requires-Dist: pytest>=3.9.1; extra == "test"
@@ -70,7 +70,7 @@ Requires-Dist: uproot>=4.1.5; extra == "dev"
70
70
  Provides-Extra: conda
71
71
  Requires-Dist: lxml!=4.9.1; sys_platform == "win32" and extra == "conda"
72
72
  Requires-Dist: python-framel!=8.46.0,>=8.40.1; extra == "conda"
73
- Requires-Dist: python-ldas-tools-framecpp; sys_platform != "win32" and extra == "conda"
73
+ Requires-Dist: python-ldas-tools-framecpp; (sys_platform != "win32" and python_version < "3.12") and extra == "conda"
74
74
  Requires-Dist: python-nds2-client; extra == "conda"
75
75
 
76
76
  GWpy is a collaboration-driven Python package providing tools for
@@ -235,7 +235,7 @@ intersphinx_mapping = {
235
235
  'gwosc': ('https://gwosc.readthedocs.io/en/stable/', None),
236
236
  'h5py': ('https://docs.h5py.org/en/latest/', None),
237
237
  'ligo.skymap': ('https://lscsoft.docs.ligo.org/ligo.skymap/', None),
238
- 'ligo-segments': ('https://lscsoft.docs.ligo.org/ligo-segments/', None),
238
+ 'igwn-segments': ('https://igwn-segments.readthedocs.io/en/stable/', None),
239
239
  'lscsoft-glue': ('https://lscsoft.docs.ligo.org/glue/', None),
240
240
  'matplotlib': ('https://matplotlib.org/', None),
241
241
  'numpy': ('https://numpy.org/doc/stable/', None),
@@ -52,13 +52,13 @@ GWpy has the following strict requirements:
52
52
  |gwdatafind|_ ``>=1.1.0``
53
53
  |gwosc-mod|_ ``>=0.5.3``
54
54
  |h5py|_ ``>=3.0.0``
55
- |ligo-segments|_ ``>=1.0.0``
55
+ |igwn-segments|_ ``>=2.0.0``
56
56
  |ligotimegps|_ ``>=1.2.1``
57
57
  |matplotlib|_ ``>=3.1.0``
58
- |numpy|_ ``>=1.16.0``
58
+ |numpy|_ ``>=1.19.5``
59
59
  |dateutil|_
60
60
  |scipy|_ ``>=1.2.0``
61
- |tqdm|_ ``>=4.10.0``
61
+ |tqdm|_ ``>=4.52.0``
62
62
  ================== ===========================
63
63
 
64
64
  All of these will be installed using any of the above install methods.
@@ -3,9 +3,6 @@
3
3
  .. |astropy| replace:: `astropy`
4
4
  .. _astropy: http://www.astropy.org/
5
5
 
6
- .. |CVMFS| replace:: CVMFS
7
- .. _CVMFS: https://cvmfs.readthedocs.io/
8
-
9
6
  .. |dateparser| replace:: `dateparser`
10
7
  .. _dateparser: https://dateparser.readthedocs.io
11
8
 
@@ -24,8 +21,8 @@
24
21
  .. |h5py| replace:: `h5py`
25
22
  .. _h5py: http://docs.h5py.org/en/latest/
26
23
 
27
- .. |ligo-segments| replace:: `ligo-segments`
28
- .. _ligo-segments: https://lscsoft.docs.ligo.org/ligo-segments/
24
+ .. |igwn-segments| replace:: `igwn-segments`
25
+ .. _igwn-segments: https://igwn-segments.readthedocs.io/
29
26
 
30
27
  .. |ligotimegps| replace:: `ligotimegps`
31
28
  .. _ligotimegps: https://github.com/gwpy/ligotimegps/
@@ -127,6 +124,12 @@
127
124
  .. |LIGO-T050017| replace:: LIGO-T050017
128
125
  .. _LIGO-T050017: https://dcc.ligo.org/LIGO-T050017/public
129
126
 
127
+ .. |OSDF| replace:: OSDF
128
+ .. _OSDF: https://osg-htc.org/services/osdf.html
129
+
130
+ .. |OSDFl| replace:: the Open Science Data Federation (OSDF)
131
+ .. _OSDF: https://osg-htc.org/services/osdf.html
132
+
130
133
  .. -- Event science summaries -------------------
131
134
 
132
135
  .. catalogues
@@ -25,7 +25,7 @@ The :class:`Segment` and :class:`SegmentList` classes
25
25
 
26
26
  GWpy provides a number of classes for generating and manipulating such
27
27
  segments, enhancing the functionality provided by the (excellent)
28
- :mod:`ligo.segments` package.
28
+ |igwn-segments|_ package.
29
29
  All credits for their usefulness go to the authors of that package.
30
30
 
31
31
  These basic objects are as follows:
@@ -45,7 +45,8 @@ are archived in :ref:`GWF <gwpy-timeseries-io-gwf>` files stored at the
45
45
  relevant observatory.
46
46
  These data are available locally to authenticated users of the associated
47
47
  computing centres (typically collaboration members), but are also
48
- distributed using |CVMFS|_ and are available remotely using :ref:`gwpy-external-nds2`.
48
+ distributed as part of |OSDFl|_ and are available remotely using
49
+ :ref:`gwpy-external-nds2`.
49
50
  Access to these data is restricted to active collaboration members.
50
51
 
51
52
  Additionally |GWOSCl|_ hosts publicly-accessible 'open' data, with *event*
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.0.10'
16
- __version_tuple__ = version_tuple = (3, 0, 10)
15
+ __version__ = version = '3.0.12'
16
+ __version_tuple__ = version_tuple = (3, 0, 12)
@@ -22,7 +22,7 @@ Automatic discovery of file paths for both LIGO and Virgo index solutions
22
22
  (``gwdatafind`` or ``ffl``, respectvely) is supported.
23
23
 
24
24
  The functions in this module are highly reliant on having local access to
25
- files (either directly, or via NFS, or CVMFS).
25
+ files (either directly, or via NFS/fuse).
26
26
 
27
27
  Data discovery using the DataFind service requires the `gwdatafind` Python
28
28
  package (a dependency of ``gwpy``), and either the ``GW_DATAFIND_SERVER``
@@ -45,7 +45,7 @@ from unittest import mock
45
45
 
46
46
  import gwdatafind
47
47
 
48
- from ligo.segments import segment as LigoSegment
48
+ from igwn_segments import segment as LigoSegment
49
49
 
50
50
  from ..time import to_gps
51
51
  from . import ffldatafind
@@ -32,7 +32,7 @@ from collections import defaultdict
32
32
  from functools import lru_cache
33
33
  from warnings import warn
34
34
 
35
- from ligo.segments import (
35
+ from igwn_segments import (
36
36
  segment,
37
37
  segmentlist,
38
38
  )
@@ -27,7 +27,6 @@ import pytest
27
27
  import gwdatafind
28
28
 
29
29
  from ...testing.errors import (
30
- pytest_skip_cvmfs_read_error,
31
30
  pytest_skip_network_error,
32
31
  )
33
32
  from ...testing.utils import (
@@ -76,30 +75,6 @@ def _mock_gwdatafind(func):
76
75
  return wrapper
77
76
 
78
77
 
79
- def _gwosc_gwdatafind(func):
80
- """Decorate a function to use the GWOSC GWDataFind server.
81
-
82
- That server returns paths from CVMFS (``/cvmfs/gwosc.osgstorage.org``) so
83
- we need to add various protections.
84
- """
85
- @mock.patch.dict( # point GWDataFind at GWOSC server
86
- "os.environ",
87
- {"GWDATAFIND_SERVER": "datafind.gwosc.org:80"},
88
- )
89
- @pytest_skip_cvmfs_read_error # skip CVMFS problems
90
- @pytest_skip_network_error # skip network problems
91
- @pytest.mark.skipif( # skip missing CVMFS repo
92
- not os.path.isdir('/cvmfs/gwosc.osgstorage.org/'),
93
- reason="GWOSC CVMFS repository not available",
94
- )
95
- @pytest.mark.cvmfs # mark test as requiring cvmfs
96
- @pytest.mark.requires("LDAStools.frameCPP") # skip if no frameCPP
97
- def wrapper(*args, **kwargs):
98
- return func(*args, **kwargs)
99
-
100
- return wrapper
101
-
102
-
103
78
  # -- tests --------------------------------------------------------------------
104
79
 
105
80
  @mock.patch.dict("os.environ", clear=True)
@@ -207,34 +182,6 @@ def test_find_best_frametype():
207
182
  ) == 'HW100916'
208
183
 
209
184
 
210
- @_gwosc_gwdatafind
211
- def test_find_best_frametype_with_gaps():
212
- """Test that `find_best_frametype` works across gaps.
213
-
214
- It tries to find something that covers at least some of the gap.
215
- """
216
- assert io_datafind.find_best_frametype(
217
- "L1:GWOSC-4KHZ_R1_STRAIN",
218
- 1187733504,
219
- 1187733504 + 4097, # one second too long
220
- ) == "L1_GWOSC_O2_4KHZ_R1"
221
-
222
-
223
- @_gwosc_gwdatafind
224
- def test_find_best_frametype_with_gaps_multiple():
225
- """Test that `find_best_frametype` works across gaps with multiple
226
- channels.
227
- """
228
- assert io_datafind.find_best_frametype(
229
- ("L1:GWOSC-4KHZ_R1_STRAIN", "L1:GWOSC-4KHZ_R1_DQMASK"),
230
- 1187733504,
231
- 1187733504 + 4097, # one second too long
232
- ) == {
233
- "L1:GWOSC-4KHZ_R1_STRAIN": "L1_GWOSC_O2_4KHZ_R1",
234
- "L1:GWOSC-4KHZ_R1_DQMASK": "L1_GWOSC_O2_4KHZ_R1",
235
- }
236
-
237
-
238
185
  @pytest.mark.requires("LDAStools.frameCPP")
239
186
  @pytest_skip_network_error
240
187
  @pytest.mark.skipif(
@@ -39,6 +39,8 @@ from matplotlib.collections import PolyCollection
39
39
  from matplotlib.lines import Line2D
40
40
  from matplotlib.projections import register_projection
41
41
 
42
+ from packaging.version import Version
43
+
42
44
  from . import (Plot, colorbar as gcbar)
43
45
  from .colors import format_norm
44
46
  from .gps import GPS_SCALES
@@ -47,6 +49,8 @@ from ..time import to_gps
47
49
 
48
50
  __author__ = 'Duncan Macleod <duncan.macleod@ligo.org>'
49
51
 
52
+ matplotlib_version = Version(matplotlib_version)
53
+
50
54
 
51
55
  def log_norm(func):
52
56
  """Wrap ``func`` to handle custom gwpy keywords for a LogNorm colouring
@@ -86,7 +90,7 @@ def restore_grid(func):
86
90
  automatically removed a grid on a set of Axes. This decorator just
87
91
  undoes that.
88
92
  """
89
- if matplotlib_version >= "3.7.0":
93
+ if matplotlib_version >= Version("3.7.0"):
90
94
  return func
91
95
 
92
96
  @wraps(func)
@@ -162,7 +166,7 @@ class Axes(_Axes):
162
166
  super().__init__(*args, **kwargs)
163
167
 
164
168
  # handle Series in `ax.plot()`
165
- if matplotlib_version >= "3.8.0":
169
+ if matplotlib_version >= Version("3.8.0"):
166
170
  self._get_lines = PlotArgsProcessor()
167
171
  else:
168
172
  self._get_lines = PlotArgsProcessor(self)