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