gwpy 3.0.8__tar.gz → 3.0.10__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 (385) hide show
  1. gwpy-3.0.10/.gitlab/ci/compatibility.yml +79 -0
  2. gwpy-3.0.10/.gitlab/ci/coverage.yml +32 -0
  3. gwpy-3.0.10/.gitlab/ci/init-creds.sh +28 -0
  4. gwpy-3.0.10/.gitlab/ci/init-cvmfs.sh +42 -0
  5. gwpy-3.0.10/.gitlab/ci/platforms.yml +30 -0
  6. gwpy-3.0.10/.gitlab/ci/python-base.yml +37 -0
  7. gwpy-3.0.10/.gitlab/ci/python-dist.yml +42 -0
  8. gwpy-3.0.10/.gitlab/ci/qa.yml +52 -0
  9. gwpy-3.0.10/.gitlab/ci/rules.yml +70 -0
  10. gwpy-3.0.10/.gitlab/ci/sphinx.yml +65 -0
  11. gwpy-3.0.10/.gitlab/ci/test-job.yml +84 -0
  12. gwpy-3.0.10/.gitlab/ci/test.yml +249 -0
  13. gwpy-3.0.10/.gitlab/ci/twine.yml +68 -0
  14. gwpy-3.0.10/.gitlab-ci.yml +44 -0
  15. gwpy-3.0.10/CONTRIBUTING.md +160 -0
  16. {gwpy-3.0.8 → gwpy-3.0.10}/PKG-INFO +14 -13
  17. {gwpy-3.0.8 → gwpy-3.0.10}/README.md +7 -5
  18. {gwpy-3.0.8 → gwpy-3.0.10}/docs/conf.py +3 -4
  19. {gwpy-3.0.8 → gwpy-3.0.10}/docs/external/lalsuite.rst +1 -1
  20. {gwpy-3.0.8 → gwpy-3.0.10}/docs/references.rst +10 -0
  21. {gwpy-3.0.8 → gwpy-3.0.10}/docs/spectrogram/index.rst +7 -5
  22. {gwpy-3.0.8 → gwpy-3.0.10}/docs/spectrum/index.rst +7 -4
  23. {gwpy-3.0.8 → gwpy-3.0.10}/docs/timeseries/datafind.rst +12 -0
  24. {gwpy-3.0.8 → gwpy-3.0.10}/examples/miscellaneous/open-data-spectrogram.py +32 -18
  25. {gwpy-3.0.8 → gwpy-3.0.10}/examples/test_examples.py +1 -0
  26. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/_version.py +2 -2
  27. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/astro/range.py +3 -3
  28. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/astro/tests/test_range.py +4 -5
  29. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/gwpy_plot.py +1 -1
  30. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/qtransform.py +1 -1
  31. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/base.py +11 -1
  32. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/units.py +2 -1
  33. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/tests/test_hist.py +4 -3
  34. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/datafind.py +1 -0
  35. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/ffldatafind.py +27 -16
  36. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_ffldatafind.py +10 -3
  37. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/plot.py +12 -2
  38. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_segments.py +1 -1
  39. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tex.py +6 -4
  40. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/flag.py +13 -11
  41. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/filter_design.py +5 -4
  42. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_coherence.py +31 -10
  43. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_filter_design.py +3 -3
  44. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/spectrogram/tests/test_spectrogram.py +2 -2
  45. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/ligolw.py +1 -1
  46. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/tests/test_io_ligolw.py +1 -1
  47. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/errors.py +1 -0
  48. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/fixtures.py +1 -18
  49. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/utils.py +15 -6
  50. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/core.py +0 -1
  51. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/cache.py +47 -29
  52. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/gwf/lalframe.py +8 -0
  53. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/statevector.py +4 -2
  54. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/tests/test_core.py +7 -13
  55. gwpy-3.0.10/gwpy/timeseries/tests/test_io_cache.py +74 -0
  56. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/tests/test_io_gwf_framecpp.py +1 -1
  57. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/tests/test_statevector.py +29 -17
  58. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/tests/test_timeseries.py +37 -34
  59. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/array.py +16 -3
  60. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/index.py +7 -5
  61. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/tests/test_array.py +12 -10
  62. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/tests/test_array2d.py +5 -9
  63. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/tests/test_series.py +5 -5
  64. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/sphinx/zenodo.py +5 -1
  65. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_sphinx_zenodo.py +23 -0
  66. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy.egg-info/PKG-INFO +14 -13
  67. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy.egg-info/SOURCES.txt +15 -8
  68. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy.egg-info/requires.txt +6 -5
  69. {gwpy-3.0.8 → gwpy-3.0.10}/pyproject.toml +15 -12
  70. gwpy-3.0.8/.codeclimate.yml +0 -39
  71. gwpy-3.0.8/.codecov.yml +0 -21
  72. gwpy-3.0.8/.github/workflows/conda.yml +0 -173
  73. gwpy-3.0.8/.github/workflows/dependencies.yml +0 -110
  74. gwpy-3.0.8/.github/workflows/dist.yml +0 -141
  75. gwpy-3.0.8/.github/workflows/lint.yml +0 -66
  76. gwpy-3.0.8/.github/workflows/release.yml +0 -54
  77. gwpy-3.0.8/.pep8speaks.yml +0 -3
  78. gwpy-3.0.8/CONTRIBUTING.md +0 -129
  79. {gwpy-3.0.8 → gwpy-3.0.10}/.flake8 +0 -0
  80. {gwpy-3.0.8 → gwpy-3.0.10}/.gitattributes +0 -0
  81. {gwpy-3.0.8 → gwpy-3.0.10}/.gitignore +0 -0
  82. {gwpy-3.0.8 → gwpy-3.0.10}/CODE_OF_CONDUCT.rst +0 -0
  83. {gwpy-3.0.8 → gwpy-3.0.10}/LICENSE +0 -0
  84. {gwpy-3.0.8 → gwpy-3.0.10}/MANIFEST.in +0 -0
  85. {gwpy-3.0.8 → gwpy-3.0.10}/docs/Makefile +0 -0
  86. {gwpy-3.0.8 → gwpy-3.0.10}/docs/_static/css/gwpy-sphinx.css +0 -0
  87. {gwpy-3.0.8 → gwpy-3.0.10}/docs/_static/favicon.png +0 -0
  88. {gwpy-3.0.8 → gwpy-3.0.10}/docs/_static/gwpy_white_24.png +0 -0
  89. {gwpy-3.0.8 → gwpy-3.0.10}/docs/_templates/autoclass/class.rst +0 -0
  90. {gwpy-3.0.8 → gwpy-3.0.10}/docs/_templates/autosummary/base.rst +0 -0
  91. {gwpy-3.0.8 → gwpy-3.0.10}/docs/_templates/autosummary/class.rst +0 -0
  92. {gwpy-3.0.8 → gwpy-3.0.10}/docs/_templates/autosummary/module.rst +0 -0
  93. {gwpy-3.0.8 → gwpy-3.0.10}/docs/astro/index.rst +0 -0
  94. {gwpy-3.0.8 → gwpy-3.0.10}/docs/citing.rst.in +0 -0
  95. {gwpy-3.0.8 → gwpy-3.0.10}/docs/cli/examples.ini +0 -0
  96. {gwpy-3.0.8 → gwpy-3.0.10}/docs/cli/index.rst +0 -0
  97. {gwpy-3.0.8 → gwpy-3.0.10}/docs/detector/channel.rst +0 -0
  98. {gwpy-3.0.8 → gwpy-3.0.10}/docs/dev/release.rst +0 -0
  99. {gwpy-3.0.8 → gwpy-3.0.10}/docs/env.rst +0 -0
  100. {gwpy-3.0.8 → gwpy-3.0.10}/docs/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  101. {gwpy-3.0.8 → gwpy-3.0.10}/docs/external/framecpp.rst +0 -0
  102. {gwpy-3.0.8 → gwpy-3.0.10}/docs/external/framel.rst +0 -0
  103. {gwpy-3.0.8 → gwpy-3.0.10}/docs/external/nds2.rst +0 -0
  104. {gwpy-3.0.8 → gwpy-3.0.10}/docs/gwpy-docs-logo.png +0 -0
  105. {gwpy-3.0.8 → gwpy-3.0.10}/docs/index.rst +0 -0
  106. {gwpy-3.0.8 → gwpy-3.0.10}/docs/install.rst +0 -0
  107. {gwpy-3.0.8 → gwpy-3.0.10}/docs/overview.rst +0 -0
  108. {gwpy-3.0.8 → gwpy-3.0.10}/docs/plot/colorbars.rst +0 -0
  109. {gwpy-3.0.8 → gwpy-3.0.10}/docs/plot/colors.rst +0 -0
  110. {gwpy-3.0.8 → gwpy-3.0.10}/docs/plot/filter.rst +0 -0
  111. {gwpy-3.0.8 → gwpy-3.0.10}/docs/plot/gps.rst +0 -0
  112. {gwpy-3.0.8 → gwpy-3.0.10}/docs/plot/index.rst +0 -0
  113. {gwpy-3.0.8 → gwpy-3.0.10}/docs/plot/legend.rst +0 -0
  114. {gwpy-3.0.8 → gwpy-3.0.10}/docs/plot/log.rst +0 -0
  115. {gwpy-3.0.8 → gwpy-3.0.10}/docs/segments/dqsegdb.rst +0 -0
  116. {gwpy-3.0.8 → gwpy-3.0.10}/docs/segments/index.rst +0 -0
  117. {gwpy-3.0.8 → gwpy-3.0.10}/docs/segments/io.rst +0 -0
  118. {gwpy-3.0.8 → gwpy-3.0.10}/docs/segments/thresholding.rst +0 -0
  119. {gwpy-3.0.8 → gwpy-3.0.10}/docs/signal/index.rst +0 -0
  120. {gwpy-3.0.8 → gwpy-3.0.10}/docs/spectrum/filtering.rst +0 -0
  121. {gwpy-3.0.8 → gwpy-3.0.10}/docs/spectrum/io.rst +0 -0
  122. {gwpy-3.0.8 → gwpy-3.0.10}/docs/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  123. {gwpy-3.0.8 → gwpy-3.0.10}/docs/table/filter.rst +0 -0
  124. {gwpy-3.0.8 → gwpy-3.0.10}/docs/table/histogram.rst +0 -0
  125. {gwpy-3.0.8 → gwpy-3.0.10}/docs/table/index.rst +0 -0
  126. {gwpy-3.0.8 → gwpy-3.0.10}/docs/table/io.rst +0 -0
  127. {gwpy-3.0.8 → gwpy-3.0.10}/docs/table/plot.rst +0 -0
  128. {gwpy-3.0.8 → gwpy-3.0.10}/docs/table/rate.rst +0 -0
  129. {gwpy-3.0.8 → gwpy-3.0.10}/docs/time/index.rst +0 -0
  130. {gwpy-3.0.8 → gwpy-3.0.10}/docs/timeseries/index.rst +0 -0
  131. {gwpy-3.0.8 → gwpy-3.0.10}/docs/timeseries/io.rst +0 -0
  132. {gwpy-3.0.8 → gwpy-3.0.10}/docs/timeseries/opendata.rst +0 -0
  133. {gwpy-3.0.8 → gwpy-3.0.10}/docs/timeseries/plot.rst +0 -0
  134. {gwpy-3.0.8 → gwpy-3.0.10}/docs/timeseries/statevector.rst +0 -0
  135. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/coherence.py +0 -0
  136. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/hoff.py +0 -0
  137. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/index.rst +0 -0
  138. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/inject.py +0 -0
  139. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/percentiles.py +0 -0
  140. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/rayleigh.py +0 -0
  141. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/transfer_function.py +0 -0
  142. {gwpy-3.0.8 → gwpy-3.0.10}/examples/frequencyseries/variance.py +0 -0
  143. {gwpy-3.0.8 → gwpy-3.0.10}/examples/miscellaneous/index.rst +0 -0
  144. {gwpy-3.0.8 → gwpy-3.0.10}/examples/miscellaneous/range-spectrogram.py +0 -0
  145. {gwpy-3.0.8 → gwpy-3.0.10}/examples/miscellaneous/range-timeseries.py +0 -0
  146. {gwpy-3.0.8 → gwpy-3.0.10}/examples/segments/index.rst +0 -0
  147. {gwpy-3.0.8 → gwpy-3.0.10}/examples/segments/open-data.py +0 -0
  148. {gwpy-3.0.8 → gwpy-3.0.10}/examples/signal/gw150914.py +0 -0
  149. {gwpy-3.0.8 → gwpy-3.0.10}/examples/signal/index.rst +0 -0
  150. {gwpy-3.0.8 → gwpy-3.0.10}/examples/signal/qscan.py +0 -0
  151. {gwpy-3.0.8 → gwpy-3.0.10}/examples/spectrogram/coherence.py +0 -0
  152. {gwpy-3.0.8 → gwpy-3.0.10}/examples/spectrogram/index.rst +0 -0
  153. {gwpy-3.0.8 → gwpy-3.0.10}/examples/spectrogram/plot.py +0 -0
  154. {gwpy-3.0.8 → gwpy-3.0.10}/examples/spectrogram/ratio.py +0 -0
  155. {gwpy-3.0.8 → gwpy-3.0.10}/examples/spectrogram/rayleigh.py +0 -0
  156. {gwpy-3.0.8 → gwpy-3.0.10}/examples/spectrogram/spectrogram2.py +0 -0
  157. {gwpy-3.0.8 → gwpy-3.0.10}/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  158. {gwpy-3.0.8 → gwpy-3.0.10}/examples/table/histogram.py +0 -0
  159. {gwpy-3.0.8 → gwpy-3.0.10}/examples/table/index.rst +0 -0
  160. {gwpy-3.0.8 → gwpy-3.0.10}/examples/table/rate.py +0 -0
  161. {gwpy-3.0.8 → gwpy-3.0.10}/examples/table/rate_binned.py +0 -0
  162. {gwpy-3.0.8 → gwpy-3.0.10}/examples/table/scatter.py +0 -0
  163. {gwpy-3.0.8 → gwpy-3.0.10}/examples/table/tiles.py +0 -0
  164. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/blrms.py +0 -0
  165. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/correlate.py +0 -0
  166. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/filter.py +0 -0
  167. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/index.rst +0 -0
  168. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/inject.py +0 -0
  169. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/public.py +0 -0
  170. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/pycbc-snr.py +0 -0
  171. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/qscan.py +0 -0
  172. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/statevector.py +0 -0
  173. {gwpy-3.0.8 → gwpy-3.0.10}/examples/timeseries/whiten.py +0 -0
  174. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/__init__.py +0 -0
  175. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/astro/__init__.py +0 -0
  176. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/astro/tests/__init__.py +0 -0
  177. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/__init__.py +0 -0
  178. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/cliproduct.py +0 -0
  179. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/coherence.py +0 -0
  180. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/coherencegram.py +0 -0
  181. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/spectrogram.py +0 -0
  182. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/spectrum.py +0 -0
  183. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/__init__.py +0 -0
  184. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_coherence.py +0 -0
  185. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_coherencegram.py +0 -0
  186. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_gwpy_plot.py +0 -0
  187. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_qtransform.py +0 -0
  188. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_spectrogram.py +0 -0
  189. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_spectrum.py +0 -0
  190. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_timeseries.py +0 -0
  191. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/tests/test_transferfunction.py +0 -0
  192. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/timeseries.py +0 -0
  193. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/cli/transferfunction.py +0 -0
  194. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/conftest.py +0 -0
  195. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/__init__.py +0 -0
  196. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/channel.py +0 -0
  197. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/io/__init__.py +0 -0
  198. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/io/cis.py +0 -0
  199. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/io/clf.py +0 -0
  200. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/io/omega.py +0 -0
  201. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/tests/__init__.py +0 -0
  202. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/tests/test_channel.py +0 -0
  203. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/detector/tests/test_units.py +0 -0
  204. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/__init__.py +0 -0
  205. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/_fdcommon.py +0 -0
  206. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/frequencyseries.py +0 -0
  207. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/hist.py +0 -0
  208. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/io/__init__.py +0 -0
  209. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/io/ascii.py +0 -0
  210. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/io/hdf5.py +0 -0
  211. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/io/ligolw.py +0 -0
  212. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/tests/__init__.py +0 -0
  213. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/frequencyseries/tests/test_frequencyseries.py +0 -0
  214. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/__init__.py +0 -0
  215. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/_framecpp.py +0 -0
  216. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/cache.py +0 -0
  217. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/gwf.py +0 -0
  218. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/hdf5.py +0 -0
  219. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/kerberos.py +0 -0
  220. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/ligolw.py +0 -0
  221. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/mp.py +0 -0
  222. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/nds2.py +0 -0
  223. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/registry.py +0 -0
  224. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/__init__.py +0 -0
  225. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_cache.py +0 -0
  226. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_datafind.py +0 -0
  227. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_gwf.py +0 -0
  228. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_kerberos.py +0 -0
  229. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_ligolw.py +0 -0
  230. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_mp.py +0 -0
  231. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_nds2.py +0 -0
  232. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/tests/test_utils.py +0 -0
  233. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/io/utils.py +0 -0
  234. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/__init__.py +0 -0
  235. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/axes.py +0 -0
  236. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/bode.py +0 -0
  237. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/colorbar.py +0 -0
  238. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/colors.py +0 -0
  239. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/gps.py +0 -0
  240. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/legend.py +0 -0
  241. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/log.py +0 -0
  242. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/rc.py +0 -0
  243. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/segments.py +0 -0
  244. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/__init__.py +0 -0
  245. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_axes.py +0 -0
  246. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_bode.py +0 -0
  247. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_colors.py +0 -0
  248. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_gps.py +0 -0
  249. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_log.py +0 -0
  250. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_plot.py +0 -0
  251. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_rc.py +0 -0
  252. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_tex.py +0 -0
  253. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_text.py +0 -0
  254. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/test_utils.py +0 -0
  255. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/tests/utils.py +0 -0
  256. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/text.py +0 -0
  257. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/units.py +0 -0
  258. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/plot/utils.py +0 -0
  259. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/__init__.py +0 -0
  260. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/io/__init__.py +0 -0
  261. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/io/hdf5.py +0 -0
  262. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/io/json.py +0 -0
  263. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/io/ligolw.py +0 -0
  264. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/io/segwizard.py +0 -0
  265. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/segments.py +0 -0
  266. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/tests/__init__.py +0 -0
  267. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/tests/test_flag.py +0 -0
  268. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/segments/tests/test_segments.py +0 -0
  269. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/__init__.py +0 -0
  270. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/fft.py +0 -0
  271. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/qtransform.py +0 -0
  272. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/__init__.py +0 -0
  273. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/_lal.py +0 -0
  274. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/_median_mean.py +0 -0
  275. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/_pycbc.py +0 -0
  276. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/_registry.py +0 -0
  277. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/_scipy.py +0 -0
  278. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/_ui.py +0 -0
  279. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/spectral/_utils.py +0 -0
  280. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/__init__.py +0 -0
  281. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_qtransform.py +0 -0
  282. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_spectral_lal.py +0 -0
  283. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_spectral_median_mean.py +0 -0
  284. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_spectral_pycbc.py +0 -0
  285. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_spectral_registry.py +0 -0
  286. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_spectral_scipy.py +0 -0
  287. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_spectral_ui.py +0 -0
  288. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_spectral_utils.py +0 -0
  289. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/tests/test_window.py +0 -0
  290. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/signal/window.py +0 -0
  291. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/spectrogram/__init__.py +0 -0
  292. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/spectrogram/coherence.py +0 -0
  293. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/spectrogram/io/__init__.py +0 -0
  294. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/spectrogram/io/hdf5.py +0 -0
  295. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/spectrogram/spectrogram.py +0 -0
  296. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/spectrogram/tests/__init__.py +0 -0
  297. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/__init__.py +0 -0
  298. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/filter.py +0 -0
  299. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/filters.py +0 -0
  300. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/gravityspy.py +0 -0
  301. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/__init__.py +0 -0
  302. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/cwb.py +0 -0
  303. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/fetch.py +0 -0
  304. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/gravityspy.py +0 -0
  305. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/gstlal.py +0 -0
  306. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/gwf.py +0 -0
  307. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/hacr.py +0 -0
  308. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/losc.py +0 -0
  309. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/omega.py +0 -0
  310. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/omicron.py +0 -0
  311. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/pycbc.py +0 -0
  312. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/root.py +0 -0
  313. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/snax.py +0 -0
  314. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/sql.py +0 -0
  315. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/io/utils.py +0 -0
  316. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/table.py +0 -0
  317. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/tests/__init__.py +0 -0
  318. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/tests/test_gravityspy.py +0 -0
  319. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/tests/test_io_gstlal.py +0 -0
  320. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/tests/test_io_pycbc.py +0 -0
  321. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/table/tests/test_table.py +0 -0
  322. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/__init__.py +0 -0
  323. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/data/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  324. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/data/HLV-HW100916-968654552-1.gwf +0 -0
  325. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/data/HLV-HW100916-968654552-1.hdf +0 -0
  326. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.txt +0 -0
  327. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.xml.gz +0 -0
  328. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/marks.py +0 -0
  329. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/testing/mocks.py +0 -0
  330. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/time/__init__.py +0 -0
  331. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/time/__main__.py +0 -0
  332. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/time/_tconvert.py +0 -0
  333. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/time/tests/__init__.py +0 -0
  334. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/time/tests/test_main.py +0 -0
  335. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/time/tests/test_time.py +0 -0
  336. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/__init__.py +0 -0
  337. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/__init__.py +0 -0
  338. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/ascii.py +0 -0
  339. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/core.py +0 -0
  340. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/gwf/__init__.py +0 -0
  341. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/gwf/framecpp.py +0 -0
  342. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/gwf/framel.py +0 -0
  343. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/hdf5.py +0 -0
  344. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/losc.py +0 -0
  345. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/nds2.py +0 -0
  346. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/io/wav.py +0 -0
  347. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/tests/__init__.py +0 -0
  348. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/tests/test_io_gwf_lalframe.py +0 -0
  349. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/tests/test_io_losc.py +0 -0
  350. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/timeseries/timeseries.py +0 -0
  351. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/__init__.py +0 -0
  352. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/array2d.py +0 -0
  353. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/io/__init__.py +0 -0
  354. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/io/ascii.py +0 -0
  355. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/io/hdf5.py +0 -0
  356. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/io/ligolw.py +0 -0
  357. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/series.py +0 -0
  358. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/sliceutils.py +0 -0
  359. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/tests/__init__.py +0 -0
  360. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/types/tests/test_index.py +0 -0
  361. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/__init__.py +0 -0
  362. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/decorators.py +0 -0
  363. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/enum.py +0 -0
  364. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/env.py +0 -0
  365. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/lal.py +0 -0
  366. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/misc.py +0 -0
  367. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/mp.py +0 -0
  368. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/progress.py +0 -0
  369. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/shell.py +0 -0
  370. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/sphinx/__init__.py +0 -0
  371. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/sphinx/ex2rst.py +0 -0
  372. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/__init__.py +0 -0
  373. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_decorators.py +0 -0
  374. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_enum.py +0 -0
  375. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_env.py +0 -0
  376. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_lal.py +0 -0
  377. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_misc.py +0 -0
  378. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_mp.py +0 -0
  379. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_shell.py +0 -0
  380. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy/utils/tests/test_sphinx_ex2rst.py +0 -0
  381. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy.egg-info/dependency_links.txt +0 -0
  382. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy.egg-info/entry_points.txt +0 -0
  383. {gwpy-3.0.8 → gwpy-3.0.10}/gwpy.egg-info/top_level.txt +0 -0
  384. {gwpy-3.0.8 → gwpy-3.0.10}/setup.cfg +0 -0
  385. {gwpy-3.0.8 → gwpy-3.0.10}/setup_utils.py +0 -0
@@ -0,0 +1,79 @@
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.8"
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
+ .compat_rules:
49
+ rules:
50
+ - if: '$CI_COMMIT_MESSAGE =~ /\[skip compat\]/'
51
+ when: never
52
+ - !reference [.rules_nightly, rules]
53
+ - !reference [.rules_full_test, rules]
54
+
55
+ # test against the minimum specified requirements
56
+ compat_minimum:
57
+ extends:
58
+ - .compat_minimum
59
+ - .compat_rules
60
+ image: python:$[[ inputs.minimum_python_version ]]
61
+ before_script:
62
+ # replace the requirements as follows:
63
+ # >=X.Y.Z ---> X.Y.Z (exact pin to minimum)
64
+ # ^X.Y ---> ~X.Y (pin to X.Y.*)
65
+ - sed -i -E
66
+ -e 's/>=/==/'
67
+ -e 's/\^/~/'
68
+ pyproject.toml
69
+ # undo the change to python_requires
70
+ - sed -i -E
71
+ -e 's/requires-python = "==/requires-python = ">=/'
72
+ pyproject.toml
73
+
74
+ # test against latest/pre-release versions
75
+ compat_experimental:
76
+ extends:
77
+ - .compat_experimental
78
+ - .compat_rules
79
+ image: python:3
@@ -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,42 @@
1
+ #!/bin/bash
2
+ #
3
+ # Install and configure CVMFS
4
+ #
5
+
6
+ set -e
7
+
8
+ if [ "$GITLAB_CI" = "true" ] && [[ "$CI_RUNNER_TAGS" != *"linux"* ]]; then
9
+ echo -e "\x1B[94mSkipping CVMFS setup on this platform\x1B[0m"
10
+ exit 0
11
+ fi
12
+
13
+ echo -e "\x1B[92mConfiguring /cvmfs/gwosc.osgstorage.org\x1B[0m"
14
+
15
+ # configure CVMFS Apt repo
16
+ export DEBIAN_FRONTEND=noninteractive
17
+ apt-get -yqq update
18
+ apt-get -yqq install curl lsb-release
19
+ curl -sLO https://ecsft.cern.ch/dist/cvmfs/cvmfs-release/cvmfs-release-latest_all.deb
20
+ dpkg -i cvmfs-release-latest_all.deb
21
+ rm -f cvmfs-release-latest_all.deb
22
+
23
+ # configure CVMFS-contrib Apt repo
24
+ curl -sLO https://ecsft.cern.ch/dist/cvmfs/cvmfs-contrib-release/cvmfs-contrib-release-latest_all.deb
25
+ dpkg -i cvmfs-contrib-release-latest_all.deb
26
+ rm -f cvmfs-contrib-release-latest_all.deb
27
+
28
+ # install cvmfs
29
+ apt-get -yqq update
30
+ apt-get -yq install \
31
+ cvmfs \
32
+ cvmfs-config-osg \
33
+ ;
34
+
35
+ # configure CVMFS client
36
+ cvmfs_config setup
37
+ cat > /etc/cvmfs/default.local << EOF
38
+ CVMFS_REPOSITORIES=gwosc.osgstorage.org
39
+ CVMFS_HTTP_PROXY=DIRECT
40
+ EOF
41
+
42
+ cvmfs_config probe
@@ -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,42 @@
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
+ setuptools
27
+ script:
28
+ # if running a default branch push pipeline, strip the +g<HASH> suffix
29
+ # from the version to give something that test.pypi.org will accept
30
+ - |
31
+ 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%%+*}
34
+ fi
35
+ # generate the distributions
36
+ - python -m build . -o .
37
+ - python -m tarfile --list *.tar.*
38
+ - python -m zipfile --list *.whl
39
+ artifacts:
40
+ paths:
41
+ - "*.tar.*"
42
+ - "*.whl"
@@ -0,0 +1,52 @@
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
+ flake8_requirements:
14
+ default: ""
15
+ description: "Extra packages to install alongside flake8"
16
+ type: string
17
+
18
+ ---
19
+
20
+ include:
21
+ - component: gitlab.com/components/sast/sast@2
22
+ inputs:
23
+ stage: $[[ inputs.stage ]]
24
+ - local: .gitlab/ci/rules.yml
25
+
26
+ .qa:
27
+ extends: .rules_full_test
28
+ stage: $[[ inputs.stage ]]
29
+ needs: []
30
+
31
+ semgrep-sast:
32
+ # NOTE: can't use 'extends' when overwriting job config
33
+ stage: $[[ inputs.stage ]]
34
+ needs: []
35
+ rules: !reference [.qa, rules]
36
+
37
+ flake8:
38
+ extends: .qa
39
+ image: python
40
+ script:
41
+ - python -m pip install flake8 flake8-gl-codeclimate $[[ inputs.flake8_requirements ]]
42
+ - python -m flake8
43
+ $[[ inputs.project_dir ]]
44
+ --exit-zero
45
+ - python -m flake8
46
+ $[[ inputs.project_dir ]]
47
+ --exit-zero
48
+ --format gl-codeclimate
49
+ --output-file flake8.json
50
+ artifacts:
51
+ reports:
52
+ codequality: flake8.json
@@ -0,0 +1,70 @@
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
19
+ .rules_default:
20
+ rules:
21
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
22
+
23
+ # schedules on default branch
24
+ .rules_default_schedule:
25
+ rules:
26
+ - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
27
+
28
+ # merge requests
29
+ .rules_merge_request:
30
+ rules:
31
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
32
+
33
+ # new branches
34
+ .rules_branch:
35
+ rules:
36
+ # not on branches with an open merge request
37
+ - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
38
+ when: never
39
+ - if: $CI_COMMIT_BRANCH
40
+
41
+ # -- job types
42
+
43
+ # deployment jobs
44
+ .rules_deploy:
45
+ rules:
46
+ - !reference [.rules_tag, rules]
47
+
48
+ # nightly builds
49
+ .rules_nightly:
50
+ rules:
51
+ - !reference [.rules_default_schedule, rules]
52
+
53
+ # build jobs
54
+ .rules_build:
55
+ rules:
56
+ - !reference [.rules_tag, rules]
57
+ - !reference [.rules_default, rules]
58
+ - !reference [.rules_merge_request, rules]
59
+ - !reference [.rules_branch, rules]
60
+
61
+ # full test suite
62
+ .rules_full_test:
63
+ rules:
64
+ - !reference [.rules_default, rules]
65
+ - !reference [.rules_merge_request, rules]
66
+
67
+ # basic test suite
68
+ .rules_basic_test:
69
+ rules:
70
+ - !reference [.rules_branch, 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,84 @@
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
+ # create the cache directory (so that astropy will actually use it)
51
+ # (this isn't just 'mkdir -p ...' because Windows)
52
+ - python -c "import os;
53
+ from pathlib import Path;
54
+ (Path(os.getenv('XDG_CACHE_HOME')) / 'astropy').mkdir(parents=True, exist_ok=True)
55
+ "
56
+ # install pytest
57
+ - python -m pip install pytest pytest-cov $[[ inputs.pip_options ]]
58
+ - python -m pip install $[[ inputs.install_target ]][$[[ inputs.install_extra ]]] $[[ inputs.pip_options ]]
59
+ # list installed packages
60
+ - python -m pip list installed
61
+ # run the tests
62
+ - python -m pytest --junit-xml=junit.xml $[[ inputs.pytest_options ]]
63
+ # run any extra tests
64
+ - $[[ inputs.extra_test_commands ]]
65
+ # format the coverage report
66
+ - python -m coverage xml -o coverage.xml
67
+ artifacts:
68
+ reports:
69
+ # coverage report
70
+ coverage_report:
71
+ coverage_format: cobertura
72
+ path: coverage.xml
73
+ # test report
74
+ junit: junit.xml
75
+ paths:
76
+ - .coverage*
77
+ coverage: null
78
+ cache:
79
+ # cache pip packages
80
+ - !reference [.python_base, cache]
81
+ # cache GWpy downloaded files
82
+ - key: "gwpy-${CI_JOB_NAME_SLUG}"
83
+ paths:
84
+ - .cache/astropy/download