#!/usr/bin/env python
__author__ = "Vanessa Sochat"
__copyright__ = "Copyright 2021, Vanessa Sochat"
__license__ = "MPL 2.0"
import contributor_ci
from contributor_ci.logger import setup_logger
import argparse
import sys
import os
[docs]def get_parser():
parser = argparse.ArgumentParser(
description="Contributor CI",
formatter_class=argparse.RawTextHelpFormatter,
)
parser.add_argument(
"--debug",
dest="debug",
help="use verbose logging to debug.",
default=False,
action="store_true",
)
parser.add_argument(
"--quiet",
dest="quiet",
help="suppress additional output.",
default=False,
action="store_true",
)
parser.add_argument(
"-c",
"--config-file",
dest="config_file",
help="custom path to contributor-ci.yaml file.",
default="contributor-ci.yaml",
)
parser.add_argument(
"-o",
"--out-dir",
dest="outdir",
help="Specify a custom output directory (defaults to $PWD/.cci)",
default=None,
)
parser.add_argument(
"--version",
dest="version",
help="suppress additional output.",
default=False,
action="store_true",
)
description = "actions for Contributor CI"
subparsers = parser.add_subparsers(
help="contributor-ci actions",
title="actions",
description=description,
dest="command",
)
# print version and exit
subparsers.add_parser("version", help="show software version")
init = subparsers.add_parser("init", help="Create a contributor-ci.yaml.")
init.add_argument("username", help="GitHub user or org name to base off of.")
cfa = subparsers.add_parser("cfa", help="Contributor Friendliness Assessment")
cfa.add_argument(
"-t",
"--terminal",
action="store_true",
default=False,
help="print output to the terminal.",
)
cfa.add_argument(
"repo", help="repository or 'all' to run for a contributor-ci.yaml file."
)
config = subparsers.add_parser(
"config",
description="update configuration file. Use sort, edit, add, or remove to edit fields.",
formatter_class=argparse.RawTextHelpFormatter,
)
config.add_argument(
"params",
nargs="*",
help="edit, add, remove, or sort",
type=str,
)
# See extractors
listing = subparsers.add_parser(
"list",
description="see extractors available",
)
listing.add_argument(
"query",
help="search extractors by a query string",
nargs="?",
default=None,
)
# Local shell with client loaded
shell = subparsers.add_parser(
"shell", help="shell into a Python session with a client."
)
shell.add_argument("module_name", help="module to inspect", nargs="?")
shell.add_argument(
"--interpreter",
"-i",
dest="interpreter",
help="python interpreter",
choices=["ipython", "python", "bpython"],
default="ipython",
)
# Extract metrics for a repository
extract = subparsers.add_parser(
"extract", description="extract metrics for a repository."
)
extract.add_argument("method", help="extraction method", nargs="*")
extract.add_argument(
"--save-format",
dest="save_format",
help="use a custom save format (e.g., year/month) defaults to year/month/day",
)
# Generate an interface with extractions, a GitHub workflow to run updates,
# and contributor friendliness files.
ui = subparsers.add_parser(
"ui", description="generate or update a CCI user interface."
)
ui.add_argument("ui_command", help="generate or update.", nargs="*")
ui.add_argument(
"--cfa",
dest="include_cfa",
help="include contributor friendliness assessments for generate or update.",
default=False,
action="store_true",
)
return parser
[docs]def run():
parser = get_parser()
def help(return_code=0):
"""print help, including the software version and active client
and exit with return code.
"""
version = contributor_ci.__version__
print("\nContributor CI v%s" % version)
parser.print_help()
sys.exit(return_code)
# If the user didn't provide any arguments, show the full help
if len(sys.argv) == 1:
help()
# If an error occurs while parsing the arguments, the interpreter will exit with value 2
args, extra = parser.parse_known_args()
if args.debug is True:
os.environ["MESSAGELEVEL"] = "DEBUG"
# Show the version and exit
if args.command == "version" or args.version:
print(contributor_ci.__version__)
sys.exit(0)
setup_logger(
quiet=args.quiet,
debug=args.debug,
)
# retrieve subparser (with help) from parser
helper = None
subparsers_actions = [
action
for action in parser._actions
if isinstance(action, argparse._SubParsersAction)
]
for subparsers_action in subparsers_actions:
for choice, subparser in subparsers_action.choices.items():
if choice == args.command:
helper = subparser
break
if args.command == "cfa":
from .cfa import main
if args.command == "extract":
from .extract import main
if args.command == "init":
from .init import main
if args.command == "list":
from .listing import main
elif args.command == "shell":
from .shell import main
elif args.command == "config":
from .config import main
elif args.command == "ui":
from .ui import main
# Pass on to the correct parser
return_code = 0
try:
main(args=args, parser=parser, extra=extra, subparser=helper)
sys.exit(return_code)
except UnboundLocalError:
return_code = 1
help(return_code)
if __name__ == "__main__":
run()