Skip to content

Commit 165468d

Browse files
Merge pull request #855 from valory-xyz/fix/click-flag-value-default-v2
fix: make Click flag_value defaults work across Click 8.1-8.3
2 parents 5f7da2c + 9ad3088 commit 165468d

File tree

3 files changed

+52
-21
lines changed

3 files changed

+52
-21
lines changed

aea/cli/packages.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ def package_manager(
8585
is_flag=True,
8686
help="Recalculate hashes in packages.json so that they match the local packages.",
8787
)
88+
# default=None workaround for Click <8.3 flag_value handling; see
89+
# aea/cli/utils/click_utils.py:registry_flag for details.
8890
@click.option(
8991
"--third-party",
9092
"sync_type",

aea/cli/utils/click_utils.py

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
# ------------------------------------------------------------------------------
2020
"""Module with click utils of the aea cli."""
2121

22+
import functools
2223
import os
2324
from collections import OrderedDict
2425
from contextlib import contextmanager
@@ -304,29 +305,42 @@ def registry_flag(
304305
default_registry = REGISTRY_LOCAL
305306

306307
def wrapper(f: Callable) -> Callable:
307-
_default = default_registry if mark_default else None
308-
f = option(
308+
# Workaround: Click <8.3 ignores default= on flag_value options and
309+
# uses the last-applied decorator's flag_value instead. Click >=8.3
310+
# honours default= but treats booleans literally. Using default=None
311+
# with a normalizing wrapper works across all supported versions.
312+
# If the Click lower bound is raised to >=8.3, this wrapper can be
313+
# removed and default=_resolve can be passed directly to the options.
314+
_resolve = default_registry if mark_default else None
315+
316+
@functools.wraps(f)
317+
def new_f(*args: Any, registry: Optional[str] = None, **kwargs: Any) -> Any:
318+
if registry is None:
319+
registry = _resolve
320+
return f(*args, registry=registry, **kwargs)
321+
322+
new_f = option(
309323
"--mixed",
310324
"registry",
311325
flag_value=REGISTRY_MIXED,
312326
help="To use a local and remote registries.",
313-
default=_default,
314-
)(f)
315-
f = option(
327+
default=None,
328+
)(new_f)
329+
new_f = option(
316330
"--remote",
317331
"registry",
318332
flag_value=REGISTRY_REMOTE,
319333
help="To use a remote registry.",
320-
default=_default,
321-
)(f)
322-
f = option(
334+
default=None,
335+
)(new_f)
336+
new_f = option(
323337
"--local",
324338
"registry",
325339
flag_value=REGISTRY_LOCAL,
326340
help="To use a local registry.",
327-
default=_default,
328-
)(f)
329-
return f
341+
default=None,
342+
)(new_f)
343+
return new_f
330344

331345
return wrapper
332346

@@ -350,22 +364,33 @@ def remote_registry_flag(
350364
default_registry = REMOTE_IPFS
351365

352366
def wrapper(f: Callable) -> Callable:
353-
_default = default_registry if mark_default else None
354-
f = option(
367+
# See registry_flag for explanation of this workaround.
368+
# Can be removed when Click lower bound is raised to >=8.3.
369+
_resolve = default_registry if mark_default else None
370+
371+
@functools.wraps(f)
372+
def new_f(
373+
*args: Any, remote_registry: Optional[str] = None, **kwargs: Any
374+
) -> Any:
375+
if remote_registry is None:
376+
remote_registry = _resolve
377+
return f(*args, remote_registry=remote_registry, **kwargs)
378+
379+
new_f = option(
355380
"--http",
356381
"remote_registry",
357382
flag_value=REMOTE_HTTP,
358383
help="To use an HTTP registry.",
359-
default=_default,
360-
)(f)
361-
f = option(
384+
default=None,
385+
)(new_f)
386+
new_f = option(
362387
"--ipfs",
363388
"remote_registry",
364389
flag_value=REMOTE_IPFS,
365390
help="To use an IPFS registry.",
366-
default=_default,
367-
)(f)
368-
return f
391+
default=None,
392+
)(new_f)
393+
return new_f
369394

370395
return wrapper
371396

scripts/update_package_versions.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,18 +850,20 @@ def _ask_to_user_and_replace_if_allowed(
850850
is_flag=True,
851851
help="Ask for every package version interactively",
852852
)
853+
# default=None workaround for Click <8.3 flag_value handling; see
854+
# aea/cli/utils/click_utils.py:registry_flag for details.
853855
@click.option(
854856
"--update-minor",
855857
"update_version",
856858
flag_value="minor",
857-
default="minor",
859+
default=None,
858860
help="Increase minor version",
859861
)
860862
@click.option(
861863
"--update-patch",
862864
"update_version",
863865
flag_value="patch",
864-
default="minor",
866+
default=None,
865867
help="Increase patch version",
866868
)
867869
@click.option(
@@ -885,6 +887,8 @@ def _ask_to_user_and_replace_if_allowed(
885887
)
886888
def command(ask_version, update_version, replace_by_default, no_interactive, context):
887889
"""Run cli command."""
890+
if update_version is None:
891+
update_version = "minor"
888892
Updater(
889893
ask_version, update_version, replace_by_default, no_interactive, context
890894
).run()

0 commit comments

Comments
 (0)