1
+ import shutil
1
2
from unittest .mock import call , patch
2
3
3
4
import pytest
4
5
5
6
from climateset import TEST_DIR
6
- from climateset .download .downloader import Downloader , download_from_config_file
7
- from climateset .utils import get_yaml_config
7
+ from climateset .download .cmip6_downloader import CMIP6Downloader
8
+ from climateset .download .constants .esgf import CMIP6 , INPUT4MIPS
9
+ from climateset .download .downloader import download_from_config_file
10
+ from climateset .download .downloader_config import (
11
+ create_cmip6_downloader_config_from_file ,
12
+ create_input4mips_downloader_config_from_file ,
13
+ )
14
+ from climateset .download .input4mips_downloader import Input4MipsDownloader
8
15
9
16
MINIMAL_DATASET_CONFIG_PATH = TEST_DIR / "resources/test_minimal_dataset.yaml"
17
+ TEST_TMP_DIR = TEST_DIR / "resources/.tmp"
10
18
11
- DOWNLOAD_RAW_INPUT_SINGLE_VAR = "climateset.download.downloader.Downloader.download_raw_input_single_var"
19
+ DOWNLOAD_RAW_INPUT_SINGLE_VAR = (
20
+ "climateset.download.input4mips_downloader.Input4MipsDownloader.download_raw_input_single_var"
21
+ )
12
22
DOWNLOAD_META_HISTORIC_SINGLE_VAR = (
13
- "climateset.download.downloader.Downloader .download_meta_historic_biomassburning_single_var"
23
+ "climateset.download.input4mips_downloader.Input4MipsDownloader .download_meta_historic_biomassburning_single_var"
14
24
)
15
- DOWNLOAD_MODEL_SINGLE_VAR = "climateset.download.downloader.Downloader .download_from_model_single_var"
25
+ DOWNLOAD_MODEL_SINGLE_VAR = "climateset.download.cmip6_downloader.CMIP6Downloader .download_from_model_single_var"
16
26
SUBPROCESS_RUN = "subprocess.run"
17
27
18
28
EXPECTED_MINIMAL_RAW_INPUT_CALLS = [
36
46
]
37
47
38
48
EXPECTED_MINIMAL_MODEL_CALLS = [
39
- call (variable = "tas" , experiment = "historical" ),
40
- call (variable = "tas" , experiment = "ssp126" ),
49
+ call (project = "CMIP6" , variable = "tas" , experiment = "historical" ),
50
+ call (project = "CMIP6" , variable = "tas" , experiment = "ssp126" ),
41
51
]
42
52
43
53
54
+ def delete_tmp_dir ():
55
+ shutil .rmtree (TEST_TMP_DIR , ignore_errors = True )
56
+
57
+
44
58
@pytest .fixture ()
45
59
def mock_raw_input_single_var ():
46
60
with patch (DOWNLOAD_RAW_INPUT_SINGLE_VAR ) as mock_function :
@@ -66,71 +80,83 @@ def mock_subprocess_run():
66
80
67
81
68
82
@pytest .fixture
69
- def simple_downloader_object ():
83
+ def input4mips_downloader_object ():
70
84
config_source = MINIMAL_DATASET_CONFIG_PATH
71
- config = get_yaml_config (config_source )
72
- model = config [ "models" ][ 0 ]
73
- downloader_kwargs = config [ "downloader_kwargs" ]
74
- return Downloader ( model = model , ** downloader_kwargs )
85
+ config = create_input4mips_downloader_config_from_file (config_source )
86
+ config . data_dir = TEST_TMP_DIR
87
+ yield Input4MipsDownloader ( config = config )
88
+ delete_tmp_dir ( )
75
89
76
90
77
- def test_downloader_init (simple_downloader_object ):
78
- assert isinstance (simple_downloader_object , Downloader )
91
+ @pytest .fixture
92
+ def cmip6_downloader_object ():
93
+ config_source = MINIMAL_DATASET_CONFIG_PATH
94
+ config = create_cmip6_downloader_config_from_file (config_source )
95
+ config .data_dir = TEST_TMP_DIR
96
+ yield CMIP6Downloader (config = config )
97
+ delete_tmp_dir ()
98
+
79
99
100
+ def test_downloader_init (input4mips_downloader_object , cmip6_downloader_object ):
101
+ assert isinstance (input4mips_downloader_object , Input4MipsDownloader )
102
+ assert isinstance (cmip6_downloader_object , CMIP6Downloader )
80
103
81
- def test_downloader_base_params (simple_downloader_object ):
82
- assert simple_downloader_object .model == "NorESM2-LM"
83
- assert simple_downloader_object .experiments == ["historical" , "ssp126" ]
84
104
105
+ def test_downloader_base_params (input4mips_downloader_object , cmip6_downloader_object ):
106
+ assert input4mips_downloader_object .config .project == INPUT4MIPS
107
+ assert input4mips_downloader_object .config .experiments == ["historical" , "ssp126" ]
108
+ assert cmip6_downloader_object .config .project == CMIP6
109
+ assert cmip6_downloader_object .config .model == ["NorESM2-LM" ]
110
+ assert cmip6_downloader_object .config .experiments == ["historical" , "ssp126" ]
85
111
86
- def test_downloader_max_possible_member_number (simple_downloader_object ):
87
- assert simple_downloader_object .max_ensemble_members == 1
88
112
113
+ def test_downloader_max_possible_member_number (cmip6_downloader_object ):
114
+ assert cmip6_downloader_object .config .max_ensemble_members == 10
89
115
90
- def test_downloader_variables (simple_downloader_object ):
91
- assert simple_downloader_object .raw_vars == [
116
+
117
+ def test_downloader_variables (input4mips_downloader_object , cmip6_downloader_object ):
118
+ assert cmip6_downloader_object .config .variables == ["tas" ]
119
+ assert input4mips_downloader_object .config .variables == [
92
120
"CO2_em_anthro" ,
93
121
"CO2_em_AIR_anthro" ,
94
122
"CH4_em_openburning" ,
95
123
"CH4_em_anthro" ,
96
124
"CH4_em_AIR_anthro" ,
97
125
]
98
- assert simple_downloader_object .biomass_vars == ["CO2" , "CH4" ]
99
- assert simple_downloader_object .model_vars == ["tas" ]
100
- assert simple_downloader_object .meta_vars_percentage == [
126
+ assert input4mips_downloader_object .config .biomass_vars == ["CO2" , "CH4" ]
127
+ assert input4mips_downloader_object .config .meta_vars_percentage == [
101
128
"CH4_percentage_AGRI" ,
102
129
"CH4_percentage_BORF" ,
103
130
"CH4_percentage_DEFO" ,
104
131
"CH4_percentage_PEAT" ,
105
132
"CH4_percentage_SAVA" ,
106
133
"CH4_percentage_TEMF" ,
107
134
]
108
- assert simple_downloader_object .meta_vars_share == ["CH4_openburning_share" ]
135
+ assert input4mips_downloader_object . config .meta_vars_share == ["CH4_openburning_share" ]
109
136
110
137
111
- def test_downloader_model_params (simple_downloader_object ):
112
- assert simple_downloader_object .model_node_link == "https://esgf-data.dkrz.de/esg-search"
113
- assert simple_downloader_object .model_source_center == "NCC"
138
+ def test_downloader_model_params (cmip6_downloader_object ):
139
+ assert cmip6_downloader_object .config .node_link == "http://esgf-node.llnl.gov/esg-search/"
114
140
115
141
116
- def test_download_raw_input (simple_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var ):
117
- simple_downloader_object . download_raw_input ()
142
+ def test_download_raw_input (input4mips_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var ):
143
+ input4mips_downloader_object . download ()
118
144
assert mock_raw_input_single_var .call_args_list == EXPECTED_MINIMAL_RAW_INPUT_CALLS
119
145
assert mock_raw_input_single_var .call_count == 8
120
146
assert mock_meta_historic_single_var .call_args_list == EXPECTED_MINIMAL_META_HISTORIC_CALLS
121
147
assert mock_meta_historic_single_var .call_count == 6
122
148
123
149
124
- def test_download_from_model (simple_downloader_object , mock_model_single_var ):
125
- simple_downloader_object . download_from_model ()
150
+ def test_download_from_model (cmip6_downloader_object , mock_model_single_var ):
151
+ cmip6_downloader_object . download ()
126
152
assert mock_model_single_var .call_args_list == EXPECTED_MINIMAL_MODEL_CALLS
127
153
assert mock_model_single_var .call_count == 2
128
154
129
155
130
156
def test_download_from_config_file (
131
- simple_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var , mock_model_single_var
157
+ input4mips_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var , mock_model_single_var
132
158
):
133
- download_from_config_file (config = MINIMAL_DATASET_CONFIG_PATH )
159
+ download_from_config_file (config_file = MINIMAL_DATASET_CONFIG_PATH )
134
160
135
161
assert mock_raw_input_single_var .call_args_list == EXPECTED_MINIMAL_RAW_INPUT_CALLS
136
162
assert mock_raw_input_single_var .call_count == 8
@@ -153,26 +179,25 @@ def _assert_content_is_in_wget_script(mock_call, string_content):
153
179
assert string_content in wget_script_content
154
180
155
181
156
- def test_download_raw_input_single_var (simple_downloader_object , mock_subprocess_run ):
182
+ def test_download_raw_input_single_var (input4mips_downloader_object , mock_subprocess_run ):
157
183
download_subprocess = mock_subprocess_run
158
- simple_downloader_object .download_raw_input_single_var (variable = "CO2_em_anthro" , institution_id = "PNNL-JGCRI" )
184
+ input4mips_downloader_object .download_raw_input_single_var (variable = "CO2_em_anthro" , institution_id = "PNNL-JGCRI" )
159
185
160
186
expected_files = [
161
- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_175001-179912.nc" ,
162
- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_180001-184912.nc" ,
163
- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_185001-185012.nc" ,
164
- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_185101-189912.nc" ,
165
- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_190001-194912.nc" ,
166
- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_195001-199912.nc" ,
167
- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_200001-201412.nc" ,
187
+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_175001-179912.nc" ,
188
+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_180001-184912.nc" ,
189
+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_185001-189912.nc" ,
190
+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_190001-194912.nc" ,
191
+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_195001-199912.nc" ,
192
+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_200001-202212.nc" ,
168
193
]
169
194
download_subprocess .assert_called_once ()
170
195
for f in expected_files :
171
196
_assert_content_is_in_wget_script (download_subprocess , f )
172
197
173
198
174
- def test_download_meta_historic_biomassburning_single_var (simple_downloader_object , mock_subprocess_run ):
175
- simple_downloader_object .download_meta_historic_biomassburning_single_var (
199
+ def test_download_meta_historic_biomassburning_single_var (input4mips_downloader_object , mock_subprocess_run ):
200
+ input4mips_downloader_object .download_meta_historic_biomassburning_single_var (
176
201
variable = "CH4_percentage_AGRI" , institution_id = "VUA"
177
202
)
178
203
@@ -184,8 +209,8 @@ def test_download_meta_historic_biomassburning_single_var(simple_downloader_obje
184
209
_assert_content_is_in_wget_script (mock_call = mock_subprocess_run , string_content = f )
185
210
186
211
187
- def test_download_from_model_single_var (simple_downloader_object , mock_subprocess_run ):
188
- simple_downloader_object .download_from_model_single_var (variable = "tas" , experiment = "ssp126" )
212
+ def test_download_from_model_single_var (cmip6_downloader_object , mock_subprocess_run ):
213
+ cmip6_downloader_object .download_from_model_single_var (variable = "tas" , experiment = "ssp126" )
189
214
190
215
expected_files = [
191
216
"tas_Amon_NorESM2-LM_ssp126_r1i1p1f1_gn_201501-202012.nc" ,
@@ -198,6 +223,6 @@ def test_download_from_model_single_var(simple_downloader_object, mock_subproces
198
223
"tas_Amon_NorESM2-LM_ssp126_r1i1p1f1_gn_208101-209012.nc" ,
199
224
"tas_Amon_NorESM2-LM_ssp126_r1i1p1f1_gn_209101-210012.nc" ,
200
225
]
201
- mock_subprocess_run .assert_called_once ()
226
+ mock_subprocess_run .assert_called ()
202
227
for f in expected_files :
203
228
_assert_content_is_in_wget_script (mock_call = mock_subprocess_run , string_content = f )
0 commit comments