Commit 592bd11e4114bfe3857b14d8f300ac7330bc9684

Authored by Miguel Barão
1 parent d4557086
Exists in master and in 1 other branch dev

- added tools.py

Showing 1 changed file with 81 additions and 0 deletions   Show diff stats
tools.py 0 → 100644
... ... @@ -0,0 +1,81 @@
  1 +
  2 +import subprocess
  3 +import logging
  4 +import yaml
  5 +import markdown
  6 +
  7 +# setup logger for this module
  8 +logger = logging.getLogger(__name__)
  9 +
  10 +# ---------------------------------------------------------------------------
  11 +# load data from yaml file
  12 +# ---------------------------------------------------------------------------
  13 +def load_yaml(filename, default=None):
  14 + try:
  15 + f = open(filename, 'r', encoding='utf-8')
  16 + except IOError:
  17 + logger.error('Can\'t open file "{}"'.format(filename))
  18 + return default
  19 + else:
  20 + with f:
  21 + try:
  22 + return yaml.load(f)
  23 + except yaml.YAMLError as e:
  24 + mark = e.problem_mark
  25 + logger.error('In YAML file "{0}" near line {1}, column {2}.'.format(filename, mark.line, mark.column+1))
  26 + return default
  27 +
  28 +# ---------------------------------------------------------------------------
  29 +# Runs a script and returns its stdout parsed as yaml, or None on error.
  30 +# Note: requires python 3.5+
  31 +# ---------------------------------------------------------------------------
  32 +def run_script(script, stdin='', timeout=5):
  33 + try:
  34 + p = subprocess.run([script],
  35 + input=stdin,
  36 + stdout=subprocess.PIPE,
  37 + stderr=subprocess.STDOUT,
  38 + universal_newlines=True,
  39 + timeout=timeout,
  40 + )
  41 + except FileNotFoundError:
  42 + logger.error('Script not found: "{0}".'.format(script))
  43 + except PermissionError:
  44 + logger.error('Script "{0}" not executable (wrong permissions?).'.format(script))
  45 + except subprocess.TimeoutExpired:
  46 + logger.error('Timeout {0}s exceeded while running script "{1}"'.format(timeout, script))
  47 + else:
  48 + if p.returncode != 0:
  49 + logger.error('Script "{0}" returned error code {1}.'.format(script, p.returncode))
  50 + else:
  51 + try:
  52 + output = yaml.load(p.stdout)
  53 + except:
  54 + logger.error('Error parsing yaml output of script "{0}"'.format(script))
  55 + else:
  56 + return output
  57 +
  58 +def md_to_html(text, ref=None, files={}):
  59 + if ref is not None:
  60 + # given q['ref'] and q['files'] replaces references to files by a
  61 + # GET to /file?ref=???;name=???
  62 + for k in files:
  63 + text = text.replace(k, '/file?ref={};name={}'.format(ref, k))
  64 + return markdown.markdown(text, extensions=[
  65 + 'markdown.extensions.tables',
  66 + 'markdown.extensions.fenced_code',
  67 + 'markdown.extensions.codehilite',
  68 + 'markdown.extensions.def_list',
  69 + 'markdown.extensions.sane_lists'
  70 + ])
  71 +
  72 +def md_to_html_review(text, q):
  73 + for k,f in q['files'].items():
  74 + text = text.replace(k, '/absfile?name={}'.format(q['files'][k]))
  75 + return markdown.markdown(text, extensions=[
  76 + 'markdown.extensions.tables',
  77 + 'markdown.extensions.fenced_code',
  78 + 'markdown.extensions.codehilite',
  79 + 'markdown.extensions.def_list',
  80 + 'markdown.extensions.sane_lists'
  81 + ])
... ...