def get_weather_variables(forecast, location): """ :param forecast: forecastio object :param location: location dict with 'lat', 'lng', and 'name' keys :return: weather_data dict containing weather information """ try: weather_data = dict() if 'darksky-unavailable' in forecast.json['flags']: raise BadForecastDataError('Darksky unavailable') if not forecast.currently().temperature: raise BadForecastDataError('Temp is None') if not forecast.currently().summary: raise BadForecastDataError('Summary is None') weather_data['units'] = utils.get_units(CONFIG['basic']['units']) # forecast.io doesn't always include 'windBearing' or 'nearestStormDistance' if hasattr(forecast.currently(), 'windBearing'): weather_data['windBearing'] = utils.get_wind_direction(forecast.currently().windBearing) else: weather_data['windBearing'] = 'unknown direction' if hasattr(forecast.currently(), 'nearestStormDistance'): weather_data['nearestStormDistance'] = forecast.currently().nearestStormDistance else: weather_data['nearestStormDistance'] = 99999 weather_data['windSpeed'] = forecast.currently().windSpeed weather_data['windSpeed_and_unit'] = str(round(forecast.currently().windSpeed)) + ' ' + \ weather_data['units']['windSpeed'] weather_data['apparentTemperature'] = forecast.currently().apparentTemperature weather_data['apparentTemperature_and_unit'] = str(round(forecast.currently().apparentTemperature)) + 'º' \ + weather_data['units']['apparentTemperature'] weather_data['temp'] = forecast.currently().temperature weather_data['temp_and_unit'] = str(round(forecast.currently().temperature)) + 'º' + \ weather_data['units']['temperature'] weather_data['humidity'] = round(forecast.currently().humidity * 100) weather_data['precipIntensity'] = forecast.currently().precipIntensity weather_data['precipProbability'] = forecast.currently().precipProbability if hasattr(forecast.currently(), 'precipType'): weather_data['precipType'] = forecast.currently().precipType else: weather_data['precipType'] = 'none' weather_data['summary'] = forecast.currently().summary.lower() weather_data['icon'] = forecast.currently().icon weather_data['location'] = location['name'] weather_data['latitude'] = location['lat'] weather_data['longitude'] = location['lng'] weather_data['timezone'] = forecast.json['timezone'] weather_data['forecast'] = forecast.daily().data[0] weather_data['hour_icon'] = forecast.minutely().icon weather_data['hour_summary'] = forecast.minutely().summary weather_data['alerts'] = forecast.alerts() weather_data['valid'] = True logging.debug('Weather data: {0}'.format(weather_data)) return weather_data except (KeyError, TypeError, BadForecastDataError) as err: logging.error('Found an error in get_weather_variables') logging.error(err) return {'valid': False}
def __init__(self, forecast, location): """ :type location: WeatherLocation :type forecast: forecastio.models.Forecast """ self.__forecast = forecast try: if 'darksky-unavailable' in forecast.json['flags']: raise BadForecastDataError('Darksky unavailable') self.units = utils.get_units(forecast.json['flags']['units']) # Dark Sky doesn't always include 'windBearing' or 'nearestStormDistance' if hasattr(forecast.currently(), 'windBearing'): self.windBearing = utils.get_wind_direction( forecast.currently().windBearing) else: self.windBearing = 'unknown direction' self.windSpeed = forecast.currently().windSpeed self.apparentTemperature = forecast.currently().apparentTemperature self.temp = forecast.currently().temperature self.humidity = round(forecast.currently().humidity * 100) self.precipIntensity = forecast.currently().precipIntensity self.precipProbability = forecast.currently().precipProbability if hasattr(forecast.currently(), 'precipType'): self.precipType = forecast.currently().precipType else: self.precipType = 'none' self.summary = forecast.currently().summary self.icon = forecast.currently().icon self.location = location self.timezone = forecast.json['timezone'] self.forecast = forecast.daily().data[0] self.minutely = forecast.minutely( ) # this will return None in many parts of the world self.alerts = list() for alert in forecast.alerts(): self.alerts.append(WeatherAlert(alert)) self.valid = True except (KeyError, TypeError, BadForecastDataError, PropertyUnavailable): self.valid = False
def test_init(self): """Testing that weather data is loaded correctly""" forecast = forecastio.manual(os.path.join('fixtures', 'us.json')) wd = models.WeatherData(forecast, self.location) self.assertEqual(wd.units, utils.get_units('us')) self.assertEqual(wd.windBearing, 'SW') self.assertEqual(wd.windSpeed, 10.81) self.assertEqual(wd.apparentTemperature, 50.84) self.assertEqual(wd.temp, 50.84) self.assertEqual(wd.humidity, 89) self.assertEqual(wd.precipIntensity, 0) self.assertEqual(wd.precipProbability, 0) self.assertEqual(wd.precipType, 'none') self.assertEqual(wd.summary, 'Partly Cloudy') self.assertEqual(wd.icon, 'partly-cloudy-day') self.assertEqual(wd.location, self.location) self.assertEqual(wd.timezone, 'Europe/Copenhagen') self.assertEqual(wd.alerts, []) self.assertTrue(wd.valid) self.assertEqual(str(wd), '<WeatherData: Lyngby-Taarbæk, Hovedstaden(55.76,12.49) at 2016-10-01 05:56:38+00:00>')
def __init__(self, forecast, location): """ :type location: WeatherLocation :type forecast: forecastio.models.Forecast """ self.__forecast = forecast try: if 'darksky-unavailable' in forecast.json['flags']: raise BadForecastDataError('Darksky unavailable') self.units = utils.get_units(forecast.json['flags']['units']) # Dark Sky doesn't always include 'windBearing' if hasattr(forecast.currently(), 'windBearing'): self.windBearing = utils.get_wind_direction(forecast.currently().windBearing) else: self.windBearing = 'unknown direction' self.windSpeed = forecast.currently().windSpeed self.apparentTemperature = forecast.currently().apparentTemperature self.temp = forecast.currently().temperature self.humidity = round(forecast.currently().humidity * 100) self.precipIntensity = forecast.currently().precipIntensity self.precipProbability = forecast.currently().precipProbability if hasattr(forecast.currently(), 'precipType'): self.precipType = forecast.currently().precipType else: self.precipType = 'none' self.summary = forecast.currently().summary self.icon = forecast.currently().icon self.location = location self.timezone = forecast.json['timezone'] self.forecast = forecast.daily().data[0] self.minutely = forecast.minutely() # this will return None in many parts of the world self.alerts = list() for alert in forecast.alerts(): self.alerts.append(WeatherAlert(alert)) self.valid = True except (KeyError, TypeError, BadForecastDataError, PropertyUnavailable): self.valid = False
def test_get_units(self): """Testing getting units from a country/unit identifier""" self.assertEqual(utils.get_units('us')['unit'], 'us') self.assertEqual(utils.get_units('us')['nearestStormDistance'], 'mph') self.assertEqual(utils.get_units('us')['precipIntensity'], 'in/h') self.assertEqual(utils.get_units('us')['precipIntensityMax'], 'in/h') self.assertEqual(utils.get_units('us')['precipAccumulation'], 'in') self.assertEqual(utils.get_units('us')['temperature'], 'F') self.assertEqual(utils.get_units('us')['temperatureMin'], 'F') self.assertEqual(utils.get_units('us')['temperatureMax'], 'F') self.assertEqual(utils.get_units('us')['apparentTemperature'], 'F') self.assertEqual(utils.get_units('us')['dewPoint'], 'F') self.assertEqual(utils.get_units('us')['windSpeed'], 'mph') self.assertEqual(utils.get_units('us')['pressure'], 'mb') self.assertEqual(utils.get_units('us')['visibility'], 'mi') self.assertEqual(utils.get_units('ca')['unit'], 'ca') self.assertEqual(utils.get_units('ca')['nearestStormDistance'], 'km') self.assertEqual(utils.get_units('ca')['precipIntensity'], 'mm/h') self.assertEqual(utils.get_units('ca')['precipIntensityMax'], 'mm/h') self.assertEqual(utils.get_units('ca')['precipAccumulation'], 'cm') self.assertEqual(utils.get_units('ca')['temperature'], 'C') self.assertEqual(utils.get_units('ca')['temperatureMin'], 'C') self.assertEqual(utils.get_units('ca')['temperatureMax'], 'C') self.assertEqual(utils.get_units('ca')['apparentTemperature'], 'C') self.assertEqual(utils.get_units('ca')['dewPoint'], 'C') self.assertEqual(utils.get_units('ca')['windSpeed'], 'km/h') self.assertEqual(utils.get_units('ca')['pressure'], 'hPa') self.assertEqual(utils.get_units('ca')['visibility'], 'km') self.assertEqual(utils.get_units('uk2')['unit'], 'uk2') self.assertEqual(utils.get_units('uk2')['nearestStormDistance'], 'mi') self.assertEqual(utils.get_units('uk2')['precipIntensity'], 'mm/h') self.assertEqual(utils.get_units('uk2')['precipIntensityMax'], 'mm/h') self.assertEqual(utils.get_units('uk2')['precipAccumulation'], 'cm') self.assertEqual(utils.get_units('uk2')['temperature'], 'C') self.assertEqual(utils.get_units('uk2')['temperatureMin'], 'C') self.assertEqual(utils.get_units('uk2')['temperatureMax'], 'C') self.assertEqual(utils.get_units('uk2')['apparentTemperature'], 'C') self.assertEqual(utils.get_units('uk2')['dewPoint'], 'C') self.assertEqual(utils.get_units('uk2')['windSpeed'], 'mph') self.assertEqual(utils.get_units('uk2')['pressure'], 'hPa') self.assertEqual(utils.get_units('uk2')['visibility'], 'mi') self.assertEqual(utils.get_units('si')['unit'], 'si') self.assertEqual(utils.get_units('si')['nearestStormDistance'], 'km') self.assertEqual(utils.get_units('si')['precipIntensity'], 'mm/h') self.assertEqual(utils.get_units('si')['precipIntensityMax'], 'mm/h') self.assertEqual(utils.get_units('si')['precipAccumulation'], 'cm') self.assertEqual(utils.get_units('si')['temperature'], 'C') self.assertEqual(utils.get_units('si')['temperatureMin'], 'C') self.assertEqual(utils.get_units('si')['temperatureMax'], 'C') self.assertEqual(utils.get_units('si')['apparentTemperature'], 'C') self.assertEqual(utils.get_units('si')['dewPoint'], 'C') self.assertEqual(utils.get_units('si')['windSpeed'], 'm/s') self.assertEqual(utils.get_units('si')['pressure'], 'hPa') self.assertEqual(utils.get_units('si')['visibility'], 'km')