Skip to content

Commit 09bc120

Browse files
committed
Add --limit to clob per the blob PR
1 parent e65c4f6 commit 09bc120

File tree

4 files changed

+122
-5
lines changed

4 files changed

+122
-5
lines changed

cwmscli/commands/clob.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,15 @@ def list_clobs(
5353
sort_by: Optional[Sequence[str]] = None,
5454
ascending: bool = True,
5555
limit: Optional[int] = None,
56+
page_size: Optional[int] = None,
5657
) -> pd.DataFrame:
5758
logging.info(f"Listing clobs for office: {office!r}...")
58-
result = cwms.get_clobs(office_id=office, clob_id_like=clob_id_like)
59+
fetch_page_size = page_size if page_size is not None else limit
60+
result = cwms.get_clobs(
61+
office_id=office,
62+
clob_id_like=clob_id_like,
63+
page_size=fetch_page_size,
64+
)
5965

6066
# Accept either a DataFrame or a JSON/dict-like response
6167
if isinstance(result, pd.DataFrame):
@@ -289,6 +295,7 @@ def list_cmd(
289295
sort_by: list[str],
290296
desc: bool,
291297
limit: int,
298+
page_size: int,
292299
to_csv: str,
293300
office: str,
294301
api_root: str,
@@ -305,6 +312,7 @@ def list_cmd(
305312
sort_by=sort_by,
306313
ascending=not desc,
307314
limit=limit,
315+
page_size=page_size,
308316
)
309317
except Exception:
310318
log_scoped_read_hint(

cwmscli/commands/commands_cwms.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,12 @@ def update_cmd(**kwargs):
555555
help="Sort descending instead of ascending.",
556556
)
557557
@click.option("--limit", type=int, default=None, help="Max rows to show.")
558+
@click.option(
559+
"--page-size",
560+
type=int,
561+
default=None,
562+
help="Max rows to request from the clob endpoint. Defaults to --limit when set.",
563+
)
558564
@click.option(
559565
"--to-csv",
560566
type=click.Path(dir_okay=False, writable=True, path_type=str),

docs/cli/clob.rst

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ Quick reference
3131
- ``clob download`` writes the returned clob text to disk.
3232
- ``clob list`` and ``clob download`` send an API key if one is configured,
3333
unless ``--anonymous`` is used.
34+
- ``clob list --limit`` caps displayed rows, and sets the clob endpoint
35+
request page size unless ``--page-size`` is provided to override the fetch size.
3436
- ``clob upload --overwrite`` replaces an existing clob.
3537
- ``clob update`` supports partial updates and ``--ignore-nulls`` behavior.
3638

@@ -88,6 +90,28 @@ Examples:
8890
# Anonymous list
8991
cwms-cli clob list --office SWT --api-root http://localhost:8082/cwms-data --anonymous
9092
93+
List pagination
94+
---------------
95+
96+
``cwms-cli clob list`` can cap the local output and also control how many rows
97+
the CDA clob endpoint returns for the request.
98+
99+
- ``--limit`` caps how many rows cwms-cli prints or writes.
100+
- When ``--limit`` is set, cwms-cli also uses that value as the clob endpoint
101+
request ``page_size``.
102+
- Use ``--page-size`` to override the request size explicitly, especially if
103+
you want to fetch more rows than you plan to display.
104+
105+
Examples:
106+
107+
.. code-block:: bash
108+
109+
# Fetch and show up to 250 rows
110+
cwms-cli clob list --office SWT --limit 250
111+
112+
# Fetch 500 rows from CDA but only show the first 50 locally
113+
cwms-cli clob list --office SWT --limit 50 --page-size 500
114+
91115
.. _clob-overwrite-flag:
92116

93117
Overwrite behavior

tests/commands/test_clob.py

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,8 @@ def init_session(api_root, api_key):
207207
return None
208208

209209
@staticmethod
210-
def get_clobs(office_id, clob_id_like):
210+
def get_clobs(office_id, clob_id_like, page_size=None):
211+
calls.append(("get_clobs", office_id, clob_id_like, page_size))
211212
return pd.DataFrame([{"id": "TEST_CLOB", "description": "x"}])
212213

213214
monkeypatch.setitem(sys.modules, "cwms", FakeCwms)
@@ -219,13 +220,86 @@ def get_clobs(office_id, clob_id_like):
219220
sort_by=[],
220221
desc=False,
221222
limit=None,
223+
page_size=None,
222224
to_csv=None,
223225
office="SWT",
224226
api_root="https://example.test/",
225227
api_key="apikey 123",
226228
)
227229

228-
assert calls == [("init_session", "https://example.test/", "apikey 123")]
230+
assert calls == [
231+
("init_session", "https://example.test/", "apikey 123"),
232+
("get_clobs", "SWT", "TEST_.*", None),
233+
]
234+
235+
236+
def test_list_cmd_uses_limit_as_fetch_page_size(monkeypatch):
237+
calls = []
238+
239+
class FakeCwms:
240+
@staticmethod
241+
def init_session(api_root, api_key):
242+
return None
243+
244+
@staticmethod
245+
def get_clobs(office_id, clob_id_like, page_size=None):
246+
calls.append((office_id, clob_id_like, page_size))
247+
return pd.DataFrame(
248+
[
249+
{"id": "A", "description": "x"},
250+
{"id": "B", "description": "y"},
251+
]
252+
)
253+
254+
monkeypatch.setitem(sys.modules, "cwms", FakeCwms)
255+
monkeypatch.setattr("cwmscli.commands.clob.cwms", FakeCwms)
256+
257+
list_cmd(
258+
clob_id_like="TEST_.*",
259+
columns=[],
260+
sort_by=[],
261+
desc=False,
262+
limit=25,
263+
page_size=None,
264+
to_csv=None,
265+
office="SWT",
266+
api_root="https://example.test/",
267+
api_key="apikey 123",
268+
)
269+
270+
assert calls == [("SWT", "TEST_.*", 25)]
271+
272+
273+
def test_list_cmd_page_size_overrides_limit_for_fetch(monkeypatch):
274+
calls = []
275+
276+
class FakeCwms:
277+
@staticmethod
278+
def init_session(api_root, api_key):
279+
return None
280+
281+
@staticmethod
282+
def get_clobs(office_id, clob_id_like, page_size=None):
283+
calls.append((office_id, clob_id_like, page_size))
284+
return pd.DataFrame([{"id": "A", "description": "x"}])
285+
286+
monkeypatch.setitem(sys.modules, "cwms", FakeCwms)
287+
monkeypatch.setattr("cwmscli.commands.clob.cwms", FakeCwms)
288+
289+
list_cmd(
290+
clob_id_like="TEST_.*",
291+
columns=[],
292+
sort_by=[],
293+
desc=False,
294+
limit=25,
295+
page_size=200,
296+
to_csv=None,
297+
office="SWT",
298+
api_root="https://example.test/",
299+
api_key="apikey 123",
300+
)
301+
302+
assert calls == [("SWT", "TEST_.*", 200)]
229303

230304

231305
def test_list_cmd_anonymous_skips_api_key(monkeypatch):
@@ -238,7 +312,8 @@ def init_session(api_root, api_key):
238312
return None
239313

240314
@staticmethod
241-
def get_clobs(office_id, clob_id_like):
315+
def get_clobs(office_id, clob_id_like, page_size=None):
316+
calls.append(("get_clobs", office_id, clob_id_like, page_size))
242317
return pd.DataFrame([{"id": "TEST_CLOB", "description": "x"}])
243318

244319
monkeypatch.setitem(sys.modules, "cwms", FakeCwms)
@@ -250,14 +325,18 @@ def get_clobs(office_id, clob_id_like):
250325
sort_by=[],
251326
desc=False,
252327
limit=None,
328+
page_size=None,
253329
to_csv=None,
254330
office="SWT",
255331
api_root="https://example.test/",
256332
api_key="apikey 123",
257333
anonymous=True,
258334
)
259335

260-
assert calls == [("init_session", "https://example.test/", None)]
336+
assert calls == [
337+
("init_session", "https://example.test/", None),
338+
("get_clobs", "SWT", "TEST_.*", None),
339+
]
261340

262341

263342
def test_delete_cmd_uses_query_override_for_special_char_ids(monkeypatch):

0 commit comments

Comments
 (0)