Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-gwpy for openSUSE:Factory 
checked in at 2023-06-21 22:40:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-gwpy (Old)
 and      /work/SRC/openSUSE:Factory/.python-gwpy.new.15902 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-gwpy"

Wed Jun 21 22:40:29 2023 rev:3 rq:1094393 version:3.0.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-gwpy/python-gwpy.changes  2023-05-27 
00:51:11.866900014 +0200
+++ /work/SRC/openSUSE:Factory/.python-gwpy.new.15902/python-gwpy.changes       
2023-06-21 22:41:20.954909227 +0200
@@ -1,0 +2,18 @@
+Wed Jun 21 14:12:43 UTC 2023 - Ben Greiner <c...@bnavigator.de>
+
+- Update to 3.0.5
+  * [#1613] Update all GWOSC URLs to gwosc.org
+  * [#1608] Fix issues writing StateVector.bits to HDF5
+  * [#1610] Fix plotting TimeSeriesDict on separate Axes
+  * [#1611] Resample time series for coherence calculation when
+    sampling rates differ
+  * [#1622] Update LatexInlineDimensional unit formatter for
+    Astropy 5.3
+  * [#1621] Fix issues with Series.crop precision
+  * [#1617] Document the copy keyword for TimeSeriesBaseDict.crop
+  * [#1619] Address inconsistency in transfer_function between CSD
+    and PSD averaging methods
+  * [#1628] Add H0 and L0 to dynamic_scaled exclusion list
+- Update requirements
+
+-------------------------------------------------------------------

Old:
----
  gwpy-3.0.4.tar.gz

New:
----
  gwpy-3.0.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-gwpy.spec ++++++
--- /var/tmp/diff_new_pack.xoN4yk/_old  2023-06-21 22:41:21.510912572 +0200
+++ /var/tmp/diff_new_pack.xoN4yk/_new  2023-06-21 22:41:21.518912621 +0200
@@ -16,61 +16,65 @@
 #
 
 
-# Python2 no longer supported upstream
-%define         skip_python2 1
-
 Name:           python-gwpy
-Version:        3.0.4
+Version:        3.0.5
 Release:        0
 Summary:        A python package for gravitational-wave astrophysics
 License:        GPL-3.0-only
 URL:            https://gwpy.github.io/
 Source:         
https://files.pythonhosted.org/packages/source/g/gwpy/gwpy-%{version}.tar.gz
+BuildRequires:  %{python_module base >= 3.7}
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module setuptools_scm}
 BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
-Requires:       python-astropy >= 3.0.0
+Requires:       python-astropy >= 4.3.0
 Requires:       python-dqsegdb2
-Requires:       python-gwosc
-Requires:       python-h5py
-Requires:       python-lal
-Requires:       python-ligo-lw
-Requires:       python-ligo-segments
-Requires:       python-matplotlib >= 3.1.0
-Requires:       python-numpy
+Requires:       python-gwdatafind >= 1.1.0
+Requires:       python-gwosc >= 0.5.3
+Requires:       python-h5py >= 3
+Requires:       python-ligo-segments >= 1.0.0
+Requires:       python-ligotimegps >= 1.2.1
+Requires:       python-matplotlib >= 3.3.0
+Requires:       python-numpy >= 1.17
 Requires:       python-python-dateutil
 Requires:       python-requests
-Requires:       python-scipy
-Requires:       python-tqdm
+Requires:       python-scipy >= 1.2.0
+Requires:       python-tqdm >= 4.10.0
 Recommends:     python-PyCBC
 Recommends:     python-PyMySQL
 Recommends:     python-lalsimulation
 Recommends:     python-lscsoft-glue
+Suggests:       python-inspiral-range
 BuildArch:      noarch
 # SECTION test requirements
 # BuildRequires:  %%{python_module PyCBC} -- optional, not available on aarch64
 BuildRequires:  %{python_module PyMySQL}
-BuildRequires:  %{python_module astropy >= 3.0.0}
+BuildRequires:  %{python_module astropy >= 4.3.0}
 BuildRequires:  %{python_module dqsegdb2}
-BuildRequires:  %{python_module framel}
-BuildRequires:  %{python_module freezegun}
-BuildRequires:  %{python_module gwosc}
-BuildRequires:  %{python_module h5py}
-BuildRequires:  %{python_module lalsimulation}
-BuildRequires:  %{python_module lal}
-BuildRequires:  %{python_module ligo-lw}
-BuildRequires:  %{python_module ligo-segments}
-BuildRequires:  %{python_module matplotlib >= 3.1.0}
-BuildRequires:  %{python_module numpy}
-BuildRequires:  %{python_module pytest >= 3.3}
+BuildRequires:  %{python_module gwdatafind >= 1.1.0}
+BuildRequires:  %{python_module gwosc >= 0.5.3}
+BuildRequires:  %{python_module h5py >= 3}
+BuildRequires:  %{python_module ligo-segments >= 1.0.0}
+BuildRequires:  %{python_module ligotimegps >= 1.2.1}
+BuildRequires:  %{python_module lscsoft-glue}
+BuildRequires:  %{python_module matplotlib >= 3.3.0}
+BuildRequires:  %{python_module numpy >= 1.17}
+BuildRequires:  %{python_module pytest-freezegun}
+BuildRequires:  %{python_module pytest-socket}
+BuildRequires:  %{python_module pytest-xdist}
+BuildRequires:  %{python_module pytest}
+BuildRequires:  %{python_module python-dateutil}
 BuildRequires:  %{python_module requests-mock}
-BuildRequires:  %{python_module scipy}
-BuildRequires:  %{python_module tqdm}
+BuildRequires:  %{python_module requests}
+BuildRequires:  %{python_module scipy >= 1.2.0}
+BuildRequires:  %{python_module tqdm >= 4.10.0}
+# extra not defined upstream but needed for tests
+BuildRequires:  %{python_module ligo-lw}
 # /SECTION
 # Unsupported archs by upstream
-ExcludeArch:    %ix86
+ExcludeArch:    %{ix86}
 Requires(post): update-alternatives
 Requires(postun):update-alternatives
 %python_subpackages

++++++ gwpy-3.0.4.tar.gz -> gwpy-3.0.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/PKG-INFO new/gwpy-3.0.5/PKG-INFO
--- old/gwpy-3.0.4/PKG-INFO     2023-04-12 14:14:41.108642600 +0200
+++ new/gwpy-3.0.5/PKG-INFO     2023-06-02 10:36:27.297606200 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: gwpy
-Version: 3.0.4
+Version: 3.0.5
 Summary: A python package for gravitational-wave astrophysics
 Author-email: Duncan Macleod <duncan.macl...@ligo.org>
 License: GPL-3.0-or-later
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/docs/install.rst 
new/gwpy-3.0.5/docs/install.rst
--- old/gwpy-3.0.4/docs/install.rst     2023-04-12 11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/docs/install.rst     2023-06-02 10:29:18.000000000 +0200
@@ -50,7 +50,7 @@
    |dqsegdb2|_
    |gwdatafind|_       ``>=1.1.0``
    |gwosc-mod|_        ``>=0.5.3``
-   |h5py|_             ``>=2.8.0``
+   |h5py|_             ``>=3.0.0``
    |ligo-segments|_    ``>=1.0.0``
    |ligotimegps|_      ``>=1.2.1``
    |matplotlib|_       ``>=3.1.0``
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/docs/references.rst 
new/gwpy-3.0.5/docs/references.rst
--- old/gwpy-3.0.4/docs/references.rst  2023-04-12 11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/docs/references.rst  2023-06-02 10:29:18.000000000 +0200
@@ -103,13 +103,13 @@
 .. _GravitySpy: https://gravityspy.org
 
 .. |GWOSCl| replace:: The Gravitational-Wave Open Science Centre (GWOSC)
-.. _GWOSCl: https://www.gw-openscience.org/
+.. _GWOSCl: https://gwosc.org/
 
 .. |GWOSC| replace:: GWOSC
-.. _GWOSC: https://www.gw-openscience.org/
+.. _GWOSC: https://gwosc.org/
 
 .. |GWOSC_AUX_RELEASE| replace:: Auxiliary Channel Three Hour Release
-.. _GWOSC_AUX_RELEASE: https://www.gw-openscience.org/auxiliary/GW170814/
+.. _GWOSC_AUX_RELEASE: https://gwosc.org/auxiliary/GW170814/
 
 .. |LIGO-T050017| replace:: LIGO-T050017
 .. _LIGO-T050017: https://dcc.ligo.org/LIGO-T050017/public
@@ -119,34 +119,34 @@
 .. catalogues
 
 .. |GWTCl| replace:: Gravitational-Wave Transient Catalogue (GWTC)
-.. _GWTCl: https://www.gw-openscience.org/eventapi/html/GWTC/
+.. _GWTCl: https://gwosc.org/eventapi/html/GWTC/
 
 .. |GWTC| replace:: GWTC
-.. _GWTC: https://www.gw-openscience.org/eventapi/html/GWTC/
+.. _GWTC: https://gwosc.org/eventapi/html/GWTC/
 
 .. |GWTC-1l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 1
-.. _GWTC-1l: https://www.gw-openscience.org/GWTC-1/
+.. _GWTC-1l: https://gwosc.org/GWTC-1/
 
 .. |GWTC-1| replace:: GWTC-1
-.. _GWTC-1: https://www.gw-openscience.org/GWTC-1/
+.. _GWTC-1: https://gwosc.org/GWTC-1/
 
 .. |GWTC-2l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 2
-.. _GWTC-2l: https://www.gw-openscience.org/GWTC-2/
+.. _GWTC-2l: https://gwosc.org/GWTC-2/
 
 .. |GWTC-2| replace:: GWTC-2
-.. _GWTC-2: https://www.gw-openscience.org/GWTC-2/
+.. _GWTC-2: https://gwosc.org/GWTC-2/
 
 .. |GWTC-2.1l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 2.1
-.. _GWTC-2.1l: https://www.gw-openscience.org/GWTC-2.1/
+.. _GWTC-2.1l: https://gwosc.org/GWTC-2.1/
 
 .. |GWTC-2.1| replace:: GWTC-2.1
-.. _GWTC-2.1: https://www.gw-openscience.org/GWTC-2.1/
+.. _GWTC-2.1: https://gwosc.org/GWTC-2.1/
 
 .. |GWTC-3l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 3
-.. _GWTC-3l: https://www.gw-openscience.org/GWTC-3/
+.. _GWTC-3l: https://gwosc.org/GWTC-3/
 
 .. |GWTC-3| replace:: GWTC-3
-.. _GWTC-3: https://www.gw-openscience.org/GWTC-3/
+.. _GWTC-3: https://gwosc.org/GWTC-3/
 
 .. events
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/docs/table/io.rst 
new/gwpy-3.0.5/docs/table/io.rst
--- old/gwpy-3.0.4/docs/table/io.rst    2023-04-12 11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/docs/table/io.rst    2023-06-02 10:29:18.000000000 +0200
@@ -129,7 +129,7 @@
 
 .. admonition:: GWOSC catalogues
 
-   For more details on the GWOSC catalogues, see 
https://www.gw-openscience.org/eventapi/html/.
+   For more details on the GWOSC catalogues, see 
https://gwosc.org/eventapi/html/.
 
 .. _gwpy-table-gwosc-filter:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/docs/timeseries/opendata.rst 
new/gwpy-3.0.5/docs/timeseries/opendata.rst
--- old/gwpy-3.0.4/docs/timeseries/opendata.rst 2023-04-12 14:10:00.000000000 
+0200
+++ new/gwpy-3.0.5/docs/timeseries/opendata.rst 2023-06-02 10:29:18.000000000 
+0200
@@ -18,7 +18,7 @@
 
    For full details of the available data, please see
 
-   https://www.gw-openscience.org/data/
+   https://gwosc.org/data/
 
 .. _gwpy-timeseries-fetchopendata:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/docs/timeseries/statevector.rst 
new/gwpy-3.0.5/docs/timeseries/statevector.rst
--- old/gwpy-3.0.4/docs/timeseries/statevector.rst      2023-04-06 
12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/docs/timeseries/statevector.rst      2023-06-02 
10:29:18.000000000 +0200
@@ -117,7 +117,7 @@
 .. admonition:: GWOSC data usage notes
 
    Refer to the GWOSC
-   `data usage notes <https://www.gw-openscience.org/yellow_box/>`__
+   `data usage notes <https://gwosc.org/yellow_box/>`__
    page for details of the various bits (states) in the state vectors.
 
 To demonstate, we can download the `StateVector` associated with
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gwpy-3.0.4/examples/miscellaneous/open-data-spectrogram.py 
new/gwpy-3.0.5/examples/miscellaneous/open-data-spectrogram.py
--- old/gwpy-3.0.4/examples/miscellaneous/open-data-spectrogram.py      
2023-04-06 12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/examples/miscellaneous/open-data-spectrogram.py      
2023-06-02 10:29:18.000000000 +0200
@@ -24,7 +24,7 @@
 issues.
 
 This is done for the LIGO-Virgo detector network, with
-`up-to-date plots <https://www.gw-openscience.org/detector_status/>`__
+`up-to-date plots <https://gwosc.org/detector_status/>`__
 available from |GWOSC|.
 
 This example demonstrates how to download data segments from GWOSC, then
@@ -42,7 +42,7 @@
 # First, we need to fetch the Open Data timeline segments from GWOSC.
 # To do that we can call the :meth:`DataQualityFlag.fetch_open_data` method
 # using ``'H1_DATA'`` as the flag (for an explanation of what this means,
-# read up on `The S6 Data Release <https://www.gw-openscience.org/S6/>`__).
+# read up on `The S6 Data Release <https://gwosc.org/S6/>`__).
 
 from gwpy.segments import DataQualityFlag
 h1segs = DataQualityFlag.fetch_open_data('H1_DATA',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gwpy-3.0.4/examples/miscellaneous/range-spectrogram.py 
new/gwpy-3.0.5/examples/miscellaneous/range-spectrogram.py
--- old/gwpy-3.0.4/examples/miscellaneous/range-spectrogram.py  2023-04-06 
12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/examples/miscellaneous/range-spectrogram.py  2023-06-02 
10:29:18.000000000 +0200
@@ -29,7 +29,7 @@
 __author__ = 'Alex Urban <alexander.ur...@ligo.org>'
 
 # First, we need to load some data. As before we can `fetch` the
-# `public data <https://www.gw-openscience.org/catalog/>`__
+# `public data <https://gwosc.org/catalog/>`__
 # around the GW170817 BNS merger:
 
 from gwpy.timeseries import TimeSeries
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gwpy-3.0.4/examples/miscellaneous/range-timeseries.py 
new/gwpy-3.0.5/examples/miscellaneous/range-timeseries.py
--- old/gwpy-3.0.4/examples/miscellaneous/range-timeseries.py   2023-04-06 
12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/examples/miscellaneous/range-timeseries.py   2023-06-02 
10:29:18.000000000 +0200
@@ -31,7 +31,7 @@
 __credits__ = 'Alex Urban <alexander.ur...@ligo.org>'
 
 # First, we need to load some data. We can `fetch` the
-# `public data <https://www.gw-openscience.org/catalog/>`__
+# `public data <https://gwosc.org/catalog/>`__
 # around the GW170817 BNS merger:
 
 from gwpy.timeseries import TimeSeries
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/examples/segments/open-data.py 
new/gwpy-3.0.5/examples/segments/open-data.py
--- old/gwpy-3.0.4/examples/segments/open-data.py       2023-04-06 
12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/examples/segments/open-data.py       2023-06-02 
10:29:18.000000000 +0200
@@ -20,7 +20,7 @@
 """Plotting observing segments for O1
 
 The data from the full
-`Observing Run 1 (O1) <https://www.gw-openscience.org/O1/>`__
+`Observing Run 1 (O1) <https://gwosc.org/O1/>`__
 have been released by |GWOSC|_.
 
 This example demonstrates how to download segment information into a
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/examples/timeseries/inject.py 
new/gwpy-3.0.5/examples/timeseries/inject.py
--- old/gwpy-3.0.4/examples/timeseries/inject.py        2023-04-06 
12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/examples/timeseries/inject.py        2023-06-02 
10:29:18.000000000 +0200
@@ -41,7 +41,7 @@
 # Then we can download a simulation of the GW150914 signal from GWOSC:
 
 from astropy.utils.data import get_readable_fileobj
-url = ("https://www.gw-openscience.org/s/events/GW150914/P150914/";
+url = ("https://gwosc.org/s/events/GW150914/P150914/";
        "fig2-unfiltered-waveform-H.txt")
 with get_readable_fileobj(url) as f:
     signal = TimeSeries.read(f, format='txt')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/_version.py 
new/gwpy-3.0.5/gwpy/_version.py
--- old/gwpy-3.0.4/gwpy/_version.py     2023-04-12 14:14:40.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/_version.py     2023-06-02 10:36:26.000000000 +0200
@@ -1,4 +1,4 @@
 # file generated by setuptools_scm
 # don't change, don't track in version control
-__version__ = version = '3.0.4'
-__version_tuple__ = version_tuple = (3, 0, 4)
+__version__ = version = '3.0.5'
+__version_tuple__ = version_tuple = (3, 0, 5)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/frequencyseries/tests/test_hist.py 
new/gwpy-3.0.5/gwpy/frequencyseries/tests/test_hist.py
--- old/gwpy-3.0.4/gwpy/frequencyseries/tests/test_hist.py      2023-04-12 
11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/frequencyseries/tests/test_hist.py      2023-06-02 
10:29:18.000000000 +0200
@@ -106,6 +106,9 @@
         assert array.y0 == self.bins[0]
         assert array.dy == self.bins[1] - self.bins[0]
 
+    def test_crop_float_precision(self):
+        pytest.skip("float precision test not supported for SpectralVariance")
+
     def test_is_compatible_yindex(self, array):
         return NotImplemented
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/io/tests/test_datafind.py 
new/gwpy-3.0.5/gwpy/io/tests/test_datafind.py
--- old/gwpy-3.0.4/gwpy/io/tests/test_datafind.py       2023-04-12 
11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/io/tests/test_datafind.py       2023-06-02 
10:29:18.000000000 +0200
@@ -84,7 +84,7 @@
     """
     @mock.patch.dict(  # point GWDataFind at GWOSC server
         "os.environ",
-        {"GWDATAFIND_SERVER": "datafind.gw-openscience.org:80"},
+        {"GWDATAFIND_SERVER": "datafind.gwosc.org:80"},
     )
     @pytest_skip_cvmfs_read_error  # skip CVMFS problems
     @pytest_skip_network_error  # skip network problems
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/plot/units.py 
new/gwpy-3.0.5/gwpy/plot/units.py
--- old/gwpy-3.0.4/gwpy/plot/units.py   2023-04-06 12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/plot/units.py   2023-06-02 10:29:18.000000000 +0200
@@ -24,17 +24,31 @@
 
 
 class LatexInlineDimensional(LatexInline):
-    """Custom LaTeX formatter that includes physical type (if available)
+    r"""Custom LaTeX formatter that includes physical type (if available)
 
-    Mainly for auto-labelling `Axes` in matplotlib figures
+    Mainly for auto-labelling `Axes` in matplotlib figures.
+
+    Examples
+    --------
+    The built-in astropy ``latex_inline`` formatter gives this:
+
+    >>> Unit('m/s').to_string(format='latex_inline')
+    '$\mathrm{m\,s^{-1}}$'
+
+    This custom 'dimensional' formatter gives:
+
+    >>> Unit('m/s').to_string(format='latex_inline_dimensional')
+    'Speed [$\mathrm{m\,s^{-1}}$]'
     """
     name = 'latex_inline_dimensional'
 
     @classmethod
-    def to_string(cls, unit):
-        u = f"[{super().to_string(unit)}]"
+    def to_string(cls, unit, *args, **kwargs):
+        u = f"[{super().to_string(unit, *args, **kwargs)}]"
 
         if unit.physical_type not in {None, 'unknown', 'dimensionless'}:
-            ptype = str(unit.physical_type).split('/', 1)[0].title()
-            return f"{cls._latex_escape(ptype)} {u}"
+            # format physical type of unit for LaTeX
+            ptype = str(unit.physical_type).title().replace("_", r"\_")
+            # return '<Physical type> [<unit>]'
+            return f"{ptype} {u}"
         return u
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/segments/flag.py 
new/gwpy-3.0.5/gwpy/segments/flag.py
--- old/gwpy-3.0.4/gwpy/segments/flag.py        2023-04-06 12:37:11.000000000 
+0200
+++ new/gwpy-3.0.5/gwpy/segments/flag.py        2023-06-02 10:29:18.000000000 
+0200
@@ -443,7 +443,7 @@
             timeout for download (seconds)
 
         host : `str`, optional
-            URL of GWOSC host, default: ``'https://gw-openscience.org'``
+            URL of GWOSC host, default: ``'https://gwosc.org'``
 
         Returns
         -------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/signal/spectral/_scipy.py 
new/gwpy-3.0.5/gwpy/signal/spectral/_scipy.py
--- old/gwpy-3.0.4/gwpy/signal/spectral/_scipy.py       2023-04-06 
12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/signal/spectral/_scipy.py       2023-06-02 
10:29:18.000000000 +0200
@@ -20,6 +20,7 @@
 """
 
 import numpy
+import warnings
 
 import scipy.signal
 
@@ -171,7 +172,8 @@
         sdfunc=scipy.signal.csd, **kwargs)
 
 
-def coherence(timeseries, other, segmentlength, noverlap=None, **kwargs):
+def coherence(timeseries, other, segmentlength, downsample=None,
+              noverlap=None, **kwargs):
     """Calculate the coherence between two `TimeSeries` using Welch's method
 
     Parameters
@@ -188,6 +190,10 @@
     noverlap : `int`
         number of samples to overlap between segments, defaults to 50%.
 
+    downsample : `bool`
+        Downsample the series with higher sampling frequency? SciPy assumes
+        that both TimeSeries have the same rate.
+
     **kwargs
         other keyword arguments are passed to :meth:`scipy.signal.coherence`
 
@@ -200,6 +206,33 @@
     --------
     scipy.signal.coherence
     """
+
+    # Should we warn about unequal sampling frequencies?
+    warn_fs = False
+
+    if downsample is None:
+        warn_fs = True
+        downsample = True
+
+    if timeseries.sample_rate != other.sample_rate:
+        # scipy assumes a single sampling frequency
+        if not downsample:
+            raise ValueError("Cannot calculate coherence when sampling "
+                             "frequencies are unequal")
+        if warn_fs:
+            warnings.warn("Sampling frequencies are unequal. Higher "
+                          "frequency series will be downsampled before "
+                          "coherence is calculated",
+                          category=UserWarning)
+        # downsample the one with the higher rate
+        if timeseries.sample_rate > other.sample_rate:
+            timeseries = timeseries.resample(other.sample_rate)
+        else:
+            other = other.resample(timeseries.sample_rate)
+
+    # should never be unequal from here on
+    assert timeseries.sample_rate == other.sample_rate
+
     # calculate CSD
     kwargs.setdefault('y', other.value)
     out = _spectral_density(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/signal/tests/test_coherence.py 
new/gwpy-3.0.5/gwpy/signal/tests/test_coherence.py
--- old/gwpy-3.0.4/gwpy/signal/tests/test_coherence.py  1970-01-01 
01:00:00.000000000 +0100
+++ new/gwpy-3.0.5/gwpy/signal/tests/test_coherence.py  2023-06-02 
10:29:18.000000000 +0200
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) Cardiff University (2023)
+#
+# This file is part of GWpy.
+#
+# GWpy is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GWpy is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GWpy.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Custom filtering utilities for the `TimeSeries`
+"""
+
+__author__ = "Alex Southgate <alex.southg...@ligo.org>"
+
+import numpy as np
+import pytest
+import scipy.signal as sig
+
+from ...signal import spectral
+from ...timeseries import TimeSeries
+
+
+@pytest.fixture
+def series_data():
+    """Create some fake data with equal sampling frequencies.
+
+    Returns:
+        firstarr: an array of data, simple mixture of waves
+        secondarr: a second array of data from different mixture
+        seglen: segment length param to reuse for ffts
+    """
+    seglen = 512
+    n_segs = 10
+    n_t = seglen * n_segs
+    t_end = 2 * np.pi
+
+    ts = np.linspace(0, t_end, n_t)
+
+    firstarr = 0.1 * np.cos(ts + 0.1) + 0.9 * np.sin(2 * ts + 5)
+    firstarr += np.random.normal(5.8, 2, n_t)
+
+    secondarr = 0.5 * np.cos(ts + 0.1) + 0.1 * np.sin(5 * ts + 10)
+    firstarr += np.random.normal(5.8, 2, n_t)
+
+    return firstarr, secondarr, seglen
+
+
+@pytest.fixture
+def unequal_fs_series_data():
+    """Create some fake data with unequal sampling frequencies.
+
+    Returns:
+        ts1: array of time points for first data array
+        ts2: array of time points for second data array
+        firstarr: an array of data, simple mixture of waves
+        secondarr: a second array of data from different mixture
+        seglen: segment length param to reuse for ffts
+        fs_1: sampling frequency 1
+        fs_2: sampling frequency 2
+    """
+
+    seglen = 512
+    n_segs1 = 10
+    n_segs2 = 20
+    n_t1 = seglen * n_segs1
+    n_t2 = seglen * n_segs2
+    t_end = 10
+
+    fs_1 = n_t1 / t_end
+    fs_2 = n_t2 / t_end
+
+    ts1 = np.linspace(0, t_end, n_t1)
+    ts2 = np.linspace(0, t_end, n_t2)
+
+    firstarr = np.sin(2 * np.pi * ts1) + 0.1 * np.sin(2 * np.pi * ts1 * 5)
+    secondarr = np.sin(2 * np.pi * ts2)
+
+    return ts1, ts2, firstarr, secondarr, seglen, fs_1, fs_2
+
+
+def test_coherence_happy(series_data):
+    """Test the interface to scipy.signal.coherence.
+
+    For other tests see timeseries/tests/timeseries.py
+    """
+
+    firstarr, secondarr, seglen = series_data
+    f_s = 0.001
+
+    first = TimeSeries(firstarr, sample_rate=f_s)
+    second = TimeSeries(secondarr, sample_rate=f_s)
+
+    coh = spectral.coherence(first, second, segmentlength=seglen)
+    ftemp, cxytemp = sig.coherence(firstarr, secondarr, f_s, nperseg=seglen)
+
+    coharr = np.array(coh.data)
+
+    assert all(coharr == cxytemp)
+
+
+def test_coherence_resample(unequal_fs_series_data):
+    """Ensure warning is raised by unequal sampling frequencies"""
+
+    ts1, ts2, firstarr, secondarr, seglen, fs_1, fs_2 = unequal_fs_series_data
+
+    # first and second arrays are different, secondarr should have
+    # sampling frequency fs_2, but sometimes a mistake is made
+    first = TimeSeries(firstarr, sample_rate=fs_1)
+    second = TimeSeries(secondarr, sample_rate=fs_1)
+    third = TimeSeries(secondarr, sample_rate=fs_2)
+
+    # the first coherence val coh12 is broken intentionally since
+    # secondarr data should not have fs_1, instead fs_2
+    coh12 = spectral.coherence(first, second, segmentlength=seglen)
+    coh13 = spectral.coherence(first, third, segmentlength=seglen)
+
+    # get the frequency at minimum coherence, this should be the extra
+    # component in secondarr
+    maxi12 = np.argmin(coh12[:50])
+    maxf12 = coh12.frequencies[maxi12]
+    maxi13 = np.argmin(coh13[:50])
+    maxf13 = coh12.frequencies[maxi13]
+
+    # this one is close to 5 -- the extra freq component in secondarr
+    assert 4 <= maxf13.value <= 6
+    # this one is totally broken
+    assert not (4 <= maxf12.value <= 6)
+
+
+def test_coherence_resample_arg(series_data):
+    """Ensure warning is raised by unequal sampling frequencies"""
+
+    firstarr, secondarr, seglen = series_data
+    f_s = 0.001
+
+    first = TimeSeries(firstarr, sample_rate=f_s)
+    second = TimeSeries(secondarr, sample_rate=f_s * 2.32)
+
+    with pytest.warns(UserWarning, match="Sampling frequencies are unequal"):
+        spectral.coherence(first, second, segmentlength=seglen)
+
+    with pytest.raises(ValueError):
+        spectral.coherence(first, second, segmentlength=seglen,
+                           downsample=False)
+
+    coh1 = spectral.coherence(first, second, segmentlength=seglen)
+    coh2 = spectral.coherence(first, second, segmentlength=seglen,
+                              downsample=True)
+
+    assert all(np.array(coh1.data) == np.array(coh2.data))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/core.py 
new/gwpy-3.0.5/gwpy/timeseries/core.py
--- old/gwpy-3.0.4/gwpy/timeseries/core.py      2023-04-12 14:10:02.000000000 
+0200
+++ new/gwpy-3.0.5/gwpy/timeseries/core.py      2023-06-02 10:29:18.000000000 
+0200
@@ -84,7 +84,9 @@
     """Determine default for scaled based on channel name
 
     This is mainly to work around LIGO not correctly recording ADC
-    scaling parameters for most of Advanced LIGO (through 2019).
+    scaling parameters for most of Advanced LIGO (through 2023).
+    Scaling parameters for H0 and L0 data are also not correct
+    starting in mid-2020.
 
     Parameters
     ----------
@@ -108,7 +110,7 @@
     """
     if scaled is not None:
         return scaled
-    return not str(channel).startswith(("H1", "L1"))
+    return not str(channel).startswith(("H0", "L0", "H1", "L1"))
 
 
 # -- TimeSeriesBase------------------------------------------------------------
@@ -993,7 +995,7 @@
         return self
 
     def crop(self, start=None, end=None, copy=False):
-        """Crop each entry of this `dict`
+        """Crop each entry of this `dict`.
 
         This method calls the :meth:`crop` method of all entries and
         modifies this dict in place.
@@ -1008,6 +1010,10 @@
             GPS end time of required data, defaults to end of data found;
             any input parseable by `~gwpy.time.to_gps` is fine
 
+        copy : `bool`, optional, default: `False`
+            If `True` copy the data for each entry to fresh memory,
+            otherwise return a view.
+
         See also
         --------
         TimeSeries.crop
@@ -1441,9 +1447,18 @@
             all other keyword arguments are passed to the plotter as
             appropriate
         """
+        kwargs.update({
+            "method": method,
+            "label": label,
+        })
+
         # make plot
         from ..plot import Plot
-        plot = Plot(self.values(), method=method, label=label, **kwargs)
+
+        if kwargs.get("separate", False):
+            plot = Plot(*self.values(), **kwargs)
+        else:
+            plot = Plot(self.values(), **kwargs)
 
         # update labels
         artmap = {'plot': 'lines', 'scatter': 'collections'}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/statevector.py 
new/gwpy-3.0.5/gwpy/timeseries/statevector.py
--- old/gwpy-3.0.4/gwpy/timeseries/statevector.py       2023-04-06 
12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/timeseries/statevector.py       2023-06-02 
10:29:18.000000000 +0200
@@ -427,8 +427,8 @@
             indent, self.__class__.__name__,
             mask, str(self.channel), str(self.epoch)))
 
-    def __array__(self):
-        return numpy.array([b or '' for b in self])
+    def __array__(self, dtype="U"):
+        return numpy.array([b or '' for b in self], dtype=dtype)
 
 
 # -- StateVector --------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/tests/test_core.py 
new/gwpy-3.0.5/gwpy/timeseries/tests/test_core.py
--- old/gwpy-3.0.4/gwpy/timeseries/tests/test_core.py   2023-04-12 
11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/timeseries/tests/test_core.py   2023-06-02 
10:29:18.000000000 +0200
@@ -420,6 +420,22 @@
             plot.save(BytesIO(), format='png')
             plot.close()
 
+    def test_plot_separate(self, instance):
+        """Test plotting `TimeSeriesDict` on separate axes.
+
+        See https://github.com/gwpy/gwpy/issues/1609
+        """
+        with rc_context(rc={'text.usetex': False}):
+            plot = instance.plot(separate=True)
+            assert len(plot.axes) == len(instance.keys())
+            for ax, key in zip(plot.axes, instance):
+                utils.assert_array_equal(ax.lines[-1].get_xdata(),
+                                         instance[key].xindex.value)
+                utils.assert_array_equal(ax.lines[-1].get_ydata(),
+                                         instance[key].value)
+            plot.save(BytesIO(), format='png')
+            plot.close()
+
 
 # -- TimeSeriesBaseList -------------------------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/tests/test_statevector.py 
new/gwpy-3.0.5/gwpy/timeseries/tests/test_statevector.py
--- old/gwpy-3.0.4/gwpy/timeseries/tests/test_statevector.py    2023-04-12 
11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/timeseries/tests/test_statevector.py    2023-06-02 
10:29:18.000000000 +0200
@@ -370,6 +370,22 @@
         array = self.TEST_CLASS.from_nds2_buffer(nds_buffer)
         assert array.unit is units.dimensionless_unscaled
 
+    @pytest.mark.parametrize('ext', ('hdf5', 'h5'))
+    def test_read_write_hdf5(self, tmp_path, array, ext):
+        array.bits = ["a", "b", "c", "d"]
+        array.name = "test"
+
+        tmp = tmp_path / "test.{}".format(ext)
+
+        # write array (with auto-identify)
+        array.write(tmp, overwrite=True)
+
+        # check reading gives the same data (with/without auto-identify)
+        new = type(array).read(tmp, format='hdf5')
+        utils.assert_quantity_sub_equal(array, new)
+        new = type(array).read(tmp)
+        utils.assert_quantity_sub_equal(array, new)
+
 
 # -- StateVectorDict ----------------------------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/tests/test_timeseries.py 
new/gwpy-3.0.5/gwpy/timeseries/tests/test_timeseries.py
--- old/gwpy-3.0.4/gwpy/timeseries/tests/test_timeseries.py     2023-04-12 
11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/timeseries/tests/test_timeseries.py     2023-06-02 
10:29:18.000000000 +0200
@@ -82,7 +82,7 @@
     isgood=True,
 )
 
-GWOSC_DATAFIND_SERVER = "datafind.gw-openscience.org"
+GWOSC_DATAFIND_SERVER = "datafind.gwosc.org"
 GWOSC_GW150914_IFO = "L1"
 GWOSC_GW150914_CHANNEL = "L1:GWOSC-16KHZ_R1_STRAIN"
 NDS2_GW150914_CHANNEL = "L1:DCS-CALIB_STRAIN_C02"
@@ -834,23 +834,32 @@
             gw150914.psd(1, **kw) ** (1/2.),
         )
 
-    def test_csd(self, noisy_sinusoid, corrupt_noisy_sinusoid):
-        # test that csd(self) is the same as psd()
-        fs = noisy_sinusoid.csd(noisy_sinusoid)
+    def test_csd(self, noisy_sinusoid):
+        """Test that `TimeSeries.csd(self)` is the same as `psd()`.
+        """
+        fs = noisy_sinusoid.csd(noisy_sinusoid, average="mean")
         utils.assert_quantity_sub_equal(
-            fs,
+            fs.abs(),
             noisy_sinusoid.psd(method="welch"),
             exclude=['name'],
         )
 
-        # test fftlength
+    def test_csd_fftlength(self, noisy_sinusoid, corrupt_noisy_sinusoid):
+        """Test that `TimeSeries.csd` uses the ``fftlength`` keyword properly.
+        """
+        # test fftlength is used
         fs = noisy_sinusoid.csd(corrupt_noisy_sinusoid, fftlength=0.5)
         assert fs.size == 0.5 * noisy_sinusoid.sample_rate.value // 2 + 1
         assert fs.df == 2 * units.Hertz
+
+        # test that the default overlap works (by comparing to explicit)
         utils.assert_quantity_sub_equal(
             fs,
-            noisy_sinusoid.csd(corrupt_noisy_sinusoid, fftlength=0.5,
-                               overlap=0.25),
+            noisy_sinusoid.csd(
+                corrupt_noisy_sinusoid,
+                fftlength=0.5,
+                overlap=0.25,
+            ),
         )
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/timeseries.py 
new/gwpy-3.0.5/gwpy/timeseries/timeseries.py
--- old/gwpy-3.0.4/gwpy/timeseries/timeseries.py        2023-04-12 
11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/timeseries/timeseries.py        2023-06-02 
10:29:18.000000000 +0200
@@ -1107,7 +1107,7 @@
         return new
 
     def transfer_function(self, other, fftlength=None, overlap=None,
-                          window='hann', **kwargs):
+                          window='hann', average='mean', **kwargs):
         """Calculate the transfer function between this `TimeSeries` and
         another.
 
@@ -1132,6 +1132,10 @@
             see :func:`scipy.signal.get_window` for details on acceptable
             formats
 
+        average : `str`, optional
+            FFT-averaging method (default: ``'mean'``) passed to
+            underlying csd() and psd() methods
+
         **kwargs
             any other keyword arguments accepted by
             :meth:`TimeSeries.csd` or :meth:`TimeSeries.psd`
@@ -1149,9 +1153,9 @@
         `TimeSeries` will be down-sampled to match the lower.
         """
         csd = self.csd(other, fftlength=fftlength, overlap=overlap,
-                       window=window, **kwargs)
+                       window=window, average=average, **kwargs)
         psd = self.psd(fftlength=fftlength, overlap=overlap, window=window,
-                       **kwargs)
+                       average=average, **kwargs)
 
         # Take the minimum of the frequencyseries csd and psd because the
         # sample rate of different channels might yield different length
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/types/io/hdf5.py 
new/gwpy-3.0.5/gwpy/types/io/hdf5.py
--- old/gwpy-3.0.4/gwpy/types/io/hdf5.py        2023-04-06 12:37:11.000000000 
+0200
+++ new/gwpy-3.0.5/gwpy/types/io/hdf5.py        2023-06-02 10:29:18.000000000 
+0200
@@ -125,8 +125,10 @@
         try:
             dataset.attrs[attr] = value
         except (TypeError, ValueError, RuntimeError) as exc:
-            exc.args = ("Failed to store {} ({}) for {}: {}".format(
-                attr, type(value).__name__, type(array).__name__, str(exc)))
+            exc.args = (
+                f"Failed to store {attr} ({type(value).__name__}) "
+                f"for {type(array).__name__}: '{exc}'",
+            )
             raise
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/types/series.py 
new/gwpy-3.0.5/gwpy/types/series.py
--- old/gwpy-3.0.4/gwpy/types/series.py 2023-04-06 12:37:11.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/types/series.py 2023-06-02 10:29:18.000000000 +0200
@@ -947,25 +947,26 @@
         Parameters
         ----------
         start : `float`, optional
-            lower limit of x-axis to crop to, defaults to
-            current `~Series.x0`
+            Lower limit of x-axis to crop to, defaults to
+            :attr:`~Series.x0`.
 
         end : `float`, optional
-            upper limit of x-axis to crop to, defaults to current series end
+            Upper limit of x-axis to crop to, defaults to series end.
 
-        copy : `bool`, optional, default: `False`
-            copy the input data to fresh memory, otherwise return a view
+        copy : `bool`, optional
+            Copy the input data to fresh memory,
+            otherwise return a view (default).
 
         Returns
         -------
         series : `Series`
-            A new series with a sub-set of the input data
+            A new series with a sub-set of the input data.
 
         Notes
         -----
         If either ``start`` or ``end`` are outside of the original
         `Series` span, warnings will be printed and the limits will
-        be restricted to the :attr:`~Series.xspan`
+        be restricted to the :attr:`~Series.xspan`.
         """
         x0, x1 = self.xspan
         xtype = type(x0)
@@ -978,18 +979,20 @@
         if start == x0:
             start = None
         elif start is not None and xtype(start) < x0:
-            warn('%s.crop given start smaller than current start, '
-                 'crop will begin when the Series actually starts.'
-                 % type(self).__name__)
+            warn(
+                f"{type(self).__name__}.crop given start smaller than current "
+                "start, crop will begin when the Series actually starts.",
+            )
             start = None
 
         # pin late ends to time-series end
         if end == x1:
             end = None
         if end is not None and xtype(end) > x1:
-            warn('%s.crop given end larger than current end, '
-                 'crop will end when the Series actually ends.'
-                 % type(self).__name__)
+            warn(
+                f"{type(self).__name__}.crop given end larger than current "
+                "end, crop will begin when the Series actually ends.",
+            )
             end = None
 
         # check if series is irregular
@@ -1003,31 +1006,26 @@
         # find start index
         if start is None:
             idx0 = None
+        elif irregular:
+            idx0 = numpy.searchsorted(
+                self.xindex.value,
+                xtype(start),
+                side="left",
+            )
         else:
-            if not irregular:
-                idx0 = int((xtype(start) - x0) // self.dx.value)
-            else:
-                idx0 = numpy.searchsorted(
-                    self.xindex.value, xtype(start), side="left"
-                )
+            idx0 = floor((xtype(start) - x0) / self.dx.value)
 
         # find end index
         if end is None:
             idx1 = None
+        elif irregular:
+            idx1 = numpy.searchsorted(
+                self.xindex.value,
+                xtype(end),
+                side="left",
+            )
         else:
-            if not irregular:
-                idx1 = int((xtype(end) - x0) // self.dx.value)
-                if idx1 >= self.size:
-                    idx1 = None
-            else:
-                if xtype(end) >= self.xindex.value[-1]:
-                    idx1 = None
-                else:
-                    idx1 = (
-                        numpy.searchsorted(
-                            self.xindex.value, xtype(end), side="left"
-                        )
-                    )
+            idx1 = floor((xtype(end) - x0) / self.dx.value)
 
         # crop
         if copy:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy/types/tests/test_series.py 
new/gwpy-3.0.5/gwpy/types/tests/test_series.py
--- old/gwpy-3.0.4/gwpy/types/tests/test_series.py      2023-04-12 
11:57:39.000000000 +0200
+++ new/gwpy-3.0.5/gwpy/types/tests/test_series.py      2023-06-02 
10:29:18.000000000 +0200
@@ -185,16 +185,25 @@
             z, numpy.column_stack((array.xindex.value, array.value)))
 
     def test_crop(self, array):
+        """Test basic functionality of `Series.crop`.
+        """
+        # all defaults
+        utils.assert_quantity_equal(array, array.crop())
+
+        # normal operation
         a2 = array.crop(10, 20)
         utils.assert_quantity_equal(array[10:20], a2)
-        # check that warnings are printed for out-of-bounds
+
+    def test_crop_warnings(self, array):
+        """Test that `Series.crop` emits warnings when it is supposed to.
+        """
         with pytest.warns(UserWarning):
             array.crop(array.xspan[0]-1, array.xspan[1])
         with pytest.warns(UserWarning):
             array.crop(array.xspan[0], array.xspan[1]+1)
 
     def test_crop_irregular(self):
-        """The cropping on an irregularly spaced series.
+        """Test `Series.crop` with an irregular index.
         """
         x = numpy.linspace(0, 100, num=self.data.shape[0])
 
@@ -212,6 +221,19 @@
         cropped = series.crop(start=25, end=75)
         utils.assert_quantity_equal(series[(x > 25) & (x < 75)], cropped)
 
+    def test_crop_float_precision(self):
+        """Verify the float precision of the crop function.
+
+        This tests regression against https://github.com/gwpy/gwpy/issues/1601.
+        """
+        # construct empty data array with the right shape for this array object
+        shape = (101,) * self.TEST_CLASS._ndim
+        series = self.TEST_CLASS(numpy.empty(shape), dx=0.01)
+
+        # assert that when we crop it, we only crop a single sample
+        cropped = series.crop(end=1.)
+        utils.assert_quantity_equal(series[:-1], cropped)
+
     def test_is_compatible(self, array):
         """Test the `Series.is_compatible` method
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy.egg-info/PKG-INFO 
new/gwpy-3.0.5/gwpy.egg-info/PKG-INFO
--- old/gwpy-3.0.4/gwpy.egg-info/PKG-INFO       2023-04-12 14:14:40.000000000 
+0200
+++ new/gwpy-3.0.5/gwpy.egg-info/PKG-INFO       2023-06-02 10:36:26.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: gwpy
-Version: 3.0.4
+Version: 3.0.5
 Summary: A python package for gravitational-wave astrophysics
 Author-email: Duncan Macleod <duncan.macl...@ligo.org>
 License: GPL-3.0-or-later
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy.egg-info/SOURCES.txt 
new/gwpy-3.0.5/gwpy.egg-info/SOURCES.txt
--- old/gwpy-3.0.4/gwpy.egg-info/SOURCES.txt    2023-04-12 14:14:40.000000000 
+0200
+++ new/gwpy-3.0.5/gwpy.egg-info/SOURCES.txt    2023-06-02 10:36:26.000000000 
+0200
@@ -242,6 +242,7 @@
 gwpy/signal/spectral/_ui.py
 gwpy/signal/spectral/_utils.py
 gwpy/signal/tests/__init__.py
+gwpy/signal/tests/test_coherence.py
 gwpy/signal/tests/test_filter_design.py
 gwpy/signal/tests/test_qtransform.py
 gwpy/signal/tests/test_spectral_lal.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/gwpy.egg-info/requires.txt 
new/gwpy-3.0.5/gwpy.egg-info/requires.txt
--- old/gwpy-3.0.4/gwpy.egg-info/requires.txt   2023-04-12 14:14:40.000000000 
+0200
+++ new/gwpy-3.0.5/gwpy.egg-info/requires.txt   2023-06-02 10:36:26.000000000 
+0200
@@ -2,7 +2,7 @@
 dqsegdb2
 gwdatafind>=1.1.0
 gwosc>=0.5.3
-h5py>=2.8.0
+h5py>=3.0.0
 ligo-segments>=1.0.0
 ligotimegps>=1.2.1
 matplotlib>=3.3.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gwpy-3.0.4/pyproject.toml 
new/gwpy-3.0.5/pyproject.toml
--- old/gwpy-3.0.4/pyproject.toml       2023-04-12 12:27:17.000000000 +0200
+++ new/gwpy-3.0.5/pyproject.toml       2023-06-02 10:29:18.000000000 +0200
@@ -40,7 +40,7 @@
   "dqsegdb2",
   "gwdatafind >=1.1.0",
   "gwosc >=0.5.3",
-  "h5py >=2.8.0",
+  "h5py >=3.0.0",
   "ligo-segments >=1.0.0",
   "ligotimegps >=1.2.1",
   "matplotlib >=3.3.0",

Reply via email to