From 1b613b0a663e1e4e44413c052df0c8fcf1f3fa82 Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Sun, 3 May 2026 12:51:29 -0500 Subject: [PATCH 1/3] Fix get_reference_table: propagate limit to query args The signature accepted and documented a `limit` parameter, but the function never forwarded it into `query_args`, so every call fetched at the schema/server default regardless of what the user requested. Forward `limit` into a copy of the user-supplied `query` dict (so the caller's dict is not mutated) when it is not None. Co-Authored-By: Claude Opus 4.7 (1M context) --- dataretrieval/waterdata/api.py | 4 +++- tests/waterdata_test.py | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/dataretrieval/waterdata/api.py b/dataretrieval/waterdata/api.py index a3c0a94b..d4bb647a 100644 --- a/dataretrieval/waterdata/api.py +++ b/dataretrieval/waterdata/api.py @@ -1542,7 +1542,9 @@ def get_reference_table( else: output_id = f"{collection.replace('-', '_')}" - query_args = query or {} + query_args = dict(query) if query else {} + if limit is not None: + query_args["limit"] = limit return get_ogc_data(args=query_args, output_id=output_id, service=collection) diff --git a/tests/waterdata_test.py b/tests/waterdata_test.py index 195441e5..bb53806b 100644 --- a/tests/waterdata_test.py +++ b/tests/waterdata_test.py @@ -322,6 +322,33 @@ def test_get_reference_table_wrong_name(): get_reference_table("agency-cod") +def test_get_reference_table_propagates_limit(requests_mock): + """The `limit` argument must reach the OGC `limit` query parameter.""" + request_url = ( + "https://api.waterdata.usgs.gov/ogcapi/v0/collections/agency-codes/items" + ) + body = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "USGS", + "properties": {"agency_code": "USGS"}, + "geometry": None, + } + ], + "numberReturned": 1, + "links": [], + } + requests_mock.get(request_url, json=body, headers={"mock_header": "value"}) + + df, _md = get_reference_table("agency-codes", limit=42) + + sent = requests_mock.request_history[-1] + assert sent.qs.get("limit") == ["42"] + assert "agency_code" in df.columns + + def test_get_stats_por(): df, _ = get_stats_por( monitoring_location_id="USGS-12451000", From 3515562bc2327c380bc395bda4942c74eda6512e Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Mon, 4 May 2026 10:07:27 -0500 Subject: [PATCH 2/3] Cover the limit + query branch with no-mutation assertion Per copilot review on PR #248. Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/waterdata_test.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/waterdata_test.py b/tests/waterdata_test.py index bb53806b..2190c70c 100644 --- a/tests/waterdata_test.py +++ b/tests/waterdata_test.py @@ -349,6 +349,36 @@ def test_get_reference_table_propagates_limit(requests_mock): assert "agency_code" in df.columns +def test_get_reference_table_limit_with_query_does_not_mutate(requests_mock): + """`limit` is merged with a caller-supplied `query` dict without mutating it.""" + request_url = ( + "https://api.waterdata.usgs.gov/ogcapi/v0/collections/agency-codes/items" + ) + body = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "USGS", + "properties": {"agency_code": "USGS"}, + "geometry": None, + } + ], + "numberReturned": 1, + "links": [], + } + requests_mock.get(request_url, json=body, headers={"mock_header": "value"}) + + user_query = {"id": "USGS"} + user_query_snapshot = dict(user_query) + get_reference_table("agency-codes", limit=42, query=user_query) + + sent = requests_mock.request_history[-1] + assert sent.qs.get("limit") == ["42"] + assert sent.qs.get("id") == ["usgs"] + assert user_query == user_query_snapshot + + def test_get_stats_por(): df, _ = get_stats_por( monitoring_location_id="USGS-12451000", From 42b12d8e55ff11a33a164b29bf9fe72d70ff83de Mon Sep 17 00:00:00 2001 From: thodson-usgs Date: Mon, 4 May 2026 11:59:30 -0500 Subject: [PATCH 3/3] Drop trivial regression tests for limit propagation Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/waterdata_test.py | 57 ----------------------------------------- 1 file changed, 57 deletions(-) diff --git a/tests/waterdata_test.py b/tests/waterdata_test.py index 2190c70c..195441e5 100644 --- a/tests/waterdata_test.py +++ b/tests/waterdata_test.py @@ -322,63 +322,6 @@ def test_get_reference_table_wrong_name(): get_reference_table("agency-cod") -def test_get_reference_table_propagates_limit(requests_mock): - """The `limit` argument must reach the OGC `limit` query parameter.""" - request_url = ( - "https://api.waterdata.usgs.gov/ogcapi/v0/collections/agency-codes/items" - ) - body = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "id": "USGS", - "properties": {"agency_code": "USGS"}, - "geometry": None, - } - ], - "numberReturned": 1, - "links": [], - } - requests_mock.get(request_url, json=body, headers={"mock_header": "value"}) - - df, _md = get_reference_table("agency-codes", limit=42) - - sent = requests_mock.request_history[-1] - assert sent.qs.get("limit") == ["42"] - assert "agency_code" in df.columns - - -def test_get_reference_table_limit_with_query_does_not_mutate(requests_mock): - """`limit` is merged with a caller-supplied `query` dict without mutating it.""" - request_url = ( - "https://api.waterdata.usgs.gov/ogcapi/v0/collections/agency-codes/items" - ) - body = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "id": "USGS", - "properties": {"agency_code": "USGS"}, - "geometry": None, - } - ], - "numberReturned": 1, - "links": [], - } - requests_mock.get(request_url, json=body, headers={"mock_header": "value"}) - - user_query = {"id": "USGS"} - user_query_snapshot = dict(user_query) - get_reference_table("agency-codes", limit=42, query=user_query) - - sent = requests_mock.request_history[-1] - assert sent.qs.get("limit") == ["42"] - assert sent.qs.get("id") == ["usgs"] - assert user_query == user_query_snapshot - - def test_get_stats_por(): df, _ = get_stats_por( monitoring_location_id="USGS-12451000",