gwpy 3.0.9__tar.gz → 3.0.11__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 (384) hide show
  1. gwpy-3.0.11/.gitlab/ci/compatibility.yml +105 -0
  2. gwpy-3.0.11/.gitlab/ci/coverage.yml +32 -0
  3. gwpy-3.0.11/.gitlab/ci/init-creds.sh +28 -0
  4. gwpy-3.0.11/.gitlab/ci/platforms.yml +30 -0
  5. gwpy-3.0.11/.gitlab/ci/python-base.yml +37 -0
  6. gwpy-3.0.11/.gitlab/ci/python-dist.yml +43 -0
  7. gwpy-3.0.11/.gitlab/ci/qa.yml +109 -0
  8. gwpy-3.0.11/.gitlab/ci/rules.yml +81 -0
  9. gwpy-3.0.11/.gitlab/ci/sphinx.yml +65 -0
  10. gwpy-3.0.11/.gitlab/ci/test-job.yml +88 -0
  11. gwpy-3.0.11/.gitlab/ci/test.yml +253 -0
  12. gwpy-3.0.11/.gitlab/ci/twine.yml +69 -0
  13. gwpy-3.0.11/.gitlab-ci.yml +54 -0
  14. gwpy-3.0.11/CONTRIBUTING.md +160 -0
  15. {gwpy-3.0.9 → gwpy-3.0.11}/PKG-INFO +20 -19
  16. {gwpy-3.0.9 → gwpy-3.0.11}/README.md +7 -5
  17. {gwpy-3.0.9 → gwpy-3.0.11}/docs/conf.py +4 -5
  18. {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/lalsuite.rst +1 -1
  19. {gwpy-3.0.9 → gwpy-3.0.11}/docs/install.rst +3 -3
  20. {gwpy-3.0.9 → gwpy-3.0.11}/docs/references.rst +18 -5
  21. {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/index.rst +1 -1
  22. {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrogram/index.rst +7 -5
  23. {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrum/index.rst +7 -4
  24. {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/datafind.rst +12 -0
  25. {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/io.rst +2 -1
  26. {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/open-data-spectrogram.py +32 -18
  27. {gwpy-3.0.9 → gwpy-3.0.11}/examples/test_examples.py +1 -0
  28. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/_version.py +2 -2
  29. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/gwpy_plot.py +1 -1
  30. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/base.py +11 -1
  31. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/units.py +1 -1
  32. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/tests/test_hist.py +4 -3
  33. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/datafind.py +2 -2
  34. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/ffldatafind.py +1 -1
  35. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_datafind.py +0 -53
  36. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/axes.py +6 -2
  37. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/plot.py +12 -2
  38. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/segments.py +8 -8
  39. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_axes.py +4 -2
  40. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_segments.py +1 -1
  41. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/__init__.py +1 -1
  42. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/flag.py +13 -11
  43. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/hdf5.py +1 -1
  44. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/segments.py +1 -1
  45. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/filter_design.py +1 -1
  46. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_coherence.py +31 -10
  47. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/ligolw.py +1 -1
  48. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_io_ligolw.py +1 -1
  49. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/errors.py +1 -0
  50. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/marks.py +1 -1
  51. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/core.py +0 -1
  52. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/__init__.py +1 -1
  53. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/statevector.py +4 -2
  54. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_core.py +7 -13
  55. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_gwf_framecpp.py +1 -1
  56. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_statevector.py +29 -17
  57. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_timeseries.py +10 -14
  58. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_array.py +12 -10
  59. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_array2d.py +5 -9
  60. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_series.py +5 -5
  61. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/sphinx/zenodo.py +5 -1
  62. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_sphinx_zenodo.py +10 -5
  63. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/PKG-INFO +20 -19
  64. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/SOURCES.txt +13 -9
  65. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/requires.txt +10 -8
  66. {gwpy-3.0.9 → gwpy-3.0.11}/pyproject.toml +65 -17
  67. gwpy-3.0.9/.codeclimate.yml +0 -39
  68. gwpy-3.0.9/.codecov.yml +0 -21
  69. gwpy-3.0.9/.flake8 +0 -30
  70. gwpy-3.0.9/.github/workflows/conda.yml +0 -173
  71. gwpy-3.0.9/.github/workflows/dependencies.yml +0 -110
  72. gwpy-3.0.9/.github/workflows/dist.yml +0 -141
  73. gwpy-3.0.9/.github/workflows/lint.yml +0 -66
  74. gwpy-3.0.9/.github/workflows/release.yml +0 -54
  75. gwpy-3.0.9/.pep8speaks.yml +0 -3
  76. gwpy-3.0.9/CONTRIBUTING.md +0 -129
  77. {gwpy-3.0.9 → gwpy-3.0.11}/.gitattributes +0 -0
  78. {gwpy-3.0.9 → gwpy-3.0.11}/.gitignore +0 -0
  79. {gwpy-3.0.9 → gwpy-3.0.11}/CODE_OF_CONDUCT.rst +0 -0
  80. {gwpy-3.0.9 → gwpy-3.0.11}/LICENSE +0 -0
  81. {gwpy-3.0.9 → gwpy-3.0.11}/MANIFEST.in +0 -0
  82. {gwpy-3.0.9 → gwpy-3.0.11}/docs/Makefile +0 -0
  83. {gwpy-3.0.9 → gwpy-3.0.11}/docs/_static/css/gwpy-sphinx.css +0 -0
  84. {gwpy-3.0.9 → gwpy-3.0.11}/docs/_static/favicon.png +0 -0
  85. {gwpy-3.0.9 → gwpy-3.0.11}/docs/_static/gwpy_white_24.png +0 -0
  86. {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autoclass/class.rst +0 -0
  87. {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autosummary/base.rst +0 -0
  88. {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autosummary/class.rst +0 -0
  89. {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autosummary/module.rst +0 -0
  90. {gwpy-3.0.9 → gwpy-3.0.11}/docs/astro/index.rst +0 -0
  91. {gwpy-3.0.9 → gwpy-3.0.11}/docs/citing.rst.in +0 -0
  92. {gwpy-3.0.9 → gwpy-3.0.11}/docs/cli/examples.ini +0 -0
  93. {gwpy-3.0.9 → gwpy-3.0.11}/docs/cli/index.rst +0 -0
  94. {gwpy-3.0.9 → gwpy-3.0.11}/docs/detector/channel.rst +0 -0
  95. {gwpy-3.0.9 → gwpy-3.0.11}/docs/dev/release.rst +0 -0
  96. {gwpy-3.0.9 → gwpy-3.0.11}/docs/env.rst +0 -0
  97. {gwpy-3.0.9 → gwpy-3.0.11}/docs/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  98. {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/framecpp.rst +0 -0
  99. {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/framel.rst +0 -0
  100. {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/nds2.rst +0 -0
  101. {gwpy-3.0.9 → gwpy-3.0.11}/docs/gwpy-docs-logo.png +0 -0
  102. {gwpy-3.0.9 → gwpy-3.0.11}/docs/index.rst +0 -0
  103. {gwpy-3.0.9 → gwpy-3.0.11}/docs/overview.rst +0 -0
  104. {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/colorbars.rst +0 -0
  105. {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/colors.rst +0 -0
  106. {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/filter.rst +0 -0
  107. {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/gps.rst +0 -0
  108. {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/index.rst +0 -0
  109. {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/legend.rst +0 -0
  110. {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/log.rst +0 -0
  111. {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/dqsegdb.rst +0 -0
  112. {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/io.rst +0 -0
  113. {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/thresholding.rst +0 -0
  114. {gwpy-3.0.9 → gwpy-3.0.11}/docs/signal/index.rst +0 -0
  115. {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrum/filtering.rst +0 -0
  116. {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrum/io.rst +0 -0
  117. {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  118. {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/filter.rst +0 -0
  119. {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/histogram.rst +0 -0
  120. {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/index.rst +0 -0
  121. {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/io.rst +0 -0
  122. {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/plot.rst +0 -0
  123. {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/rate.rst +0 -0
  124. {gwpy-3.0.9 → gwpy-3.0.11}/docs/time/index.rst +0 -0
  125. {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/index.rst +0 -0
  126. {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/opendata.rst +0 -0
  127. {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/plot.rst +0 -0
  128. {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/statevector.rst +0 -0
  129. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/coherence.py +0 -0
  130. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/hoff.py +0 -0
  131. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/index.rst +0 -0
  132. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/inject.py +0 -0
  133. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/percentiles.py +0 -0
  134. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/rayleigh.py +0 -0
  135. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/transfer_function.py +0 -0
  136. {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/variance.py +0 -0
  137. {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/index.rst +0 -0
  138. {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/range-spectrogram.py +0 -0
  139. {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/range-timeseries.py +0 -0
  140. {gwpy-3.0.9 → gwpy-3.0.11}/examples/segments/index.rst +0 -0
  141. {gwpy-3.0.9 → gwpy-3.0.11}/examples/segments/open-data.py +0 -0
  142. {gwpy-3.0.9 → gwpy-3.0.11}/examples/signal/gw150914.py +0 -0
  143. {gwpy-3.0.9 → gwpy-3.0.11}/examples/signal/index.rst +0 -0
  144. {gwpy-3.0.9 → gwpy-3.0.11}/examples/signal/qscan.py +0 -0
  145. {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/coherence.py +0 -0
  146. {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/index.rst +0 -0
  147. {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/plot.py +0 -0
  148. {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/ratio.py +0 -0
  149. {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/rayleigh.py +0 -0
  150. {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/spectrogram2.py +0 -0
  151. {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  152. {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/histogram.py +0 -0
  153. {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/index.rst +0 -0
  154. {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/rate.py +0 -0
  155. {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/rate_binned.py +0 -0
  156. {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/scatter.py +0 -0
  157. {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/tiles.py +0 -0
  158. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/blrms.py +0 -0
  159. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/correlate.py +0 -0
  160. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/filter.py +0 -0
  161. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/index.rst +0 -0
  162. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/inject.py +0 -0
  163. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/public.py +0 -0
  164. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/pycbc-snr.py +0 -0
  165. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/qscan.py +0 -0
  166. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/statevector.py +0 -0
  167. {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/whiten.py +0 -0
  168. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/__init__.py +0 -0
  169. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/__init__.py +0 -0
  170. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/range.py +0 -0
  171. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/tests/__init__.py +0 -0
  172. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/tests/test_range.py +0 -0
  173. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/__init__.py +0 -0
  174. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/cliproduct.py +0 -0
  175. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/coherence.py +0 -0
  176. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/coherencegram.py +0 -0
  177. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/qtransform.py +0 -0
  178. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/spectrogram.py +0 -0
  179. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/spectrum.py +0 -0
  180. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/__init__.py +0 -0
  181. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_coherence.py +0 -0
  182. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_coherencegram.py +0 -0
  183. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_gwpy_plot.py +0 -0
  184. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_qtransform.py +0 -0
  185. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_spectrogram.py +0 -0
  186. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_spectrum.py +0 -0
  187. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_timeseries.py +0 -0
  188. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_transferfunction.py +0 -0
  189. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/timeseries.py +0 -0
  190. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/transferfunction.py +0 -0
  191. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/conftest.py +0 -0
  192. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/__init__.py +0 -0
  193. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/channel.py +0 -0
  194. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/__init__.py +0 -0
  195. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/cis.py +0 -0
  196. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/clf.py +0 -0
  197. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/omega.py +0 -0
  198. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/tests/__init__.py +0 -0
  199. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/tests/test_channel.py +0 -0
  200. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/tests/test_units.py +0 -0
  201. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/__init__.py +0 -0
  202. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/_fdcommon.py +0 -0
  203. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/frequencyseries.py +0 -0
  204. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/hist.py +0 -0
  205. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/__init__.py +0 -0
  206. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/ascii.py +0 -0
  207. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/hdf5.py +0 -0
  208. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/ligolw.py +0 -0
  209. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/tests/__init__.py +0 -0
  210. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/tests/test_frequencyseries.py +0 -0
  211. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/__init__.py +0 -0
  212. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/_framecpp.py +0 -0
  213. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/cache.py +0 -0
  214. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/gwf.py +0 -0
  215. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/hdf5.py +0 -0
  216. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/kerberos.py +0 -0
  217. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/ligolw.py +0 -0
  218. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/mp.py +0 -0
  219. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/nds2.py +0 -0
  220. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/registry.py +0 -0
  221. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/__init__.py +0 -0
  222. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_cache.py +0 -0
  223. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_ffldatafind.py +0 -0
  224. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_gwf.py +0 -0
  225. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_kerberos.py +0 -0
  226. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_ligolw.py +0 -0
  227. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_mp.py +0 -0
  228. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_nds2.py +0 -0
  229. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_utils.py +0 -0
  230. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/utils.py +0 -0
  231. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/__init__.py +0 -0
  232. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/bode.py +0 -0
  233. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/colorbar.py +0 -0
  234. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/colors.py +0 -0
  235. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/gps.py +0 -0
  236. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/legend.py +0 -0
  237. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/log.py +0 -0
  238. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/rc.py +0 -0
  239. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/__init__.py +0 -0
  240. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_bode.py +0 -0
  241. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_colors.py +0 -0
  242. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_gps.py +0 -0
  243. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_log.py +0 -0
  244. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_plot.py +0 -0
  245. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_rc.py +0 -0
  246. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_tex.py +0 -0
  247. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_text.py +0 -0
  248. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_utils.py +0 -0
  249. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/utils.py +0 -0
  250. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tex.py +0 -0
  251. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/text.py +0 -0
  252. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/units.py +0 -0
  253. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/utils.py +0 -0
  254. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/__init__.py +0 -0
  255. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/json.py +0 -0
  256. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/ligolw.py +0 -0
  257. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/segwizard.py +0 -0
  258. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/tests/__init__.py +0 -0
  259. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/tests/test_flag.py +0 -0
  260. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/tests/test_segments.py +0 -0
  261. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/__init__.py +0 -0
  262. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/fft.py +0 -0
  263. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/qtransform.py +0 -0
  264. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/__init__.py +0 -0
  265. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_lal.py +0 -0
  266. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_median_mean.py +0 -0
  267. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_pycbc.py +0 -0
  268. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_registry.py +0 -0
  269. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_scipy.py +0 -0
  270. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_ui.py +0 -0
  271. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_utils.py +0 -0
  272. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/__init__.py +0 -0
  273. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_filter_design.py +0 -0
  274. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_qtransform.py +0 -0
  275. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_lal.py +0 -0
  276. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_median_mean.py +0 -0
  277. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_pycbc.py +0 -0
  278. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_registry.py +0 -0
  279. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_scipy.py +0 -0
  280. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_ui.py +0 -0
  281. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_utils.py +0 -0
  282. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_window.py +0 -0
  283. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/window.py +0 -0
  284. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/__init__.py +0 -0
  285. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/coherence.py +0 -0
  286. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/io/__init__.py +0 -0
  287. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/io/hdf5.py +0 -0
  288. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/spectrogram.py +0 -0
  289. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/tests/__init__.py +0 -0
  290. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/tests/test_spectrogram.py +0 -0
  291. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/__init__.py +0 -0
  292. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/filter.py +0 -0
  293. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/filters.py +0 -0
  294. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/gravityspy.py +0 -0
  295. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/__init__.py +0 -0
  296. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/cwb.py +0 -0
  297. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/fetch.py +0 -0
  298. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/gravityspy.py +0 -0
  299. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/gstlal.py +0 -0
  300. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/gwf.py +0 -0
  301. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/hacr.py +0 -0
  302. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/losc.py +0 -0
  303. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/omega.py +0 -0
  304. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/omicron.py +0 -0
  305. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/pycbc.py +0 -0
  306. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/root.py +0 -0
  307. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/snax.py +0 -0
  308. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/sql.py +0 -0
  309. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/utils.py +0 -0
  310. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/table.py +0 -0
  311. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/__init__.py +0 -0
  312. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_gravityspy.py +0 -0
  313. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_io_gstlal.py +0 -0
  314. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_io_pycbc.py +0 -0
  315. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_table.py +0 -0
  316. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/__init__.py +0 -0
  317. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  318. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/HLV-HW100916-968654552-1.gwf +0 -0
  319. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/HLV-HW100916-968654552-1.hdf +0 -0
  320. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.txt +0 -0
  321. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.xml.gz +0 -0
  322. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/fixtures.py +0 -0
  323. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/mocks.py +0 -0
  324. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/utils.py +0 -0
  325. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/__init__.py +0 -0
  326. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/__main__.py +0 -0
  327. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/_tconvert.py +0 -0
  328. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/tests/__init__.py +0 -0
  329. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/tests/test_main.py +0 -0
  330. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/tests/test_time.py +0 -0
  331. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/__init__.py +0 -0
  332. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/__init__.py +0 -0
  333. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/ascii.py +0 -0
  334. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/cache.py +0 -0
  335. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/core.py +0 -0
  336. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/framecpp.py +0 -0
  337. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/framel.py +0 -0
  338. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/lalframe.py +0 -0
  339. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/hdf5.py +0 -0
  340. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/losc.py +0 -0
  341. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/nds2.py +0 -0
  342. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/wav.py +0 -0
  343. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/__init__.py +0 -0
  344. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_cache.py +0 -0
  345. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_gwf_lalframe.py +0 -0
  346. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_losc.py +0 -0
  347. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/timeseries.py +0 -0
  348. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/__init__.py +0 -0
  349. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/array.py +0 -0
  350. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/array2d.py +0 -0
  351. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/index.py +0 -0
  352. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/__init__.py +0 -0
  353. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/ascii.py +0 -0
  354. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/hdf5.py +0 -0
  355. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/ligolw.py +0 -0
  356. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/series.py +0 -0
  357. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/sliceutils.py +0 -0
  358. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/__init__.py +0 -0
  359. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_index.py +0 -0
  360. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/__init__.py +0 -0
  361. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/decorators.py +0 -0
  362. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/enum.py +0 -0
  363. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/env.py +0 -0
  364. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/lal.py +0 -0
  365. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/misc.py +0 -0
  366. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/mp.py +0 -0
  367. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/progress.py +0 -0
  368. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/shell.py +0 -0
  369. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/sphinx/__init__.py +0 -0
  370. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/sphinx/ex2rst.py +0 -0
  371. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/__init__.py +0 -0
  372. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_decorators.py +0 -0
  373. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_enum.py +0 -0
  374. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_env.py +0 -0
  375. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_lal.py +0 -0
  376. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_misc.py +0 -0
  377. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_mp.py +0 -0
  378. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_shell.py +0 -0
  379. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_sphinx_ex2rst.py +0 -0
  380. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/dependency_links.txt +0 -0
  381. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/entry_points.txt +0 -0
  382. {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/top_level.txt +0 -0
  383. {gwpy-3.0.9 → gwpy-3.0.11}/setup.cfg +0 -0
  384. {gwpy-3.0.9 → gwpy-3.0.11}/setup_utils.py +0 -0
@@ -0,0 +1,105 @@
1
+ # -- Check dependency compatibility
2
+ #
3
+ # These jobs check that the minimum versions are well specified,
4
+ # and that this project is compatible with the new pre-relase
5
+ # versions of anything we can find.
6
+ #
7
+
8
+ spec:
9
+ inputs:
10
+ stage:
11
+ default: test
12
+ description: "Pipeline stage in which to add jobs"
13
+ type: string
14
+ pytest_options:
15
+ default: ""
16
+ description: "Extra options to pass to pytest"
17
+ type: string
18
+ minimum_python_version:
19
+ default: "3.9"
20
+ description: "Python version for minimum dependency compatibility check"
21
+ type: string
22
+
23
+ ---
24
+
25
+ include:
26
+ - local: .gitlab/ci/rules.yml
27
+
28
+ # configure minimum dependency compatibility job
29
+ - local: .gitlab/ci/test-job.yml
30
+ inputs:
31
+ stage: $[[ inputs.stage ]]
32
+ job_name: "compat_minimum"
33
+ install_target: "."
34
+ install_extra: "test"
35
+ pip_options: "--upgrade-strategy=only-if-needed"
36
+ pytest_options: $[[ inputs.pytest_options ]]
37
+
38
+ # configure experimental dependency compatibility job
39
+ - local: .gitlab/ci/test-job.yml
40
+ inputs:
41
+ stage: $[[ inputs.stage ]]
42
+ job_name: "compat_experimental"
43
+ install_target: "."
44
+ install_extra: "test,dev"
45
+ pip_options: "--upgrade --upgrade-strategy=eager --pre"
46
+ pytest_options: $[[ inputs.pytest_options ]]
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
+
56
+ .compat_rules:
57
+ rules:
58
+ - if: '$CI_COMMIT_MESSAGE =~ /\[skip compat\]/'
59
+ when: never
60
+ - !reference [.rules_nightly, rules]
61
+ - !reference [.rules_full_test, rules]
62
+
63
+ # test against the minimum specified requirements
64
+ compat_minimum:
65
+ extends:
66
+ - .compat_minimum
67
+ - .compat_rules
68
+ image: python:$[[ inputs.minimum_python_version ]]
69
+ before_script:
70
+ # replace the requirements as follows:
71
+ # >=X.Y.Z ---> X.Y.Z (exact pin to minimum)
72
+ # ^X.Y ---> ~X.Y (pin to X.Y.*)
73
+ - sed -i -E
74
+ -e 's/>=/==/'
75
+ -e 's/\^/~/'
76
+ pyproject.toml
77
+ # undo the change to python_requires
78
+ - sed -i -E
79
+ -e 's/requires-python = "==/requires-python = ">=/'
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
93
+
94
+ # test against latest/pre-release versions
95
+ compat_experimental:
96
+ extends:
97
+ - .compat_experimental
98
+ - .compat_rules
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]
@@ -0,0 +1,32 @@
1
+ # -- Python test coverage measurements
2
+
3
+ spec:
4
+ inputs:
5
+
6
+ ---
7
+
8
+ include:
9
+ - local: .gitlab/ci/rules.yml
10
+
11
+ coverage:
12
+ stage: .post
13
+ image: python
14
+ rules: !reference [.rules_full_test, rules]
15
+ script:
16
+ # install coverage (with toml parsing extra)
17
+ - python -m pip install coverage[toml]
18
+ # combine coverage files from other jobs
19
+ - python -m coverage combine .coverage*
20
+ # write an HTML report
21
+ - python -m coverage html -d htmlcov
22
+ # print a report (for the record)
23
+ - python -m coverage report -m
24
+ allow_failure: true
25
+ artifacts:
26
+ name: htmlcov
27
+ expose_as: Coverage report
28
+ paths:
29
+ - htmlcov/index.html
30
+ - htmlcov
31
+ # report coverage here, now that we have all of the information
32
+ coverage: '/^TOTAL\s+.*\s+(\d+\.?\d*)%/'
@@ -0,0 +1,28 @@
1
+ #!/bin/bash
2
+ #
3
+ # Initialise credentials for jobs
4
+ #
5
+
6
+ if [ "${KERBEROS_KEYTAB}" = "" ]; then
7
+ echo -e "\x1B[94mNo KERBEROS_KEYTAB configured, skipping credential init.\x1B[0m"
8
+ exit 0
9
+ fi
10
+
11
+ # install tooling
12
+ conda install -c conda-forge -q -y ciecplib krb5
13
+
14
+ # unpack keytab
15
+ export KRB5_KTNAME="${CI_PROJECT_DIR}/.keytab"
16
+ echo "${KERBEROS_KEYTAB}" | base64 -d > ${KRB5_KTNAME}
17
+ chmod 0600 "${KRB5_KTNAME}"
18
+
19
+ # find principal
20
+ export KRB5_PRINCIPAL="$(klist -k ${KRB5_KTNAME} | tail -n 1 | awk '{print $2}')"
21
+
22
+ # get Kerberos TGT
23
+ kinit "${KRB5_PRINCIPAL}" -k -t "${KRB5_KTNAME}"
24
+ klist
25
+
26
+ # get LIGO.ORG X.509
27
+ ecp-get-cert -i login.ligo.org --kerberos
28
+ ecp-cert-info
@@ -0,0 +1,30 @@
1
+ spec:
2
+ inputs:
3
+
4
+ ---
5
+
6
+ .linux:
7
+ rules:
8
+ - if: '$CI_COMMIT_MESSAGE =~ /\[skip linux\]/'
9
+ when: never
10
+ tags:
11
+ - saas-linux-medium-amd64
12
+
13
+ .macos:
14
+ rules:
15
+ - if: '$CI_COMMIT_MESSAGE =~ /\[skip macos\]/'
16
+ when: never
17
+ tags:
18
+ - saas-macos-medium-m1
19
+ image: macos-14-xcode-15
20
+
21
+ .windows:
22
+ rules:
23
+ - if: '$CI_COMMIT_MESSAGE =~ /\[skip windows\]/'
24
+ when: never
25
+ variables:
26
+ # windows gitlab runners don't support symbolic links, so we can't
27
+ # run the tests that rely upon them
28
+ PYTEST_ADDOPTS: "-k 'not table\\\\rate and not table\\\\tiles'"
29
+ tags:
30
+ - saas-windows-medium-amd64
@@ -0,0 +1,37 @@
1
+ # Common elements for Python components
2
+
3
+ spec:
4
+ inputs:
5
+ cache_dir:
6
+ default: ".cache/pip"
7
+ description: "The path to cache to (relative to CI_PROJECT_DIR)"
8
+ image:
9
+ default: "python"
10
+ description: "The default image to use for jobs"
11
+ job_prefix:
12
+ default: ".python"
13
+ description: "Prefix to apply to all templates"
14
+
15
+ ---
16
+
17
+ $[[ inputs.job_prefix ]]_image:
18
+ image: $[[ inputs.image ]]
19
+
20
+ $[[ inputs.job_prefix ]]_cache:
21
+ variables:
22
+ PIP_CACHE_DIR: "${CI_PROJECT_DIR}/$[[ inputs.cache_dir ]]"
23
+ cache:
24
+ key: "pip-${CI_JOB_NAME_SLUG}"
25
+ paths:
26
+ - $[[ inputs.cache_dir ]]
27
+
28
+ $[[ inputs.job_prefix ]]_base:
29
+ extends:
30
+ - $[[ inputs.job_prefix ]]_image
31
+ - $[[ inputs.job_prefix ]]_cache
32
+ retry:
33
+ # retry all jobs at most twice when gitlab-ci fails to start the job properly
34
+ # see https://docs.gitlab.com/ee/ci/yaml/#retry
35
+ max: 2
36
+ when:
37
+ - runner_system_failure
@@ -0,0 +1,43 @@
1
+ # -- Build Python project distributions
2
+
3
+ spec:
4
+ inputs:
5
+ stage:
6
+ default: build
7
+ description: "Pipeline stage in which to add jobs"
8
+ type: string
9
+
10
+ ---
11
+
12
+ include:
13
+ - local: .gitlab/ci/rules.yml
14
+
15
+ build:
16
+ rules: !reference [.rules_build, rules]
17
+ needs: []
18
+ stage: $[[ inputs.stage ]]
19
+ image: python
20
+ variables:
21
+ # get the full history for setuptools-scm
22
+ GIT_DEPTH: 0
23
+ before_script:
24
+ - python -m pip install
25
+ build
26
+ script:
27
+ # if running a default branch push pipeline, strip the +g<HASH> suffix
28
+ # from the version to give something that test.pypi.org will accept
29
+ - |
30
+ if [ "${CI_COMMIT_TAG}" = "" ] && [ "${CI_PIPELINE_SOURCE}" = "push" ] && [ "${CI_COMMIT_BRANCH}" = "${CI_DEFAULT_BRANCH}" ]; then
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}'";
35
+ fi
36
+ # generate the distributions
37
+ - python -m build . -o .
38
+ - python -m tarfile --list *.tar.*
39
+ - python -m zipfile --list *.whl
40
+ artifacts:
41
+ paths:
42
+ - "*.tar.*"
43
+ - "*.whl"
@@ -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
@@ -0,0 +1,81 @@
1
+ # -- GWpy CI/CD workflow rules
2
+
3
+ spec:
4
+ inputs:
5
+ # project_path:
6
+ # description: "Path of parent project for which to define rules"
7
+ # type: string
8
+
9
+ ---
10
+
11
+ # -- basics
12
+
13
+ # tag pipelines
14
+ .rules_tag:
15
+ rules:
16
+ - if: $CI_COMMIT_TAG
17
+
18
+ # default branch (all pipelines)
19
+ .rules_default:
20
+ rules:
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'
27
+
28
+ # schedules on default branch
29
+ .rules_default_schedule:
30
+ rules:
31
+ - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
32
+
33
+ # merge requests
34
+ .rules_merge_request:
35
+ rules:
36
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
37
+
38
+ # new branches
39
+ .rules_branch:
40
+ rules:
41
+ # not on branches with an open merge request
42
+ - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
43
+ when: never
44
+ - if: $CI_COMMIT_BRANCH
45
+
46
+ # -- job types
47
+
48
+ # deployment jobs
49
+ .rules_deploy:
50
+ rules:
51
+ - !reference [.rules_tag, rules]
52
+
53
+ # nightly builds
54
+ .rules_nightly:
55
+ rules:
56
+ - !reference [.rules_default_schedule, rules]
57
+
58
+ # build jobs
59
+ .rules_build:
60
+ rules:
61
+ - !reference [.rules_tag, rules]
62
+ - !reference [.rules_default_push, rules]
63
+ - !reference [.rules_merge_request, rules]
64
+ - !reference [.rules_branch, rules]
65
+
66
+ # full test suite
67
+ .rules_full_test:
68
+ rules:
69
+ - !reference [.rules_default_push, rules]
70
+ - !reference [.rules_merge_request, rules]
71
+
72
+ # basic test suite
73
+ .rules_basic_test:
74
+ rules:
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]
@@ -0,0 +1,65 @@
1
+ # -- Sphinx documentation
2
+
3
+ spec:
4
+ inputs:
5
+ stage:
6
+ default: test
7
+ description: "Pipeline stage in which to add jobs"
8
+ type: string
9
+ image:
10
+ default: python
11
+ description: "Container image to build in"
12
+ type: string
13
+ requirements:
14
+ default: ""
15
+ description: "Extra packages to install with pip before building"
16
+ type: string
17
+ builder:
18
+ default: "html"
19
+ description: "Sphinx builder to use"
20
+ type: string
21
+ sphinx_sourcedir:
22
+ default: ""
23
+ description: "Path of directory containing the Sphinx conf.py (auto-discovered if not set)"
24
+ type: string
25
+ sphinx_options:
26
+ default: ""
27
+ description: "Extra options to pass to sphinx-build"
28
+ type: string
29
+ sphinx_outputdir:
30
+ default: "sphinx"
31
+ description: "Sphinx build output directory (relative to `$CI_PROJECT_DIR`)"
32
+ type: string
33
+
34
+ ---
35
+
36
+ include:
37
+ - local: .gitlab/ci/rules.yml
38
+ - local: .gitlab/ci/python-base.yml
39
+ - local: .gitlab/ci/conda-test.yml
40
+ inputs:
41
+ job_name: ".conda_test"
42
+
43
+ sphinx:
44
+ extends: .python_base
45
+ rules: !reference [.rules_full_test, rules]
46
+ stage: $[[ inputs.stage ]]
47
+ image: $[[ inputs.image ]]
48
+ before_script:
49
+ - !reference [.conda_test_linux, before_script]
50
+ script:
51
+ # install sphinx
52
+ - python -m pip install sphinx $[[ inputs.requirements ]]
53
+ - python -m pip list installed
54
+ # run sphinx
55
+ - python -m sphinx
56
+ -b $[[ inputs.builder ]]
57
+ $[[ inputs.sphinx_sourcedir | expand_vars ]]
58
+ $[[ inputs.sphinx_outputdir | expand_vars ]]
59
+ $[[ inputs.sphinx_options ]]
60
+ artifacts:
61
+ name: "sphinx"
62
+ expose_as: "Sphinx docs"
63
+ paths:
64
+ - $[[ inputs.sphinx_outputdir ]]/index.html
65
+ - $[[ inputs.sphinx_outputdir ]]
@@ -0,0 +1,88 @@
1
+ # -- Basic Pytest-based test template
2
+
3
+ spec:
4
+ inputs:
5
+ stage:
6
+ default: test
7
+ description: "Pipeline stage in which to add jobs"
8
+ type: string
9
+ job_name:
10
+ default: test
11
+ description: "Name to give this job"
12
+ type: string
13
+ install_target:
14
+ default: "."
15
+ description: "Directory/distribution/package to install"
16
+ type: string
17
+ install_extra:
18
+ default: "test"
19
+ description: "Name of the extra feature group(s) to install when installing <install_target>"
20
+ type: string
21
+ pip_options:
22
+ default: ""
23
+ description: "Extra options to pass to pip install"
24
+ type: string
25
+ pytest_options:
26
+ default: ""
27
+ description: "Extra options to pass to pytest"
28
+ type: string
29
+ extra_test_commands:
30
+ default: []
31
+ description: "Extra test commands to run (after pytest)"
32
+ type: array
33
+
34
+ ---
35
+
36
+ include:
37
+ - local: .gitlab/ci/python-base.yml
38
+
39
+ .$[[ inputs.job_name ]]:
40
+ extends:
41
+ - .python_base
42
+ variables:
43
+ # store coverage in a file named for this job (to be combined later)
44
+ COVERAGE_FILE: ".coverage-${CI_JOB_NAME_SLUG}"
45
+ # cache downloaded data
46
+ GWPY_CACHE: "1"
47
+ # store caches in .cache
48
+ XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache"
49
+ script:
50
+ # print some basic information about python
51
+ - python --version
52
+ - python -m site
53
+ - python -m sysconfig
54
+ # create the cache directory (so that astropy will actually use it)
55
+ # (this isn't just 'mkdir -p ...' because Windows)
56
+ - python -c "import os;
57
+ from pathlib import Path;
58
+ (Path(os.getenv('XDG_CACHE_HOME')) / 'astropy').mkdir(parents=True, exist_ok=True)
59
+ "
60
+ # install pytest
61
+ - python -m pip install pytest pytest-cov $[[ inputs.pip_options ]]
62
+ - python -m pip install $[[ inputs.install_target ]][$[[ inputs.install_extra ]]] $[[ inputs.pip_options ]]
63
+ # list installed packages
64
+ - python -m pip list installed
65
+ # run the tests
66
+ - python -m pytest --junit-xml=junit.xml $[[ inputs.pytest_options ]]
67
+ # run any extra tests
68
+ - $[[ inputs.extra_test_commands ]]
69
+ # format the coverage report
70
+ - python -m coverage xml -o coverage.xml
71
+ artifacts:
72
+ reports:
73
+ # coverage report
74
+ coverage_report:
75
+ coverage_format: cobertura
76
+ path: coverage.xml
77
+ # test report
78
+ junit: junit.xml
79
+ paths:
80
+ - .coverage*
81
+ coverage: null
82
+ cache:
83
+ # cache pip packages
84
+ - !reference [.python_base, cache]
85
+ # cache GWpy downloaded files
86
+ - key: "gwpy-${CI_JOB_NAME_SLUG}"
87
+ paths:
88
+ - .cache/astropy/download