def _make_complex_group(): g = og( 'temp', aa=[oa('a_root_attr_num', _long(1)), oa('c_root_attr_str', 'xyz'), oa('b_root_attr_vec', np.array([1.2, 3, 4]))], dd=[od('root_dim_x', 2)], vv=[ov('root_var_1', dd=[od('root_dim_x')], aa=[oa('root_var_attr_1', _long(11))], data=np.zeros((2))), ov('root_var_2_scalar', data=np.array(3.15, dtype=np.float32))], gg=[og('subgroup', aa=[oa('subgroup_attr', 'qq')], dd=[od('subgroup_dim_y', 3)], vv=[ov('subgroup_var', dd=[od('root_dim_x'), od('subgroup_dim_y')], aa=[oa('subgroup_var_attr', 57.5)], data=np.zeros((2, 3)))], gg=[og('sub_sub_group', aa=[oa('sub_sub_group_attr', 'this')], vv=[ov('sub_sub_group_var', dd=[od('subgroup_dim_y')], data=np.zeros((3)))])]), og('sg_2_empty')]) ncg.complete(g) return g
def eg_simple_flat(): """Produce a flat version of the simple containers example.""" d_lat = od('lat', 10) d_lon = od('lon', 5) d_time = od('time', u=True) dims = [d_lat, d_lon, d_time] collection_vars = [ ov('instrument', data=np.array(0), aa=[oa('container_type', 'simple'), oa('members', ('instrument___lat instrument___lon instrument___rh ' 'instrument___time')), oa('measurement_platform', 'aircraft')]), ov('model', data=np.array(0), aa=[oa('container_type', 'simple'), oa('members', 'model___lat model___lon model___rh model___time'), oa('measurement_platform', 'global circulation model')])] data_vars = [ ov('instrument___lat', dd=[d_lat], aa=[oa('units', 'degrees_north')]), ov('instrument___lon', dd=[d_lon], aa=[oa('units', 'degrees_east')]), ov('instrument___time', dd=[d_time], aa=[oa('units', 'seconds')]), ov('instrument___rh', dd=dims, aa=[oa('_FillValue', -1)]), ov('model___lat', dd=[d_lat], aa=[oa('units', 'degrees_north')]), ov('model___lon', dd=[d_lon], aa=[oa('units', 'degrees_east')]), ov('model___time', dd=[d_time], aa=[oa('units', 'seconds')]), ov('model___rh', dd=dims, aa=[oa('_FillValue', -1)])] g = og('foo', dd=dims, vv=collection_vars + data_vars) _fake_complete(g) return g
def eg_simple_grouped(): """Produce a grouped version of the simple containers example.""" d_lat = od('lat', 10) d_lon = od('lon', 5) d_time = od('time', u=True) dims = [d_lat, d_lon, d_time] c_lat = ov('lat', dd=[d_lat], aa=[oa('units', 'degrees_north')]) c_lon = ov('lon', dd=[d_lon], aa=[oa('units', 'degrees_east')]) c_time = ov('time', dd=[d_time], aa=[oa('units', 'seconds')]) coords = [c_lat, c_lon, c_time] g = og('foo', dd=dims, gg=[og('instrument', vv=(coords + [ov('rh', dd=dims, aa=[oa('_FillValue', -1)])]), aa=[oa('container_type', 'simple'), oa('measurement_platform', 'aircraft')]), og('model', vv=(coords + [ov('rh', dd=dims, aa=[oa('_FillValue', -1)])]), aa=[oa('container_type', 'simple'), oa('measurement_platform', 'global circulation model')])]) _fake_complete(g) return g
def test_shared_clash(self): # NOTE: "complete" won't allow this, but this method doesn't care. g = og('', vv=[ov('v1', dd=[od('x', 2)]), ov('v2', dd=[od('x', 3)])]) add_missing_dims(g) self.assertEqual(len(g.dimensions), 1) self.assertEqual(g.dimensions.names(), ['x'])
def test_grouped_okay(self): g = og('', dd=[od('x'), od('y')], vv=[ov('v1', dd=[od('x')]), ov('v2', dd=[od('x'), od('y')])], gg=[og('subgroup', dd=[od('z')], vv=[ov('sv1', dd=[od('x')]), ov('sv2', dd=[od('y'), od('z')])])]) self.assertTrue(has_no_missing_dims(g))
def test_fail_nomatch(self): g = og('', dd=[od('x')], vv=[ov('v1', dd=[od('x', 2)]), ov('v2', dd=[od('x', 3)])]) with self.assertRaises(DimensionConflictError) as err_context: check_dims(g) msg = err_context.exception.message self.check_all_in_str(msg, ['/v1', '"x" = 2', '/v2', '"x" = 3'])
def test_okay_override_subgroup(self): # NOTE: here *two* 'x' dimensions, which do not conflict. g = og('', dd=[od('x')], vv=[ov('v1', dd=[od('x', 2)])], gg=[og('subgroup', dd=[od('x')], vv=[ov('v2', dd=[od('x', 3)])])]) check_dims(g)
def test_subgroup_okay(self): g = og('root', vv=[ov('test_var')], gg=[og('tst1', vv=[ov('test_var')])]) subgroup = g.groups['tst1'] self.assertFalse(group_is_tagged(g)) self.assertFalse(group_is_tagged(subgroup)) check_names(g) self.assertFalse(group_is_tagged(g)) self.assertFalse(group_is_tagged(subgroup))
def test_fail_conflicting_data_shapes(self): d1 = _mockdata((2, 23)) v1 = ov('v1', dd=[od('x'), od('y')], data=d1) v2 = ov('v2', dd=[od('x', 17), od('y', 23)]) g = og('', dd=[od('x'), od('y')], vv=[v1, v2]) with self.assertRaises(DimensionConflictError) as err_context: check_dims(g) msg = err_context.exception.message self.check_all_in_str(msg, ['/v1', '/v2', '"x" = 17', '"x" = 2'])
def test_multiple(self): g = og('', vv=[ov('v1', dd=[od('x'), od('y')]), ov('v2', dd=[od('y'), od('z')])]) self.assertEqual(all_dimensions(g), []) r = add_missing_dims(g) self.assertEqual(len(r), 3) self.assertEqual(len(g.dimensions), 3) self.assertIn(od('x'), g.dimensions) self.assertIn(od('y'), g.dimensions) self.assertIn(od('z'), g.dimensions)
def test_unlimited(self): g = og('', vv=[ov('v1', dd=[od('x', 2, u=True)]), ov('v2', dd=[od('x', 2)])]) self.assertEqual(all_dimensions(g), []) self.assertEqual(g.variables['v2'].dimensions[0], od('x', 2)) self.do_complete(g) self.assertNotEqual(g.variables['v2'].dimensions[0], od('x', 2)) self.assertEqual(list(g.dimensions), [od('x', 2, u=True)]) test_dim = g.dimensions['x'] self.assertIs(g.variables['v1'].dimensions[0], test_dim) self.assertIs(g.variables['v2'].dimensions[0], test_dim)
def test_with_varsdata_okay(self): g = og('', dd=[od('x')], vv=[ov('v1', dd=[od('x', 2)])], gg=[og('subgroup', vv=[ov('v2', dd=[od('x', 2)])])]) subgroup = g.groups['subgroup'] tag_group(g) self.assertTrue(group_is_tagged(g)) self.assertFalse(group_is_tagged(subgroup)) check_dims(g) self.assertTrue(group_is_tagged(g)) self.assertFalse(group_is_tagged(subgroup))
def test_partial_grouped(self): # Build a group with one dimension to be found in the subgroup. g = og('', gg=[og('subgroup', dd=[od('x', 4)], vv=[ov('subvar_1', dd=[od('x')]), ov('subvar_2', dd=[od('z', 3), od('x')])])]) dim_x_def = g.groups['subgroup'].dimensions['x'] self.do_complete(g) self.assertEqual(list(g.dimensions), [od('z', 3)]) self.assertEqual(list(g.groups['subgroup'].dimensions), [dim_x_def]) self.assertIs(g.groups['subgroup'].dimensions['x'], dim_x_def)
def test_grouped_fail(self): g = og('', dd=[od('x'), od('y')], vv=[ov('v1', dd=[od('x')]), ov('v2', dd=[od('x'), od('y')])], gg=[og('subgroup', dd=[od('zz')], vv=[ov('sv1', dd=[od('x')]), ov('sv2', dd=[od('y'), od('z')])])]) with self.assertRaises(IncompleteStructureError) as err_context: has_no_missing_dims(g, fail_if_not=True) msg = err_context.exception.message self.check_all_in_str(msg, [ 'Variable "/subgroup/sv2"', 'dimension "z"', 'no definition exists'])
def test_with_varsdata_fail(self): g = og('', dd=[od('x')], vv=[ov('v1', dd=[od('x', 2)])], gg=[og('subgroup', vv=[ov('v2', dd=[od('x', 3)])])]) subgroup = g.groups['subgroup'] tag_group(g) self.assertTrue(group_is_tagged(g)) self.assertFalse(group_is_tagged(subgroup)) with self.assertRaises(DimensionConflictError): check_dims(g) self.assertTrue(group_is_tagged(g)) self.assertFalse(group_is_tagged(subgroup))
def test_subgroup_mixed(self): g = og('', vv=[ov('v1', dd=[od('q')])], gg=[og('subgroup', vv=[ov('v1', dd=[od('q', 2)])])]) self.assertEqual(list(g.dimensions), []) v1 = g.variables['v1'] v2 = g.groups['subgroup'].variables['v1'] self.do_complete(g) self.assertEqual(len(g.dimensions), 1) self.assertEqual(list(g.dimensions), [od('q', 2)]) test_dim = g.dimensions['q'] self.assertIs(v1.dimensions[0], test_dim) self.assertIs(v2.dimensions[0], test_dim)
def test_multiple(self): g = og('', vv=[ov('v1', dd=[od('x', 1), od('y')]), ov('v2', dd=[od('y', 2), od('z', 3)])]) self.assertEqual(all_dimensions(g), []) self.do_complete(g) self.assertEqual(len(g.dimensions), 3) self.assertIn(od('x', 1), g.dimensions) self.assertIn(od('y', 2), g.dimensions) self.assertIn(od('z', 3), g.dimensions) v1, v2 = g.variables['v1'], g.variables['v2'] dx, dy, dz = [g.dimensions[name] for name in ('x', 'y', 'z')] self.assertIs(v1.dimensions[0], dx) self.assertIs(v1.dimensions[1], dy) self.assertIs(v2.dimensions[0], dy) self.assertIs(v2.dimensions[1], dz)
def test_mixture(self): g = og('', dd=[od('x')], vv=[ov('v', dd=[od('y')])]) self.assertEqual(all_dimensions(g), [od('x')]) r = add_missing_dims(g) self.assertEqual(r, [od('y')]) self.assertEqual(len(g.dimensions), 2) self.assertIs(r[0], g.dimensions['y'])
def test_fail_error(self): g = og('', vv=[ov('v', dd=[od('x')])]) with self.assertRaises(IncompleteStructureError) as err_context: has_no_missing_dims(g, fail_if_not=True) msg = err_context.exception.message self.check_all_in_str(msg, [ 'Variable "/v"', 'dimension "x"', 'no definition exists'])
def test_group_contained(self): g = og('', gg=[og('subgroup', dd=[od('x', 4)], vv=[ov('sv1', dd=[od('x'), od('y')])])]) add_missing_dims(g) self.assertEqual(list(g.dimensions), [od('y')]) self.assertEqual(list(g.groups['subgroup'].dimensions), [od('x', 4)])
def test_unlimited(self): g = og('', vv=[ov('v', dd=[od('x', 2, u=True)])]) self.assertEqual(all_dimensions(g), []) add_missing_dims(g) self.assertEqual(len(g.dimensions), 1) self.assertNotEqual(all_dimensions(g), [od('x', 2)]) self.assertEqual(all_dimensions(g), [od('x', 2, u=True)])
def test_var_vs_grp(self): g = og('root', vv=[ov('tst1')], gg=[og('tst1')]) with self.assertRaises(NameConflictError) as err_context: check_names(g) msg = err_context.exception.message self.check_all_in_str(msg, ['group "root"', 'both', 'variable', 'group', 'tst1'])
def test_missing(self): g = og('', vv=[ov('v', dd=[od('x')])]) self.assertEqual(all_dimensions(g), []) r = add_missing_dims(g) self.assertEqual(r, [od('x')]) self.assertEqual(all_dimensions(g), [od('x')]) self.assertIs(g.dimensions['x'], r[0])
def test_simple_data(self): g = og('', vv=[ov('v', dd=[od('y'), od('x')], data=_mockdata((15, 20)))]) self.do_complete(g) self.assertEqual(len(g.dimensions), 2) self.assertEqual(g.dimensions['x'], od('x', 20)) self.assertEqual(g.dimensions['y'], od('y', 15))
def test_attrs(self): result = cdl(ov('x', dd=[od('p'), od('q')], aa=[oa('n1', _long(3)), oa('r1', 1.24)], data=np.array(1.0))) self.assertEqual(result, 'double x(p, q) ;\n' ' x:n1 = 3L ;\n' ' x:r1 = 1.24 ;')
def test_fail_bad_data_shapes(self): d1 = _mockdata((5, 3, 2)) g = og('', dd=[od('x'), od('y')], vv=[ov('v1', dd=[od('x'), od('y')], data=d1)]) with self.assertRaises(DimensionConflictError) as err_context: check_dims(g) msg = err_context.exception.message self.check_all_in_str(msg, ['/v1', '3 dimensions', '2 dimensions'])
def test_subgroup(self): g = og('', gg=[og('subgroup', vv=[ov('v1', dd=[od('y', 2)])])]) self.do_complete(g) self.assertEqual(len(g.dimensions), 1) self.assertEqual(list(g.dimensions), [od('y', 2)]) self.assertIs(g.groups['subgroup'].variables['v1'].dimensions[0], g.dimensions['y'])
def test_nomissing(self): g = og('', dd=[od('x')], vv=[ov('v', dd=[od('x')])]) test_dim = g.dimensions['x'] str_before = str(g) r = add_missing_dims(g) self.assertEqual(r, []) self.assertIs(g.dimensions['x'], test_dim) self.assertEqual(str(g), str_before)
def test_length(self): g = og('', vv=[ov('v', dd=[od('x', 2)])]) self.assertEqual(all_dimensions(g), []) r = add_missing_dims(g) self.assertEqual(r, [od('x', 2)]) self.assertEqual(len(g.dimensions), 1) self.assertNotEqual(all_dimensions(g), [od('x')]) self.assertEqual(all_dimensions(g), [od('x', 2)])
def test_var(self): g = og('group_name', vv=[ov('x', data=np.array(1.0))]) result = cdl(g) self.assertEqual(result, 'netcdf group_name {\n' '\n' 'variables:\n' ' double x ;\n' '}')