@@ -55,7 +55,9 @@ def test_setparent_unnamed_child_node_fails(self):
55
55
def test_create_two_children (self ):
56
56
root_data = xr .Dataset ({"a" : ("y" , [6 , 7 , 8 ]), "set0" : ("x" , [9 , 10 ])})
57
57
set1_data = xr .Dataset ({"a" : 0 , "b" : 1 })
58
-
58
+ # root = DataTree.from_dict(
59
+ # {"/": root_data, "/set1": set1_data, "/set1/set2": None}
60
+ # )
59
61
root : DataTree = DataTree (data = root_data )
60
62
set1 : DataTree = DataTree (name = "set1" , parent = root , data = set1_data )
61
63
DataTree (name = "set1" , parent = root )
@@ -195,9 +197,13 @@ def test_to_dataset(self):
195
197
196
198
class TestVariablesChildrenNameCollisions :
197
199
def test_parent_already_has_variable_with_childs_name (self ):
198
- dt : DataTree = DataTree (data = xr .Dataset ({"a" : [0 ], "b" : 1 }))
199
200
with pytest .raises (KeyError , match = "already contains a variable named a" ):
200
- DataTree (name = "a" , data = None , parent = dt )
201
+ DataTree .from_dict ({"/" : xr .Dataset ({"a" : [0 ], "b" : 1 }), "/a" : None })
202
+
203
+ def test_parent_already_has_variable_with_childs_name_update (self ):
204
+ dt : DataTree = DataTree (data = xr .Dataset ({"a" : [0 ], "b" : 1 }))
205
+ with pytest .raises (ValueError , match = "already contains a variable named a" ):
206
+ dt .update ({"a" : DataTree ()})
201
207
202
208
def test_assign_when_already_child_with_variables_name (self ):
203
209
dt = DataTree .from_dict (
@@ -249,8 +255,7 @@ def test_getitem_single_data_variable_from_node(self):
249
255
assert_identical (folder1 ["results/highres/temp" ], data ["temp" ])
250
256
251
257
def test_getitem_nonexistent_node (self ):
252
- folder1 : DataTree = DataTree (name = "folder1" )
253
- DataTree (name = "results" , parent = folder1 )
258
+ folder1 : DataTree = DataTree .from_dict ({"/results" : DataTree ()}, name = "folder1" )
254
259
with pytest .raises (KeyError ):
255
260
folder1 ["results/highres" ]
256
261
@@ -448,10 +453,10 @@ def test_setitem_new_empty_node(self):
448
453
assert_identical (mary .to_dataset (), xr .Dataset ())
449
454
450
455
def test_setitem_overwrite_data_in_node_with_none (self ):
451
- john : DataTree = DataTree ( name = "john" )
452
- mary : DataTree = DataTree ( name = "mary" , parent = john , data = xr . Dataset ())
456
+ john : DataTree = DataTree . from_dict ({ "/mary" : xr . Dataset ()}, name = "john" )
457
+
453
458
john ["mary" ] = DataTree ()
454
- assert_identical (mary .to_dataset (), xr .Dataset ())
459
+ assert_identical (john [ " mary" ] .to_dataset (), xr .Dataset ())
455
460
456
461
john .ds = xr .Dataset () # type: ignore[assignment]
457
462
with pytest .raises (ValueError , match = "has no name" ):
@@ -633,8 +638,13 @@ def test_view_contents(self):
633
638
634
639
def test_immutability (self ):
635
640
# See issue https://github.com/xarray-contrib/datatree/issues/38
636
- dt : DataTree = DataTree (name = "root" , data = None )
637
- DataTree (name = "a" , data = None , parent = dt )
641
+ dt = DataTree .from_dict (
642
+ {
643
+ "/" : None ,
644
+ "/a" : None ,
645
+ },
646
+ name = "root" ,
647
+ )
638
648
639
649
with pytest .raises (
640
650
AttributeError , match = "Mutation of the DatasetView is not allowed"
@@ -1087,44 +1097,51 @@ def test_filter(self):
1087
1097
class TestDSMethodInheritance :
1088
1098
def test_dataset_method (self ):
1089
1099
ds = xr .Dataset ({"a" : ("x" , [1 , 2 , 3 ])})
1090
- dt : DataTree = DataTree (data = ds )
1091
- DataTree (name = "results" , parent = dt , data = ds )
1100
+ dt = DataTree .from_dict (
1101
+ {
1102
+ "/" : ds ,
1103
+ "/results" : ds ,
1104
+ }
1105
+ )
1092
1106
1093
- expected : DataTree = DataTree (data = ds .isel (x = 1 ))
1094
- DataTree (name = "results" , parent = expected , data = ds .isel (x = 1 ))
1107
+ expected = DataTree .from_dict (
1108
+ {
1109
+ "/" : ds .isel (x = 1 ),
1110
+ "/results" : ds .isel (x = 1 ),
1111
+ }
1112
+ )
1095
1113
1096
1114
result = dt .isel (x = 1 )
1097
1115
assert_equal (result , expected )
1098
1116
1099
1117
def test_reduce_method (self ):
1100
1118
ds = xr .Dataset ({"a" : ("x" , [False , True , False ])})
1101
- dt : DataTree = DataTree (data = ds )
1102
- DataTree (name = "results" , parent = dt , data = ds )
1119
+ dt = DataTree .from_dict ({"/" : ds , "/results" : ds })
1103
1120
1104
- expected : DataTree = DataTree (data = ds .any ())
1105
- DataTree (name = "results" , parent = expected , data = ds .any ())
1121
+ expected = DataTree .from_dict ({"/" : ds .any (), "/results" : ds .any ()})
1106
1122
1107
1123
result = dt .any ()
1108
1124
assert_equal (result , expected )
1109
1125
1110
1126
def test_nan_reduce_method (self ):
1111
1127
ds = xr .Dataset ({"a" : ("x" , [1 , 2 , 3 ])})
1112
- dt : DataTree = DataTree (data = ds )
1113
- DataTree (name = "results" , parent = dt , data = ds )
1128
+ dt = DataTree .from_dict ({"/" : ds , "/results" : ds })
1114
1129
1115
- expected : DataTree = DataTree (data = ds .mean ())
1116
- DataTree (name = "results" , parent = expected , data = ds .mean ())
1130
+ expected = DataTree .from_dict ({"/" : ds .mean (), "/results" : ds .mean ()})
1117
1131
1118
1132
result = dt .mean ()
1119
1133
assert_equal (result , expected )
1120
1134
1121
1135
def test_cum_method (self ):
1122
1136
ds = xr .Dataset ({"a" : ("x" , [1 , 2 , 3 ])})
1123
- dt : DataTree = DataTree (data = ds )
1124
- DataTree (name = "results" , parent = dt , data = ds )
1137
+ dt = DataTree .from_dict ({"/" : ds , "/results" : ds })
1125
1138
1126
- expected : DataTree = DataTree (data = ds .cumsum ())
1127
- DataTree (name = "results" , parent = expected , data = ds .cumsum ())
1139
+ expected = DataTree .from_dict (
1140
+ {
1141
+ "/" : ds .cumsum (),
1142
+ "/results" : ds .cumsum (),
1143
+ }
1144
+ )
1128
1145
1129
1146
result = dt .cumsum ()
1130
1147
assert_equal (result , expected )
@@ -1134,11 +1151,9 @@ class TestOps:
1134
1151
def test_binary_op_on_int (self ):
1135
1152
ds1 = xr .Dataset ({"a" : [5 ], "b" : [3 ]})
1136
1153
ds2 = xr .Dataset ({"x" : [0.1 , 0.2 ], "y" : [10 , 20 ]})
1137
- dt : DataTree = DataTree (data = ds1 )
1138
- DataTree (name = "subnode" , data = ds2 , parent = dt )
1154
+ dt = DataTree .from_dict ({"/" : ds1 , "/subnode" : ds2 })
1139
1155
1140
- expected : DataTree = DataTree (data = ds1 * 5 )
1141
- DataTree (name = "subnode" , data = ds2 * 5 , parent = expected )
1156
+ expected = DataTree .from_dict ({"/" : ds1 * 5 , "/subnode" : ds2 * 5 })
1142
1157
1143
1158
# TODO: Remove ignore when ops.py is migrated?
1144
1159
result : DataTree = dt * 5 # type: ignore[assignment,operator]
@@ -1147,24 +1162,32 @@ def test_binary_op_on_int(self):
1147
1162
def test_binary_op_on_dataset (self ):
1148
1163
ds1 = xr .Dataset ({"a" : [5 ], "b" : [3 ]})
1149
1164
ds2 = xr .Dataset ({"x" : [0.1 , 0.2 ], "y" : [10 , 20 ]})
1150
- dt : DataTree = DataTree (data = ds1 )
1151
- DataTree (name = "subnode" , data = ds2 , parent = dt )
1165
+ dt = DataTree .from_dict (
1166
+ {
1167
+ "/" : ds1 ,
1168
+ "/subnode" : ds2 ,
1169
+ }
1170
+ )
1171
+
1152
1172
other_ds = xr .Dataset ({"z" : ("z" , [0.1 , 0.2 ])})
1153
1173
1154
- expected : DataTree = DataTree (data = ds1 * other_ds )
1155
- DataTree (name = "subnode" , data = ds2 * other_ds , parent = expected )
1174
+ expected = DataTree .from_dict (
1175
+ {
1176
+ "/" : ds1 * other_ds ,
1177
+ "/subnode" : ds2 * other_ds ,
1178
+ }
1179
+ )
1156
1180
1157
1181
result = dt * other_ds
1158
1182
assert_equal (result , expected )
1159
1183
1160
1184
def test_binary_op_on_datatree (self ):
1161
1185
ds1 = xr .Dataset ({"a" : [5 ], "b" : [3 ]})
1162
1186
ds2 = xr .Dataset ({"x" : [0.1 , 0.2 ], "y" : [10 , 20 ]})
1163
- dt : DataTree = DataTree (data = ds1 )
1164
- DataTree (name = "subnode" , data = ds2 , parent = dt )
1165
1187
1166
- expected : DataTree = DataTree (data = ds1 * ds1 )
1167
- DataTree (name = "subnode" , data = ds2 * ds2 , parent = expected )
1188
+ dt = DataTree .from_dict ({"/" : ds1 , "/subnode" : ds2 })
1189
+
1190
+ expected = DataTree .from_dict ({"/" : ds1 * ds1 , "/subnode" : ds2 * ds2 })
1168
1191
1169
1192
# TODO: Remove ignore when ops.py is migrated?
1170
1193
result : DataTree = dt * dt # type: ignore[operator]
0 commit comments