Skip to content

Commit a959a5c

Browse files
CENG-355: Add --show-all flag to display all results from repo/package list (#172)
* Add --show-all flag to paginated commands
1 parent 4021df8 commit a959a5c

File tree

19 files changed

+340
-84
lines changed

19 files changed

+340
-84
lines changed

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 1.9.2
2+
current_version = 1.9.3
33
commit = True
44
tag = True
55
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<revision>\d+)

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
77

88
## [Unreleased]
99

10+
## [1.9.3] - 2025-11-07
11+
12+
- [[Issue-170]](https://github.com/cloudsmith-io/cloudsmith-cli/issues/170) - Add flag to get all pages
13+
1014
## [1.9.2] - 2025-11-06
1115

1216
### Fixed

CONTRIBUTING.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ For most purposes, you probably just want `pip install -r requirements.txt`.
2222

2323
Our [direnv config](./.envrc) file codifies the development environment setup which we use internally.
2424

25-
2625
## Coding Conventions
2726

2827
Please ensure code conforms to [PEP-8](https://www.python.org/dev/peps/pep-0008/) and [PEP-257](https://www.python.org/dev/peps/pep-0257/).

cloudsmith_cli/cli/commands/dependencies.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def list_dependencies(ctx, opts, owner_repo_package):
4242
for the package format yet.
4343
4444
- OWNER/REPO/PACKAGE: Specify the OWNER namespace (i.e. user or org), the
45-
REPO name where the package is stored, and the PACKAGE name (identifier) of the
45+
REPO name where the package is stored, and the PACKAGE name (identifier/slug) of the
4646
package itself. All separated by a slash.
4747
4848
Example: 'your-org/awesome-repo/better-pkg'.

cloudsmith_cli/cli/commands/list_.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from ...core.api.distros import list_distros
99
from ...core.api.packages import get_package_format_names_with_distros, list_packages
10+
from ...core.pagination import paginate_results
1011
from .. import command, decorators, utils, validators
1112
from ..exceptions import handle_api_exceptions
1213
from ..utils import maybe_spinner
@@ -156,7 +157,7 @@ def entitlements_(*args, **kwargs): # pylint: disable=missing-docstring
156157
help=("Sort packages by field. Prefix with '-' for descending order."),
157158
)
158159
@click.pass_context
159-
def packages(ctx, opts, owner_repo, page, page_size, query, sort):
160+
def packages(ctx, opts, owner_repo, page, page_size, query, sort, show_all):
160161
"""
161162
List packages for a repository.
162163
@@ -217,11 +218,13 @@ def packages(ctx, opts, owner_repo, page, page_size, query, sort):
217218
context_msg = "Failed to get list of packages!"
218219
with handle_api_exceptions(ctx, opts=opts, context_msg=context_msg):
219220
with maybe_spinner(opts):
220-
packages_, page_info = list_packages(
221-
owner=owner,
222-
repo=repo,
221+
packages_, page_info = paginate_results(
222+
list_packages,
223+
show_all=show_all,
223224
page=page,
224225
page_size=page_size,
226+
owner=owner,
227+
repo=repo,
225228
query=query,
226229
sort=sort,
227230
)
@@ -256,9 +259,12 @@ def packages(ctx, opts, owner_repo, page, page_size, query, sort):
256259
click.echo()
257260

258261
num_results = len(packages_)
259-
list_suffix = "package%s visible" % ("s" if num_results != 1 else "")
262+
list_suffix = "package%s" % ("s" if num_results != 1 else "")
260263
utils.pretty_print_list_info(
261-
num_results=num_results, page_info=page_info, suffix=list_suffix
264+
num_results=num_results,
265+
page_info=None if show_all else page_info,
266+
suffix=f"{list_suffix} retrieved" if show_all else f"{list_suffix} visible",
267+
show_all=show_all,
262268
)
263269

264270

@@ -276,7 +282,7 @@ def packages(ctx, opts, owner_repo, page, page_size, query, sort):
276282
required=False,
277283
)
278284
@click.pass_context
279-
def repos(ctx, opts, owner_repo, page, page_size):
285+
def repos(ctx, opts, owner_repo, page, page_size, show_all):
280286
"""
281287
List repositories for a namespace (owner).
282288

cloudsmith_cli/cli/commands/policy/license.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import click
66

77
from ....core.api import orgs as api
8+
from ....core.pagination import paginate_results
89
from ... import command, decorators, utils, validators
910
from ...exceptions import handle_api_exceptions
1011
from ...utils import (
@@ -19,7 +20,6 @@
1920

2021
def print_license_policies(policies):
2122
"""Print license policies as a table or output in another format."""
22-
2323
headers = [
2424
"Name",
2525
"Description",
@@ -57,10 +57,6 @@ def print_license_policies(policies):
5757
utils.pretty_print_table(headers, rows)
5858
click.echo()
5959

60-
num_results = len(rows)
61-
list_suffix = "license polic%s" % ("y" if num_results == 1 else "ies")
62-
utils.pretty_print_list_info(num_results=num_results, suffix=list_suffix)
63-
6460

6561
@policy.group(cls=command.AliasGroup, name="license", aliases=[])
6662
@decorators.common_cli_config_options
@@ -86,7 +82,7 @@ def licence(*args, **kwargs):
8682
"owner", metavar="OWNER", callback=validators.validate_owner, required=True
8783
)
8884
@click.pass_context
89-
def ls(ctx, opts, owner, page, page_size):
85+
def ls(ctx, opts, owner, page, page_size, show_all):
9086
"""
9187
List license policies.
9288
@@ -111,8 +107,8 @@ def ls(ctx, opts, owner, page, page_size):
111107
context_msg = "Failed to get license policies!"
112108
with handle_api_exceptions(ctx, opts=opts, context_msg=context_msg):
113109
with maybe_spinner(opts):
114-
policies, page_info = api.list_license_policies(
115-
owner=owner, page=page, page_size=page_size
110+
policies, page_info = paginate_results(
111+
api.list_license_policies, show_all, page, page_size, owner=owner
116112
)
117113

118114
click.secho("OK", fg="green", err=use_stderr)
@@ -122,6 +118,17 @@ def ls(ctx, opts, owner, page, page_size):
122118

123119
print_license_policies(policies)
124120

121+
click.echo()
122+
123+
num_results = len(policies)
124+
list_suffix = "license polic%s" % ("y" if num_results == 1 else "ies")
125+
utils.pretty_print_list_info(
126+
num_results=num_results,
127+
page_info=None if show_all else page_info,
128+
suffix=list_suffix,
129+
show_all=show_all,
130+
)
131+
125132

126133
@licence.command(aliases=["new"])
127134
@decorators.common_cli_config_options

cloudsmith_cli/cli/commands/policy/vulnerability.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import click
66

77
from ....core.api import orgs as api
8+
from ....core.pagination import paginate_results
89
from ... import command, decorators, utils, validators
910
from ...exceptions import handle_api_exceptions
1011
from ...utils import fmt_bool, fmt_datetime, maybe_spinner, maybe_truncate_string
@@ -46,10 +47,6 @@ def print_vulnerability_policies(policies):
4647
utils.pretty_print_table(headers, rows, title="Vulnerability Policies")
4748
click.echo()
4849

49-
num_results = len(rows)
50-
list_suffix = "vulnerability polic%s" % ("y" if num_results == 1 else "ies")
51-
utils.pretty_print_list_info(num_results=num_results, suffix=list_suffix)
52-
5350

5451
@policy.group(cls=command.AliasGroup, name="vulnerability", aliases=[])
5552
@decorators.common_cli_config_options
@@ -75,7 +72,7 @@ def vulnerability(*args, **kwargs):
7572
"owner", metavar="OWNER", callback=validators.validate_owner, required=True
7673
)
7774
@click.pass_context
78-
def ls(ctx, opts, owner, page, page_size):
75+
def ls(ctx, opts, owner, page, page_size, show_all):
7976
"""
8077
List vulnerability policies.
8178
@@ -100,8 +97,8 @@ def ls(ctx, opts, owner, page, page_size):
10097
context_msg = "Failed to get package vulnerability policies!"
10198
with handle_api_exceptions(ctx, opts=opts, context_msg=context_msg):
10299
with maybe_spinner(opts):
103-
policies, page_info = api.list_vulnerability_policies(
104-
owner=owner, page=page, page_size=page_size
100+
policies, page_info = paginate_results(
101+
api.list_vulnerability_policies, show_all, page, page_size, owner=owner
105102
)
106103

107104
click.secho("OK", fg="green", err=use_stderr)
@@ -111,6 +108,17 @@ def ls(ctx, opts, owner, page, page_size):
111108

112109
print_vulnerability_policies(policies)
113110

111+
click.echo()
112+
113+
num_results = len(policies)
114+
list_suffix = "vulnerability polic%s" % ("y" if num_results == 1 else "ies")
115+
utils.pretty_print_list_info(
116+
num_results=num_results,
117+
page_info=None if show_all else page_info,
118+
suffix=list_suffix,
119+
show_all=show_all,
120+
)
121+
114122

115123
@vulnerability.command(aliases=["new"])
116124
@decorators.common_cli_config_options

cloudsmith_cli/cli/commands/repos.py

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
import click
77

88
from ...core.api import repos as api
9+
from ...core.pagination import paginate_results
910
from .. import command, decorators, utils, validators
1011
from ..exceptions import handle_api_exceptions
1112
from ..utils import maybe_spinner
1213
from .main import main
1314

1415

15-
def print_repositories(opts, data, page_info=None, show_list_info=True):
16+
def print_repositories(opts, data, page_info=None, show_list_info=True, show_all=False):
1617
"""Print repositories as a table or output in another format."""
1718
headers = [
1819
"Name",
@@ -48,10 +49,16 @@ def print_repositories(opts, data, page_info=None, show_list_info=True):
4849

4950
click.echo()
5051

52+
if not show_list_info:
53+
return
54+
5155
num_results = len(data)
52-
list_suffix = "repositor%s visible" % ("ies" if num_results != 1 else "y")
56+
list_suffix = "repositor%s" % ("ies" if num_results != 1 else "y")
5357
utils.pretty_print_list_info(
54-
num_results=num_results, page_info=page_info, suffix=list_suffix
58+
num_results=num_results,
59+
page_info=None if show_all else page_info,
60+
suffix=f"{list_suffix} retrieved" if show_all else f"{list_suffix} visible",
61+
show_all=show_all,
5562
)
5663

5764

@@ -83,7 +90,7 @@ def repositories(ctx, opts): # pylink: disable=unused-argument
8390
required=False,
8491
)
8592
@click.pass_context
86-
def get(ctx, opts, owner_repo, page, page_size):
93+
def get(ctx, opts, owner_repo, page, page_size, show_all):
8794
"""
8895
List repositories for a namespace (owner).
8996
@@ -96,30 +103,34 @@ def get(ctx, opts, owner_repo, page, page_size):
96103
If OWNER isn't specified it'll default to the currently authenticated user
97104
(if any). If you're unauthenticated, no results will be returned.
98105
"""
99-
# Use stderr for messages if the output is something else (e.g. # JSON)
106+
# Use stderr for messages if the output is something else (e.g. JSON)
100107
use_stderr = opts.output != "pretty"
101108

102-
click.echo("Getting list of repositories ... ", nl=False, err=use_stderr)
103-
104109
if isinstance(owner_repo, list):
105110
if len(owner_repo) == 1:
106111
owner = owner_repo[0]
107112
repo = None
108113
else:
109114
owner, repo = owner_repo
110-
if isinstance(owner_repo, str):
115+
elif isinstance(owner_repo, str):
116+
repo = None
117+
owner = owner_repo or None
118+
else:
119+
owner = None
111120
repo = None
112121

113-
if owner_repo:
114-
owner = owner_repo
115-
else:
116-
owner = None
122+
if show_all and repo:
123+
raise click.UsageError(
124+
"The --show-all option cannot be used when specifying a single repository (OWNER/REPO). Omit the repository slug or remove --show-all."
125+
)
126+
127+
click.echo("Getting list of repositories ... ", nl=False, err=use_stderr)
117128

118129
context_msg = "Failed to get list of repositories!"
119130
with handle_api_exceptions(ctx, opts=opts, context_msg=context_msg):
120131
with maybe_spinner(opts):
121-
repos_, page_info = api.list_repos(
122-
owner=owner, repo=repo, page=page, page_size=page_size
132+
repos_, page_info = paginate_results(
133+
api.list_repos, show_all, page, page_size, owner=owner, repo=repo
123134
)
124135

125136
click.secho("OK", fg="green", err=use_stderr)
@@ -128,7 +139,11 @@ def get(ctx, opts, owner_repo, page, page_size):
128139
return
129140

130141
print_repositories(
131-
opts=opts, data=repos_, show_list_info=False, page_info=page_info
142+
opts=opts,
143+
data=repos_,
144+
show_list_info=True,
145+
page_info=page_info,
146+
show_all=show_all,
132147
)
133148

134149

@@ -192,7 +207,10 @@ def create(ctx, opts, owner, repo_config_file):
192207

193208
click.secho("OK", fg="green", err=use_stderr)
194209

195-
print_repositories(opts=opts, data=[repository], show_list_info=False)
210+
if utils.maybe_print_as_json(opts, [repository]):
211+
return
212+
213+
print_repositories(opts=opts, data=[repository], show_list_info=True)
196214

197215

198216
@repositories.command()
@@ -252,7 +270,10 @@ def update(ctx, opts, owner_repo, repo_config_file):
252270

253271
click.secho("OK", fg="green", err=use_stderr)
254272

255-
print_repositories(opts=opts, data=[repository], show_list_info=False)
273+
if utils.maybe_print_as_json(opts, [repository]):
274+
return
275+
276+
print_repositories(opts=opts, data=[repository], show_list_info=True)
256277

257278

258279
@repositories.command(aliases=["rm"])

0 commit comments

Comments
 (0)