def main(verbosity: str, rich: bool, path: Path, template: str): if rich: logger = RichOutputLog(sys.stdout) else: logger = log.TeeLog( log.FilterLog(log.StdoutLog(), maxlevel=log.proto.Level.user), log.FilterLog(log.StderrLog(), minlevel=log.proto.Level.warning), ) log.current = log.FilterLog(logger, minlevel=getattr(log.proto.Level, verbosity)) blocks = [ 'summary', 'experience', 'education', 'honors', 'publications', 'presentations', 'projects', 'committees', ] try: Resume(path, template).render({'blocks': blocks}, verbosity == 'debug') except Exception as err: if verbosity == 'debug': traceback.print_exc() else: print(err) sys.exit(1)
def main(ctx, verbosity, rich): if rich: logger = RichOutputLog(sys.stdout) else: logger = log.TeeLog( log.FilterLog(log.StdoutLog(), maxlevel=log.proto.Level.user), log.FilterLog(log.StderrLog(), minlevel=log.proto.Level.warning), ) log.current = log.FilterLog(logger, minlevel=getattr(log.proto.Level, verbosity))
def setup(scriptname: str, kwargs: typing.List[typing.Tuple[str, str, str]], outrootdir: str = '~/public_html', outdir: typing.Optional[str] = None, cachedir: str = 'cache', cache: bool = False, nprocs: int = 1, matrix: str = 'auto', richoutput: typing.Optional[bool] = None, outrooturi: typing.Optional[str] = None, outuri: typing.Optional[str] = None, verbose: typing.Optional[int] = 4, pdb: bool = False, gracefulexit: bool = True, **unused): '''Set up compute environment.''' from . import cache as _cache, parallel as _parallel, matrix as _matrix for name in unused: warnings.warn( 'ignoring unused configuration variable {!r}'.format(name)) if outdir is None: outdir = os.path.join(os.path.expanduser(outrootdir), scriptname) if outrooturi is None: outrooturi = pathlib.Path( outrootdir).expanduser().resolve().as_uri() outuri = outrooturi.rstrip('/') + '/' + scriptname elif outuri is None: outuri = pathlib.Path(outdir).resolve().as_uri() if richoutput is None: richoutput = sys.stdout.isatty() consolellog = treelog.RichOutputLog() if richoutput else treelog.StdoutLog( ) if verbose is not None: consolellog = treelog.FilterLog(consolellog, minlevel=tuple(Level)[5 - verbose]) htmllog = _htmllog(outdir, scriptname, kwargs) if nprocs == 1: os.environ['MKL_THREADING_LAYER'] = 'SEQUENTIAL' with htmllog, \ _status(outuri+'/'+htmllog.filename, richoutput), \ treelog.set(treelog.TeeLog(consolellog, htmllog)), \ _traceback(richoutput=richoutput, postmortem=pdb, exit=gracefulexit), \ warnings.via(treelog.warning), \ _cache.enable(os.path.join(outdir, cachedir)) if cache else _cache.disable(), \ _parallel.maxprocs(nprocs), \ _matrix.backend(matrix), \ _signal_handler(signal.SIGINT, functools.partial(_breakpoint, richoutput)): treelog.info('nutils v{}'.format(_version())) treelog.info('start', time.ctime()) yield treelog.info('finish', time.ctime())
class ConsoleDirective(docutils.parsers.rst.Directive): has_content = True required_arguments = 0 options_arguments = 0 info = treelog.proto.Level.info if hasattr(treelog, 'proto') else 1 _console_log = treelog.FilterLog(treelog.StdoutLog(), minlevel=info) def run(self): document = self.state.document env = document.settings.env nodes = [] indent = min(len(line) - len(line.lstrip()) for line in self.content) code = ''.join(line[indent:] + '\n' for line in self.content) code_wo_spread = nutils.testing.FloatNeighborhoodOutputChecker.re_spread.sub( lambda m: m.group(0).split('±', 1)[0], code) literal = docutils.nodes.literal_block(code_wo_spread, code_wo_spread, classes=['console']) literal['language'] = 'python3' literal['linenos'] = False sphinx.util.nodes.set_source_info(self, literal) nodes.append(literal) import matplotlib.testing matplotlib.testing.setup() import matplotlib.pyplot parser = doctest.DocTestParser() runner = doctest.DocTestRunner( checker=nutils.testing.FloatNeighborhoodOutputChecker(), optionflags=doctest.ELLIPSIS) globs = getattr(document, '_console_globs', {}) test = parser.get_doctest(code, globs, 'test', env.docname, self.lineno) with treelog.set(self._console_log): failures, tries = runner.run(test, clear_globs=False) for fignum in matplotlib.pyplot.get_fignums(): fig = matplotlib.pyplot.figure(fignum) with io.BytesIO() as f: fig.savefig(f, format='svg') name = hashlib.sha1(f.getvalue()).hexdigest() + '.svg' uri = 'data:image/svg+xml;base64,{}'.format( base64.b64encode(f.getvalue()).decode()) nodes.append( docutils.nodes.image('', uri=uri, alt='image generated by matplotlib')) matplotlib.pyplot.close('all') if failures: document.reporter.warning('doctest failed', line=self.lineno) document._console_globs = test.globs return nodes
def output_tester(self): recordlog = treelog.RecordLog() yield treelog.FilterLog(recordlog, minlevel=treelog.proto.Level.user) self.assertEqual( recordlog._messages, [('write', 'my message', treelog.proto.Level.user), ('pushcontext', 'my context'), ('write', 'multiple..\n ..lines', treelog.proto.Level.error), ('open', 0, 'test.dat', 'wb', treelog.proto.Level.user), ('close', 0, b'test2'), ('recontext', 'generate_test'), ('open', 1, 'test.dat', 'wb', treelog.proto.Level.warning), ('close', 1, b'test3'), ('popcontext', ), ('open', 2, 'same.dat', 'wb', treelog.proto.Level.error), ('close', 2, b'test3'), ('write', 'warn', treelog.proto.Level.warning)])
def output_tester(self): recordlog = treelog.RecordLog() yield treelog.FilterLog(recordlog, maxlevel=treelog.proto.Level.user) self.assertEqual( recordlog._messages, [('write', 'my message', treelog.proto.Level.user), ('open', 0, 'test.dat', 'w', treelog.proto.Level.info), ('close', 0, 'test1'), ('pushcontext', 'my context'), ('pushcontext', 'iter 1'), ('write', 'a', treelog.proto.Level.info), ('recontext', 'iter 2'), ('write', 'b', treelog.proto.Level.info), ('recontext', 'iter 3'), ('write', 'c', treelog.proto.Level.info), ('popcontext', ), ('open', 1, 'test.dat', 'wb', treelog.proto.Level.user), ('write', 'generating', treelog.proto.Level.info), ('close', 1, b'test2'), ('recontext', 'context step=0'), ('write', 'foo', treelog.proto.Level.info), ('recontext', 'context step=1'), ('write', 'bar', treelog.proto.Level.info), ('popcontext', ), ('open', 2, 'dbg.dat', 'wb', treelog.proto.Level.debug), ('close', 2, b'test4'), ('write', 'dbg', treelog.proto.Level.debug)])
def convert(ctx, verbosity, rich, infile, fmt, outfile, **kwargs): # Set up logging if rich: logger = RichOutputLog(sys.stdout) else: logger = log.TeeLog( log.FilterLog(log.StdoutLog(), maxlevel=log.proto.Level.user), log.FilterLog(log.StderrLog(), minlevel=log.proto.Level.warning), ) log.current = log.FilterLog(logger, minlevel=getattr(log.proto.Level, verbosity)) # Print potential warnings if '--global' in sys.argv: log.warning(f"--global is deprecated; use --coords geocentric instead") if '--local' in sys.argv: log.warning(f"--local is deprecated; use --coords local instead") if '--geometry' in sys.argv or '-g' in sys.argv: log.warning(f"--geometry is deprecated; use --coords instead") if '--endianness' in sys.argv: log.warning(f"--endianness is deprecated; use --in-endianness instead") # Convert to pathlib infile = Path(infile) outfile = Path(outfile) if outfile else None # Determine filename of output if outfile and not fmt: fmt = outfile.suffix[1:].lower() elif not outfile: fmt = fmt or 'pvd' outfile = Path(infile.name).with_suffix(f'.{fmt}') # Handle default values of multi-valued options that should be # distinguished from empty, as well as comma splitting and other # transformations explicit = { click.core.ParameterSource.COMMANDLINE, click.core.ParameterSource.ENVIRONMENT } kwargs['input_coords'] = dict(kwargs['input_coords']) for k in ['field_filter', 'only_bases']: kwargs[k] = tuple(split_commas(kwargs[k])) if kwargs['no_fields']: kwargs['field_filter'] = [] elif ctx.get_parameter_source('field_filter') not in explicit: kwargs['field_filter'] = None else: kwargs['field_filter'] = tuple(f.lower() for f in kwargs['field_filter']) if isinstance(kwargs['timestep_index'], int): n = kwargs['timestep_index'] kwargs['timestep_slice'] = f'{n}:{n+1}:1' config.require(multiple_timesteps=False, reason="--time is set") # Remove meta-options for k in ['timestep_index', 'no_fields']: kwargs.pop(k) try: # The config can influence the choice of readers or writers, # so apply it first. Since kwargs may include options that # are not explicity set by the user, we set the source to # Default, and later use the upgrade_source method. with config(source=ConfigSource.Default, **kwargs): for name in kwargs: if ctx.get_parameter_source(name) in explicit: config.upgrade_source(name, ConfigSource.User) if not infile.exists(): raise IOError(f"File or directory does not exist: {infile}") ReaderClass = Reader.find_applicable(infile) WriterClass = Writer.find_applicable(fmt) with ReaderClass(infile) as reader, WriterClass(outfile) as writer: reader.validate() writer.validate() pipeline(reader, writer) except Exception as e: if verbosity == 'debug': # In debug mode, allow exceptions to filter through in raw form traceback.print_exc() else: log.error(f"Error: {e}") log.error("More information may be available with --debug") sys.exit(1)
def call(func, kwargs, scriptname, funcname=None): '''set up compute environment and call function''' outdir = config.outdir or os.path.join( os.path.expanduser(config.outrootdir), scriptname) with contextlib.ExitStack() as stack: stack.enter_context( cache.enable(os.path.join(outdir, config.cachedir)) if config. cache else cache.disable()) stack.enter_context(matrix.backend(config.matrix)) stack.enter_context( log.set( log.FilterLog(log.RichOutputLog() if config.richoutput else log.StdoutLog(), minlevel=5 - config.verbose))) if config.htmloutput: html = stack.enter_context( log.HtmlLog( outdir, title=scriptname, htmltitle='<a href="http://www.nutils.org">{}</a> {}'. format(SVGLOGO, scriptname), favicon=FAVICON)) uri = (config.outrooturi.rstrip('/') + '/' + scriptname if config.outrooturi else pathlib.Path( outdir).resolve().as_uri()) + '/' + html.filename if config.richoutput: t0 = time.perf_counter() bar = lambda running: '{0} [{1}] {2[0]}:{2[1]:02d}:{2[2]:02d}'.format( uri, 'RUNNING' if running else 'STOPPED', _hms(time.perf_counter() - t0)) stack.enter_context(stickybar.activate(bar, update=1)) else: log.info('opened log at', uri) html.write( '<ul style="list-style-position: inside; padding-left: 0px; margin-top: 0px;">{}</ul>' .format(''.join( '<li>{}={} <span style="color: gray;">{}</span></li>'. format(param.name, kwargs.get(param.name, param.default), param.annotation) for param in inspect.signature(func).parameters.values())), level=1, escape=False) stack.enter_context(log.add(html)) stack.enter_context(warnings.via(log.warning)) stack.callback(signal.signal, signal.SIGINT, signal.signal(signal.SIGINT, _sigint_handler)) log.info('nutils v{}'.format(_version())) log.info('start', time.ctime()) try: func(**kwargs) except (KeyboardInterrupt, SystemExit, pdb.bdb.BdbQuit): log.error('killed by user') return 1 except: log.error(traceback.format_exc()) if config.pdb: print( _mkbox('YOUR PROGRAM HAS DIED. The Python debugger', 'allows you to examine its post-mortem state', 'to figure out why this happened. Type "h"', 'for an overview of commands to get going.')) pdb.post_mortem() return 2 else: log.info('finish', time.ctime()) return 0
import doctest as _doctest, unittest, importlib, os, tempfile, pathlib, functools, warnings, subprocess, sys, treelog import nutils.testing _doctestlog = treelog.FilterLog(treelog.StdoutLog(), minlevel=1) class DocTestCase(nutils.testing.ContextTestCase, _doctest.DocTestCase): def __init__(self, test, *, requires=None, **kwargs): self.__test = test self.__requires = tuple(requires) if requires else () super().__init__(test, **kwargs) def setUpContext(self, stack): lines = self.__test.docstring.splitlines() indent = min((len(line) - len(line.lstrip()) for line in lines[1:] if line.strip()), default=0) blank = True requires = list(self.__requires) for line in lines: if blank and line[indent:].startswith('.. requires:: '): requires.extend(name.strip() for name in line[indent + 13:].split(',')) blank = not line.strip() missing = tuple(filter(nutils.testing._not_has_module, requires)) if missing: self.skipTest('missing module{}: {}'.format( 's' if len(missing) > 1 else '', ','.join(missing))) if 'matplotlib' in requires: import matplotlib.testing