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.
- gwpy-3.0.11/.gitlab/ci/compatibility.yml +105 -0
- gwpy-3.0.11/.gitlab/ci/coverage.yml +32 -0
- gwpy-3.0.11/.gitlab/ci/init-creds.sh +28 -0
- gwpy-3.0.11/.gitlab/ci/platforms.yml +30 -0
- gwpy-3.0.11/.gitlab/ci/python-base.yml +37 -0
- gwpy-3.0.11/.gitlab/ci/python-dist.yml +43 -0
- gwpy-3.0.11/.gitlab/ci/qa.yml +109 -0
- gwpy-3.0.11/.gitlab/ci/rules.yml +81 -0
- gwpy-3.0.11/.gitlab/ci/sphinx.yml +65 -0
- gwpy-3.0.11/.gitlab/ci/test-job.yml +88 -0
- gwpy-3.0.11/.gitlab/ci/test.yml +253 -0
- gwpy-3.0.11/.gitlab/ci/twine.yml +69 -0
- gwpy-3.0.11/.gitlab-ci.yml +54 -0
- gwpy-3.0.11/CONTRIBUTING.md +160 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/PKG-INFO +20 -19
- {gwpy-3.0.9 → gwpy-3.0.11}/README.md +7 -5
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/conf.py +4 -5
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/lalsuite.rst +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/install.rst +3 -3
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/references.rst +18 -5
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/index.rst +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrogram/index.rst +7 -5
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrum/index.rst +7 -4
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/datafind.rst +12 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/io.rst +2 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/open-data-spectrogram.py +32 -18
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/test_examples.py +1 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/_version.py +2 -2
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/gwpy_plot.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/base.py +11 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/units.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/tests/test_hist.py +4 -3
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/datafind.py +2 -2
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/ffldatafind.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_datafind.py +0 -53
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/axes.py +6 -2
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/plot.py +12 -2
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/segments.py +8 -8
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_axes.py +4 -2
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_segments.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/__init__.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/flag.py +13 -11
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/hdf5.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/segments.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/filter_design.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_coherence.py +31 -10
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/ligolw.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_io_ligolw.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/errors.py +1 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/marks.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/core.py +0 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/__init__.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/statevector.py +4 -2
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_core.py +7 -13
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_gwf_framecpp.py +1 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_statevector.py +29 -17
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_timeseries.py +10 -14
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_array.py +12 -10
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_array2d.py +5 -9
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_series.py +5 -5
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/sphinx/zenodo.py +5 -1
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_sphinx_zenodo.py +10 -5
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/PKG-INFO +20 -19
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/SOURCES.txt +13 -9
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/requires.txt +10 -8
- {gwpy-3.0.9 → gwpy-3.0.11}/pyproject.toml +65 -17
- gwpy-3.0.9/.codeclimate.yml +0 -39
- gwpy-3.0.9/.codecov.yml +0 -21
- gwpy-3.0.9/.flake8 +0 -30
- gwpy-3.0.9/.github/workflows/conda.yml +0 -173
- gwpy-3.0.9/.github/workflows/dependencies.yml +0 -110
- gwpy-3.0.9/.github/workflows/dist.yml +0 -141
- gwpy-3.0.9/.github/workflows/lint.yml +0 -66
- gwpy-3.0.9/.github/workflows/release.yml +0 -54
- gwpy-3.0.9/.pep8speaks.yml +0 -3
- gwpy-3.0.9/CONTRIBUTING.md +0 -129
- {gwpy-3.0.9 → gwpy-3.0.11}/.gitattributes +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/.gitignore +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/CODE_OF_CONDUCT.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/LICENSE +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/MANIFEST.in +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/Makefile +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/_static/css/gwpy-sphinx.css +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/_static/favicon.png +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/_static/gwpy_white_24.png +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autoclass/class.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autosummary/base.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autosummary/class.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/_templates/autosummary/module.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/astro/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/citing.rst.in +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/cli/examples.ini +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/cli/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/detector/channel.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/dev/release.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/env.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/framecpp.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/framel.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/external/nds2.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/gwpy-docs-logo.png +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/overview.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/colorbars.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/colors.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/filter.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/gps.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/legend.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/plot/log.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/dqsegdb.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/io.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/segments/thresholding.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/signal/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrum/filtering.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/spectrum/io.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/filter.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/histogram.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/io.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/plot.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/table/rate.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/time/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/opendata.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/plot.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/docs/timeseries/statevector.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/coherence.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/hoff.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/inject.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/percentiles.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/rayleigh.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/transfer_function.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/frequencyseries/variance.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/range-spectrogram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/miscellaneous/range-timeseries.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/segments/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/segments/open-data.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/signal/gw150914.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/signal/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/signal/qscan.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/coherence.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/plot.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/ratio.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/rayleigh.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/spectrogram/spectrogram2.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/histogram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/rate.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/rate_binned.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/scatter.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/table/tiles.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/blrms.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/correlate.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/filter.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/index.rst +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/inject.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/public.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/pycbc-snr.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/qscan.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/statevector.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/examples/timeseries/whiten.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/range.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/astro/tests/test_range.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/cliproduct.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/coherence.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/coherencegram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/qtransform.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/spectrogram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/spectrum.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_coherence.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_coherencegram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_gwpy_plot.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_qtransform.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_spectrogram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_spectrum.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_timeseries.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/tests/test_transferfunction.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/timeseries.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/cli/transferfunction.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/conftest.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/channel.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/cis.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/clf.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/io/omega.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/tests/test_channel.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/detector/tests/test_units.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/_fdcommon.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/frequencyseries.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/hist.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/ascii.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/hdf5.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/io/ligolw.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/frequencyseries/tests/test_frequencyseries.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/_framecpp.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/cache.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/gwf.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/hdf5.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/kerberos.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/ligolw.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/mp.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/nds2.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/registry.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_cache.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_ffldatafind.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_gwf.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_kerberos.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_ligolw.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_mp.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_nds2.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/tests/test_utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/io/utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/bode.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/colorbar.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/colors.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/gps.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/legend.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/log.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/rc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_bode.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_colors.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_gps.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_log.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_plot.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_rc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_tex.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_text.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/test_utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tests/utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/tex.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/text.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/units.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/plot/utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/json.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/ligolw.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/io/segwizard.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/tests/test_flag.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/segments/tests/test_segments.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/fft.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/qtransform.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_lal.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_median_mean.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_pycbc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_registry.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_scipy.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_ui.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/spectral/_utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_filter_design.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_qtransform.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_lal.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_median_mean.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_pycbc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_registry.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_scipy.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_ui.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_spectral_utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/tests/test_window.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/signal/window.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/coherence.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/io/hdf5.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/spectrogram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/spectrogram/tests/test_spectrogram.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/filter.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/filters.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/gravityspy.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/cwb.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/fetch.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/gravityspy.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/gstlal.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/gwf.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/hacr.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/losc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/omega.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/omicron.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/pycbc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/root.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/snax.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/sql.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/io/utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/table.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_gravityspy.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_io_gstlal.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_io_pycbc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/table/tests/test_table.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/HLV-HW100916-968654552-1.gwf +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/HLV-HW100916-968654552-1.hdf +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.txt +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.xml.gz +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/fixtures.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/mocks.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/testing/utils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/__main__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/_tconvert.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/tests/test_main.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/time/tests/test_time.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/ascii.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/cache.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/core.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/framecpp.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/framel.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/gwf/lalframe.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/hdf5.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/losc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/nds2.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/io/wav.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_cache.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_gwf_lalframe.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/tests/test_io_losc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/timeseries/timeseries.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/array.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/array2d.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/index.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/ascii.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/hdf5.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/io/ligolw.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/series.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/sliceutils.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/types/tests/test_index.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/decorators.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/enum.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/env.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/lal.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/misc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/mp.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/progress.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/shell.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/sphinx/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/sphinx/ex2rst.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/__init__.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_decorators.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_enum.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_env.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_lal.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_misc.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_mp.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_shell.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy/utils/tests/test_sphinx_ex2rst.py +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/dependency_links.txt +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/entry_points.txt +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/gwpy.egg-info/top_level.txt +0 -0
- {gwpy-3.0.9 → gwpy-3.0.11}/setup.cfg +0 -0
- {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
|