Skip to content

Commit 89feb55

Browse files
Merge pull request #203 from BelKed/fix-search-rect
Fix and improve `Geocaching.search_rect()`
2 parents 5ee052f + 3d98e6c commit 89feb55

File tree

6 files changed

+329
-491
lines changed

6 files changed

+329
-491
lines changed

pycaching/cache.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def _from_api_record(cls, geocaching, record):
170170
name=record["name"],
171171
type=Type.from_number(record["geocacheType"]),
172172
status=Status(record["cacheStatus"]),
173-
found=record["userFound"],
173+
found="userFound" in record,
174174
size=Size.from_number(record["containerType"]),
175175
difficulty=record["difficulty"],
176176
terrain=record["terrain"],

pycaching/geocaching.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,8 @@ def search_rect(
391391
*,
392392
per_query: int = 200,
393393
sort_by: Union[str, SortOrder] = SortOrder.date_last_visited,
394+
reverse: bool = False,
395+
limit: int = float("inf"),
394396
origin: Optional[Point] = None,
395397
wait_sleep: bool = True
396398
):
@@ -400,22 +402,28 @@ def search_rect(
400402
:param rect: Search area.
401403
:param int per_query: Number of caches requested in single query.
402404
:param sort_by: Order cached by given criterion.
405+
:param reverse: Reverse sort order.
406+
:param limit: Maximum number of caches to return.
403407
:param origin: Origin point for search by distance.
404408
:param wait_sleep: In case of rate limits exceeding, wait appropriate time if set True,
405409
otherwise just yield None.
406410
"""
407411
if not isinstance(sort_by, SortOrder):
408412
sort_by = SortOrder(sort_by)
409413

414+
if limit <= 0:
415+
return
416+
417+
take_amount = min(limit, per_query)
410418
params = {
411419
"box": "{},{},{},{}".format(
412420
rect.corners[0].latitude,
413421
rect.corners[0].longitude,
414422
rect.corners[1].latitude,
415423
rect.corners[1].longitude,
416424
),
417-
"take": per_query,
418-
"asc": "true",
425+
"take": take_amount,
426+
"asc": str(not reverse).lower(),
419427
"skip": 0,
420428
"sort": sort_by.value,
421429
}
@@ -425,7 +433,7 @@ def search_rect(
425433
params["origin"] = "{},{}".format(origin.latitude, origin.longitude)
426434

427435
total, offset = None, 0
428-
while (total is None) or (offset < total):
436+
while (offset < limit) and ((total is None) or (offset < total)):
429437
params["skip"] = offset
430438

431439
try:
@@ -441,7 +449,7 @@ def search_rect(
441449
yield Cache._from_api_record(self, record)
442450

443451
total = resp["total"]
444-
offset += per_query
452+
offset += take_amount
445453

446454
def geocode(self, location):
447455
"""Return a :class:`.Point` object from geocoded location.

0 commit comments

Comments
 (0)