Skip to content

Commit 08b42fe

Browse files
Add support for Search URL
Co-authored-by: carlevison <[email protected]>
1 parent 505ef9b commit 08b42fe

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

cloudinary_cli/core/search.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,38 +27,46 @@
2727
@option("-A", "--auto_paginate", is_flag=True, help="Return all results. Will call Admin API multiple times.")
2828
@option("-F", "--force", is_flag=True, help="Skip confirmation when running --auto-paginate.")
2929
@option("-ff", "--filter_fields", multiple=True, help="Filter fields to return.")
30+
@option("-t", "--ttl", nargs=1, default=300, help="Set the Search URL TTL in seconds. Default: 300.")
31+
@option("-u", "--url", is_flag=True, help="Build a signed search URL.")
3032
@option("--json", nargs=1, help="Save JSON output to a file. Usage: --json <filename>")
3133
@option("--csv", nargs=1, help="Save CSV output to a file. Usage: --csv <filename>")
3234
@option("-d", "--doc", is_flag=True, help="Open Search API documentation page.")
3335
def search(query, with_field, sort_by, aggregate, max_results, next_cursor,
34-
auto_paginate, force, filter_fields, json, csv, doc):
36+
auto_paginate, force, filter_fields, ttl, url, json, csv, doc):
3537
if doc:
3638
return launch("https://cloudinary.com/documentation/search_api")
3739

3840
fields_to_keep = []
3941
if filter_fields:
4042
fields_to_keep = tuple(normalize_list_params(filter_fields)) + with_field
4143

42-
expression = cloudinary.search.Search().expression(" ".join(query))
44+
search = cloudinary.search.Search().expression(" ".join(query))
4345

4446
if auto_paginate:
4547
max_results = DEFAULT_MAX_RESULTS
4648
if with_field:
4749
for f in with_field:
48-
expression.with_field(f)
50+
search.with_field(f)
4951
if sort_by:
50-
expression.sort_by(*sort_by)
52+
search.sort_by(*sort_by)
5153
if aggregate:
52-
expression.aggregate(aggregate)
54+
search.aggregate(aggregate)
5355
if next_cursor:
54-
expression.next_cursor(next_cursor)
56+
search.next_cursor(next_cursor)
57+
if ttl:
58+
search.ttl(ttl)
5559

56-
expression.max_results(max_results)
60+
search.max_results(max_results)
5761

58-
res = execute_single_request(expression, fields_to_keep)
62+
if url:
63+
print(search.to_url())
64+
return True
65+
66+
res = execute_single_request(search, fields_to_keep)
5967

6068
if auto_paginate:
61-
res = handle_auto_pagination(res, expression, force, fields_to_keep)
69+
res = handle_auto_pagination(res, search, force, fields_to_keep)
6270

6371
print_json(res)
6472

test/test_cli_search_api.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,12 @@ def test_search(self, mocker):
2121
self.assertEqual(0, result.exit_code)
2222
self.assertIn('"foo": "bar"', result.output)
2323

24+
def test_search_url(self):
25+
result = self.runner.invoke(cli, ['search', 'cat', '-c', 'NEXT_CURSOR', '--ttl', '1000', '--url'])
26+
27+
self.assertEqual(0, result.exit_code)
28+
self.assertTrue(result.output.startswith("http"))
29+
self.assertIn('/search/', result.output)
30+
self.assertIn('eyJleHByZXNzaW9uIjoiY2F0IiwibWF4X3Jlc3VsdHMiOjEwfQ==', result.output)
31+
self.assertIn('1000', result.output)
32+
self.assertIn('NEXT_CURSOR', result.output)

0 commit comments

Comments
 (0)