88from typing import Dict , List , Optional , Tuple , Union
99
1010import hxl
11- from hxl import InputOptions
11+ from hxl import Dataset , InputOptions
1212
1313from hdx .utilities .path import script_dir_plus_file
1414from hdx .utilities .text import get_words_in_sentence
@@ -69,6 +69,8 @@ class Country:
6969 "KINGDOM" ,
7070 "PROTECTORATE" ,
7171 ]
72+ _include_unofficial_default = False
73+ _include_unofficial = _include_unofficial_default
7274 _use_live_default = True
7375 _use_live = _use_live_default
7476 _countriesdata = None
@@ -102,6 +104,8 @@ def _add_countriesdata(cls, iso3: str, hxlcountry: hxl.Row) -> Dict:
102104 if countryname is not None :
103105 country ["#country+name+override" ] = countryname
104106 iso2 = hxlcountry .get ("#country+code+v_iso2" )
107+ if not iso2 and cls ._include_unofficial :
108+ iso2 = hxlcountry .get ("#country+code+alpha2" )
105109 if iso2 :
106110 cls ._countriesdata ["iso2iso3" ][iso2 ] = iso3
107111 # different types so keys won't clash
@@ -159,12 +163,12 @@ def add_country_to_set(colname, idval, iso3):
159163 return country
160164
161165 @classmethod
162- def set_countriesdata (cls , countries : str ) -> None :
166+ def set_countriesdata (cls , countries : Dataset ) -> None :
163167 """
164- Set up countries data from data in form provided by UNStats and World Bank
168+ Set up countries data from OCHA countries and territories dataset
165169
166170 Args:
167- countries (str ): Countries data in HTML format provided by UNStats
171+ countries (Dataset ): Countries data from countries and territories dataset
168172
169173 Returns:
170174 None
@@ -186,7 +190,12 @@ def set_countriesdata(cls, countries: str) -> None:
186190 for country in countries :
187191 iso3 = country .get ("#country+code+v_iso3" )
188192 if not iso3 :
189- continue
193+ if cls ._include_unofficial :
194+ iso3 = country .get ("#country+code+alpha3" )
195+ if not iso3 :
196+ continue
197+ else :
198+ continue
190199 iso3 = iso3 .upper ()
191200 countrydict = cls ._add_countriesdata (iso3 , country )
192201 cls ._countriesdata ["countries" ][iso3 ] = countrydict
@@ -202,30 +211,37 @@ def sort_list(colname):
202211 @classmethod
203212 def countriesdata (
204213 cls ,
205- use_live : bool = None ,
206- country_name_overrides : Dict = None ,
207- country_name_mappings : Dict = None ,
214+ include_unofficial : Optional [bool ] = None ,
215+ use_live : Optional [bool ] = None ,
216+ country_name_overrides : Optional [Dict ] = None ,
217+ country_name_mappings : Optional [Dict ] = None ,
208218 ) -> List [Dict [str , Dict ]]:
209219 """
210- Read countries data from OCHA countries feed (falling back to file)
220+ Read countries data from OCHA countries feed (falling back to file).
221+ include_unofficial, use_live, country_name_overrides and country_name_mappings
222+ are taken from internal defaults if they are None, otherwise the internal
223+ defaults are overridden.
211224
212225 Args:
213- use_live (bool): Try to get use latest data from web rather than file in package. Defaults to True.
214- country_name_overrides (Dict): Dictionary of mappings from iso3 to country name
215- country_name_mappings (Dict): Dictionary of mappings from country name to iso3
226+ include_unofficial (Optional[bool]): Include unofficial country alpha codes. Defaults to False.
227+ use_live (Optional[bool]): Try to get latest data from web rather than file in package. Defaults to True.
228+ country_name_overrides (Optional[Dict]): Dictionary of mappings from iso3 to country name
229+ country_name_mappings (Optional[Dict]): Dictionary of mappings from country name to iso3
216230
217231 Returns:
218232 List[Dict[str,Dict]]: Countries dictionaries
219233 """
220- if use_live is None :
221- use_live = cls ._use_live
234+ if include_unofficial is not None :
235+ cls ._include_unofficial = include_unofficial
236+ if use_live is not None :
237+ cls ._use_live = use_live
222238 if cls ._countriesdata is None :
223239 countries = None
224240 if country_name_overrides is not None :
225241 cls .set_country_name_overrides (country_name_overrides )
226242 if country_name_mappings is not None :
227243 cls .set_country_name_mappings (country_name_mappings )
228- if use_live :
244+ if cls . _use_live :
229245 try :
230246 countries = hxl .data (cls ._ochaurl , InputOptions (encoding = "utf-8" ))
231247 except OSError :
@@ -240,6 +256,24 @@ def countriesdata(
240256 cls .set_countriesdata (countries )
241257 return cls ._countriesdata
242258
259+ @classmethod
260+ def set_include_unofficial_default (
261+ cls , include_unofficial : Optional [bool ] = None
262+ ) -> None :
263+ """
264+ Set the default for include_unofficial which defines if unofficial alpha2 and
265+ alpha3 codes such as AN and XKX will be included.
266+
267+ Args:
268+ include_unofficial (bool): Default value to use for include_unofficial. Defaults to internal value (False).
269+
270+ Returns:
271+ None
272+ """
273+ if include_unofficial is None :
274+ include_unofficial = cls ._include_unofficial
275+ cls ._include_unofficial = include_unofficial
276+
243277 @classmethod
244278 def set_use_live_default (cls , use_live : Optional [bool ] = None ) -> None :
245279 """
0 commit comments