Index: trunk/SDToolBox/outputmessages.py =================================================================== diff -u -r30 -r40 --- trunk/SDToolBox/outputmessages.py (.../outputmessages.py) (revision 30) +++ trunk/SDToolBox/outputmessages.py (.../outputmessages.py) (revision 40) @@ -1,9 +1,14 @@ #! /usr/bin/env python -""" Info messages """ +""" Info messages """ -""" Warning messages """ +""" Warning messages """ -""" Error messages """ +""" Error messages """ error_missing_arguments = 'Missing arguments -i -o. Run {0} -h for help.' -error_missing_list_of_variables = 'List of variable names should be given.' \ No newline at end of file +error_missing_list_of_variables = 'List of variable names should be given.' +error_no_valid_input_data = 'No InputData object was provided.' +error_not_enough_coordinates = '' + \ + 'Not enough coordinates were provided as InputData.coord_list.' +error_no_valid_dict_of_vars = '' + \ + 'A dictionary of variables (key: value) should be provided.' Index: trunk/tests/test_extract_waves.py =================================================================== diff -u -r38 -r40 --- trunk/tests/test_extract_waves.py (.../test_extract_waves.py) (revision 38) +++ trunk/tests/test_extract_waves.py (.../test_extract_waves.py) (revision 40) @@ -4,11 +4,20 @@ import netCDF4 from tests.TestUtils import TestUtils from netCDF4 import Dataset + from SDToolBox import main as main -from SDToolBox import extract_data_era5 +from SDToolBox import extract_waves from SDToolBox import data_acquisition +from SDToolBox import outputmessages as om + import numpy as np +test_variable_dict = { + 'swh': 'Hs', + 'pp1d': 'Tp', + 'mwd': 'MWD', + 'mwp': 'Tm', +} class Test_create: @@ -17,10 +26,10 @@ # 1. Given input_data = None output_result = None - expected_error = 'No valid input data.' + expected_error = om.error_no_valid_input_data # 2. When with pytest.raises(IOError) as e_info: - output_result = extract_data_era5.ExtractDataEra5(input_data) + output_result = extract_waves.ExtractWaves(input_data) # 3. Then error_message = str(e_info.value) @@ -29,7 +38,44 @@ 'Expected exception message {},'.format(expected_error) + \ 'retrieved {}'.format(error_message) + @pytest.mark.unittest + def test_given_no_input_coords_then_exception_is_risen(self): + # 1. Given + input_data = data_acquisition.InputData() + input_data.coord_list = [] + data_extractor = None + expected_error = om.error_not_enough_coordinates + # 2. When + with pytest.raises(IOError) as e_info: + data_extractor = extract_waves.ExtractWaves(input_data) + # 3. Then + error_message = str(e_info.value) + assert data_extractor is None + assert error_message == expected_error, '' + \ + 'Expected exception message {},'.format(expected_error) + \ + 'retrieved {}'.format(error_message) + + @pytest.mark.unittest + def test_given_no_dict_of_vars_then_exception_is_risen(self): + # 1. Given + input_data = data_acquisition.InputData() + input_data.coord_list = [(4.2, 42)] + input_data.input_dict = None + data_extractor = None + expected_error = om.error_no_valid_dict_of_vars + # 2. When + with pytest.raises(IOError) as e_info: + data_extractor = extract_waves.ExtractWaves(input_data) + + # 3. Then + error_message = str(e_info.value) + assert data_extractor is None + assert error_message == expected_error, '' + \ + 'Expected exception message {},'.format(expected_error) + \ + 'retrieved {}'.format(error_message) + + class Test_subset_era_5: @pytest.mark.systemtest @@ -40,11 +86,12 @@ # dir_test_data = 'P:\\metocean-data\\open\\ERA5\\data\\Global' input_data = data_acquisition.InputData() - input_data.coord_list = [(4.2, 2.4),] + input_data.input_dict = test_variable_dict + input_data.coord_list = [(4.2, 2.4), ] # 2. When - extract_wave = extract_data_era5.ExtractDataEra5(input_data) - output_data = extract_wave.subset_waves(dir_test_data, 1981, 1982) + extract_wave = extract_waves.ExtractWaves(input_data) + output_data = extract_wave.subset_era_5(dir_test_data, 1981, 1982) # 3. Then assert output_data is not None @@ -60,40 +107,42 @@ def test_given_waves_folder_then_subset_collection_is_extracted_with_coord_list(self): # 1. Given # When using local data you can just replace the comment in these lines - dir_test_data = TestUtils.get_local_test_data_dir('netCDF_Waves_data') - # dir_test_data = 'P:\\metocean-data\\open\\ERA5\\data\\Global' + # dir_test_data = TestUtils.get_local_test_data_dir('netCDF_Waves_data') + dir_test_data = 'P:\\metocean-data\\open\\ERA5\\data\\Global' input_data = data_acquisition.InputData() + input_data.input_dict = test_variable_dict input_data.coord_list = [(4.2, 2.4), (42, 2.4), (42, 24), (4.2, 24)] # 2. When - extract_wave = extract_data_era5.ExtractDataEra5(input_data) - dataset_list = extract_wave.subset_waves(dir_test_data, 1981, 1982) + extract_wave = extract_waves.ExtractWaves(input_data) + dataset_list = extract_wave.subset_era_5(dir_test_data, 1981, 1982) # 3. Then assert dataset_list is not None - + """ - Checks that the longitude is normalized if a value higher than 180 is passed + Checks that the longitude is normalized + if a value higher than 180 is passed """ @pytest.mark.unittest def test_given_longitude_higher_than_180_returns_normalized_longitude(self): - #setup + # setup longitude = 400 - normalized_longitude = longitude -180 + normalized_longitude = longitude - 180 dir_test_data = 'P:\\metocean-data\\open\\ERA5\\data\\Global\\Hs' filename = 'era5_Global_Hs_1980.nc' path = dir_test_data + filename with Dataset(path, 'r', format='netCDF4') as case_dataset: input_data = data_acquisition.InputData() input_data.coord_list = [(4.2, 2.4)] - extractwaves = extract_data_era5.ExtractDataEra5(input_data) - - #call + extractwaves = extract_waves.ExtractWaves(input_data) + + # call result = extractwaves.check_for_longitude(longitude) - #assert + # assert assert result == normalized_longitude - + """ Checks that the longitude is unchanged if a value lower than 180 is passed """ @@ -105,34 +154,36 @@ path = dir_test_data + filename with Dataset(path, 'r', format='netCDF4') as case_dataset: input_data = data_acquisition.InputData() + input_data.input_dict = test_variable_dict input_data.coord_list = [(4.2, 2.4)] - extractwaves = extract_data_era5.ExtractDataEra5(input_data) - - #call + extractwaves = extract_waves.ExtractWaves(input_data) + + # call result = extractwaves.check_for_longitude(longitude) - #assert + # assert assert result == 30 """ Checks that array of years if correctly generated """ @pytest.mark.unittest def test_years_array_is_correctly_generated(self): - #setup + # setup year1 = 1980 yearN = 1983 - result_array = [1980,1981,1982,1983] + result_array = [1980, 1981, 1982, 1983] result = [] dir_test_data = 'P:\\metocean-data\\open\\ERA5\\data\\Global\\Hs' filename = 'era5_Global_Hs_1980.nc' path = dir_test_data + filename with Dataset(path, 'r', format='netCDF4') as case_dataset: input_data = data_acquisition.InputData() + input_data.input_dict = test_variable_dict input_data.coord_list = [(4.2, 2.4)] - extractwaves = extract_data_era5.ExtractDataEra5(input_data) - #call + extractwaves = extract_waves.ExtractWaves(input_data) + # call result = extractwaves.generate_years_array(year1, yearN) - #assert + # assert assert result[0] == result_array[0] assert result[1] == result_array[1] assert result[2] == result_array[2] Index: trunk/tests/test_extract_slp.py =================================================================== diff -u -r38 -r40 --- trunk/tests/test_extract_slp.py (.../test_extract_slp.py) (revision 38) +++ trunk/tests/test_extract_slp.py (.../test_extract_slp.py) (revision 40) @@ -4,7 +4,7 @@ from tests.TestUtils import TestUtils from netCDF4 import Dataset from SDToolBox import main as main -from SDToolBox import extract_data_era5 +from SDToolBox import extract_sea_level_pressure_era5 from SDToolBox import data_acquisition import numpy as np @@ -24,7 +24,7 @@ input_data = data_acquisition.InputData() input_data.coord_list = [(4.2, 2.4), (42, 2.4), (42, 24), (4.2, 24)] #2. When - extract_slp = extract_data_era5.ExtractDataEra5(input_data) + extract_slp = extract_sea_level_pressure_era5.ExtractSeaLevelPressureERA5(input_data) dataset_list = extract_slp.subset_sea_level_pressure(dir_test_data, 1981, 1982) #3. Then Index: trunk/tests/test_output_data.py =================================================================== diff -u -r39 -r40 --- trunk/tests/test_output_data.py (.../test_output_data.py) (revision 39) +++ trunk/tests/test_output_data.py (.../test_output_data.py) (revision 40) @@ -14,6 +14,12 @@ from SDToolBox.data_acquisition import OutputData import SDToolBox.outputmessages as output_messages +test_wave_variable_dict = { + 'swh': 'Hs', + 'pp1d': 'Tp', + 'mwd': 'MWD', + 'mwp': 'Tm', +} class Test_create: @@ -22,7 +28,7 @@ # 1. Given output_data = None data_result = [] - + # 2. When try: output_data = OutputData(None) @@ -72,6 +78,7 @@ dir_test_data = 'P:\\metocean-data\\open\\ERA5\\data\\Global' output_test_data = TestUtils.get_local_test_data_dir('output_data') input_data = data_acquisition.InputData() + input_data.input_dict = test_wave_variable_dict input_data.coord_list = [(4.2, 2.4), ] netcdf_filepath = None @@ -107,6 +114,7 @@ output_test_data = TestUtils.get_local_test_data_dir('output_data') input_data = data_acquisition.InputData() + input_data.input_dict = test_wave_variable_dict input_data.coord_list = [(4.2, 2.4), ] # 2. When Index: trunk/SDToolBox/extract_waves.py =================================================================== diff -u -r36 -r40 --- trunk/SDToolBox/extract_waves.py (.../extract_waves.py) (revision 36) +++ trunk/SDToolBox/extract_waves.py (.../extract_waves.py) (revision 40) @@ -7,7 +7,7 @@ import sys import os from datetime import datetime, timedelta -from SDToolBox import outputmessages as outputmessages +from SDToolBox import outputmessages as om from SDToolBox import data_acquisition from netCDF4 import Dataset import numpy as np @@ -28,6 +28,7 @@ __time_key = 'time' __input_lon = None __input_lat = None + __variable_dict = {} __out_lat_key = data_acquisition.OutputData.var_lat_key __out_lon_key = data_acquisition.OutputData.var_lon_key __out_time_key = data_acquisition.OutputData.var_time_key @@ -40,13 +41,17 @@ input_data {data_acquisition.InputData} -- Required. """ # verify input_data not none - if not input_data or \ - not input_data.coord_list or \ + if not input_data: + raise IOError(om.error_no_valid_input_data) + if not input_data.coord_list or \ len(input_data.coord_list) < 1: - raise IOError('No valid input data.') + raise IOError(om.error_not_enough_coordinates) + if not input_data.input_dict: + raise IOError(om.error_no_valid_dict_of_vars) input_data.lon_key = self.__lon_key input_data.lat_key = self.__lat_key + self.__variable_dict = input_data.input_dict self.__input_lon, self.__input_lat = zip(*input_data.coord_list) def subset_era_5(self, directory_path: str, year_from: int, year_to: int): @@ -61,15 +66,8 @@ Returns: list(Dataset) -- collection of netCDF4 subsets per variable. """ - variable_dict = { - 'swh': 'Hs', - 'pp1d': 'Tp', - 'mwd': 'MWD', - 'mwp': 'Tm', - } - output_data = data_acquisition.OutputData( - variable_dict.keys() + self.__variable_dict.keys() ) cases_dict = output_data.get_data_dict() @@ -79,8 +77,8 @@ for lon in self.__input_lon] years = self.generate_years_array(year_from, year_to) nn_idx = None - for n_variable, variable_name in enumerate(variable_dict): - case_name_value = variable_dict[variable_name] + for n_variable, variable_name in enumerate(self.__variable_dict): + case_name_value = self.__variable_dict[variable_name] for year in years: print(year, '-', variable_name) base_file_name = 'era5_Global_' + \ Index: trunk/SDToolBox/data_acquisition.py =================================================================== diff -u -r39 -r40 --- trunk/SDToolBox/data_acquisition.py (.../data_acquisition.py) (revision 39) +++ trunk/SDToolBox/data_acquisition.py (.../data_acquisition.py) (revision 40) @@ -27,6 +27,7 @@ class InputData: coord_list = [] + input_dict = {} date_from = None date_to = None # These parameters are set in the extraction methods