Example #1
0
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
Example #2
0
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