esphome/esphomeyaml/helpers.py

112 lines
2.6 KiB
Python
Raw Normal View History

2018-04-07 01:23:03 +02:00
from __future__ import print_function
2019-01-06 19:38:23 +01:00
import errno
2018-04-07 01:23:03 +02:00
import logging
2018-09-23 18:58:41 +02:00
import os
2019-01-06 19:38:23 +01:00
import socket
import subprocess
2018-04-07 01:23:03 +02:00
2019-01-06 19:38:23 +01:00
from esphomeyaml.py_compat import text_type, char_to_byte
2018-04-07 01:23:03 +02:00
_LOGGER = logging.getLogger(__name__)
def ensure_unique_string(preferred_string, current_strings):
test_string = preferred_string
current_strings_set = set(current_strings)
tries = 1
while test_string in current_strings_set:
tries += 1
test_string = u"{}_{}".format(preferred_string, tries)
return test_string
def indent_all_but_first_and_last(text, padding=u' '):
lines = text.splitlines(True)
if len(lines) <= 2:
return text
return lines[0] + u''.join(padding + line for line in lines[1:-1]) + lines[-1]
def indent_list(text, padding=u' '):
return [padding + line for line in text.splitlines()]
def indent(text, padding=u' '):
return u'\n'.join(indent_list(text, padding))
2018-05-15 11:09:27 +02:00
# From https://stackoverflow.com/a/14945195/8924614
2018-05-17 19:57:55 +02:00
def cpp_string_escape(string, encoding='utf-8'):
2019-01-06 19:38:23 +01:00
def _should_escape(byte): # type: (int) -> bool
if not 32 <= byte < 127:
return True
if byte in (char_to_byte('\\'), char_to_byte('"')):
return True
return False
if isinstance(string, text_type):
2018-05-17 19:57:55 +02:00
string = string.encode(encoding)
2018-05-15 11:09:27 +02:00
result = ''
2018-05-17 19:57:55 +02:00
for character in string:
2019-01-06 19:38:23 +01:00
character = char_to_byte(character)
if _should_escape(character):
result += '\\%03o' % character
2018-05-15 11:09:27 +02:00
else:
2019-01-06 19:38:23 +01:00
result += chr(character)
2018-05-15 11:09:27 +02:00
return '"' + result + '"'
2019-01-06 19:38:23 +01:00
def color(the_color, message=''):
from colorlog.escape_codes import escape_codes, parse_colors
2018-06-02 22:22:20 +02:00
2019-01-06 19:38:23 +01:00
if not message:
res = parse_colors(the_color)
2018-06-02 22:22:20 +02:00
else:
2019-01-06 19:38:23 +01:00
res = parse_colors(the_color) + message + escape_codes['reset']
2018-04-07 01:23:03 +02:00
2019-01-06 19:38:23 +01:00
return res
2018-04-07 01:23:03 +02:00
2019-01-06 19:38:23 +01:00
def run_system_command(*args):
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
rc = p.returncode
return rc, stdout, stderr
2018-04-07 01:23:03 +02:00
2019-01-06 19:38:23 +01:00
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc:
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
2018-06-06 08:35:23 +02:00
else:
2019-01-06 19:38:23 +01:00
raise
2018-04-07 01:23:03 +02:00
2019-01-06 19:38:23 +01:00
def is_ip_address(host):
parts = host.split('.')
if len(parts) != 4:
return False
try:
for p in parts:
int(p)
return True
except ValueError:
return False
2019-01-06 19:38:23 +01:00
def resolve_ip_address(host):
try:
ip = socket.gethostbyname(host)
except socket.error as err:
from esphomeyaml.core import EsphomeyamlError
2018-09-23 18:58:41 +02:00
2019-01-06 19:38:23 +01:00
raise EsphomeyamlError("Error resolving IP address: {}".format(err))
2018-09-23 18:58:41 +02:00
2019-01-06 19:38:23 +01:00
return ip