-
Notifications
You must be signed in to change notification settings - Fork 258
/
tst_rename.py
143 lines (136 loc) · 5.06 KB
/
tst_rename.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import sys
import unittest
import os
import tempfile
import numpy as NP
import netCDF4
from netCDF4 import __has_rename_grp__
# test changing dimension, variable names
# and deleting attributes.
FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name
LAT_NAME="lat"
LON_NAME="lon"
LON_NAME2 = "longitude"
LEVEL_NAME="level"
TIME_NAME="time"
VAR_NAME='temp'
VAR_NAME2='wind'
GROUP_NAME='subgroup'
GROUP_NAME2='subgroup2'
class VariablesTestCase(unittest.TestCase):
def setUp(self):
self.file = FILE_NAME
f = netCDF4.Dataset(self.file, 'w')
f.createDimension(LAT_NAME,73)
f.createDimension(LON_NAME,145)
f.createDimension(LEVEL_NAME,10)
f.createDimension(TIME_NAME,None)
if __has_rename_grp__:
g = f.createGroup(GROUP_NAME)
else:
g = f.createGroup(GROUP_NAME2)
g.createDimension(LAT_NAME,145)
g.createDimension(LON_NAME,289)
g.createDimension(LEVEL_NAME,20)
g.createDimension(TIME_NAME,None)
f.foo = 'bar'
f.goober = 2
g.foo = 'bar'
g.goober = 2
f.createVariable(VAR_NAME,'f4',(LAT_NAME, LON_NAME, TIME_NAME))
v = f.variables[VAR_NAME]
v.bar = 'foo'
v.slobber = 3
g.createVariable(VAR_NAME,'f4',(LAT_NAME, LON_NAME, TIME_NAME))
v2 = g.variables[VAR_NAME]
v2.bar = 'foo'
v2.slobber = 3
f.close()
def tearDown(self):
# Remove the temporary files
os.remove(self.file)
def runTest(self):
"""testing renaming of dimensions, variables and attribute deletion"""
f = netCDF4.Dataset(self.file, 'r+')
v = f.variables[VAR_NAME]
names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME]
# check that dimension names are correct.
for name in f.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME]
# check that variable names are correct.
for name in f.variables.keys():
self.assertTrue(name in names_check)
# rename dimension.
f.renameDimension(LON_NAME,LON_NAME2)
# rename variable.
f.renameVariable(VAR_NAME,VAR_NAME2)
# rename group.
if __has_rename_grp__:
f.renameGroup(GROUP_NAME,GROUP_NAME2)
# check that new dimension names are correct.
names_check = [LAT_NAME, LON_NAME2, LEVEL_NAME, TIME_NAME]
for name in f.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME2]
# check that new variable names are correct.
for name in f.variables.keys():
self.assertTrue(name in names_check)
g = f.groups[GROUP_NAME2]
vg = g.variables[VAR_NAME]
names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME]
# check that dimension names are correct.
for name in g.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME]
# check that variable names are correct.
for name in g.variables.keys():
self.assertTrue(name in names_check)
# check that group name is correct.
self.assertTrue(GROUP_NAME not in f.groups and GROUP_NAME2 in f.groups)
# rename dimension.
g.renameDimension(LON_NAME,LON_NAME2)
# rename variable.
g.renameVariable(VAR_NAME,VAR_NAME2)
# check that new dimension names are correct.
names_check = [LAT_NAME, LON_NAME2, LEVEL_NAME, TIME_NAME]
for name in g.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME2]
# check that new variable names are correct.
for name in g.variables.keys():
self.assertTrue(name in names_check)
# delete a global attribute.
atts = f.ncattrs()
del f.goober
atts.remove('goober')
self.assertTrue(atts == f.ncattrs())
atts = g.ncattrs()
del g.goober
atts.remove('goober')
self.assertTrue(atts == g.ncattrs())
# delete a variable attribute.
atts = v.ncattrs()
del v.slobber
atts.remove('slobber')
self.assertTrue(atts == v.ncattrs())
atts = vg.ncattrs()
del vg.slobber
atts.remove('slobber')
self.assertTrue(atts == vg.ncattrs())
f.close()
# make sure attributes cannot be deleted, or vars/dims renamed
# when file is open read-only.
f = netCDF4.Dataset(self.file)
v = f.variables[VAR_NAME2]
self.assertRaises(RuntimeError, delattr, v, 'bar')
self.assertRaises(RuntimeError, f.renameVariable, VAR_NAME2, VAR_NAME)
self.assertRaises(RuntimeError, f.renameDimension, LON_NAME2, LON_NAME)
g = f.groups[GROUP_NAME2]
vg = g.variables[VAR_NAME2]
self.assertRaises(RuntimeError, delattr, vg, 'bar')
self.assertRaises(RuntimeError, g.renameVariable, VAR_NAME2, VAR_NAME)
self.assertRaises(RuntimeError, g.renameDimension, LON_NAME2, LON_NAME)
f.close()
if __name__ == '__main__':
unittest.main()