-
-
Notifications
You must be signed in to change notification settings - Fork 141
Description
When defining a custom Completion and Action the parsed_args for Completer call are empty. This means I cannot use first completiion in second.
I am using macos 26.1 (Tahoe), Python 3.14.0, zsh (macOS)
Code:
#!/usr/bin/env python3
PYTHON_ARGCOMPLETE_OK
import os,sys
import argparse, argcomplete
from argcomplete.completers import FilesCompleter, ChoicesCompleter, BaseCompleter
from argcomplete import warn
class ArtistAction(argparse.Action):
""" Custom action to get artist id from artist name """
def call(self, parser, namespace, values, option_string=None):
""" Custom action to set arg to artist id based on artist name.
"""
warn(f"ArtistAction Entry: namespace={namespace}")
setattr(namespace, "test_artist", 10)
setattr(namespace,"artist", values)
warn(f"ArtistAction Exit: namespace={namespace}")
class AlbumAction(argparse.Action):
""" Custom action to get album id from album name """
def call(self, parser, namespace, values, option_string=None):
""" Custom action to set arg to album id based on album name.
"""
warn(f"AlbumAction Entry: namespace={namespace}")
setattr(namespace,"test_album", 10)
setattr(namespace,"album", values)
warn(f"AlbumAction Exit: namespace={namespace}")
class ArtistCompleter(BaseCompleter):
""" Completer for artist names """
def call(self, prefix, parser, parsed_args, **kwargs):
""" Complete artist names """
warn(f'ArtistCompleter: parsed_args={parsed_args}')
return ['Artist1', 'Artist2', 'Artist3']
class AlbumCompleter(BaseCompleter):
""" Completer for album names """
def call(self, prefix, parser, parsed_args, **kwargs):
""" Complete album names """
warn(f'AlbumCompleter: parsed_args={parsed_args}')
return ['Album1', 'Album2', 'Album3']
def get_args():
warn("Creating argument parser")
parser = argparse.ArgumentParser(description='Search for an artist on Spotify',formatter_class=argparse.ArgumentDefaultsHelpFormatter)
warn("Adding arguments")
# parser.add_argument('artist', help='An Artist').completer=ArtistCompleter()
# parser.add_argument('album', help='An Album').completer=AlbumCompleter()
# parser.add_argument('artist', action=ArtistAction, help='An Artist')
# parser.add_argument('album', action=AlbumAction, help='An Album')
parser.add_argument('artist', action=ArtistAction, help='An Artist').completer=ArtistCompleter()
parser.add_argument('album', action=AlbumAction, help='An Album').completer=AlbumCompleter()
#argcomplete.autocomplete(parser, always_complete_options=False)
warn("Calling argcomplete.autocomplete")
a = argparse.Namespace()
setattr(a, "check", 1)
argcomplete.autocomplete(parser)
#setattr(parser, 'sp', sp) # Add Spotify object to parser for access in actions
return parser.parse_args(namespace=a)
def test_search_artist():
args = get_args()
print(args)
def main():
test_search_artist()
if name == "main":
main()
results in:
ArtistCompleter: parsed_args=Namespace(artist=None, album=None)
test_completions.py
ArtistCompleter: parsed_args=Namespace(artist=None, album=None)
--help -h --test_completions.py Artist3
AlbumCompleter: parsed_args=Namespace(artist=None, album=None)
test_completions.py Artist3
AlbumCompleter: parsed_args=Namespace(artist=None, album=None)
--help -h -- shtest_completions.py Artist3 Album2
Creating argument parser
Adding arguments
Calling argcomplete.autocomplete
ArtistAction Entry: namespace=Namespace(check=1, artist=None, album=None)
ArtistAction Exit: namespace=Namespace(check=1, artist='Artist3', album=None, test_artist=10)
AlbumAction Entry: namespace=Namespace(check=1, artist='Artist3', album=None, test_artist=10)
AlbumAction Exit: namespace=Namespace(check=1, artist='Artist3', album='Album2', test_artist=10, test_album=10)
Namespace(check=1, artist='Artist3', album='Album2', test_artist=10, test_album=10)