Module pynotedb.utils

Expand source code
# Copyright (c) 2020 Red Hat
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

import subprocess
import os
import itertools
from pathlib import Path
from typing import Any, Callable, List, Optional, Iterator, TYPE_CHECKING
from hashlib import sha1


if TYPE_CHECKING:
    Proc = subprocess.Popen[Any]
else:
    Proc = Any

def wait_popen(proc: Proc) -> None:
    if proc.wait():
        raise RuntimeError("%s: failed" % ' '.join(map(str, proc.args)))

def execute(argv: List[str], cwd: Optional[Path] = None) -> None:
    """Execute command, raise an exception if it fails

    >>> execute(["ls", "/fail"])
    Traceback (most recent call last):
    ...
    RuntimeError: ls /fail: failed
    """
    wait_popen(subprocess.Popen(argv, cwd=cwd))

def pread(argv: List[str], cwd: Optional[Path] = None) -> bytes:
    """Return command outputs, raise an exception if it fails

    >>> pread(["dd", "if=/dev/zero", "bs=2", "count=1"])
    b'\\x00\\x00'
    """
    proc = subprocess.Popen(argv, cwd=cwd, stdout=subprocess.PIPE)
    stdout, _ = proc.communicate()
    wait_popen(proc)
    return stdout

def try_action(action: Callable[[], None]) -> bool:
    """Return True if an action succeed, otherwise false

    >>> try_action(lambda: 1/0)
    False
    >>> try_action(lambda: None)
    True
    """
    try:
        action()
        return True
    except:
        return False

def ls(root: Path) -> Iterator[Path]:
    """List a directory and return absolute path"""
    return map(lambda fn: root / fn, os.listdir(root))

def lsR(root: Path) -> Iterator[Path]:
    """Recursive list a directory and return absolute path"""
    return filter(lambda p: ".git" not in p.parts, itertools.chain.from_iterable(
        map(
            lambda lsdir: list(map(lambda f: Path(lsdir[0]) / f, lsdir[2])),
            os.walk(root),
        )
    ))

def sha1sum(strdata: str) -> str:
    """Create a sha1

    >>> sha1sum('username:admin')
    'b54915000d281bb92f990131b8356c67fa065353'
    """
    m = sha1()
    m.update(strdata.encode('utf8'))
    return m.hexdigest()

Functions

def execute(argv: List[str], cwd: Optional[pathlib.Path] = None) ‑> NoneType

Execute command, raise an exception if it fails

>>> execute(["ls", "/fail"])
Traceback (most recent call last):
...
RuntimeError: ls /fail: failed
Expand source code
def execute(argv: List[str], cwd: Optional[Path] = None) -> None:
    """Execute command, raise an exception if it fails

    >>> execute(["ls", "/fail"])
    Traceback (most recent call last):
    ...
    RuntimeError: ls /fail: failed
    """
    wait_popen(subprocess.Popen(argv, cwd=cwd))
def ls(root: pathlib.Path) ‑> Iterator[pathlib.Path]

List a directory and return absolute path

Expand source code
def ls(root: Path) -> Iterator[Path]:
    """List a directory and return absolute path"""
    return map(lambda fn: root / fn, os.listdir(root))
def lsR(root: pathlib.Path) ‑> Iterator[pathlib.Path]

Recursive list a directory and return absolute path

Expand source code
def lsR(root: Path) -> Iterator[Path]:
    """Recursive list a directory and return absolute path"""
    return filter(lambda p: ".git" not in p.parts, itertools.chain.from_iterable(
        map(
            lambda lsdir: list(map(lambda f: Path(lsdir[0]) / f, lsdir[2])),
            os.walk(root),
        )
    ))
def pread(argv: List[str], cwd: Optional[pathlib.Path] = None) ‑> bytes

Return command outputs, raise an exception if it fails

>>> pread(["dd", "if=/dev/zero", "bs=2", "count=1"])
b'\x00\x00'
Expand source code
def pread(argv: List[str], cwd: Optional[Path] = None) -> bytes:
    """Return command outputs, raise an exception if it fails

    >>> pread(["dd", "if=/dev/zero", "bs=2", "count=1"])
    b'\\x00\\x00'
    """
    proc = subprocess.Popen(argv, cwd=cwd, stdout=subprocess.PIPE)
    stdout, _ = proc.communicate()
    wait_popen(proc)
    return stdout
def sha1sum(strdata: str) ‑> str

Create a sha1

>>> sha1sum('username:admin')
'b54915000d281bb92f990131b8356c67fa065353'
Expand source code
def sha1sum(strdata: str) -> str:
    """Create a sha1

    >>> sha1sum('username:admin')
    'b54915000d281bb92f990131b8356c67fa065353'
    """
    m = sha1()
    m.update(strdata.encode('utf8'))
    return m.hexdigest()
def try_action(action: Callable[[], NoneType]) ‑> bool

Return True if an action succeed, otherwise false

>>> try_action(lambda: 1/0)
False
>>> try_action(lambda: None)
True
Expand source code
def try_action(action: Callable[[], None]) -> bool:
    """Return True if an action succeed, otherwise false

    >>> try_action(lambda: 1/0)
    False
    >>> try_action(lambda: None)
    True
    """
    try:
        action()
        return True
    except:
        return False
def wait_popen(proc: Any) ‑> NoneType
Expand source code
def wait_popen(proc: Proc) -> None:
    if proc.wait():
        raise RuntimeError("%s: failed" % ' '.join(map(str, proc.args)))