chg: Set up the main running function to use handler functions (#45)
This commit is contained in:
Родитель
127a46123d
Коммит
14e0ad4e93
2
setup.py
2
setup.py
|
@ -75,7 +75,7 @@ setup(
|
|||
tests_require=extra_dependencies['tests'],
|
||||
extras_require=extra_dependencies,
|
||||
entry_points={
|
||||
'console_scripts': ['quilla = quilla:run'],
|
||||
'console_scripts': ['quilla = quilla:main'],
|
||||
'pytest11': [
|
||||
'quilla = pytest_quilla'
|
||||
]
|
||||
|
|
|
@ -67,7 +67,7 @@ class QuillaItem(pytest.Item):
|
|||
data retrieved from the JSON file.
|
||||
'''
|
||||
ctx = setup_context(
|
||||
[*self.config.getoption('--quilla-opts').split(), ''],
|
||||
[*self.config.getoption('--quilla-opts').split()],
|
||||
str(self.config.rootpath),
|
||||
recreate_context=True
|
||||
)
|
||||
|
|
|
@ -30,7 +30,7 @@ def make_parser() -> argparse.ArgumentParser: # pragma: no cover
|
|||
'''
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='quilla',
|
||||
usage='%(prog)s [options] [-f] JSON',
|
||||
# usage='%(prog)s [options] [-f] JSON',
|
||||
description='''
|
||||
Program to provide a report of UI validations given a json representation
|
||||
of the validations or given the filename containing a json document describing
|
||||
|
@ -44,16 +44,22 @@ def make_parser() -> argparse.ArgumentParser: # pragma: no cover
|
|||
help='Prints the version of the software and quits'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
data_group = parser.add_mutually_exclusive_group()
|
||||
|
||||
data_group.add_argument(
|
||||
'-f',
|
||||
'--file',
|
||||
dest='is_file',
|
||||
action='store_true',
|
||||
help='Whether to treat the argument as raw json or as a file',
|
||||
dest='file_name',
|
||||
action='store',
|
||||
help='A file containing a Quilla test',
|
||||
default=None,
|
||||
)
|
||||
parser.add_argument(
|
||||
'json',
|
||||
help='The json file name or raw json string',
|
||||
data_group.add_argument(
|
||||
'-r',
|
||||
'--raw',
|
||||
action='store',
|
||||
help='A Quilla test passed in as a raw string',
|
||||
default=None,
|
||||
)
|
||||
|
||||
config_group = parser.add_argument_group(title='Configuration options')
|
||||
|
@ -129,6 +135,9 @@ def make_parser() -> argparse.ArgumentParser: # pragma: no cover
|
|||
default=0
|
||||
)
|
||||
|
||||
# Sets the application handler, i.e. the function that runs when ctx.run() is called
|
||||
parser.set_defaults(handler=run)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
|
@ -277,10 +286,10 @@ def setup_context(
|
|||
if not parsed_args.definitions:
|
||||
parsed_args.definitions = []
|
||||
|
||||
if not parsed_args.is_file:
|
||||
json_data = parsed_args.json
|
||||
if parsed_args.file_name is None:
|
||||
json_data = parsed_args.raw
|
||||
else:
|
||||
with open(parsed_args.json) as f:
|
||||
with open(parsed_args.file_name) as f:
|
||||
json_data = f.read()
|
||||
|
||||
logger.debug('Initializing context object')
|
||||
|
@ -291,13 +300,14 @@ def setup_context(
|
|||
parsed_args.drivers_path,
|
||||
parsed_args.pretty,
|
||||
json_data,
|
||||
parsed_args.is_file,
|
||||
parsed_args.file_name is not None,
|
||||
parsed_args.no_sandbox,
|
||||
parsed_args.definitions,
|
||||
logger=logger,
|
||||
run_id=parsed_args.run_id,
|
||||
indent=parsed_args.indent,
|
||||
update_baseline=parsed_args.update_baseline,
|
||||
args=parsed_args,
|
||||
recreate_context=recreate_context,
|
||||
)
|
||||
|
||||
|
@ -307,15 +317,14 @@ def setup_context(
|
|||
return ctx
|
||||
|
||||
|
||||
def run():
|
||||
def run(ctx: Context):
|
||||
'''
|
||||
Creates the parser object, parses the command-line arguments, and runs them, finishing with the
|
||||
appropriate exit code.
|
||||
Runs all reports and prints to stdout while providing the proper
|
||||
exit code
|
||||
|
||||
Args:
|
||||
ctx: The application context
|
||||
'''
|
||||
ctx = setup_context(sys.argv[1:])
|
||||
|
||||
ctx.logger.debug('Context setup complete, running the "execute" function')
|
||||
|
||||
reports = execute(ctx)
|
||||
|
||||
ctx.logger.debug('Finished generating reports')
|
||||
|
@ -339,5 +348,15 @@ def run():
|
|||
sys.exit(exit_code)
|
||||
|
||||
|
||||
def main():
|
||||
'''
|
||||
Creates the context and parses all arguments, then runs the default handler function
|
||||
'''
|
||||
ctx = setup_context(sys.argv[1:])
|
||||
ctx.logger.debug('Context setup complete, running the Quilla handler')
|
||||
|
||||
ctx.run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
main()
|
||||
|
|
|
@ -2,4 +2,4 @@ import quilla # pragma: no cover
|
|||
|
||||
|
||||
if __name__ == '__main__': # pragma: no cover
|
||||
quilla.run()
|
||||
quilla.main()
|
||||
|
|
|
@ -15,6 +15,7 @@ from logging import (
|
|||
)
|
||||
import json
|
||||
import uuid
|
||||
from argparse import Namespace
|
||||
|
||||
from pluggy import PluginManager
|
||||
import pydeepmerge as pdm
|
||||
|
@ -41,6 +42,7 @@ class Context(DriverHolder):
|
|||
no_sandbox: Whether to pass the '--no-sandbox' arg to Chrome and Edge
|
||||
logger: An optional configured logger instance.
|
||||
run_id: A string that uniquely identifies the run of Quilla.
|
||||
args: The Namespace object that parsed related arguments, if applicable
|
||||
update_baseline: Whether the VisualParity baselines should be updated or not
|
||||
|
||||
|
||||
|
@ -59,6 +61,7 @@ class Context(DriverHolder):
|
|||
one with the default logger.
|
||||
run_id: A string that uniquely identifies the run of Quilla.
|
||||
pretty_print_indent: How many spaces to use for indentation when pretty-printing the output
|
||||
args: The Namespace object that parsed related arguments, if applicable
|
||||
update_baseline: Whether the VisualParity baselines should be updated or not
|
||||
'''
|
||||
default_context: Optional['Context'] = None
|
||||
|
@ -85,6 +88,7 @@ class Context(DriverHolder):
|
|||
logger: Optional[Logger] = None,
|
||||
run_id: Optional[str] = None,
|
||||
indent: int = 4,
|
||||
args: Optional[Namespace] = None,
|
||||
update_baseline: bool = False,
|
||||
):
|
||||
super().__init__()
|
||||
|
@ -96,6 +100,7 @@ class Context(DriverHolder):
|
|||
self.is_file = is_file
|
||||
self.no_sandbox = no_sandbox
|
||||
self.pretty_print_indent = indent
|
||||
self.args = args
|
||||
path = Path(drivers_path)
|
||||
|
||||
if logger is None:
|
||||
|
@ -115,6 +120,17 @@ class Context(DriverHolder):
|
|||
self._context_data: Dict[str, dict] = {'Validation': {}, 'Outputs': {}, 'Definitions': {}}
|
||||
self._load_definition_files(definitions)
|
||||
|
||||
def run(self):
|
||||
'''
|
||||
Runs Quilla, assuming a proper Namespace object with a handler has been passed in.
|
||||
|
||||
This function is not guaranteed to do anything, and is just a passthrough to allow
|
||||
the proper parser handlers to execute, as described in the documentation for ArgParse
|
||||
https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_subparsers
|
||||
'''
|
||||
if self.args is not None:
|
||||
self.args.handler(self)
|
||||
|
||||
@property
|
||||
def outputs(self) -> dict:
|
||||
'''
|
||||
|
@ -355,6 +371,7 @@ def get_default_context(
|
|||
logger: Optional[Logger] = None,
|
||||
run_id: Optional[str] = None,
|
||||
indent: int = 4,
|
||||
args: Optional[Namespace] = None,
|
||||
update_baseline: bool = False,
|
||||
) -> Context:
|
||||
'''
|
||||
|
@ -398,6 +415,7 @@ def get_default_context(
|
|||
logger,
|
||||
run_id,
|
||||
indent,
|
||||
update_baseline
|
||||
args,
|
||||
update_baseline,
|
||||
)
|
||||
return Context.default_context
|
||||
|
|
Загрузка…
Ссылка в новой задаче