Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 18 additions & 11 deletions overpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def _handle_remark_msg(self, msg):
raise exception.OverpassRuntimeRemark(msg=msg)
raise exception.OverpassUnknownError(msg=msg)

def query(self, query):
def query(self, query, return_raw=False):
"""
Query the Overpass API

Expand Down Expand Up @@ -149,10 +149,10 @@ def query(self, query):
content_type = f.getheader("Content-Type")

if content_type == "application/json":
return self.parse_json(response)
return self.parse_json(response, return_raw=return_raw)

if content_type == "application/osm3s+xml":
return self.parse_xml(response)
return self.parse_xml(response, return_raw=return_raw)

e = exception.OverpassUnknownContentType(content_type)
if not do_retry:
Expand Down Expand Up @@ -201,7 +201,7 @@ def query(self, query):

raise exception.MaxRetriesReached(retry_count=retry_num, exceptions=retry_exceptions)

def parse_json(self, data, encoding="utf-8"):
def parse_json(self, data, encoding="utf-8", return_raw=False):
"""
Parse raw response from Overpass service.

Expand All @@ -214,12 +214,16 @@ def parse_json(self, data, encoding="utf-8"):
"""
if isinstance(data, bytes):
data = data.decode(encoding)
data = json.loads(data, parse_float=Decimal)
if "remark" in data:
self._handle_remark_msg(msg=data.get("remark"))
return Result.from_json(data, api=self)
json_data = json.loads(data, parse_float=Decimal)
if "remark" in json_data:
self._handle_remark_msg(msg=json_data.get("remark"))

if return_raw:
return data
else:
return Result.from_json(data, api=self)

def parse_xml(self, data, encoding="utf-8", parser=None):
def parse_xml(self, data, encoding="utf-8", parser=None, return_raw=False):
"""

:param data: Raw XML Data
Expand All @@ -241,8 +245,11 @@ def parse_xml(self, data, encoding="utf-8", parser=None):
m = re.compile("<remark>(?P<msg>[^<>]*)</remark>").search(data)
if m:
self._handle_remark_msg(m.group("msg"))

return Result.from_xml(data, api=self, parser=parser)

if return_raw:
return data
else:
return Result.from_xml(data, api=self, parser=parser)


class Result(object):
Expand Down