Skip to content

Commit f1f6aaf

Browse files
committed
Load repository info for CLI defaults
1 parent 7175675 commit f1f6aaf

File tree

1 file changed

+67
-25
lines changed

1 file changed

+67
-25
lines changed

src/labels/cli.py

Lines changed: 67 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import sys
44
import typing
55

6+
import attr
67
import click
78
from requests.auth import HTTPBasicAuth
89

@@ -53,13 +54,49 @@ def labels(ctx, username: str, token: str, verbose: bool) -> None:
5354
else:
5455
logger.setLevel(logging.INFO)
5556

56-
ctx.obj = Client(HTTPBasicAuth(username, token))
57+
ctx.obj = LabelsContext(Client(HTTPBasicAuth(username, token)))
58+
59+
60+
@click.pass_obj
61+
def default_owner(labels_context: LabelsContext) -> str:
62+
"""Load repository owner information from the local working tree."""
63+
if labels_context.repository is None:
64+
repository = utils.load_repository_info()
65+
if repository is None:
66+
raise click.BadParameter("Unable to load repository information.")
67+
labels_context.repository = repository
68+
return labels_context.repository.owner
69+
70+
71+
@click.pass_obj
72+
def default_repo(labels_context: LabelsContext) -> str:
73+
"""Load repository name information from the local working tree."""
74+
if labels_context.repository is None:
75+
repository = utils.load_repository_info()
76+
if repository is None:
77+
raise click.BadParameter("Unable to load repository information.")
78+
labels_context.repository = repository
79+
return labels_context.repository.name
5780

5881

5982
@labels.command("fetch")
6083
@click.pass_obj
61-
@click.option("-o", "--owner", help="GitHub owner name", type=str)
62-
@click.option("-r", "--repo", help="GitHub repository name", type=str)
84+
@click.option(
85+
"-o",
86+
"--owner",
87+
help="GitHub owner name",
88+
type=str,
89+
default=default_owner,
90+
required=True,
91+
)
92+
@click.option(
93+
"-r",
94+
"--repo",
95+
help="GitHub repository name",
96+
type=str,
97+
default=default_repo,
98+
required=True,
99+
)
63100
@click.option(
64101
"-f",
65102
"--filename",
@@ -68,19 +105,16 @@ def labels(ctx, username: str, token: str, verbose: bool) -> None:
68105
type=click.Path(),
69106
required=True,
70107
)
71-
def fetch_cmd(
72-
client: Client,
73-
owner: typing.Optional[str],
74-
repo: typing.Optional[str],
75-
filename: str,
76-
) -> None:
108+
def fetch_cmd(context: LabelsContext, owner: str, repo: str, filename: str) -> None:
77109
"""Fetch labels for a GitHub repository.
78110
79111
This will write the labels information to disk to the specified filename.
80112
"""
113+
114+
repository = Repository(owner, repo)
115+
81116
try:
82-
inferred_owner, inferred_repo = utils.get_owner_and_repo_from_cwd()
83-
labels = client.list_labels(owner or inferred_owner, repo or inferred_repo)
117+
labels = context.client.list_labels(repository)
84118
except LabelsException as exc:
85119
click.echo(str(exc))
86120
sys.exit(1)
@@ -93,8 +127,22 @@ def fetch_cmd(
93127

94128
@labels.command("sync")
95129
@click.pass_obj
96-
@click.option("-o", "--owner", help="GitHub owner name", type=str)
97-
@click.option("-r", "--repo", help="GitHub repository name", type=str)
130+
@click.option(
131+
"-o",
132+
"--owner",
133+
help="GitHub owner name",
134+
type=str,
135+
default=default_owner,
136+
required=True,
137+
)
138+
@click.option(
139+
"-r",
140+
"--repo",
141+
help="GitHub repository name",
142+
type=str,
143+
default=default_repo,
144+
required=True,
145+
)
98146
@click.option("-n", "--dryrun", help="Do not modify remote labels", is_flag=True)
99147
@click.option(
100148
"-f",
@@ -105,11 +153,7 @@ def fetch_cmd(
105153
required=True,
106154
)
107155
def sync_cmd(
108-
client: Client,
109-
owner: typing.Optional[str],
110-
repo: typing.Optional[str],
111-
filename: str,
112-
dryrun: bool,
156+
context: LabelsContext, owner: str, repo: str, filename: str, dryrun: bool
113157
) -> None:
114158
"""Sync labels with a GitHub repository.
115159
@@ -123,12 +167,10 @@ def sync_cmd(
123167

124168
local_labels = read_labels(filename)
125169

126-
inferred_owner, inferred_repo = utils.get_owner_and_repo_from_cwd()
127-
owner = owner or inferred_owner
128-
repo = repo or inferred_repo
170+
repository = Repository(owner, repo)
129171

130172
try:
131-
remote_labels = {l.name: l for l in client.list_labels(owner, repo)}
173+
remote_labels = {l.name: l for l in context.client.list_labels(repository)}
132174
except LabelsException as exc:
133175
click.echo(str(exc), err=True)
134176
sys.exit(1)
@@ -174,21 +216,21 @@ def sync_cmd(
174216

175217
for name in labels_to_delete.keys():
176218
try:
177-
client.delete_label(owner, repo, name=name)
219+
context.client.delete_label(repository, name=name)
178220
except LabelsException as exc:
179221
click.echo(str(exc), err=True)
180222
failures.append(name)
181223

182224
for name, label in labels_to_update.items():
183225
try:
184-
client.edit_label(owner, repo, name=name, label=label)
226+
context.client.edit_label(repository, name=name, label=label)
185227
except LabelsException as exc:
186228
click.echo(str(exc), err=True)
187229
failures.append(name)
188230

189231
for name, label in labels_to_create.items():
190232
try:
191-
client.create_label(owner, repo, label=label)
233+
context.client.create_label(repository, label=label)
192234
except LabelsException as exc:
193235
click.echo(str(exc), err=True)
194236
failures.append(name)

0 commit comments

Comments
 (0)