[python-h5netcdf] 01/02: Initial debianisation

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Thu Feb 23 13:48:34 UTC 2017


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch master
in repository python-h5netcdf.

commit b9613597713b91515777630057def0d7bf456235
Author: Ghislain Antony Vaillant <ghisvail at gmail.com>
Date:   Thu Feb 9 10:20:46 2017 +0000

    Initial debianisation
---
 debian/changelog                            |   5 +
 debian/clean                                |   1 +
 debian/compat                               |   1 +
 debian/control                              |  28 ++
 debian/copyright                            | 236 ++++++++++++
 debian/gbp.conf                             |   7 +
 debian/patches/Add-missing-test-suite.patch | 532 ++++++++++++++++++++++++++++
 debian/patches/series                       |   1 +
 debian/rules                                |  13 +
 debian/source/format                        |   1 +
 debian/tests/control                        |   8 +
 debian/watch                                |   3 +
 12 files changed, 836 insertions(+)

diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..e16ff2b
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+python-h5netcdf (0.3.1-1) UNRELEASED; urgency=low
+
+  * Initial release. (Closes: #851378)
+
+ -- Ghislain Antony Vaillant <ghisvail at gmail.com>  Thu, 09 Feb 2017 10:20:33 +0000
diff --git a/debian/clean b/debian/clean
new file mode 100644
index 0000000..45149aa
--- /dev/null
+++ b/debian/clean
@@ -0,0 +1 @@
+*.egg-info/*
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..f599e28
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+10
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..9e2b1b6
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,28 @@
+Source: python-h5netcdf
+Maintainer: Debian Science Maintainers <debian-science-maintainers at lists.alioth.debian.org>
+Uploaders: Ghislain Antony Vaillant <ghisvail at gmail.com>
+Section: python
+Priority: optional
+Build-Depends: debhelper (>= 10),
+               dh-python,
+               dpkg-dev (>= 1.17.14),
+               python3-all,
+               python3-h5py <!nocheck>,
+               python3-netcdf4 <!nocheck>,
+               python3-pytest <!nocheck>,
+               python3-setuptools
+Standards-Version: 3.9.8
+Vcs-Browser: https://anonscm.debian.org/git/debian-science/packages/python-h5netcdf.git
+Vcs-Git: https://anonscm.debian.org/git/debian-science/packages/python-h5netcdf.git
+Homepage: https://github.com/shoyer/h5netcdf
+X-Python3-Version: >= 3.4
+
+Package: python3-h5netcdf
+Architecture: all
+Depends: ${misc:Depends},
+         ${python3:Depends}
+Description: netCDF4 support for Python 3 via h5py
+ A Python interface for the netCDF4 file-format that reads and writes HDF5
+ files API directly via h5py, without relying on the Unidata netCDF library.
+ .
+ This package provides the Python 3 modules.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..969002b
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,236 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: h5netcdf
+Upstream-Contact: Stephan Hoyer <shoyer at gmail.com>
+Source: https://pypi.python.org/pypi/h5netcdf
+
+Files: *
+Copyright: 2015 Stephan Hoyer
+License: BSD-3-Clause
+
+Files: debian/*
+Copyright: 2017 Ghislain Antony Vaillant <ghisvail at gmail.com>
+License: BSD-3-Clause
+
+Files: h5netcdf/_chainmap.py
+Copyright: 2001-2015 Python Software Foundation
+License: Python-2.0
+
+License: BSD-3-Clause
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ .
+ 1. Redistributions of source code must retain the above copyright notice, this
+    list of conditions and the following disclaimer.
+ .
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+ .
+ 3. Neither the name of the copyright holder nor the names of its contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License: Python-2.0
+ PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+ --------------------------------------------
+ .
+ 1. This LICENSE AGREEMENT is between the Python Software Foundation
+ ("PSF"), and the Individual or Organization ("Licensee") accessing and
+ otherwise using this software ("Python") in source or binary form and
+ its associated documentation.
+ .
+ 2. Subject to the terms and conditions of this License Agreement, PSF
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide
+ license to reproduce, analyze, test, perform and/or display publicly,
+ prepare derivative works, distribute, and otherwise use Python
+ alone or in any derivative version, provided, however, that PSF's
+ License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
+ 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights
+ Reserved" are retained in Python alone or in any derivative version
+ prepared by Licensee.
+ .
+ 3. In the event Licensee prepares a derivative work that is based on
+ or incorporates Python or any part thereof, and wants to make
+ the derivative work available to others as provided herein, then
+ Licensee hereby agrees to include in any such work a brief summary of
+ the changes made to Python.
+ .
+ 4. PSF is making Python available to Licensee on an "AS IS"
+ basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+ INFRINGE ANY THIRD PARTY RIGHTS.
+ .
+ 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+ .
+ 6. This License Agreement will automatically terminate upon a material
+ breach of its terms and conditions.
+ .
+ 7. Nothing in this License Agreement shall be deemed to create any
+ relationship of agency, partnership, or joint venture between PSF and
+ Licensee. This License Agreement does not grant permission to use PSF
+ trademarks or trade name in a trademark sense to endorse or promote
+ products or services of Licensee, or any third party.
+ .
+ 8. By copying, installing or otherwise using Python, Licensee
+ agrees to be bound by the terms and conditions of this License
+ Agreement.
+ .
+ BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+ -------------------------------------------
+ .
+ BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+ .
+ 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+ office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+ Individual or Organization ("Licensee") accessing and otherwise using
+ this software in source or binary form and its associated
+ documentation ("the Software").
+ .
+ 2. Subject to the terms and conditions of this BeOpen Python License
+ Agreement, BeOpen hereby grants Licensee a non-exclusive,
+ royalty-free, world-wide license to reproduce, analyze, test, perform
+ and/or display publicly, prepare derivative works, distribute, and
+ otherwise use the Software alone or in any derivative version,
+ provided, however, that the BeOpen Python License is retained in the
+ Software, alone or in any derivative version prepared by Licensee.
+ .
+ 3. BeOpen is making the Software available to Licensee on an "AS IS"
+ basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+ INFRINGE ANY THIRD PARTY RIGHTS.
+ .
+ 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+ SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+ AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+ DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+ .
+ 5. This License Agreement will automatically terminate upon a material
+ breach of its terms and conditions.
+ .
+ 6. This License Agreement shall be governed by and interpreted in all
+ respects by the law of the State of California, excluding conflict of
+ law provisions. Nothing in this License Agreement shall be deemed to
+ create any relationship of agency, partnership, or joint venture
+ between BeOpen and Licensee. This License Agreement does not grant
+ permission to use BeOpen trademarks or trade names in a trademark
+ sense to endorse or promote products or services of Licensee, or any
+ third party. As an exception, the "BeOpen Python" logos available at
+ http://www.pythonlabs.com/logos.html may be used according to the
+ permissions granted on that web page.
+ .
+ 7. By copying, installing or otherwise using the software, Licensee
+ agrees to be bound by the terms and conditions of this License
+ Agreement.
+ .
+ CNRI OPEN SOURCE LICENSE AGREEMENT (for Python 1.6b1)
+ --------------------------------------------------
+ .
+ IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY.
+ .
+ BY CLICKING ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING,
+ INSTALLING OR OTHERWISE USING PYTHON 1.6, beta 1 SOFTWARE, YOU ARE
+ DEEMED TO HAVE AGREED TO THE TERMS AND CONDITIONS OF THIS LICENSE
+ AGREEMENT.
+ .
+ 1. This LICENSE AGREEMENT is between the Corporation for National
+ Research Initiatives, having an office at 1895 Preston White Drive,
+ Reston, VA 20191 ("CNRI"), and the Individual or Organization
+ ("Licensee") accessing and otherwise using Python 1.6, beta 1
+ software in source or binary form and its associated documentation,
+ as released at the www.python.org Internet site on August 4, 2000
+ ("Python 1.6b1").
+ .
+ 2. Subject to the terms and conditions of this License Agreement, CNRI
+ hereby grants Licensee a non-exclusive, royalty-free, world-wide
+ license to reproduce, analyze, test, perform and/or display
+ publicly, prepare derivative works, distribute, and otherwise use
+ Python 1.6b1 alone or in any derivative version, provided, however,
+ that CNRIs License Agreement is retained in Python 1.6b1, alone or
+ in any derivative version prepared by Licensee.
+ .
+ Alternately, in lieu of CNRIs License Agreement, Licensee may
+ substitute the following text (omitting the quotes): "Python 1.6,
+ beta 1, is made available subject to the terms and conditions in
+ CNRIs License Agreement. This Agreement may be located on the
+ Internet using the following unique, persistent identifier (known
+ as a handle): 1895.22/1011. This Agreement may also be obtained
+ from a proxy server on the Internet using the
+ URL:http://hdl.handle.net/1895.22/1011".
+ .
+ 3. In the event Licensee prepares a derivative work that is based on
+ or incorporates Python 1.6b1 or any part thereof, and wants to make
+ the derivative work available to the public as provided herein,
+ then Licensee hereby agrees to indicate in any such work the nature
+ of the modifications made to Python 1.6b1.
+ .
+ 4. CNRI is making Python 1.6b1 available to Licensee on an "AS IS"
+ basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR
+ FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6b1
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+ .
+ 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+ SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
+ LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING PYTHON 1.6b1,
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY
+ THEREOF.
+ .
+ 6. This License Agreement will automatically terminate upon a material
+ breach of its terms and conditions.
+ .
+ 7. This License Agreement shall be governed by and interpreted in all
+ respects by the law of the State of Virginia, excluding conflict of
+ law provisions. Nothing in this License Agreement shall be deemed
+ to create any relationship of agency, partnership, or joint venture
+ between CNRI and Licensee. This License Agreement does not grant
+ permission to use CNRI trademarks or trade name in a trademark
+ sense to endorse or promote products or services of Licensee, or
+ any third party.
+ .
+ 8. By clicking on the "ACCEPT" button where indicated, or by copying,
+ installing or otherwise using Python 1.6b1, Licensee agrees to be
+ bound by the terms and conditions of this License Agreement.
+ .
+ ACCEPT
+ .
+ CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+ --------------------------------------------------
+ .
+ Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+ The Netherlands. All rights reserved.
+ .
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted,
+ provided that the above copyright notice appear in all copies and that
+ both that copyright notice and this permission notice appear in
+ supporting documentation, and that the name of Stichting Mathematisch
+ Centrum or CWI not be used in advertising or publicity pertaining to
+ distribution of the software without specific, written prior
+ permission.
+ .
+ STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/debian/gbp.conf b/debian/gbp.conf
new file mode 100644
index 0000000..f53906f
--- /dev/null
+++ b/debian/gbp.conf
@@ -0,0 +1,7 @@
+[DEFAULT]
+upstream-branch = upstream
+debian-branch = master
+upstream-tag = upstream/%(version)s
+debian-tag = debian/%(version)s
+sign-tags = True
+pristine-tar = True
diff --git a/debian/patches/Add-missing-test-suite.patch b/debian/patches/Add-missing-test-suite.patch
new file mode 100644
index 0000000..a60ec03
--- /dev/null
+++ b/debian/patches/Add-missing-test-suite.patch
@@ -0,0 +1,532 @@
+From: Ghislain Antony Vaillant <ghisvail at gmail.com>
+Date: Thu, 9 Feb 2017 10:28:24 +0000
+Subject: Add missing test suite
+
+---
+ h5netcdf/tests/test_h5netcdf.py | 517 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 517 insertions(+)
+ create mode 100644 h5netcdf/tests/test_h5netcdf.py
+
+diff --git a/h5netcdf/tests/test_h5netcdf.py b/h5netcdf/tests/test_h5netcdf.py
+new file mode 100644
+index 0000000..07b5269
+--- /dev/null
++++ b/h5netcdf/tests/test_h5netcdf.py
+@@ -0,0 +1,517 @@
++import netCDF4
++import numpy as np
++import sys
++import gc
++
++import h5netcdf
++from h5netcdf import legacyapi
++from h5netcdf.compat import PY2, unicode
++import h5py
++import pytest
++
++from pytest import fixture, raises
++
++
++ at pytest.fixture
++def tmp_netcdf(tmpdir):
++    return str(tmpdir.join('testfile.nc'))
++
++
++def string_to_char(arr):
++    """Like nc4.stringtochar, but faster and more flexible.
++    """
++    # ensure the array is contiguous
++    arr = np.array(arr, copy=False, order='C')
++    kind = arr.dtype.kind
++    if kind not in ['U', 'S']:
++        raise ValueError('argument must be a string')
++    return arr.reshape(arr.shape + (1,)).view(kind + '1')
++
++
++def array_equal(a, b):
++    a, b = map(np.array, (a[...], b[...]))
++    if a.shape != b.shape:
++        return False
++    try:
++        return np.allclose(a, b)
++    except TypeError:
++        return (a == b).all()
++
++
++_char_array = string_to_char(np.array(['a', 'b', 'c', 'foo', 'bar', 'baz'],
++                                      dtype='S'))
++
++_string_array = np.array([['foobar0', 'foobar1', 'foobar3'],
++                          ['foofoofoo', 'foofoobar', 'foobarbar']])
++
++def is_h5py_char_working(tmp_netcdf, name):
++    # https://github.com/Unidata/netcdf-c/issues/298
++    with h5py.File(tmp_netcdf, 'r') as ds:
++        v = ds[name]
++        try:
++            assert array_equal(v, _char_array)
++            return True
++        except Exception as e:
++            if e.args[0] == "Can't read data (No appropriate function for conversion path)":
++                return False
++            else:
++                raise
++
++def write_legacy_netcdf(tmp_netcdf, write_module):
++    ds = write_module.Dataset(tmp_netcdf, 'w')
++    ds.setncattr('global', 42)
++    ds.other_attr = 'yes'
++    ds.createDimension('x', 4)
++    ds.createDimension('y', 5)
++    ds.createDimension('z', 6)
++    ds.createDimension('empty', 0)
++    ds.createDimension('string3', 3)
++
++    v = ds.createVariable('foo', float, ('x', 'y'), chunksizes=(4, 5),
++                          zlib=True)
++    v[...] = 1
++    v.setncattr('units', 'meters')
++
++    v = ds.createVariable('y', int, ('y',), fill_value=-1)
++    v[:4] = np.arange(4)
++
++    v = ds.createVariable('z', 'S1', ('z', 'string3'), fill_value=b'X')
++    v[...] = _char_array
++
++    v = ds.createVariable('scalar', np.float32, ())
++    v[...] = 2.0
++
++    # test creating a scalar with compression option (with should be ignored)
++    v = ds.createVariable('intscalar', np.int64, (), zlib=6, fill_value=None)
++    v[...] = 2
++
++    with raises(TypeError):
++        ds.createVariable('boolean', np.bool_, ('x'))
++
++    g = ds.createGroup('subgroup')
++    v = g.createVariable('subvar', np.int32, ('x',))
++    v[...] = np.arange(4.0)
++
++    g.createDimension('y', 10)
++    g.createVariable('y_var', float, ('y',))
++
++    ds.createDimension('mismatched_dim', 1)
++    ds.createVariable('mismatched_dim', int, ())
++
++    v = ds.createVariable('var_len_str', str, ('x'))
++    v[0] = u'foo'
++
++    ds.close()
++
++
++def write_h5netcdf(tmp_netcdf):
++    ds = h5netcdf.File(tmp_netcdf, 'w')
++    ds.attrs['global'] = 42
++    ds.attrs['other_attr'] = 'yes'
++    ds.dimensions = {'x': 4, 'y': 5, 'z': 6, 'empty': 0}
++
++    v = ds.create_variable('foo', ('x', 'y'), float, chunks=(4, 5),
++                           compression='gzip', shuffle=True)
++    v[...] = 1
++    v.attrs['units'] = 'meters'
++
++    v = ds.create_variable('y', ('y',), int, fillvalue=-1)
++    v[:4] = np.arange(4)
++
++    v = ds.create_variable('z', ('z', 'string3'), data=_char_array,
++                           fillvalue=b'X')
++
++    v = ds.create_variable('scalar', data=np.float32(2.0))
++
++    v = ds.create_variable('intscalar', data=np.int64(2))
++
++    with raises(TypeError):
++        ds.create_variable('boolean', data=True)
++
++    g = ds.create_group('subgroup')
++    v = g.create_variable('subvar', ('x',), np.int32)
++    v[...] = np.arange(4.0)
++    with raises(AttributeError):
++        v.attrs['_Netcdf4Dimid'] = -1
++
++    g.dimensions['y'] = 10
++    g.create_variable('y_var', ('y',), float)
++    g.flush()
++
++    ds.dimensions['mismatched_dim'] = 1
++    ds.create_variable('mismatched_dim', dtype=int)
++    ds.flush()
++
++    dt = h5py.special_dtype(vlen=unicode)
++    v = ds.create_variable('var_len_str', ('x',), dtype=dt)
++    v[0] = u'foo'
++
++    ds.close()
++
++
++def read_legacy_netcdf(tmp_netcdf, read_module, write_module):
++    ds = read_module.Dataset(tmp_netcdf, 'r')
++    assert ds.ncattrs() == ['global', 'other_attr']
++    assert ds.getncattr('global') == 42
++    if not PY2 and write_module is not netCDF4:
++        # skip for now: https://github.com/Unidata/netcdf4-python/issues/388
++        assert ds.other_attr == 'yes'
++    assert set(ds.dimensions) == set(['x', 'y', 'z', 'empty', 'string3',
++                                      'mismatched_dim'])
++    assert set(ds.variables) == set(['foo', 'y', 'z', 'intscalar', 'scalar',
++                                     'var_len_str', 'mismatched_dim'])
++    assert set(ds.groups) == set(['subgroup'])
++    assert ds.parent is None
++
++    v = ds.variables['foo']
++    assert array_equal(v, np.ones((4, 5)))
++    assert v.dtype == float
++    assert v.dimensions == ('x', 'y')
++    assert v.ndim == 2
++    assert v.ncattrs() == ['units']
++    if not PY2 and write_module is not netCDF4:
++        assert v.getncattr('units') == 'meters'
++    assert tuple(v.chunking()) == (4, 5)
++    assert v.filters() == {'complevel': 4, 'fletcher32': False,
++                           'shuffle': True, 'zlib': True}
++
++    v = ds.variables['y']
++    assert array_equal(v, np.r_[np.arange(4), [-1]])
++    assert v.dtype == int
++    assert v.dimensions == ('y',)
++    assert v.ndim == 1
++    assert v.ncattrs() == ['_FillValue']
++    assert v.getncattr('_FillValue') == -1
++    assert v.chunking() == 'contiguous'
++    assert v.filters() == {'complevel': 0, 'fletcher32': False,
++                           'shuffle': False, 'zlib': False}
++    ds.close()
++
++    #Check the behavior if h5py. Cannot expect h5netcdf to overcome these errors:
++    if is_h5py_char_working(tmp_netcdf, 'z'):
++        ds = read_module.Dataset(tmp_netcdf, 'r')
++        v = ds.variables['z']
++        assert array_equal(v, _char_array)
++        assert v.dtype == 'S1'
++        assert v.ndim == 2
++        assert v.dimensions == ('z', 'string3')
++        assert v.ncattrs() == ['_FillValue']
++        assert v.getncattr('_FillValue') == b'X'
++    else:
++        ds = read_module.Dataset(tmp_netcdf, 'r')
++
++    v = ds.variables['scalar']
++    assert array_equal(v, np.array(2.0))
++    assert v.dtype == 'float32'
++    assert v.ndim == 0
++    assert v.dimensions == ()
++    assert v.ncattrs() == []
++
++    v = ds.variables['intscalar']
++    assert array_equal(v, np.array(2))
++    assert v.dtype == 'int64'
++    assert v.ndim == 0
++    assert v.dimensions == ()
++    assert v.ncattrs() == []
++
++    v = ds.variables['var_len_str']
++    assert v.dtype == str
++    assert v[0] == u'foo'
++
++    v = ds.groups['subgroup'].variables['subvar']
++    assert ds.groups['subgroup'].parent is ds
++    assert array_equal(v, np.arange(4.0))
++    assert v.dtype == 'int32'
++    assert v.ndim == 1
++    assert v.dimensions == ('x',)
++    assert v.ncattrs() == []
++
++    v = ds.groups['subgroup'].variables['y_var']
++    assert v.shape == (10,)
++    assert 'y' in ds.groups['subgroup'].dimensions
++
++    ds.close()
++
++
++def read_h5netcdf(tmp_netcdf, write_module):
++    ds = h5netcdf.File(tmp_netcdf, 'r')
++    assert ds.name == '/'
++    assert list(ds.attrs) == ['global', 'other_attr']
++    assert ds.attrs['global'] == 42
++    if not PY2 and write_module is not netCDF4:
++        # skip for now: https://github.com/Unidata/netcdf4-python/issues/388
++        assert ds.attrs['other_attr'] == 'yes'
++    assert set(ds.dimensions) == set(['x', 'y', 'z', 'empty', 'string3', 'mismatched_dim'])
++    assert set(ds.variables) == set(['foo', 'y', 'z', 'intscalar', 'scalar',
++                                     'var_len_str', 'mismatched_dim'])
++    assert set(ds.groups) == set(['subgroup'])
++    assert ds.parent is None
++
++    v = ds['foo']
++    assert v.name == '/foo'
++    assert array_equal(v, np.ones((4, 5)))
++    assert v.dtype == float
++    assert v.dimensions == ('x', 'y')
++    assert v.ndim == 2
++    assert list(v.attrs) == ['units']
++    if not PY2 and write_module is not netCDF4:
++        assert v.attrs['units'] == 'meters'
++    assert v.chunks == (4, 5)
++    assert v.compression == 'gzip'
++    assert v.compression_opts == 4
++    assert not v.fletcher32
++    assert v.shuffle
++
++    v = ds['y']
++    assert array_equal(v, np.r_[np.arange(4), [-1]])
++    assert v.dtype == int
++    assert v.dimensions == ('y',)
++    assert v.ndim == 1
++    assert list(v.attrs) == ['_FillValue']
++    assert v.attrs['_FillValue'] == -1
++    assert v.chunks == None
++    assert v.compression == None
++    assert v.compression_opts == None
++    assert not v.fletcher32
++    assert not v.shuffle
++    ds.close()
++
++    if is_h5py_char_working(tmp_netcdf, 'z'):
++        ds = h5netcdf.File(tmp_netcdf, 'r')
++        v = ds['z']
++        assert v.dtype == 'S1'
++        assert v.ndim == 2
++        assert v.dimensions == ('z', 'string3')
++        assert list(v.attrs) == ['_FillValue']
++        assert v.attrs['_FillValue'] == b'X'
++    else:
++        ds = h5netcdf.File(tmp_netcdf, 'r')
++
++    v = ds['scalar']
++    assert array_equal(v, np.array(2.0))
++    assert v.dtype == 'float32'
++    assert v.ndim == 0
++    assert v.dimensions == ()
++    assert list(v.attrs) == []
++
++    v = ds.variables['intscalar']
++    assert array_equal(v, np.array(2))
++    assert v.dtype == 'int64'
++    assert v.ndim == 0
++    assert v.dimensions == ()
++    assert list(v.attrs) == []
++
++    v = ds['var_len_str']
++    assert h5py.check_dtype(vlen=v.dtype) == unicode
++    assert v[0] == u'foo'
++
++    v = ds['/subgroup/subvar']
++    assert v is ds['subgroup']['subvar']
++    assert v is ds['subgroup/subvar']
++    assert v is ds['subgroup']['/subgroup/subvar']
++    assert v.name == '/subgroup/subvar'
++    assert ds['subgroup'].name == '/subgroup'
++    assert ds['subgroup'].parent is ds
++    assert array_equal(v, np.arange(4.0))
++    assert v.dtype == 'int32'
++    assert v.ndim == 1
++    assert v.dimensions == ('x',)
++    assert list(v.attrs) == []
++
++    assert ds['/subgroup/y_var'].shape == (10,)
++    assert ds['/subgroup'].dimensions['y'] == 10
++
++    ds.close()
++
++
++def roundtrip_legacy_netcdf(tmp_netcdf, read_module, write_module):
++    write_legacy_netcdf(tmp_netcdf, write_module)
++    read_legacy_netcdf(tmp_netcdf, read_module, write_module)
++
++
++def test_write_legacyapi_read_netCDF4(tmp_netcdf):
++    roundtrip_legacy_netcdf(tmp_netcdf, netCDF4, legacyapi)
++
++
++def test_roundtrip_h5netcdf_legacyapi(tmp_netcdf):
++    roundtrip_legacy_netcdf(tmp_netcdf, legacyapi, legacyapi)
++
++
++def test_write_netCDF4_read_legacyapi(tmp_netcdf):
++    roundtrip_legacy_netcdf(tmp_netcdf, legacyapi, netCDF4)
++
++
++def test_write_h5netcdf_read_legacyapi(tmp_netcdf):
++    write_h5netcdf(tmp_netcdf)
++    read_legacy_netcdf(tmp_netcdf, legacyapi, h5netcdf)
++
++
++def test_write_h5netcdf_read_netCDF4(tmp_netcdf):
++    write_h5netcdf(tmp_netcdf)
++    read_legacy_netcdf(tmp_netcdf, netCDF4, h5netcdf)
++
++
++def test_roundtrip_h5netcdf(tmp_netcdf):
++    write_h5netcdf(tmp_netcdf)
++    read_h5netcdf(tmp_netcdf, h5netcdf)
++
++
++def test_write_netCDF4_read_h5netcdf(tmp_netcdf):
++    write_legacy_netcdf(tmp_netcdf, netCDF4)
++    read_h5netcdf(tmp_netcdf, netCDF4)
++
++
++def test_write_legacyapi_read_h5netcdf(tmp_netcdf):
++    write_legacy_netcdf(tmp_netcdf, legacyapi)
++    read_h5netcdf(tmp_netcdf, legacyapi)
++
++
++def test_repr(tmp_netcdf):
++    write_h5netcdf(tmp_netcdf)
++    f = h5netcdf.File(tmp_netcdf, 'r')
++    assert 'h5netcdf.File' in repr(f)
++    assert 'subgroup' in repr(f)
++    assert 'foo' in repr(f)
++    assert 'other_attr' in repr(f)
++
++    assert 'h5netcdf.attrs.Attributes' in repr(f.attrs)
++    assert 'global' in repr(f.attrs)
++
++    d = f.dimensions
++    assert 'h5netcdf.Dimensions' in repr(d)
++    assert 'x=4' in repr(d)
++
++    g = f['subgroup']
++    assert 'h5netcdf.Group' in repr(g)
++    assert 'subvar' in repr(g)
++
++    v = f['foo']
++    assert 'h5netcdf.Variable' in repr(v)
++    assert 'float' in repr(v)
++    assert 'units' in repr(v)
++    f.close()
++
++    assert 'Closed' in repr(f)
++    assert 'Closed' in repr(d)
++    assert 'Closed' in repr(g)
++    assert 'Closed' in repr(v)
++
++
++def test_attrs_api(tmp_netcdf):
++    with h5netcdf.File(tmp_netcdf) as ds:
++        ds.attrs['conventions'] = 'CF'
++        ds.dimensions['x'] = 1
++        v = ds.create_variable('x', ('x',), 'i4')
++        v.attrs.update({'units': 'meters', 'foo': 'bar'})
++    assert ds._closed
++    with h5netcdf.File(tmp_netcdf) as ds:
++        assert len(ds.attrs) == 1
++        assert dict(ds.attrs) == {'conventions': 'CF'}
++        assert list(ds.attrs) == ['conventions']
++        assert dict(ds['x'].attrs) == {'units': 'meters', 'foo': 'bar'}
++        assert len(ds['x'].attrs) == 2
++        assert sorted(ds['x'].attrs) == ['foo', 'units']
++
++
++def test_optional_netcdf4_attrs(tmp_netcdf):
++    with h5py.File(tmp_netcdf) as f:
++        foo_data = np.arange(50).reshape(5, 10)
++        f.create_dataset('foo', data=foo_data)
++        f.create_dataset('x', data=np.arange(5))
++        f.create_dataset('y', data=np.arange(10))
++        f['foo'].dims.create_scale(f['x'])
++        f['foo'].dims.create_scale(f['y'])
++        f['foo'].dims[0].attach_scale(f['x'])
++        f['foo'].dims[1].attach_scale(f['y'])
++    with h5netcdf.File(tmp_netcdf, 'r') as ds:
++        assert ds['foo'].dimensions == ('x', 'y')
++        assert ds.dimensions == {'x': 5, 'y': 10}
++        assert array_equal(ds['foo'], foo_data)
++
++
++def test_error_handling(tmp_netcdf):
++    with h5netcdf.File(tmp_netcdf, 'w') as ds:
++        with raises(NotImplementedError):
++            ds.dimensions['x'] = None
++        ds.dimensions['x'] = 1
++        with raises(ValueError):
++            ds.dimensions['x'] = 2
++        with raises(ValueError):
++            ds.dimensions = {'x': 2}
++        with raises(ValueError):
++            ds.dimensions = {'y': 3}
++        ds.create_variable('x', ('x',), dtype=float)
++        with raises(ValueError):
++            ds.create_variable('x', ('x',), dtype=float)
++        ds.create_group('subgroup')
++        with raises(ValueError):
++            ds.create_group('subgroup')
++
++
++def test_invalid_netcdf4(tmp_netcdf):
++    with h5py.File(tmp_netcdf) as f:
++        f.create_dataset('foo', data=np.arange(5))
++        # labeled dimensions but no dimension scales
++        f['foo'].dims[0].label = 'x'
++    with h5netcdf.File(tmp_netcdf, 'r') as ds:
++        with raises(ValueError):
++            ds.variables['foo'].dimensions
++
++
++def test_hierarchical_access_auto_create(tmp_netcdf):
++    ds = h5netcdf.File(tmp_netcdf, 'w')
++    ds.create_variable('/foo/bar', data=1)
++    g = ds.create_group('foo/baz')
++    g.create_variable('/foo/hello', data=2)
++    assert set(ds) == set(['foo'])
++    assert set(ds['foo']) == set(['bar', 'baz', 'hello'])
++    ds.close()
++
++    ds = h5netcdf.File(tmp_netcdf, 'r')
++    assert set(ds) == set(['foo'])
++    assert set(ds['foo']) == set(['bar', 'baz', 'hello'])
++    ds.close()
++
++def test_reading_str_array_from_netCDF4(tmp_netcdf):
++    # This tests reading string variables created by netCDF4
++    with netCDF4.Dataset(tmp_netcdf, 'w') as ds:
++        ds.createDimension('foo1', _string_array.shape[0])
++        ds.createDimension('foo2', _string_array.shape[1])
++        ds.createVariable('bar', str, ('foo1', 'foo2'))
++        ds.variables['bar'][:] = _string_array
++
++    ds = h5netcdf.File(tmp_netcdf, 'r')
++
++    v = ds.variables['bar']
++    assert array_equal(v, _string_array)
++    ds.close()
++
++def test_nc_properties(tmp_netcdf):
++    with h5netcdf.File(tmp_netcdf, 'w') as ds:
++        pass
++    with h5py.File(tmp_netcdf, 'r') as f:
++        assert 'h5netcdf' in f.attrs['_NCProperties']
++
++def test_failed_read_open_and_clean_delete(tmpdir):
++    # A file that does not exist but is opened for
++    # reading should only raise an IOError and
++    # no AttributeError at garbage collection.
++    path = str(tmpdir.join('this_file_does_not_exist.nc'))
++    try:
++        with h5netcdf.File(path, 'r') as ds:
++            pass
++    except IOError:
++        pass
++
++    # Look at garbage collection:
++    # A simple gc.collect() does not raise an exception.
++    # Must seek the File object and imitate its del command
++    # by forcing it to close.
++    obj_list = gc.get_objects()
++    for obj in obj_list:
++        try:
++            is_h5netcdf_File = isinstance(obj, h5netcdf.File)
++        except AttributeError as e:
++            is_h5netcdf_File = False
++        if is_h5netcdf_File:
++            obj.close()
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..fe60c2f
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+Add-missing-test-suite.patch
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..135e9e7
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,13 @@
+#!/usr/bin/make -f
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE = 1
+
+export PYBUILD_NAME = h5netcdf
+export PYBUILD_TEST_ARGS = {dir}/h5netcdf/tests
+ifneq (,$(findstring nocheck,$(DEB_BUILD_PROFILES)))
+export PYBUILD_DISABLE = test
+endif
+
+%:
+	dh $@ --with python3 --buildsystem=pybuild
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/tests/control b/debian/tests/control
new file mode 100644
index 0000000..f4806ca
--- /dev/null
+++ b/debian/tests/control
@@ -0,0 +1,8 @@
+Test-Command: set -e
+ ; cp -a h5netcdf/tests "$AUTOPKGTEST_TMP"
+ ; for py in $(py3versions -r 2>/dev/null)
+ ; do cd "$AUTOPKGTEST_TMP"
+ ; echo "Testing with $py:"
+ ; $py -m pytest tests
+ ; done
+Depends: @, python3-all, python3-netcdf4, python3-pytest
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..7059b7f
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,3 @@
+version=4
+opts=uversionmangle=s/(rc|a|b|c)/~$1/ \
+https://pypi.debian.net/h5netcdf/h5netcdf@ANY_VERSION@@ARCHIVE_EXT@

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/python-h5netcdf.git



More information about the debian-science-commits mailing list