# -*- coding: utf-8 -*-
import json
import os
import shlex
import subprocess
import pyjq
import yaml
from tornado.escape import to_unicode
from .display import Color, background_color, display_reset, foreground_color
_COLOR_MAP = {c.name.lower(): c for c in Color}
[docs]def env(name, default=''):
"""
Gets an environment variable.
Parameters
----------
name : str
Environment variable name.
default : str
Default value.
Returns
-------
env : str
Value of the environment variable.
"""
return os.environ.get(name, default)
[docs]def exec(command):
"""
Executes a command and returns the result of it.
Parameters
----------
command : str
Command name and arguments separated by whitespaces.
Returns
-------
result : str
Result of the command.
"""
return to_unicode(subprocess.check_output(shlex.split(command)))
[docs]def fg(color):
"""
Inserts the escape sequence of the foreground color.
Available colors are 'black', 'red', 'green', 'yellow', 'blue', 'magenta',
'cyan', 'white', 'bright_black', 'bright_red', 'bright_green',
'bright_yellow', 'bright_blue' , 'bright_magenta', 'bright_cyan' and
'bright_white'.
Parameters
----------
color : str
Foreground color in str (e.g. 'red').
Returns
-------
seq : str
Escape sequence of the foreground color.
Raises
------
ValueError
Invalid color name.
"""
try:
return foreground_color(_COLOR_MAP[color])
except KeyError:
return ValueError('Invalid color {!r}'.format(color))
[docs]def bg(color):
"""
Inserts the escape sequence of the background color.
Available colors are 'black', 'red', 'green', 'yellow', 'blue', 'magenta',
'cyan', 'white', 'bright_black', 'bright_red', 'bright_green',
'bright_yellow', 'bright_blue' , 'bright_magenta', 'bright_cyan' and
'bright_white'.
Parameters
----------
color : str
Background color in str (e.g. 'red').
Returns
-------
seq : str
Escape sequence of the background color.
Raises
------
ValueError
Invalid color name.
"""
try:
return background_color(_COLOR_MAP[color])
except KeyError:
return ValueError('Invalid color {!r}'.format(color))
[docs]def reset():
"""
Inserts the escape sequence of display reeet.
Returns
-------
seq : str
Escape sequence of display reeet.
"""
return display_reset()
[docs]def jq_all(query, data_str, *args, **kwargs):
"""
Queries the nested data and returns all results as a list.
Parameters
----------
data_str : str
Nested data in Python dict's representation format.
If must be loadable by ``yaml.safe_load()``.
Returns
-------
result : str
String representation of the result list.
"""
try:
return json.dumps(pyjq.all(query, yaml.loads(data_str)), *args, **kwargs)
except Exception as e:
return 'jq error: {} query: {!r} str: {!r}'.format(e, query, data_str)
[docs]def jq_first(query, data_str, *args, **kwargs):
"""
Queries the nested data and returns the first result.
Parameters
----------
data_str : str
Nested data in Python dict's representation format.
If must be loadable by ``yaml.safe_load()``.
Returns
-------
result : str
String representation of the result object.
"""
try:
return json.dumps(pyjq.first(query, yaml.safe_load(data_str)), *args, **kwargs)
except Exception as e:
return 'jq error: {} query: {!r} str: {!r}'.format(e, query, data_str)
def jq(query, data_str, *args, **kwargs):
return jq_all(query, data_str, *args, **kwargs)
jq.__doc__ = jq_all.__doc__
def jqf(query, data_str, *args, **kwargs):
return jq_first(query, data_str, *args, **kwargs)
jqf.__doc__ = jq_first.__doc__
functions = [env, exec, fg, bg, reset, jq_all, jq_first, jq, jqf]