This is an automated email from the git hooks/post-receive script. a_valentino-guest pushed a commit to branch master in repository pyresample.
commit a134a6d78b6e14cb71b8ec9acf4641cc00ff78aa Author: Antonio Valentino <antonio.valent...@tiscali.it> Date: Fri Mar 23 07:03:24 2018 +0000 New upstream version 1.8.3 --- .bumpversion.cfg | 2 +- .stickler.yml | 5 ++ appveyor.yml | 2 +- changelog.rst | 42 ++++++++++++--- pyresample/__init__.py | 31 ++++++----- pyresample/geometry.py | 41 ++++++++++----- pyresample/kd_tree.py | 109 ++++++++++++++++++++------------------- pyresample/test/test_geometry.py | 102 ++++++++++++++++++++++++------------ pyresample/version.py | 2 +- setup.py | 10 ++-- 10 files changed, 217 insertions(+), 129 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index ab21604..536a1ae 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.8.2 +current_version = 1.8.3 commit = True tag = True diff --git a/.stickler.yml b/.stickler.yml new file mode 100644 index 0000000..c266a86 --- /dev/null +++ b/.stickler.yml @@ -0,0 +1,5 @@ +linters: + flake8: + fixer: true +fixers: + enable: true diff --git a/appveyor.yml b/appveyor.yml index 51f60d1..df72583 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -64,7 +64,7 @@ install: # target Python version and architecture - "conda update --yes conda" - "conda config --add channels conda-forge" - - "conda create -q --yes -n test python=%PYTHON_VERSION% basemap-data-hires sphinx pyproj scipy pykdtree" + - "conda create -q --yes -n test python=%PYTHON_VERSION% basemap-data-hires sphinx pyproj scipy pykdtree dask xarray" - "activate test" - "pip install coveralls" - "pip install mock" diff --git a/changelog.rst b/changelog.rst index 7a105eb..31c1efd 100644 --- a/changelog.rst +++ b/changelog.rst @@ -2,6 +2,37 @@ Changelog ========= +v1.8.3 (2018-03-19) +------------------- +- update changelog. [Martin Raspaud] +- Bump version: 1.8.2 → 1.8.3. [Martin Raspaud] +- Merge branch 'develop' into new_release. [Martin Raspaud] +- Merge pull request #107 from pytroll/bugfix-memory-leak. [Martin + Raspaud] + + [WIP] Remove closures to allow memory to be freed +- Prevend dynamic areas to choke on NaNs. [Martin Raspaud] +- Make CHUNK_SIZE int if taken from environment. [Martin Raspaud] +- Reorganize indices assignments. [Martin Raspaud] +- Remove closures to allow memory to be freed. [Martin Raspaud] +- Merge pull request #106 from pytroll/bugfix-area-equality. [David + Hoese] + + Fix area equality to support np.nan, xarray and dask +- Add dask and xarray to appveyor. [Martin Raspaud] +- Use numpy's allclose for swathdef equality. [Martin Raspaud] +- Require a newer numpy for nan equality. [Martin Raspaud] +- Style cleanup. [Martin Raspaud] +- Add tests for swath equality. [Martin Raspaud] +- Style cleanup. [Martin Raspaud] +- Fix area equality to support xarray and dask. [Martin Raspaud] +- Merge pull request #108 from pytroll/add-stickler-config. [Martin + Raspaud] + + Adding .stickler.yml configuration file +- Adding .stickler.yml. [stickler-ci] + + v1.8.2 (2018-03-01) ------------------- - update changelog. [davidh-ssec] @@ -738,7 +769,6 @@ v1.2.2 (2016-06-21) Without this, the compilation of the ewa extension crashes. - v1.2.1 (2016-06-21) ------------------- - update changelog. [Martin Raspaud] @@ -894,11 +924,9 @@ v1.2.0 (2016-06-17) - Make kd_tree test work on older numpy version. [Martin Raspaud] VisibleDeprecationWarning is not available in numpy <1.9. - - Adapt to newest pykdtree version. [Martin Raspaud] The kdtree object's attribute `data_pts` has been renamed to `data`. - - Run tests on python 3.5 in travis also. [Martin Raspaud] @@ -910,7 +938,6 @@ v1.1.6 (2016-02-25) A previous commit was looking for a 'data_pts' attribute in the kdtree object, which is available in pykdtree, but not scipy. - - Merge pull request #32 from mitkin/master. [Martin Raspaud] [tests] Skip deprecation warnings in test_gauss_multi_uncert @@ -922,7 +949,6 @@ v1.1.6 (2016-02-25) The latest matplotlib (1.5) doesn't support python 2.6 and 3.3. This patch chooses the right matplotlib version to install depending on the python version at hand. - - Skip deprecation warnings. [Mikhail Itkin] Catch the rest of the warnings. Check if there is only one, and @@ -964,7 +990,6 @@ Other - Bugfix to address a numpy DeprecationWarning. [Martin Raspaud] Numpy won't take non-integer indices soon, so make index an int. - - Merge branch 'release-1.1.3' [Martin Raspaud] - Merge branch 'licence-lgpl' into pre-master. [Martin Raspaud] - Switch to lgplv3, and bump up version number. [Martin Raspaud] @@ -1186,7 +1211,7 @@ Other - Set svn:mime-type. [StorPipfugl] - Corrected doc errors. [StorPipfugl] - Removed dist dir. [StorPipfugl] -- [StorPipfugl] +- No commit message. [StorPipfugl] - Updated documentation. New release. [StorPipfugl] - Started updating docstrings. [StorPipfugl] - Restructured API. [StorPipfugl] @@ -1199,8 +1224,9 @@ Other - Removed unneeded function. [StorPipfugl] - Mime types set. [StorPipfugl] - Mime types set. [StorPipfugl] -- [StorPipfugl] +- No commit message. [StorPipfugl] - Moved to Google Code under GPLv3 license. [StorPipfugl] - moved to Google Code. [StorPipfugl] + diff --git a/pyresample/__init__.py b/pyresample/__init__.py index b36aceb..dfd52ae 100644 --- a/pyresample/__init__.py +++ b/pyresample/__init__.py @@ -17,23 +17,22 @@ import os -CHUNK_SIZE = os.getenv('PYTROLL_CHUNK_SIZE', 4096) +CHUNK_SIZE = int(os.getenv('PYTROLL_CHUNK_SIZE', 4096)) -from pyresample.version import __version__ # Backwards compatibility -from pyresample import geometry -from pyresample import grid -from pyresample import image -from pyresample import kd_tree -from pyresample import utils -from pyresample import plot +from pyresample import geometry # noqa +from pyresample import grid # noqa +from pyresample import image # noqa +from pyresample import kd_tree # noqa +from pyresample import utils # noqa +from pyresample import plot # noqa # Easy access -from pyresample.geometry import (SwathDefinition, - AreaDefinition, - DynamicAreaDefinition) -from pyresample.utils import load_area -from pyresample.kd_tree import XArrayResamplerNN -from pyresample.plot import save_quicklook, area_def2basemap +from pyresample.geometry import (SwathDefinition, # noqa + AreaDefinition, # noqa + DynamicAreaDefinition) # noqa +from pyresample.utils import load_area # noqa +from pyresample.kd_tree import XArrayResamplerNN # noqa +from pyresample.plot import save_quicklook, area_def2basemap # noqa __all__ = ['grid', 'image', 'kd_tree', 'utils', 'plot', 'geo_filter', 'geometry', 'CHUNK_SIZE'] @@ -43,13 +42,13 @@ def get_capabilities(): cap = {} try: - from pykdtree.kdtree import KDTree + from pykdtree.kdtree import KDTree # noqa cap['pykdtree'] = True except ImportError: cap['pykdtree'] = False try: - import numexpr + import numexpr # noqa cap['numexpr'] = True except ImportError: cap['numexpr'] = False diff --git a/pyresample/geometry.py b/pyresample/geometry.py index b58d3cc..23c78a7 100644 --- a/pyresample/geometry.py +++ b/pyresample/geometry.py @@ -93,7 +93,8 @@ class BaseDefinition(object): def __eq__(self, other): """Test for approximate equality""" - + if self is other: + return True if other.lons is None or other.lats is None: other_lons, other_lats = other.get_lonlats() else: @@ -106,11 +107,21 @@ class BaseDefinition(object): self_lons = self.lons self_lats = self.lats + if self_lons is other_lons and self_lats is other_lats: + return True + if isinstance(self_lons, DataArray) and np.ndarray is not DataArray: + self_lons = self_lons.data + self_lats = self_lats.data + if isinstance(other_lons, DataArray) and np.ndarray is not DataArray: + other_lons = other_lons.data + other_lats = other_lats.data + try: + from dask.array import allclose + except ImportError: + from numpy import allclose try: - return (np.allclose(self_lons, other_lons, atol=1e-6, - rtol=5e-9) and - np.allclose(self_lats, other_lats, atol=1e-6, - rtol=5e-9)) + return (allclose(self_lons, other_lons, atol=1e-6, rtol=5e-9, equal_nan=True) and + allclose(self_lats, other_lats, atol=1e-6, rtol=5e-9, equal_nan=True)) except (AttributeError, ValueError): return False @@ -679,7 +690,10 @@ class DynamicAreaDefinition(object): except (TypeError, ValueError): lons, lats = lonslats.get_lonlats() xarr, yarr = proj4(np.asarray(lons), np.asarray(lats)) - corners = [np.min(xarr), np.min(yarr), np.max(xarr), np.max(yarr)] + xarr[xarr > 9e29] = np.nan + yarr[yarr > 9e29] = np.nan + corners = [np.nanmin(xarr), np.nanmin(yarr), + np.nanmax(xarr), np.nanmax(yarr)] domain = self.compute_domain(corners, resolution, size) self.area_extent, self.x_size, self.y_size = domain @@ -689,6 +703,13 @@ class DynamicAreaDefinition(object): self.area_extent, self.rotation) +def invproj(data_x, data_y, proj_dict): + """Perform inverse projection.""" + # XXX: does pyproj copy arrays? What can we do so it doesn't? + target_proj = Proj(**proj_dict) + return np.dstack(target_proj(data_x, data_y, inverse=True)) + + class AreaDefinition(BaseDefinition): """Holds definition of an area. @@ -1229,15 +1250,9 @@ class AreaDefinition(BaseDefinition): dtype = dtype or self.dtype target_x, target_y = self.get_proj_coords_dask(chunks, dtype) - target_proj = Proj(**self.proj_dict) - - def invproj(data1, data2): - # XXX: does pyproj copy arrays? What can we do so it doesn't? - return np.dstack(target_proj(data1, data2, inverse=True)) - res = map_blocks(invproj, target_x, target_y, chunks=(target_x.chunks[0], target_x.chunks[1], 2), - new_axis=[2]) + new_axis=[2], proj_dict=self.proj_dict) return res[:, :, 0], res[:, :, 1] diff --git a/pyresample/kd_tree.py b/pyresample/kd_tree.py index b8d786a..1460013 100644 --- a/pyresample/kd_tree.py +++ b/pyresample/kd_tree.py @@ -38,9 +38,7 @@ except ImportError: DataArray = None da = None -if sys.version < '3': - range = xrange -else: +if sys.version >= '3': long = int kd_tree_name = None @@ -177,7 +175,7 @@ def resample_gauss(source_geo_def, data, target_geo_def, sigmas.__iter__() sigma_list = sigmas is_multi_channel = True - except: + except: # noqa: E722 sigma_list = [sigmas] for sigma in sigma_list: @@ -250,7 +248,7 @@ def resample_custom(source_geo_def, data, target_geo_def, for weight_func in weight_funcs: if not isinstance(weight_func, types.FunctionType): raise TypeError('weight_func must be function object') - except: + except: # noqa: E722 if not isinstance(weight_funcs, types.FunctionType): raise TypeError('weight_func must be function object') @@ -685,7 +683,7 @@ def get_sample_from_neighbour_info(resample_type, output_shape, data, 'valid_input_index and data') valid_types = ('nn', 'custom') - if not resample_type in valid_types: + if resample_type not in valid_types: raise TypeError('Invalid resampling type: %s' % resample_type) if resample_type == 'custom' and weight_funcs is None: @@ -905,7 +903,45 @@ def get_sample_from_neighbour_info(resample_type, output_shape, data, return result -class XArrayResamplerNN(object): +def lonlat2xyz(lons, lats): + + R = 6370997.0 + x_coords = R * da.cos(da.deg2rad(lats)) * da.cos(da.deg2rad(lons)) + y_coords = R * da.cos(da.deg2rad(lats)) * da.sin(da.deg2rad(lons)) + z_coords = R * da.sin(da.deg2rad(lats)) + + return da.stack( + (x_coords.ravel(), y_coords.ravel(), z_coords.ravel()), axis=-1) + + +def query_no_distance(target_lons, target_lats, + valid_output_index, kdtree, neighbours, epsilon, radius): + """Query the kdtree. No distances are returned.""" + voi = valid_output_index + shape = voi.shape + voir = voi.ravel() + target_lons_valid = target_lons.ravel()[voir] + target_lats_valid = target_lats.ravel()[voir] + + coords = lonlat2xyz(target_lons_valid, target_lats_valid) + distance_array, index_array = kdtree.query( + coords.compute(), + k=neighbours, + eps=epsilon, + distance_upper_bound=radius) + + # KDTree query returns out-of-bounds neighbors as `len(arr)` + # which is an invalid index, we mask those out so -1 represents + # invalid values + # voi is 2D, index_array is 1D + good_pixels = index_array < kdtree.n + voi[voi] = good_pixels + res_ia = np.full(shape, fill_value=-1, dtype=np.int) + res_ia[voi] = index_array[good_pixels] + return res_ia + + +class XArrayResamplerNN(): def __init__(self, source_geo_def, target_geo_def, @@ -954,15 +990,6 @@ class XArrayResamplerNN(object): self.target_geo_def = target_geo_def self.radius_of_influence = radius_of_influence - def transform_lonlats(self, lons, lats): - R = 6370997.0 - x_coords = R * da.cos(da.deg2rad(lats)) * da.cos(da.deg2rad(lons)) - y_coords = R * da.cos(da.deg2rad(lats)) * da.sin(da.deg2rad(lons)) - z_coords = R * da.sin(da.deg2rad(lats)) - - return da.stack( - (x_coords.ravel(), y_coords.ravel(), z_coords.ravel()), axis=-1) - def _create_resample_kdtree(self): """Set up kd tree on input""" source_lons, source_lats = self.source_geo_def.get_lonlats_dask() @@ -971,8 +998,7 @@ class XArrayResamplerNN(object): # FIXME: Is dask smart enough to only compute the pixels we end up # using even with this complicated indexing - input_coords = self.transform_lonlats(source_lons, - source_lats) + input_coords = lonlat2xyz(source_lons, source_lats) input_coords = input_coords[valid_input_idx.ravel(), :] # Build kd-tree on input @@ -988,38 +1014,16 @@ class XArrayResamplerNN(object): def _query_resample_kdtree(self, resample_kdtree, - target_lons, - target_lats, - valid_output_index, + tlons, + tlats, + valid_oi, reduce_data=True): """Query kd-tree on slice of target coordinates.""" - def query_no_distance(target_lons, target_lats, valid_output_index): - voi = valid_output_index - shape = voi.shape - voir = voi.ravel() - target_lons_valid = target_lons.ravel()[voir] - target_lats_valid = target_lats.ravel()[voir] - - coords = self.transform_lonlats(target_lons_valid, - target_lats_valid) - distance_array, index_array = resample_kdtree.query( - coords.compute(), - k=self.neighbours, - eps=self.epsilon, - distance_upper_bound=self.radius_of_influence) - - # KDTree query returns out-of-bounds neighbors as `len(arr)` - # which is an invalid index, we mask those out so -1 represents - # invalid values - # voi is 2D, index_array is 1D - good_pixels = index_array < resample_kdtree.n - voi[voi] = good_pixels - res_ia = np.full(shape, fill_value=-1, dtype=np.int) - res_ia[voi] = index_array[good_pixels] - return res_ia - - res = da.map_blocks(query_no_distance, target_lons, target_lats, - valid_output_index, dtype=np.int) + + res = da.map_blocks(query_no_distance, tlons, tlats, + valid_oi, dtype=np.int, kdtree=resample_kdtree, + neighbours=self.neighbours, epsilon=self.epsilon, + radius=self.radius_of_influence) return res, None def get_neighbour_info(self): @@ -1038,12 +1042,15 @@ class XArrayResamplerNN(object): # Create kd-tree valid_input_idx, resample_kdtree = self._create_resample_kdtree() + # This is a numpy array + self.valid_input_index = valid_input_idx + if resample_kdtree.n == 0: # Handle if all input data is reduced away valid_output_idx, index_arr, distance_arr = \ _create_empty_info(self.source_geo_def, self.target_geo_def, self.neighbours) - self.valid_input_index = valid_input_idx + self.valid_output_index = valid_output_idx self.index_array = index_arr self.distance_array = distance_arr @@ -1056,9 +1063,7 @@ class XArrayResamplerNN(object): index_arr, distance_arr = self._query_resample_kdtree( resample_kdtree, target_lons, target_lats, valid_output_idx) - self.valid_output_index, self.index_array = \ - da.compute(valid_output_idx, index_arr) - self.valid_input_index = valid_input_idx + self.valid_output_index, self.index_array = valid_output_idx, index_arr self.distance_array = distance_arr return (self.valid_input_index, diff --git a/pyresample/test/test_geometry.py b/pyresample/test/test_geometry.py index ae8990b..ef060d4 100644 --- a/pyresample/test/test_geometry.py +++ b/pyresample/test/test_geometry.py @@ -52,20 +52,6 @@ class Test(unittest.TestCase): 1029087.28, 1490031.3600000001]) lons, lats = area_def.get_lonlats() - area_def2 = geometry.AreaDefinition('areaD', 'Europe (3km, HRV, VTC)', 'areaD', - {'a': '6378144.0', - 'b': '6356759.0', - 'lat_0': '50.00', - 'lat_ts': '50.00', - 'lon_0': '8.00', - 'proj': 'stere'}, - 800, - 800, - [-1370912.72, - -909968.64000000001, - 1029087.28, - 1490031.3600000001], - lons=lons, lats=lats) lon, lat = area_def.get_lonlat(400, 400) self.assertAlmostEqual(lon, 5.5028467120975835, msg='lon retrieval from precomputated grid failed') @@ -111,7 +97,7 @@ class Test(unittest.TestCase): # Test dtype is preserved with automatic longitude wrapping lons2 = np.where(lons1 < 0, lons1 + 360, lons1) - with catch_warnings() as w: + with catch_warnings(): basedef = geometry.BaseDefinition(lons2, lats) lons, _ = basedef.get_lonlats() @@ -120,7 +106,7 @@ class Test(unittest.TestCase): (lons2.dtype, lons.dtype,)) lons2_ints = lons2.astype('int') - with catch_warnings() as w: + with catch_warnings(): basedef = geometry.BaseDefinition(lons2_ints, lats) lons, _ = basedef.get_lonlats() @@ -181,23 +167,23 @@ class Test(unittest.TestCase): arr = np.array([1.2, 1.3, 1.4, 1.5]) if sys.byteorder == 'little': # arr.view(np.uint8) - reference = np.array([ 51, 51, 51, 51, 51, 51, 243, - 63, 205, 204, 204, 204, 204, - 204, 244, 63, 102, 102, 102, 102, - 102, 102, 246, 63, 0, 0, - 0, 0, 0, 0, 248, 63], - dtype=np.uint8) + reference = np.array([51, 51, 51, 51, 51, 51, 243, + 63, 205, 204, 204, 204, 204, + 204, 244, 63, 102, 102, 102, 102, + 102, 102, 246, 63, 0, 0, + 0, 0, 0, 0, 248, 63], + dtype=np.uint8) else: # on le machines use arr.byteswap().view(np.uint8) - reference = np.array([ 63, 243, 51, 51, 51, 51, 51, - 51, 63, 244, 204, 204, 204, - 204, 204, 205, 63, 246, 102, 102, - 102, 102, 102, 102, 63, 248, - 0, 0, 0, 0, 0, 0], - dtype=np.uint8) + reference = np.array([63, 243, 51, 51, 51, 51, 51, + 51, 63, 244, 204, 204, 204, + 204, 204, 205, 63, 246, 102, 102, + 102, 102, 102, 102, 63, 248, + 0, 0, 0, 0, 0, 0], + dtype=np.uint8) np.testing.assert_allclose(reference, - geometry.get_array_hashable(arr)) + geometry.get_array_hashable(arr)) try: import xarray as xr @@ -212,7 +198,6 @@ class Test(unittest.TestCase): self.assertEqual(geometry.get_array_hashable(xrarr), xrarr.attrs['hash']) - def test_swath_hash(self): lons = np.array([1.2, 1.3, 1.4, 1.5]) lats = np.array([65.9, 65.86, 65.82, 65.78]) @@ -254,14 +239,12 @@ class Test(unittest.TestCase): self.assertIsInstance(hash(swath_def), int) - lons = np.ma.array([1.2, 1.3, 1.4, 1.5]) lats = np.ma.array([65.9, 65.86, 65.82, 65.78]) swath_def = geometry.SwathDefinition(lons, lats) self.assertIsInstance(hash(swath_def), int) - def test_area_equal(self): area_def = geometry.AreaDefinition('areaD', 'Europe (3km, HRV, VTC)', 'areaD', {'a': '6378144.0', @@ -784,8 +767,61 @@ class TestSwathDefinition(unittest.TestCase): lats = np.array([65.9, 65.86, 65.82, 65.78]) swath_def = geometry.SwathDefinition(lons, lats) swath_def2 = geometry.SwathDefinition(lons, lats) + # Identical lons and lats self.assertFalse( swath_def != swath_def2, 'swath_defs are not equal as expected') + # Identical objects + self.assertFalse( + swath_def != swath_def, 'swath_defs are not equal as expected') + + lons = np.array([1.2, 1.3, 1.4, 1.5]) + lats = np.array([65.9, 65.86, 65.82, 65.78]) + lons2 = np.array([1.2, 1.3, 1.4, 1.5]) + lats2 = np.array([65.9, 65.86, 65.82, 65.78]) + swath_def = geometry.SwathDefinition(lons, lats) + swath_def2 = geometry.SwathDefinition(lons2, lats2) + # different arrays, same values + self.assertFalse( + swath_def != swath_def2, 'swath_defs are not equal as expected') + + lons = np.array([1.2, 1.3, 1.4, np.nan]) + lats = np.array([65.9, 65.86, 65.82, np.nan]) + lons2 = np.array([1.2, 1.3, 1.4, np.nan]) + lats2 = np.array([65.9, 65.86, 65.82, np.nan]) + swath_def = geometry.SwathDefinition(lons, lats) + swath_def2 = geometry.SwathDefinition(lons2, lats2) + # different arrays, same values, with nans + self.assertFalse( + swath_def != swath_def2, 'swath_defs are not equal as expected') + + try: + import dask.array as da + lons = da.from_array(np.array([1.2, 1.3, 1.4, np.nan]), chunks=2) + lats = da.from_array(np.array([65.9, 65.86, 65.82, np.nan]), chunks=2) + lons2 = da.from_array(np.array([1.2, 1.3, 1.4, np.nan]), chunks=2) + lats2 = da.from_array(np.array([65.9, 65.86, 65.82, np.nan]), chunks=2) + swath_def = geometry.SwathDefinition(lons, lats) + swath_def2 = geometry.SwathDefinition(lons2, lats2) + # different arrays, same values, with nans + self.assertFalse( + swath_def != swath_def2, 'swath_defs are not equal as expected') + except ImportError: + pass + + try: + import xarray as xr + lons = xr.DataArray(np.array([1.2, 1.3, 1.4, np.nan])) + lats = xr.DataArray(np.array([65.9, 65.86, 65.82, np.nan])) + lons2 = xr.DataArray(np.array([1.2, 1.3, 1.4, np.nan])) + lats2 = xr.DataArray(np.array([65.9, 65.86, 65.82, np.nan])) + swath_def = geometry.SwathDefinition(lons, lats) + swath_def2 = geometry.SwathDefinition(lons2, lats2) + # different arrays, same values, with nans + self.assertFalse( + swath_def != swath_def2, 'swath_defs are not equal as expected') + + except ImportError: + pass def test_swath_not_equal(self): """Test swath inequality.""" @@ -1027,7 +1063,7 @@ class TestStackedAreaDefinition(unittest.TestCase): area2.y_size = random.randrange(6425) area2.x_size = x_size - res = concatenate_area_defs(area1, area2) + concatenate_area_defs(area1, area2) area_extent = [1, 2, 3, 6] y_size = area1.y_size + area2.y_size adef.assert_called_once_with(area1.area_id, area1.name, area1.proj_id, diff --git a/pyresample/version.py b/pyresample/version.py index b8f3e31..26fe615 100644 --- a/pyresample/version.py +++ b/pyresample/version.py @@ -15,4 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License along # with this program. If not, see <http://www.gnu.org/licenses/>. -__version__ = '1.8.2' +__version__ = '1.8.3' diff --git a/setup.py b/setup.py index 45a49d2..0497988 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the Free # Software Foundation, either version 3 of the License, or -#(at your option) any later version. +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS @@ -17,7 +17,7 @@ import imp # workaround python bug: http://bugs.python.org/issue15881#msg170215 -import multiprocessing +import multiprocessing # noqa: F401 import os import sys @@ -26,7 +26,7 @@ from setuptools.command.build_ext import build_ext as _build_ext version = imp.load_source('pyresample.version', 'pyresample/version.py') -requirements = ['setuptools>=3.2', 'pyproj>=1.9.5.1', 'numpy', 'configobj', +requirements = ['setuptools>=3.2', 'pyproj>=1.9.5.1', 'numpy>=1.10.0', 'configobj', 'pykdtree>=1.1.1', 'pyyaml', 'six'] extras_require = {'pykdtree': ['pykdtree>=1.1.1'], 'numexpr': ['numexpr'], @@ -48,7 +48,9 @@ else: extensions = [ Extension("pyresample.ewa._ll2cr", sources=["pyresample/ewa/_ll2cr.pyx"], extra_compile_args=extra_compile_args), - Extension("pyresample.ewa._fornav", sources=["pyresample/ewa/_fornav.pyx", "pyresample/ewa/_fornav_templates.cpp"], language="c++", extra_compile_args=extra_compile_args, + Extension("pyresample.ewa._fornav", sources=["pyresample/ewa/_fornav.pyx", + "pyresample/ewa/_fornav_templates.cpp"], + language="c++", extra_compile_args=extra_compile_args, depends=["pyresample/ewa/_fornav_templates.h"]) ] -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pyresample.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel