move main into cli init and remove circular import layer

This commit is contained in:
Nick Sweeting 2020-07-02 03:53:39 -04:00
parent 3ec97e5528
commit 322be6b292
5 changed files with 61 additions and 83 deletions

View file

@ -1,7 +1 @@
__package__ = 'archivebox' __package__ = 'archivebox'
from . import core
from . import cli
# The main CLI source code, is in 'archivebox/main.py'
from .main import *

View file

@ -3,13 +3,8 @@
__package__ = 'archivebox' __package__ = 'archivebox'
import sys import sys
from .cli import archivebox
def main():
archivebox.main(args=sys.argv[1:], stdin=sys.stdin)
from .cli import main
if __name__ == '__main__': if __name__ == '__main__':
archivebox.main(args=sys.argv[1:], stdin=sys.stdin) main(args=sys.argv[1:], stdin=sys.stdin)

View file

@ -1,8 +1,13 @@
__package__ = 'archivebox.cli' __package__ = 'archivebox.cli'
__command__ = 'archivebox'
import os import os
import argparse
from typing import Optional, Dict, List, IO
from ..config import OUTPUT_DIR
from typing import Dict, List, Optional, IO
from importlib import import_module from importlib import import_module
CLI_DIR = os.path.dirname(os.path.abspath(__file__)) CLI_DIR = os.path.dirname(os.path.abspath(__file__))
@ -24,6 +29,7 @@ is_valid_cli_module = lambda module, subcommand: (
and module.__command__.split(' ')[-1] == subcommand and module.__command__.split(' ')[-1] == subcommand
) )
def list_subcommands() -> Dict[str, str]: def list_subcommands() -> Dict[str, str]:
"""find and import all valid archivebox_<subcommand>.py files in CLI_DIR""" """find and import all valid archivebox_<subcommand>.py files in CLI_DIR"""
@ -57,6 +63,53 @@ def run_subcommand(subcommand: str,
SUBCOMMANDS = list_subcommands() SUBCOMMANDS = list_subcommands()
def main(args: Optional[List[str]]=None, stdin: Optional[IO]=None, pwd: Optional[str]=None) -> None:
subcommands = list_subcommands()
parser = argparse.ArgumentParser(
prog=__command__,
description='ArchiveBox: The self-hosted internet archive',
add_help=False,
)
group = parser.add_mutually_exclusive_group()
group.add_argument(
'--help', '-h',
action='store_true',
help=subcommands['help'],
)
group.add_argument(
'--version',
action='store_true',
help=subcommands['version'],
)
group.add_argument(
"subcommand",
type=str,
help= "The name of the subcommand to run",
nargs='?',
choices=subcommands.keys(),
default=None,
)
parser.add_argument(
"subcommand_args",
help="Arguments for the subcommand",
nargs=argparse.REMAINDER,
)
command = parser.parse_args(args or ())
if command.help or command.subcommand is None:
command.subcommand = 'help'
if command.version:
command.subcommand = 'version'
run_subcommand(
subcommand=command.subcommand,
subcommand_args=command.subcommand_args,
stdin=stdin,
pwd=pwd or OUTPUT_DIR,
)
__all__ = ( __all__ = (
'SUBCOMMANDS', 'SUBCOMMANDS',
'list_subcommands', 'list_subcommands',

View file

@ -1,63 +0,0 @@
#!/usr/bin/env python3
# archivebox [command]
__package__ = 'archivebox.cli'
__command__ = 'archivebox'
import sys
import argparse
from typing import Optional, List, IO
from . import list_subcommands, run_subcommand
from ..config import OUTPUT_DIR
def main(args: Optional[List[str]]=None, stdin: Optional[IO]=None, pwd: Optional[str]=None) -> None:
subcommands = list_subcommands()
parser = argparse.ArgumentParser(
prog=__command__,
description='ArchiveBox: The self-hosted internet archive',
add_help=False,
)
group = parser.add_mutually_exclusive_group()
group.add_argument(
'--help', '-h',
action='store_true',
help=subcommands['help'],
)
group.add_argument(
'--version',
action='store_true',
help=subcommands['version'],
)
group.add_argument(
"subcommand",
type=str,
help= "The name of the subcommand to run",
nargs='?',
choices=subcommands.keys(),
default=None,
)
parser.add_argument(
"subcommand_args",
help="Arguments for the subcommand",
nargs=argparse.REMAINDER,
)
command = parser.parse_args(args or ())
if command.help or command.subcommand is None:
command.subcommand = 'help'
if command.version:
command.subcommand = 'version'
run_subcommand(
subcommand=command.subcommand,
subcommand_args=command.subcommand_args,
stdin=stdin,
pwd=pwd or OUTPUT_DIR,
)
if __name__ == '__main__':
main(args=sys.argv[1:], stdin=sys.stdin)

View file

@ -1,4 +1,3 @@
import os
import setuptools import setuptools
from pathlib import Path from pathlib import Path
@ -10,9 +9,9 @@ README = (BASE_DIR / "README.md").read_text()
VERSION = (SOURCE_DIR / "VERSION").read_text().strip() VERSION = (SOURCE_DIR / "VERSION").read_text().strip()
# To see when setup.py gets called (uncomment for debugging) # To see when setup.py gets called (uncomment for debugging)
import sys # import sys
print(SOURCE_DIR, f" (v{VERSION})") # print(SOURCE_DIR, f" (v{VERSION})")
print('>', sys.executable, *sys.argv) # print('>', sys.executable, *sys.argv)
# raise SystemExit(0) # raise SystemExit(0)
setuptools.setup( setuptools.setup(
@ -69,10 +68,10 @@ setuptools.setup(
# 'redis': ['redis', 'django-redis'], # 'redis': ['redis', 'django-redis'],
# 'pywb': ['pywb', 'redis'], # 'pywb': ['pywb', 'redis'],
}, },
packages=[PKG_NAME], packages=setuptools.find_packages(),
entry_points={ entry_points={
"console_scripts": [ "console_scripts": [
f"{PKG_NAME} = {PKG_NAME}.__main__:main", f"{PKG_NAME} = {PKG_NAME}.cli:main",
], ],
}, },
include_package_data=True, include_package_data=True,