Source code for PyOpenWorm.cli
from __future__ import print_function
import sys
import json
from tqdm import tqdm
import six
from .cli_command_wrapper import CLICommandWrapper, CLIUserError
from .command import POW, GenericUserError
from .git_repo import GitRepoProvider
[docs]def additional_args(parser):
'Add some additional options specific to CLI'
parser.add_argument('--output-mode', default='text',
help='How to print the results of a command'
' (if any). Either "json" or "text" (the default)')
parser.add_argument('--text-field-separator', default='\t',
help='Separator to use between fields in text-mode output')
parser.add_argument('--text-record-separator', default='\n',
help='Separator to use between records in text-mode output')
class NSHandler(object):
def __init__(self, **kwargs):
self.opts = dict(kwargs)
def __getitem__(self, k):
return self.opts[k]
def __getattr__(self, k):
return self.opts[k]
def __call__(self, ns):
self.opts['output_mode'] = ns.output_mode
self.opts['text_field_separator'] = ns.text_field_separator
self.opts['text_record_separator'] = ns.text_record_separator
class JSONSerializer(object):
def __call__(self, o):
from rdflib.graph import Graph
from PyOpenWorm.context import Context
if isinstance(o, Graph):
# eventually, we will use something like JSON-LD
return []
elif isinstance(o, Context):
return {'identifier': o.identifier,
'base_namespace': o.base_namespace}
else:
return list(o)
def main():
import logging
logging.basicConfig()
p = POW()
p.log_level = 'WARN'
p.message = print
p.progress_reporter = tqdm
p.repository_provider = GitRepoProvider()
ns_handler = NSHandler()
out = None
try:
out = CLICommandWrapper(p).main(argument_callback=additional_args,
argument_namespace_callback=ns_handler)
except (CLIUserError, GenericUserError) as e:
s = str(e)
if not s:
from yarom.utils import FCN
# In case someone forgets to add a helpful message for their user error
s = 'Received error: ' + FCN(type(e))
print(s, file=sys.stderr)
output_mode = ns_handler.output_mode
text_field_separator = ns_handler.text_field_separator
text_record_separator = ns_handler.text_record_separator
if out is not None:
if output_mode == 'json':
json.dump(out, sys.stdout, default=JSONSerializer(), indent=2)
elif output_mode == 'text':
if isinstance(out, dict):
for k, v in out.items():
print('{}{}{}'.format(k, text_field_separator, v), end=text_record_separator)
elif isinstance(out, six.string_types):
print(out)
else:
try:
iterable = (x for x in out)
except TypeError:
print(out)
else:
for x in iterable:
print(x, end=text_record_separator)