Repository: tldr-pages/tldr-python-client

Issue:
"Documentation is not available" never shows up
Whenever an invalid command is entered `tldr: error: argument command: invalid choice: 'noexist' (choose from` and then all the commands available is printed instead of the `Consider contributing a Pull Request.....`

Bug is caused by https://github.com/tldr-pages/tldr-python-client/commit/d273fcd1c91d6aa6a8d4535d92feffecb2c02364, specifically the `choices=get_commands() + [[]]`

Discussion:

Patch:
diff --git a/tldr.py b/tldr.py
index bccf57b..7ca0233 100755
--- a/tldr.py
+++ b/tldr.py
@@ -15,7 +15,6 @@ from urllib.error import HTTPError, URLError
 from termcolor import colored
 import colorama  # Required for Windows
 import argcomplete
-from glob import glob
 
 __version__ = "1.0.0"
 __client_specification__ = "1.3"
@@ -223,17 +222,18 @@ LEADING_SPACES_NUM = 2
 
 COMMAND_SPLIT_REGEX = re.compile(r'(?P<param>{{.+?}})')
 PARAM_REGEX = re.compile(r'(?:{{)(?P<param>.+?)(?:}})')
-CACHE_FILE_REGEX = re.compile(r'.*\/(.*)\.md')
 
 
 def get_commands(platforms=None):
     if platforms is None:
         platforms = get_platform_list()
 
-    cache_files = []
-    for platform in platforms:
-        cache_files += glob(os.path.join(get_cache_dir(), 'pages', platform, '*.md'))
-    return [re.search(CACHE_FILE_REGEX, x).group(1) for x in cache_files]
+    commands = []
+    if os.path.exists(get_cache_dir()):
+        for platform in platforms:
+            path = os.path.join(get_cache_dir(), 'pages', platform)
+            commands += [file[:-3] for file in os.listdir(path) if file.endswith(".md")]
+    return commands
 
 
 def colors_of(key):
@@ -269,7 +269,7 @@ def output(page):
                     colored(
                         line.replace('>', '').replace('<', ''),
                         *colors_of('description')
-                    )
+                )
                 sys.stdout.buffer.write(line.encode('utf-8'))
             elif line[0] == '-':
                 line = '\n' + ' ' * LEADING_SPACES_NUM + \
@@ -381,9 +381,8 @@ def main():
                         help='Override the default language')
 
     parser.add_argument(
-        'command', type=str, nargs='*', help="command to lookup", metavar='command',
-        choices=get_commands() + [[]]
-    )
+        'command', type=str, nargs='*', help="command to lookup", metavar='command'
+    ).completer = argcomplete.completers.ChoicesCompleter(get_commands() + [[]])
 
     argcomplete.autocomplete(parser)
     options = parser.parse_args()


Test patch:
diff --git a/tests/test_tldr.py b/tests/test_tldr.py
index 53279b1..82061ac 100644
--- a/tests/test_tldr.py
+++ b/tests/test_tldr.py
@@ -2,7 +2,9 @@ import sys
 import io
 import types
 import unittest
+import unittest.mock
 import tldr
+import pytest
 
 
 class TLDRTests(unittest.TestCase):
@@ -12,7 +14,7 @@ class TLDRTests(unittest.TestCase):
                 old_stdout = sys.stdout
                 sys.stdout = io.StringIO()
                 sys.stdout.buffer = types.SimpleNamespace()
-                sys.stdout.buffer.write = lambda x: sys.stdout.write(x.decode('utf-8'))
+                sys.stdout.buffer.write = lambda x: sys.stdout.write(x.decode("utf-8"))
                 tldr.output(f_original)
 
                 sys.stdout.seek(0)
@@ -21,3 +23,12 @@ class TLDRTests(unittest.TestCase):
 
                 correct_output = f_rendered.read()
                 self.assertEqual(tldr_output, correct_output)
+
+    def test_error_message(self):
+        with unittest.mock.patch("sys.argv", ["tldr", "73eb6f19cd6f"]):
+            with pytest.raises(SystemExit) as pytest_wrapped_e:
+                tldr.main()
+            correct_output = "`73eb6f19cd6f` documentation is not available. Consider contributing Pull Request to https://github.com/tldr-pages/tldr"  # noqa
+            print("Test {}".format(pytest_wrapped_e))
+            assert pytest_wrapped_e.type == SystemExit
+            assert str(pytest_wrapped_e.value) == correct_output