예제 #1
0
파일: test_memory.py 프로젝트: micder/xcube
    def test_write_and_delete_data(self):
        cube_3 = new_cube(variables=dict(B05=0.1, B06=0.2))
        cube_3_id = self.store.write_data(cube_3, data_id='cube_3')
        self.assertEqual('cube_3', cube_3_id)
        self.assertIs(cube_3, self.store.open_data(cube_3_id))

        cube_4 = new_cube(variables=dict(B07=0.1, B08=0.2))
        cube_4_id = self.store.write_data(cube_4)
        self.assertIsInstance(cube_4_id, str)
        self.assertIs(cube_4, self.store.open_data(cube_4_id))

        with self.assertRaises(DataStoreError) as cm:
            self.store.write_data(cube_4, tile_size=1000, spatial_res=0.5)
        self.assertEqual('Unsupported write_params "tile_size", "spatial_res"',
                         f'{cm.exception}')

        with self.assertRaises(DataStoreError) as cm:
            self.store.write_data(cube_4, data_id='cube_3')
        self.assertEqual('Data resource "cube_3" already exist in store',
                         f'{cm.exception}')

        self.store.delete_data(cube_3_id)
        self.store.delete_data(cube_4_id)

        with self.assertRaises(DataStoreError) as cm:
            self.store.delete_data(cube_3_id)
        self.assertEqual('Data resource "cube_3" does not exist in store',
                         f'{cm.exception}')

        with self.assertRaises(DataStoreError) as cm:
            self.store.delete_data(cube_4_id)
        self.assertEqual(
            f'Data resource "{cube_4_id}" does not exist in store',
            f'{cm.exception}')
예제 #2
0
파일: server.py 프로젝트: dcs4cop/xcube
def _init_local_store():
    """
    Initialize a "directory" data store with test datasets.
    """
    from xcube.core.new import new_cube

    local_base_dir = new_temp_dir(suffix='_local_store')
    dataset_1 = new_cube(width=36, height=18, variables={'A': 0.1, 'B': 0.2})
    dataset_2 = new_cube(width=36, height=18, variables={'C': 0.2, 'D': 0.3})
    dataset_1.to_zarr(os.path.join(local_base_dir, 'DATASET-1.zarr'))
    dataset_2.to_zarr(os.path.join(local_base_dir, 'DATASET-2.zarr'))

    global STORES_CONFIG_PATH
    _, STORES_CONFIG_PATH = new_temp_file(suffix='_stores.yaml')
    with open(STORES_CONFIG_PATH, 'w') as stream:
        yaml.dump(
            {
                'test': {
                    'title': 'Local test store',
                    'store_id': 'file',
                    'store_params': {
                        'root': local_base_dir
                    }
                }
            }, stream)
    print(f' * Store base directory: {local_base_dir}')
    print(f' * Store configuration: {STORES_CONFIG_PATH}')
예제 #3
0
파일: test_gdf.py 프로젝트: micder/xcube
 def setUp(self) -> None:
     self.data_store = MemoryDataStore()
     self.data_store.data_dict.update({
         'cube_1':
         new_cube(variables=dict(B01=0.4, B02=0.5)),
         'cube_2':
         new_cube(variables=dict(B03=0.4, B04=0.5))
     })
예제 #4
0
    def test_write_and_read_and_delete(self):
        self.store.s3.mkdir(BUCKET_NAME)

        dataset_1 = new_cube(variables=dict(a=4.1, b=7.4))
        dataset_2 = new_cube(variables=dict(c=5.2, d=8.5))
        dataset_3 = new_cube(variables=dict(e=6.3, f=9.6))

        # Write 3 cubes
        self.store.write_data(dataset_1, data_id='cube-1.zarr')
        self.store.write_data(dataset_2, data_id='cube-2.zarr')
        self.store.write_data(dataset_3, data_id='cube-3.zarr')

        self.assertTrue(self.store.has_data('cube-1.zarr'))
        self.assertTrue(self.store.has_data('cube-2.zarr'))
        self.assertTrue(self.store.has_data('cube-3.zarr'))

        self.assertIn(('cube-1.zarr', None), set(self.store.get_data_ids()))
        self.assertIn(('cube-2.zarr', None), set(self.store.get_data_ids()))
        self.assertIn(('cube-3.zarr', None), set(self.store.get_data_ids()))
        self.assertEqual(3, len(set(self.store.get_data_ids())))

        # Open the 3 written cubes
        opened_dataset_1 = self.store.open_data('cube-1.zarr')
        opened_dataset_2 = self.store.open_data('cube-2.zarr')
        opened_dataset_3 = self.store.open_data('cube-3.zarr')

        self.assertIsInstance(opened_dataset_1, xr.Dataset)
        self.assertIsInstance(opened_dataset_2, xr.Dataset)
        self.assertIsInstance(opened_dataset_3, xr.Dataset)

        self.assertEqual(set(dataset_1.data_vars),
                         set(opened_dataset_1.data_vars))
        self.assertEqual(set(dataset_2.data_vars),
                         set(opened_dataset_2.data_vars))
        self.assertEqual(set(dataset_3.data_vars),
                         set(opened_dataset_3.data_vars))

        # Try overwriting existing cube 1
        dataset_4 = new_cube(variables=dict(g=7.4, h=10.7))
        with self.assertRaises(DataStoreError) as cm:
            self.store.write_data(dataset_4, data_id='cube-1.zarr')
        self.assertEqual("path '' contains a group", f'{cm.exception}')
        # replace=True should do the trick
        self.store.write_data(dataset_4, data_id='cube-1.zarr', replace=True)
        opened_dataset_4 = self.store.open_data('cube-1.zarr')
        self.assertEqual(set(dataset_4.data_vars),
                         set(opened_dataset_4.data_vars))

        # Try deleting cube 1
        self.store.delete_data('cube-1.zarr')
        self.assertEqual({('cube-2.zarr', None), ('cube-3.zarr', None)},
                         set(self.store.get_data_ids()))
        self.assertFalse(self.store.has_data('cube-1.zarr'))

        # Now it should be save to also write with replace=False
        self.store.write_data(dataset_1, data_id='cube-1.zarr', replace=False)
예제 #5
0
파일: test_memory.py 프로젝트: micder/xcube
 def setUp(self) -> None:
     self.old_global_data_dict = MemoryDataStore.replace_global_data_dict({
         'cube_1':
         new_cube(variables=dict(B01=0.4, B02=0.5)),
         'cube_2':
         new_cube(variables=dict(B03=0.4, B04=0.5)),
         'ds_1':
         xr.Dataset()
     })
     self._store = new_data_store('memory')
     self.assertIsInstance(self.store, MemoryDataStore)
예제 #6
0
    def test_strip_cube(self):
        cube = new_cube(variables=dict(chl=0.6, tsm=0.9, flags=16))
        self.assertIs(cube, strip_cube(cube))

        cube = new_cube(variables=dict(chl=0.6, tsm=0.9, flags=16))
        cube_subset = cube.sel(time=slice('1990-01-01', '1991-01-01'))
        stripped_cube = strip_cube(cube_subset)
        self.assertEqual(set(), set(stripped_cube.data_vars))

        cube = new_cube(variables=dict(chl=0.6, tsm=0.9, flags=16))
        cube_subset = cube.sel(lat=0, lon=0, method='nearest')
        stripped_cube = strip_cube(cube_subset)
        self.assertEqual(set(), set(stripped_cube.data_vars))
예제 #7
0
    def new(cls, **kwargs) -> xr.Dataset:
        """
        Create a new empty cube. Useful for testing.

        Refer to :func:`xcube.core.new.new_cube` for details.
        """
        return new_cube(**kwargs)
예제 #8
0
 def setUp(self) -> None:
     cube = new_cube(width=360,
                     height=180,
                     time_periods=6,
                     variables=dict(analysed_sst=275.3, analysis_error=2.1))
     cube = chunk_dataset(cube, dict(time=3, lat=90, lon=90))
     self.cube = cube
예제 #9
0
 def test_new_ml_dataset_descriptor(self):
     cube = new_cube(variables=dict(a=4.1, b=7.4))
     ml_cube = BaseMultiLevelDataset(cube)
     descriptor = new_data_descriptor('cube', ml_cube)
     self.assertExpectedDescriptor(descriptor,
                                   MultiLevelDatasetDescriptor,
                                   'mldataset')
예제 #10
0
파일: test_main.py 프로젝트: micder/xcube
 def setUp(self) -> None:
     with open('_request.json', 'w') as fp:
         json.dump(MainTest.REQUEST, fp)
     with open('_request.yaml', 'w') as fp:
         yaml.dump(MainTest.REQUEST, fp)
     self.saved_cube_memory = MemoryDataStore.replace_global_data_dict(
         {'S2L2A': new_cube(variables=dict(B01=0.1, B02=0.2, B03=0.3))})
예제 #11
0
    def test_chunks_are_smaller_than_sizes(self):
        cube1 = new_cube(variables=dict(chl=0.6, tsm=0.9, flags=16))
        for var in cube1.variables.values():
            self.assertIsNone(var.chunks)

        rc = CubeRechunker()
        cube2, gm, cc = rc.transform_cube(
            cube1, GridMapping.from_dataset(cube1),
            CubeConfig(chunks=dict(time=2, lat=100, lon=200)))

        self.assertIsInstance(cube2, xr.Dataset)
        self.assertIsInstance(gm, GridMapping)
        self.assertIsInstance(cc, CubeConfig)
        self.assertEqual(cube1.attrs, cube2.attrs)
        self.assertEqual({'time': 2, 'lat': 100, 'lon': 200}, cc.chunks)
        self.assertEqual(set(cube1.coords), set(cube2.coords))
        self.assertEqual(set(cube1.data_vars), set(cube2.data_vars))

        for k, v in cube2.coords.items():
            if v.chunks is not None:
                self.assertIsInstance(v.chunks, tuple, msg=f'{k!r}={v!r}')
                self.assertNotIn('chunks', v.encoding)
                # self.assertIn('chunks', v.encoding)
                # self.assertEqual([v.sizes[d] for d in v.dims],
                #                  v.encoding['chunks'])
        for k, v in cube2.data_vars.items():
            self.assertIsInstance(v.chunks, tuple, msg=f'{k!r}={v!r}')
            self.assertEqual(((2, 2, 1), (100, 80), (200, 160)), v.chunks)
            self.assertNotIn('chunks', v.encoding)
예제 #12
0
 def test_non_empty_cube_subset(self):
     dataset = new_cube(variables=dict(a=9, b=0.2))
     cube = dataset.xcube.cube
     self.assertIsInstance(cube, xr.Dataset)
     self.assertEqual(set(dataset.data_vars), set(cube.data_vars))
     gm = dataset.xcube.gm
     self.assertIsInstance(gm, GridMapping)
예제 #13
0
    def test_chunks_are_larger_than_sizes(self):
        cube1 = new_cube(variables=dict(chl=0.6, tsm=0.9, flags=16))
        for var in cube1.variables.values():
            self.assertIsNone(var.chunks)

        rc = CubeRechunker()
        cube2, gm, cc = rc.transform_cube(
            cube1, GridMapping.from_dataset(cube1),
            CubeConfig(chunks=dict(time=64, lat=512, lon=512)))

        self.assertIsInstance(cube2, xr.Dataset)
        self.assertIsInstance(gm, GridMapping)
        self.assertIsInstance(cc, CubeConfig)
        self.assertEqual(cube1.attrs, cube2.attrs)
        self.assertEqual(set(cube1.coords), set(cube2.coords))
        self.assertEqual(set(cube1.data_vars), set(cube2.data_vars))

        for k, v in cube2.coords.items():
            if v.chunks is not None:
                self.assertIsInstance(v.chunks, tuple, msg=f'{k!r}={v!r}')
                self.assertNotIn('chunks', v.encoding)
        for k, v in cube2.data_vars.items():
            self.assertIsInstance(v.chunks, tuple, msg=f'{k!r}={v!r}')
            self.assertEqual(((5, ), (180, ), (360, )), v.chunks)
            self.assertNotIn('chunks', v.encoding)
예제 #14
0
 def setUpClass(cls) -> None:
     rimraf(S3_BUCKET)
     os.mkdir(S3_BUCKET)
     cube = new_cube(time_periods=3,
                     variables=dict(precipitation=0.9,
                                    temperature=278.3)).chunk(dict(time=1, lat=90, lon=90))
     write_cube(cube, TEST_CUBE_1, "zarr", cube_asserted=True)
     write_cube(cube, TEST_CUBE_2, "zarr", cube_asserted=True)
예제 #15
0
 def test_get_time_range_from_data_with_irregular_data(self):
     cube = new_cube(drop_bounds=True, time_freq='M')
     time_range = get_time_range_from_data(cube)
     self.assertIsNotNone(time_range)
     self.assertEqual('2010-01-31T00:00:00',
                      pd.Timestamp(time_range[0]).isoformat())
     self.assertEqual('2010-06-30T00:00:00',
                      pd.Timestamp(time_range[1]).isoformat())
예제 #16
0
 def test_get_time_range_from_data(self):
     cube = new_cube(drop_bounds=True)
     time_range = get_time_range_from_data(cube)
     self.assertIsNotNone(time_range)
     self.assertEqual('2010-01-01T00:00:00',
                      pd.Timestamp(time_range[0]).isoformat())
     self.assertEqual('2010-01-06T00:00:00',
                      pd.Timestamp(time_range[1]).isoformat())
예제 #17
0
 def test_get_time_range_from_attrs(self):
     cube = new_cube()
     time_range = get_time_range_from_attrs(cube)
     self.assertIsNotNone(time_range)
     self.assertEqual('2010-01-01T00:00:00',
                      pd.Timestamp(time_range[0]).isoformat())
     self.assertEqual('2010-01-06T00:00:00',
                      pd.Timestamp(time_range[1]).isoformat())
예제 #18
0
 def setUp(self):
     self._rm_outputs()
     dataset = new_cube(variables=dict(precipitation=0.4,
                                       temperature=275.2,
                                       soil_moisture=0.5),
                        time_periods=self.time_periods())
     dataset.to_netcdf(TEST_NC_FILE, mode="w")
     dataset.to_zarr(TEST_ZARR_DIR, mode="w")
예제 #19
0
 def test_cube_stays_cube(self):
     dataset = new_cube(variables=dict(a=1, b=2, c=3))
     cube, grid_mapping, rest = decode_cube(dataset)
     self.assertIs(dataset, cube)
     self.assertIsInstance(grid_mapping, GridMapping)
     self.assertTrue(grid_mapping.crs.is_geographic)
     self.assertIsInstance(rest, xr.Dataset)
     self.assertEqual(set(), set(rest.data_vars))
예제 #20
0
 def test_get_dataset_indexes_for_single_cell(self):
     dataset = new_cube(width=360, height=180, drop_bounds=True)
     cell = dataset.isel(time=2, lat=20, lon=30)
     with self.assertRaises(ValueError) as cm:
         get_dataset_indexes(cell, "lon", np.array([-149.5]))
     self.assertEqual(
         "cannot determine cell boundaries"
         " for coordinate variable 'lon' of size 1", f"{cm.exception}")
예제 #21
0
    def setUp(self) -> None:
        rimraf(self.TEST_CUBE)
        cube = new_cube(time_periods=3,
                        variables=dict(precipitation=np.nan,
                                       temperature=np.nan)).chunk(
                                           dict(time=1, lat=90, lon=90))

        write_cube(cube, self.TEST_CUBE, "zarr", cube_asserted=True)
예제 #22
0
 def test_verify_cube(self):
     cube = new_cube()
     self.assertEqual([], verify_cube(cube))
     ds = cube.drop("time")
     self.assertEqual(["missing time coordinate variable"], verify_cube(ds))
     ds = ds.drop("lat")
     self.assertEqual(["missing spatial x,y coordinate variables",
                       "missing time coordinate variable"], verify_cube(ds))
예제 #23
0
 def test_get_time_range_from_data_start_and_end_time_arrays(self):
     cube = new_cube(drop_bounds=True, use_cftime=True, time_dtype=None)
     time_range = get_time_range_from_data(cube)
     self.assertIsNotNone(time_range)
     self.assertEqual('2010-01-01T00:00:00',
                      pd.Timestamp(time_range[0]).isoformat())
     self.assertEqual('2010-01-06T00:00:00',
                      pd.Timestamp(time_range[1]).isoformat())
예제 #24
0
 def test_verify_ok(self):
     cube = new_cube(variables=dict(precipitation=0.5))
     write_cube(cube, self.TEST_CUBE, "zarr", cube_asserted=True)
     result = self.invoke_cli(['verify', self.TEST_CUBE])
     self.assertEqual(0, result.exit_code)
     self.assertEqual(
         "Opening cube from 'test.zarr'...\n"
         "INPUT is a valid cube.\n", result.stdout)
예제 #25
0
 def setUp(self) -> None:
     self.cube = new_cube(width=2000,
                          height=1000,
                          x_start=0,
                          x_res=0.0025,
                          y_start=50,
                          y_res=0.0025,
                          inverse_y=True,
                          variables={'a': 0.5})
예제 #26
0
 def _new_test_cube(self):
     return new_cube(width=2000,
                     height=1000,
                     x_start=0.0,
                     y_start=50.0,
                     x_res=4.0 / 2000,
                     time_start="2010-01-01",
                     time_periods=20,
                     variables=dict(precipitation=0.6, temperature=276.2))
예제 #27
0
    def test_write_dataset(self):

        dataset = new_cube()
        try:
            write_dataset(dataset, TEST_NC_FILE_2)
            self.assertTrue(os.path.isfile(TEST_NC_FILE_2))
        finally:
            if os.path.isfile(TEST_NC_FILE_2):
                os.remove(TEST_NC_FILE_2)
예제 #28
0
파일: test_new.py 프로젝트: sfoucher/xcube
 def test_new_cube_with_const_vars(self):
     cube = new_cube(variables=dict(sst=274.4, chl=10.31))
     self.assertIn('sst', cube)
     self.assertIn('chl', cube)
     import numpy as np
     np.testing.assert_almost_equal(cube.sst.values,
                                    np.full((5, 180, 360), 274.4))
     np.testing.assert_almost_equal(cube.chl.values,
                                    np.full((5, 180, 360), 10.31))
예제 #29
0
    def test_verify_cube_coord_equidistance_reverse_lat(self):
        ds = new_cube()
        ds['lat'] = np.flip(ds.lat)
        ds['lat_bnds'] = (['lat', 'bnds'], np.flip(ds.lat_bnds))

        ds['lon'] = np.roll(ds.lon, 90)
        ds['lon_bnds'] = (['lon', 'bnds'], np.roll(ds.lon_bnds, 180))

        self.assertEqual([], verify_cube(ds))
예제 #30
0
    def test_verify_cube_coord_equidistance(self):
        ds = new_cube()
        ds['lat'] = ds['lat'] + np.random.rand(len(ds['lat']))
        ds['lat_bnds'][:, 0] = ds['lat_bnds'][:, 0] + np.random.rand(len(ds['lat_bnds'][:, 0]))
        ds['lat_bnds'][:, 1] = ds['lat_bnds'][:, 1] + np.random.rand(len(ds['lat_bnds'][:, 1]))

        self.assertEqual(["coordinate variable 'lat' is not equidistant",
                          "coordinate variable 'lat_bnds' is not equidistant"],
                         verify_cube(ds))