Source code for pyowm.weatherapi25.parsers.weatherhistoryparser
"""
Module containing a concrete implementation for JSONParser abstract class,
returning a list of Weather objects
"""
import json
from pyowm.weatherapi25 import weather
from pyowm.abstractions import jsonparser
from pyowm.exceptions import parse_response_error, api_response_error
[docs]class WeatherHistoryParser(jsonparser.JSONParser):
"""
Concrete *JSONParser* implementation building a list of *Weather* instances
out of raw JSON data coming from OWM Weather API responses.
"""
def __init__(self):
pass
[docs] def parse_JSON(self, JSON_string):
"""
Parses a list of *Weather* instances out of raw JSON data. Only certain
properties of the data are used: if these properties are not found or
cannot be parsed, an error is issued.
:param JSON_string: a raw JSON string
:type JSON_string: str
:returns: a list of *Weather* instances or ``None`` if no data is
available
:raises: *ParseResponseError* if it is impossible to find or parse the
data needed to build the result, *APIResponseError* if the JSON
string embeds an HTTP status error
"""
if JSON_string is None:
raise parse_response_error.ParseResponseError('JSON data is None')
d = json.loads(JSON_string)
# Check if server returned errors: this check overcomes the lack of use
# of HTTP error status codes by the OWM API 2.5. This mechanism is
# supposed to be deprecated as soon as the API fully adopts HTTP for
# conveying errors to the clients
if 'message' in d and 'cod' in d:
if d['cod'] == "404":
print("OWM API: data not found - response payload: " + \
json.dumps(d))
return None
elif d['cod'] != "200":
raise api_response_error.APIResponseError(
"OWM API: error - response payload: " + json.dumps(d), d['cod'])
# Handle the case when no results are found
if 'cnt' in d and d['cnt'] == "0":
return []
else:
if 'list' in d:
try:
return [weather.weather_from_dictionary(item) \
for item in d['list']]
except KeyError:
raise parse_response_error.ParseResponseError(
''.join([__name__, ': impossible to read ' \
'weather info from JSON data'])
)
else:
raise parse_response_error.ParseResponseError(
''.join([__name__, ': impossible to read ' \
'weather list from JSON data'])
)
def __repr__(self):
return "<%s.%s>" % (__name__, self.__class__.__name__)