diff env/lib/python3.9/site-packages/argcomplete/_check_console_script.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.9/site-packages/argcomplete/_check_console_script.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,57 @@
+"""
+Utility for locating the module (or package's __init__.py)
+associated with a given console_script name
+and verifying it contains the PYTHON_ARGCOMPLETE_OK marker.
+
+Such scripts are automatically generated and cannot contain
+the marker themselves, so we defer to the containing module or package.
+
+For more information on setuptools console_scripts, see
+https://setuptools.readthedocs.io/en/latest/setuptools.html#automatic-script-creation
+
+Intended to be invoked by argcomplete's global completion function.
+"""
+import os
+import sys
+
+try:
+    from importlib.metadata import entry_points as importlib_entry_points
+except ImportError:
+    from importlib_metadata import entry_points as importlib_entry_points
+
+from ._check_module import ArgcompleteMarkerNotFound, find
+
+
+def main():
+    # Argument is the full path to the console script.
+    script_path = sys.argv[1]
+
+    # Find the module and function names that correspond to this
+    # assuming it is actually a console script.
+    name = os.path.basename(script_path)
+    entry_points = [ep for ep in importlib_entry_points()["console_scripts"] if ep.name == name]
+    if not entry_points:
+        raise ArgcompleteMarkerNotFound('no entry point found matching script')
+    entry_point = entry_points[0]
+    module_name, function_name = entry_point.value.split(":", 1)
+
+    # Check this looks like the script we really expected.
+    with open(script_path) as f:
+        script = f.read()
+    if 'from {} import {}'.format(module_name, function_name) not in script:
+        raise ArgcompleteMarkerNotFound('does not appear to be a console script')
+    if 'sys.exit({}())'.format(function_name) not in script:
+        raise ArgcompleteMarkerNotFound('does not appear to be a console script')
+
+    # Look for the argcomplete marker in the script it imports.
+    with open(find(module_name, return_package=True)) as f:
+        head = f.read(1024)
+    if 'PYTHON_ARGCOMPLETE_OK' not in head:
+        raise ArgcompleteMarkerNotFound('marker not found')
+
+
+if __name__ == '__main__':
+    try:
+        main()
+    except ArgcompleteMarkerNotFound as e:
+        sys.exit(e)