Source code for medicaid_utils.common_utils.recipes

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
import sys
import inspect
import os
import errno
import shutil
import re
from logging.handlers import TimedRotatingFileHandler
from typing import Any, Optional, Union


[docs] def log_assert( bool_: bool, message: str = "", logger: Optional[logging.Logger] = None, logger_name: str = "", verbose: bool = False, ) -> None: """Use this as a replacement for assert if you want the failing of the assert statement to be logged.""" if logger is None: logger = logging.getLogger(logger_name) try: assert bool_, message except AssertionError: # construct an exception message from the code of the calling frame last_stackframe = inspect.stack()[-2] source_file, line_no, func = last_stackframe[1:4] source = ( "Traceback (most recent call last):\n" + f' File "{source_file}", line {line_no}, in {func}\n ' ) if verbose: # include more lines than that where the statement was made with open(source_file, encoding="utf-8") as fh: source_code = fh.readlines() source += "".join(source_code[line_no - 3:line_no + 1]) else: source += last_stackframe[-2][0].strip() logger.debug("%s\n%s", message, source) raise AssertionError(f"{message}\n{source}") from None
[docs] def is_number(x: Any) -> bool: try: int(float(x)) return True except (ValueError, TypeError): return False
[docs] def convert_to_int_str(x: Any) -> Union[str, Any]: try: int_val = str(int(float(x))) return int_val except (ValueError, TypeError): return x
[docs] def setup_logger( logger_name: str, log_file: str, level: int = logging.INFO ) -> None: formatter = logging.Formatter( "%(asctime)s %(levelname)s : %(message)s", datefmt="%a, %d %b %Y %H:%M:%S", ) handler = TimedRotatingFileHandler(log_file, when="W0", backupCount=0) handler.setFormatter(formatter) logger = logging.getLogger(logger_name) stream_handler = logging.StreamHandler(stream=sys.stdout) logger.addHandler(handler) logger.addHandler(stream_handler) logger.setLevel(level)
[docs] def remove_ignore_if_not_exists(filename: str) -> None: try: os.remove(filename) if not os.path.isdir(filename) else shutil.rmtree( filename ) except ( OSError ) as e: # this would be "except OSError, e:" before Python 2.6 if e.errno != errno.ENOENT: # errno.ENOENT = no such file or data raise # re-raise exception if a different error occurred
[docs] def remove_tail_dot_zeros(a: str) -> str: return re.compile(r"(?:(\.)|(\.\d*?[1-9]\d*?))0+(?=\b|[^0-9])").sub( r"\2", a )