Skip to content

Commit

Permalink
Added main module detection and command line construction, now should…
Browse files Browse the repository at this point in the history
… show the right name (instead of __main__.py) when called for modules

Co-Authored-By: Henry Fredrick Schreiner <[email protected]>
  • Loading branch information
KOLANICH and henryiii committed Apr 15, 2021
1 parent 532848b commit 294c191
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
9 changes: 7 additions & 2 deletions plumbum/cli/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from plumbum import colors, local
from plumbum.cli.i18n import get_translation_for
from plumbum.lib import getdoc, six
from plumbum.lib import getdoc, six, get_main_module_frame

from .switches import (
CountOf,
Expand Down Expand Up @@ -78,6 +78,7 @@ def __repr__(self):
# CLI Application base class
# ===================================================================================================

main_module_ending_rx = re.compile("\.__main__$")

class Application(object):
"""The base class for CLI applications; your "entry point" class should derive from it,
Expand Down Expand Up @@ -176,7 +177,11 @@ def __init__(self, executable):
# Filter colors

if self.PROGNAME is None:
self.PROGNAME = os.path.basename(executable)
spec = get_main_module_frame().f_globals.get("__spec__", None)
if spec:
self.PROGNAME = " ".join(("python -m", main_module_ending_rx.sub("", spec.name)))
else:
self.PROGNAME = os.path.basename(executable)
elif isinstance(self.PROGNAME, colors._style):
self.PROGNAME = self.PROGNAME | os.path.basename(executable)
elif colors.filter(self.PROGNAME) == "":
Expand Down
9 changes: 9 additions & 0 deletions plumbum/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,12 @@ def read_fd_decode_safely(fd, size=4096):
if i == 3:
raise
data += os.read(fd.fileno(), 1)

def get_main_module_frame():
"""
Gets the frame of the __main__ module (the one which is called with command line) of an app.
"""
fr = sys._getframe(0)
while fr and fr.f_globals["__name__"] != "__main__":
fr = fr.f_back
return fr

0 comments on commit 294c191

Please sign in to comment.