1919# ------------------------------------------------------------------------------
2020"""Module with click utils of the aea cli."""
2121
22+ import functools
2223import os
2324from collections import OrderedDict
2425from 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
0 commit comments