Source code for gerrit.utils.common

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author: Jialiang Shi
import json
import inspect
import logging
from functools import wraps


[docs] def strip_trailing_slash(url): """ remove url's trailing slash :param url: url :return: """ while url.endswith("/"): url = url[:-1] return url
[docs] def decode_response(response): """Strip off Gerrit's magic prefix and decode a response. :returns: Decoded JSON content as a dict, or raw text if content could not be decoded as JSON. :raises: requests.HTTPError if the response contains an HTTP error status code. """ magic_json_prefix = ")]}'\n" content_type = response.headers.get("content-type", "") content = response.content.strip() if response.encoding: content = content.decode(response.encoding) if not content: return content if content_type.split(";")[0] != "application/json": return content if content.startswith(magic_json_prefix): index = len(magic_json_prefix) content = content[index:] try: return json.loads(content) except ValueError: raise ValueError(f"Invalid json content: {content}")
[docs] def params_creator(tuples, pattern_types, pattern_dispatcher): p, v = None, None if pattern_dispatcher is not None and pattern_dispatcher: for item in pattern_types: if item in pattern_dispatcher: p, v = pattern_types[item], pattern_dispatcher[item] break else: k = list(pattern_types.keys()) raise ValueError( "Pattern types can be either " + ", ".join(k[:-1]) + " or " + k[-1] ) params = {k: v for k, v in tuples + ((p, v),) if v is not None} return params
[docs] def check(fn): @wraps(fn) def wrapper(*args, **kwargs): sig = inspect.signature(fn) params = sig.parameters argspec = list(params.keys()) # check args and kwargs type for i, p in enumerate(args): arg_type = fn.__annotations__.get(argspec[i], None) if arg_type and not isinstance(p, arg_type): raise TypeError( f"{argspec[i]} should be {arg_type.__name__}, not {type(p).__name__}" ) for k, v in kwargs.items(): kwarg_type = fn.__annotations__.get(k, None) if kwarg_type and not isinstance(v, kwarg_type): raise TypeError( f"{k} should be {kwarg_type.__name__}, not {type(v).__name__}" ) result = fn(*args, **kwargs) # check return type return_type = fn.__annotations__.get("return", None) if return_type and not isinstance(result, return_type): raise TypeError( f"{fn.__name__} should return {return_type.__name__}, not {type(result).__name__}" ) return result return wrapper
# create logger logger = logging.getLogger("gerrit") formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") logging.root.setLevel(logging.NOTSET) console = logging.StreamHandler() console.setLevel(logging.INFO) console.setFormatter(formatter) logger.addHandler(console)