Skip to content

Commit 484171d

Browse files
committed
fix: push max_items down into paging
Required some rewriting of a couple cassettes as the requests changed tightly.
1 parent f39773d commit 484171d

8 files changed

+474
-588
lines changed

pystac_client/item_search.py

+15-14
Original file line numberDiff line numberDiff line change
@@ -690,16 +690,10 @@ def items_as_dicts(self) -> Iterator[Dict[str, Any]]:
690690
Yields:
691691
Item : each Item matching the search criteria
692692
"""
693-
nitems = 0
694-
for page in self._stac_io.get_pages(
695-
self.url, self.method, self.get_parameters()
696-
):
693+
for page in self.pages_as_dicts():
697694
for item in page.get("features", []):
698-
call_modifier(self.modifier, item)
695+
# already signed in pages_as_dicts
699696
yield item
700-
nitems += 1
701-
if self._max_items and nitems >= self._max_items:
702-
return
703697

704698
# ------------------------------------------------------------------------
705699
# By Page
@@ -727,11 +721,22 @@ def pages_as_dicts(self) -> Iterator[Dict[str, Any]]:
727721
criteria as a feature-collection-like dictionary.
728722
"""
729723
if isinstance(self._stac_io, StacApiIO):
724+
num_items = 0
730725
for page in self._stac_io.get_pages(
731726
self.url, self.method, self.get_parameters()
732727
):
733728
call_modifier(self.modifier, page)
734-
yield page
729+
features = page.get("features", [])
730+
if features:
731+
num_items += len(features)
732+
if self._max_items and num_items > self._max_items:
733+
# Slice the features down to make sure we hit max_items
734+
page["features"] = features[0 : -(num_items - self._max_items)]
735+
yield page
736+
if self._max_items and num_items >= self._max_items:
737+
return
738+
else:
739+
return
735740

736741
# ------------------------------------------------------------------------
737742
# Everything
@@ -767,20 +772,16 @@ def item_collection_as_dict(self) -> Dict[str, Any]:
767772
Dict : A GeoJSON FeatureCollection
768773
"""
769774
features = []
770-
for page in self._stac_io.get_pages(
771-
self.url, self.method, self.get_parameters()
772-
):
775+
for page in self.pages_as_dicts():
773776
for feature in page["features"]:
774777
features.append(feature)
775778
if self._max_items and len(features) >= self._max_items:
776779
feature_collection = {
777780
"type": "FeatureCollection",
778781
"features": features,
779782
}
780-
call_modifier(self.modifier, feature_collection)
781783
return feature_collection
782784
feature_collection = {"type": "FeatureCollection", "features": features}
783-
call_modifier(self.modifier, feature_collection)
784785
return feature_collection
785786

786787
# Deprecated methods

tests/cassettes/test_item_search/TestItemSearch.test_deprecations[get_all_items-item_collection-False-True].yaml

+6-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interactions:
1919
response:
2020
body:
2121
string: !!binary |
22-
H4sIACRsQWQC/+2cW4/iNhSA/wpC6r6USXxJHIdqVGmn6qqV2q22+9QRQgEMZDckUZK5tdr/3mMn
22+
H4sIAN1tQWQC/+2cW4/iNhSA/wpC6r6USXxJHIdqVGmn6qqV2q22+9QRQgEMZDckUZK5tdr/3mMn
2323
AQcyMCzDcAsaRuA49rnl8MWx/V87e4pFu9v+VXjZXSJuoiAQw8yPwnanPc7L0nb39r+2P4Ja91l/
2424
1rcs5FBm9dOHPuZ9xFCfIMwxwq784CJCbDh5MIge4cQrhxqYIt6xqOG6DLukI4uQzRhxO5ZlIMYo
2525
cnqdJUGghcAPv+Z9JyKAI0NdtqK2F8eBP/RkofklVUemiRjDkWmWxWnXNOPAC0XmJU/DaBbfZSIx
@@ -71,7 +71,7 @@ interactions:
7171
Content-Type:
7272
- application/geo+json
7373
Date:
74-
- Thu, 20 Apr 2023 16:45:24 GMT
74+
- Thu, 20 Apr 2023 16:52:45 GMT
7575
Strict-Transport-Security:
7676
- max-age=15724800; includeSubDomains
7777
X-Cache:
@@ -81,7 +81,7 @@ interactions:
8181
vary:
8282
- Accept-Encoding
8383
x-azure-ref:
84-
- 20230420T164524Z-etrte6b79d6x39rbwaqfbyrsw800000004m00000000087yx
84+
- 20230420T165245Z-ph7t3013zp2n93v2zenxd3r61000000004tg00000000kpu0
8585
status:
8686
code: 200
8787
message: OK
@@ -106,7 +106,7 @@ interactions:
106106
response:
107107
body:
108108
string: !!binary |
109-
H4sIACRsQWQC/+2d62/iuBbA/xWEtPNlafAjcRyuqpW2VzvaK+3OanY+3VGFAhjILCRRkr7uav73
109+
H4sIAN1tQWQC/+2d62/iuBbA/xWEtPNlafAjcRyuqpW2VzvaK+3OanY+3VGFAhjILCRRkr7uav73
110110
e+wkxASaQls2PFy1FTiOz8Mn5pdTn/TvbvYUi+6g+4vws7tE3ESLhRhnQRR2e91p3pZ2B1//7gYT
111111
6HWfDZdD20YuZXSYiiHmw/mQIMwQRzacMRpFj9D7yqUW9iihtGdTy/MYIW5PNWIPe6Rn2xZijLjk
112112
tleTD2MsgvCvXGQiFnBkrKtU9PbjeBGMfdnY/5aqI/NETOHIPMvidNDvxws/FJmfPI2jZXyXicRa
@@ -160,7 +160,7 @@ interactions:
160160
Content-Type:
161161
- application/geo+json
162162
Date:
163-
- Thu, 20 Apr 2023 16:45:25 GMT
163+
- Thu, 20 Apr 2023 16:52:47 GMT
164164
Strict-Transport-Security:
165165
- max-age=15724800; includeSubDomains
166166
X-Cache:
@@ -170,7 +170,7 @@ interactions:
170170
vary:
171171
- Accept-Encoding
172172
x-azure-ref:
173-
- 20230420T164524Z-etrte6b79d6x39rbwaqfbyrsw800000004m000000000880e
173+
- 20230420T165245Z-ph7t3013zp2n93v2zenxd3r61000000004tg00000000kpvk
174174
status:
175175
code: 200
176176
message: OK

tests/cassettes/test_item_search/TestItemSearch.test_deprecations[get_all_items_as_dict-item_collection_as_dict-False-False].yaml

+24-16
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interactions:
1919
response:
2020
body:
2121
string: !!binary |
22-
H4sIACZsQWQC/+2cW4/iNhSA/wpC6r6USXxJHIdqVGmn6qqV2q22+9QRQgEMZDckUZK5tdr/3mMn
22+
H4sIAN9tQWQC/+2cW4/iNhSA/wpC6r6USXxJHIdqVGmn6qqV2q22+9QRQgEMZDckUZK5tdr/3mMn
2323
AQcyMCzDcAsaRuA49rnl8MWx/V87e4pFu9v+VXjZXSJuoiAQw8yPwnanPc7L0nb39r+2P4Ja91l/
2424
1rcs5FBm9dOHPuZ9xFCfIMwxwq784CJCbDh5MIge4cQrhxqYIt6xqOG6DLukI4uQzRhxO5ZlIMYo
2525
cnqdJUGghcAPv+Z9JyKAI0NdtqK2F8eBP/RkofklVUemiRjDkWmWxWnXNOPAC0XmJU/DaBbfZSIx
@@ -58,26 +58,30 @@ interactions:
5858
0w7ip749Rm+VYEPxmG2ELIjgaSQZ+6+Pf3/eDbpSCIXhVOJ4NFIXRQA/61m7i1GV0POHIW5O5vmN
5959
INwbarGqbKyiVV560VcRFtp0NwDcEXHs7t0U5gRc+B8mSv9AInIAAA==
6060
headers:
61+
Accept-Ranges:
62+
- bytes
6163
Access-Control-Allow-Credentials:
6264
- 'true'
6365
Access-Control-Allow-Origin:
6466
- '*'
65-
Content-Encoding:
66-
- gzip
67+
Connection:
68+
- keep-alive
6769
Content-Length:
6870
- '2149'
6971
Content-Type:
7072
- application/geo+json
7173
Date:
72-
- Thu, 20 Apr 2023 16:45:25 GMT
74+
- Thu, 20 Apr 2023 16:52:47 GMT
7375
Strict-Transport-Security:
7476
- max-age=15724800; includeSubDomains
75-
Vary:
76-
- Accept-Encoding
77-
X-Azure-Ref:
78-
- 0JWxBZAAAAADY4JLgin9pTLLdcMIHuK14REVOMzAxMDAwMTA5MDMzADkyN2FiZmE2LTE5ZjYtNGFmMS1hMDlkLWM5NTlkOWExZTY0NA==
7977
X-Cache:
8078
- CONFIG_NOCACHE
79+
content-encoding:
80+
- gzip
81+
vary:
82+
- Accept-Encoding
83+
x-azure-ref:
84+
- 20230420T165247Z-tftb77d56d3778hnqxff1fw2ag00000001bg00000000g4xa
8185
status:
8286
code: 200
8387
message: OK
@@ -102,7 +106,7 @@ interactions:
102106
response:
103107
body:
104108
string: !!binary |
105-
H4sIACZsQWQC/+2d62/iuBbA/xWEtPNlafAjcRyuqpW2VzvaK+3OanY+3VGFAhjILCRRkr7uav73
109+
H4sIAN9tQWQC/+2d62/iuBbA/xWEtPNlafAjcRyuqpW2VzvaK+3OanY+3VGFAhjILCRRkr7uav73
106110
e+wkxASaQls2PFy1FTiOz8Mn5pdTn/TvbvYUi+6g+4vws7tE3ESLhRhnQRR2e91p3pZ2B1//7gYT
107111
6HWfDZdD20YuZXSYiiHmw/mQIMwQRzacMRpFj9D7yqUW9iihtGdTy/MYIW5PNWIPe6Rn2xZijLjk
108112
tleTD2MsgvCvXGQiFnBkrKtU9PbjeBGMfdnY/5aqI/NETOHIPMvidNDvxws/FJmfPI2jZXyXicRa
@@ -143,26 +147,30 @@ interactions:
143147
9d3Q+d8wvJzF8ziWc6VhmvSxij95JUV/ibCwZrArs9WgLbpLz8cR0qLBC/8v74gY/u1iCncCGP0f
144148
XydYnp1yAAA=
145149
headers:
150+
Accept-Ranges:
151+
- bytes
146152
Access-Control-Allow-Credentials:
147153
- 'true'
148154
Access-Control-Allow-Origin:
149155
- '*'
150-
Content-Encoding:
151-
- gzip
156+
Connection:
157+
- keep-alive
152158
Content-Length:
153159
- '2231'
154160
Content-Type:
155161
- application/geo+json
156162
Date:
157-
- Thu, 20 Apr 2023 16:45:25 GMT
163+
- Thu, 20 Apr 2023 16:52:47 GMT
158164
Strict-Transport-Security:
159165
- max-age=15724800; includeSubDomains
160-
Vary:
161-
- Accept-Encoding
162-
X-Azure-Ref:
163-
- 0JmxBZAAAAADgDbukw/n2SpkTgoEMHMLcREVOMzAxMDAwMTA5MDMzADkyN2FiZmE2LTE5ZjYtNGFmMS1hMDlkLWM5NTlkOWExZTY0NA==
164166
X-Cache:
165167
- CONFIG_NOCACHE
168+
content-encoding:
169+
- gzip
170+
vary:
171+
- Accept-Encoding
172+
x-azure-ref:
173+
- 20230420T165247Z-tftb77d56d3778hnqxff1fw2ag00000001bg00000000g4yk
166174
status:
167175
code: 200
168176
message: OK

0 commit comments

Comments
 (0)