Skip to content

Commit 2eb9c38

Browse files
Fix the code
1 parent 2872493 commit 2eb9c38

File tree

4 files changed

+114
-45
lines changed

4 files changed

+114
-45
lines changed

cloudsmith_cli/cli/commands/list_.py

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def entitlements_(*args, **kwargs): # pylint: disable=missing-docstring
128128
help=("A boolean-like search term for querying package attributes."),
129129
)
130130
@click.pass_context
131-
def packages(ctx, opts, owner_repo, page, page_size, query):
131+
def packages(ctx, opts, owner_repo, page, page_size, query, show_all):
132132
"""
133133
List packages for a repository.
134134
@@ -176,9 +176,29 @@ def packages(ctx, opts, owner_repo, page, page_size, query):
176176
context_msg = "Failed to get list of packages!"
177177
with handle_api_exceptions(ctx, opts=opts, context_msg=context_msg):
178178
with maybe_spinner(opts):
179-
packages_, page_info = list_packages(
180-
owner=owner, repo=repo, page=page, page_size=page_size, query=query
181-
)
179+
if show_all:
180+
packages_ = []
181+
current_page = 1
182+
while True:
183+
page_packages, page_info = list_packages(
184+
owner=owner,
185+
repo=repo,
186+
page=current_page,
187+
page_size=page_size,
188+
query=query,
189+
)
190+
packages_.extend(page_packages)
191+
if (
192+
len(page_packages) < page_size
193+
or current_page >= page_info.page_total
194+
):
195+
break
196+
current_page += 1
197+
page_info.count = len(packages_)
198+
else:
199+
packages_, page_info = list_packages(
200+
owner=owner, repo=repo, page=page, page_size=page_size, query=query
201+
)
182202

183203
click.secho("OK", fg="green", err=use_stderr)
184204

@@ -209,10 +229,17 @@ def packages(ctx, opts, owner_repo, page, page_size, query):
209229
click.echo()
210230

211231
num_results = len(packages_)
212-
list_suffix = "package%s visible" % ("s" if num_results != 1 else "")
213-
utils.pretty_print_list_info(
214-
num_results=num_results, page_info=page_info, suffix=list_suffix
215-
)
232+
list_suffix = "package%s" % ("s" if num_results != 1 else "")
233+
if show_all:
234+
utils.pretty_print_list_info(
235+
num_results=num_results, suffix=f"{list_suffix} retrieved", show_all=True
236+
)
237+
else:
238+
utils.pretty_print_list_info(
239+
num_results=num_results,
240+
page_info=page_info,
241+
suffix=f"{list_suffix} visible",
242+
)
216243

217244

218245
@list_.command()
@@ -229,7 +256,7 @@ def packages(ctx, opts, owner_repo, page, page_size, query):
229256
required=False,
230257
)
231258
@click.pass_context
232-
def repos(ctx, opts, owner_repo, page, page_size):
259+
def repos(ctx, opts, owner_repo, page, page_size, show_all):
233260
"""
234261
List repositories for a namespace (owner).
235262
@@ -242,7 +269,7 @@ def repos(ctx, opts, owner_repo, page, page_size):
242269
If OWNER isn't specified it'll default to the currently authenticated user
243270
(if any). If you're unauthenticated, no results will be returned.
244271
"""
245-
ctx.forward(get_repos)
272+
ctx.forward(get_repos, show_all=show_all)
246273

247274

248275
def _get_package_name(package):

cloudsmith_cli/cli/commands/repos.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from .main import main
1313

1414

15-
def print_repositories(opts, data, page_info=None, show_list_info=True):
15+
def print_repositories(opts, data, page_info=None, show_list_info=True, show_all=False):
1616
"""Print repositories as a table or output in another format."""
1717
headers = [
1818
"Name",
@@ -46,13 +46,23 @@ def print_repositories(opts, data, page_info=None, show_list_info=True):
4646
click.echo()
4747
utils.pretty_print_table(headers, rows)
4848

49+
if not show_list_info:
50+
return
51+
4952
click.echo()
5053

5154
num_results = len(data)
52-
list_suffix = "repositor%s visible" % ("ies" if num_results != 1 else "y")
53-
utils.pretty_print_list_info(
54-
num_results=num_results, page_info=page_info, suffix=list_suffix
55-
)
55+
list_suffix = "repositor%s" % ("ies" if num_results != 1 else "y")
56+
if show_all:
57+
utils.pretty_print_list_info(
58+
num_results=num_results, suffix=f"{list_suffix} retrieved", show_all=True
59+
)
60+
else:
61+
utils.pretty_print_list_info(
62+
num_results=num_results,
63+
page_info=page_info,
64+
suffix=f"{list_suffix} visible",
65+
)
5666

5767

5868
@main.group(cls=command.AliasGroup, name="repositories", aliases=["repos"])
@@ -83,7 +93,7 @@ def repositories(ctx, opts): # pylink: disable=unused-argument
8393
required=False,
8494
)
8595
@click.pass_context
86-
def get(ctx, opts, owner_repo, page, page_size):
96+
def get(ctx, opts, owner_repo, page, page_size, show_all):
8797
"""
8898
List repositories for a namespace (owner).
8999
@@ -118,17 +128,37 @@ def get(ctx, opts, owner_repo, page, page_size):
118128
context_msg = "Failed to get list of repositories!"
119129
with handle_api_exceptions(ctx, opts=opts, context_msg=context_msg):
120130
with maybe_spinner(opts):
121-
repos_, page_info = api.list_repos(
122-
owner=owner, repo=repo, page=page, page_size=page_size
123-
)
131+
if show_all:
132+
repos_ = []
133+
current_page = 1
134+
while True:
135+
page_repos, page_info = api.list_repos(
136+
owner=owner, repo=repo, page=current_page, page_size=page_size
137+
)
138+
repos_.extend(page_repos)
139+
if (
140+
len(page_repos) < page_size
141+
or current_page >= page_info.page_total
142+
):
143+
break
144+
current_page += 1
145+
page_info.count = len(repos_)
146+
else:
147+
repos_, page_info = api.list_repos(
148+
owner=owner, repo=repo, page=page, page_size=page_size
149+
)
124150

125151
click.secho("OK", fg="green", err=use_stderr)
126152

127153
if utils.maybe_print_as_json(opts, repos_, page_info):
128154
return
129155

130156
print_repositories(
131-
opts=opts, data=repos_, show_list_info=False, page_info=page_info
157+
opts=opts,
158+
data=repos_,
159+
show_list_info=True,
160+
page_info=page_info,
161+
show_all=show_all,
132162
)
133163

134164

cloudsmith_cli/cli/decorators.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ def common_cli_list_options(f):
160160
help="The amount of items to view per page for lists.",
161161
callback=validators.validate_page_size,
162162
)
163+
@click.option(
164+
"--show-all",
165+
is_flag=True,
166+
default=False,
167+
help="Show all results by automatically paginating",
168+
)
163169
@click.pass_context
164170
@functools.wraps(f)
165171
def wrapper(ctx, *args, **kwargs):

cloudsmith_cli/cli/utils.py

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,38 @@ def make_user_agent(prefix=None):
1818
return f"cloudsmith-cli/{prefix} cli:{get_cli_version()} api:{get_api_version()}"
1919

2020

21-
def pretty_print_list_info(num_results, page_info=None, suffix=None):
22-
"""Pretty print list info, with pagination, for user display."""
23-
num_results_fg = "green" if num_results else "red"
24-
num_results_text = click.style(str(num_results), fg=num_results_fg)
25-
26-
if page_info and page_info.is_valid:
27-
page_range = page_info.calculate_range(num_results)
28-
page_info_text = f"page: {click.style(str(page_info.page), bold=True)}/{click.style(str(page_info.page_total), bold=True)}, page size: {click.style(str(page_info.page_size), bold=True)}"
29-
range_results_text = "%(from)s-%(to)s (%(num_results)s) of %(total)s" % {
30-
"num_results": num_results_text,
31-
"from": click.style(str(page_range[0]), fg=num_results_fg),
32-
"to": click.style(str(page_range[1]), fg=num_results_fg),
33-
"total": click.style(str(page_info.count), fg=num_results_fg),
34-
}
21+
def pretty_print_list_info(num_results, page_info=None, suffix="", show_all=False):
22+
"""Print information about list results."""
23+
if show_all:
24+
click.echo(
25+
"Results: %(num_results)d %(suffix)s"
26+
% {
27+
"num_results": num_results,
28+
"suffix": suffix,
29+
}
30+
)
31+
elif page_info:
32+
start = (page_info.page - 1) * page_info.page_size + 1
33+
end = min(start + num_results - 1, page_info.count)
34+
click.echo(
35+
"Results: %(start)d-%(end)d (%(count)d) of %(total)d %(suffix)s "
36+
"(page: %(page)d/%(pages)d, page size: %(page_size)d)"
37+
% {
38+
"start": start,
39+
"end": end,
40+
"count": num_results,
41+
"total": page_info.count,
42+
"suffix": suffix,
43+
"page": page_info.page,
44+
"pages": page_info.page_total,
45+
"page_size": page_info.page_size,
46+
}
47+
)
3548
else:
36-
page_info_text = ""
37-
range_results_text = num_results_text
38-
39-
click.secho(
40-
"Results: %(range_results)s %(suffix)s%(page_info)s"
41-
% {
42-
"range_results": range_results_text,
43-
"page_info": " (%s)" % page_info_text if page_info_text else "",
44-
"suffix": suffix or "item(s)",
45-
}
46-
)
49+
click.echo(
50+
"Results: %(num_results)d %(suffix)s"
51+
% {"num_results": num_results, "suffix": suffix}
52+
)
4753

4854

4955
def fmt_datetime(value):

0 commit comments

Comments
 (0)