Source code for ebonite.client.expose

import inspect
import re
from abc import abstractmethod
from typing import Optional

from pyjackson.utils import get_function_signature

EXPOSED_FIELD = '_client_exposed'


[docs]class ExposedMethod: def __init__(self, name: str = None): self.name = name self.method = None def __call__(self, method): setattr(method, EXPOSED_FIELD, self) self.method = method if self.name is None: self.name = self.original_name return method def __repr__(self): return f'{self.name}_method' @property def original_name(self): return self.method.__name__
[docs] @abstractmethod def generate_code(self): """Generate method code""" raise NotImplementedError()
[docs] def get_declaration(self): dec = '' for line in inspect.getsourcelines(self.method)[0]: strip = line.strip() if not strip or (dec == '' and not strip.startswith('def')): continue dec += line if re.sub(re.compile("#.*?\n"), "", line).strip().endswith(':'): break return dec.strip().replace(self.original_name, self.name)
[docs] def get_signature(self): return get_function_signature(self.method)
[docs]def get_exposed_method(f) -> Optional[ExposedMethod]: return getattr(f, EXPOSED_FIELD, None)