class IQVIAData: """Define a data object to retrieve info from IQVIA.""" def __init__(self, client, sensor_types): """Initialize.""" self._client = client self.data = {} self.sensor_types = sensor_types self.zip_code = client.zip_code self.fetchers = Registry() self.fetchers.register(TYPE_ALLERGY_FORECAST)( self._client.allergens.extended) self.fetchers.register(TYPE_ALLERGY_OUTLOOK)( self._client.allergens.outlook) self.fetchers.register(TYPE_ALLERGY_INDEX)( self._client.allergens.current) self.fetchers.register(TYPE_ASTHMA_FORECAST)( self._client.asthma.extended) self.fetchers.register(TYPE_ASTHMA_INDEX)(self._client.asthma.current) self.fetchers.register(TYPE_DISEASE_FORECAST)( self._client.disease.extended) self.fetchers.register(TYPE_DISEASE_INDEX)( self._client.disease.current) async def async_update(self): """Update IQVIA data.""" tasks = {} for conditions, fetcher_types in FETCHER_MAPPING.items(): if not any(c in self.sensor_types for c in conditions): continue for fetcher_type in fetcher_types: tasks[fetcher_type] = self.fetchers[fetcher_type]() results = await asyncio.gather(*tasks.values(), return_exceptions=True) # IQVIA sites require a bit more complicated error handling, given that # they sometimes have parts (but not the whole thing) go down: # 1. If `InvalidZipError` is thrown, quit everything immediately. # 2. If a single request throws any other error, try the others. for key, result in zip(tasks, results): if isinstance(result, InvalidZipError): _LOGGER.error("No data for ZIP: %s", self._client.zip_code) self.data = {} return if isinstance(result, IQVIAError): _LOGGER.error('Unable to get %s data: %s', key, result) self.data[key] = {} continue _LOGGER.debug('Loaded new %s data', key) self.data[key] = result
class IQVIAData: """Define a data object to retrieve info from IQVIA.""" def __init__(self, client, sensor_types): """Initialize.""" self._client = client self.data = {} self.sensor_types = sensor_types self.zip_code = client.zip_code self.fetchers = Registry() self.fetchers.register(TYPE_ALLERGY_FORECAST)( self._client.allergens.extended) self.fetchers.register(TYPE_ALLERGY_OUTLOOK)( self._client.allergens.outlook) self.fetchers.register(TYPE_ALLERGY_INDEX)( self._client.allergens.current) self.fetchers.register(TYPE_ASTHMA_FORECAST)( self._client.asthma.extended) self.fetchers.register(TYPE_ASTHMA_INDEX)(self._client.asthma.current) self.fetchers.register(TYPE_DISEASE_FORECAST)( self._client.disease.extended) self.fetchers.register(TYPE_DISEASE_INDEX)( self._client.disease.current) async def async_update(self): """Update IQVIA data.""" tasks = {} for conditions, fetcher_types in FETCHER_MAPPING.items(): if not any(c in self.sensor_types for c in conditions): continue for fetcher_type in fetcher_types: tasks[fetcher_type] = self.fetchers[fetcher_type]() results = await asyncio.gather(*tasks.values(), return_exceptions=True) for key, result in zip(tasks, results): if isinstance(result, IQVIAError): _LOGGER.error('Unable to get %s data: %s', key, result) self.data[key] = {} continue _LOGGER.debug('Loaded new %s data', key) self.data[key] = result
class IQVIAData: """Define a data object to retrieve info from IQVIA.""" def __init__(self, client, sensor_types): """Initialize.""" self._client = client self.data = {} self.sensor_types = sensor_types self.zip_code = client.zip_code self.fetchers = Registry() self.fetchers.register(TYPE_ALLERGY_FORECAST)( self._client.allergens.extended) self.fetchers.register(TYPE_ALLERGY_OUTLOOK)( self._client.allergens.outlook) self.fetchers.register(TYPE_ALLERGY_INDEX)( self._client.allergens.current) self.fetchers.register(TYPE_ASTHMA_FORECAST)( self._client.asthma.extended) self.fetchers.register(TYPE_ASTHMA_INDEX)(self._client.asthma.current) self.fetchers.register(TYPE_DISEASE_FORECAST)( self._client.disease.extended) self.fetchers.register(TYPE_DISEASE_INDEX)( self._client.disease.current) async def async_update(self): """Update IQVIA data.""" tasks = {} for conditions, fetcher_types in FETCHER_MAPPING.items(): if not any(c in self.sensor_types for c in conditions): continue for fetcher_type in fetcher_types: tasks[fetcher_type] = self.fetchers[fetcher_type]() results = await asyncio.gather(*tasks.values(), return_exceptions=True) # IQVIA sites require a bit more complicated error handling, given that # they sometimes have parts (but not the whole thing) go down: # 1. If `InvalidZipError` is thrown, quit everything immediately. # 2. If a single request throws any other error, try the others. for key, result in zip(tasks, results): if isinstance(result, InvalidZipError): _LOGGER.error("No data for ZIP: %s", self._client.zip_code) self.data = {} return if isinstance(result, IQVIAError): _LOGGER.error('Unable to get %s data: %s', key, result) self.data[key] = {} continue _LOGGER.debug('Loaded new %s data', key) self.data[key] = result