diff --git a/ptvp35/__init__.py b/ptvp35/__init__.py index daf26bd..52e7ea6 100644 --- a/ptvp35/__init__.py +++ b/ptvp35/__init__.py @@ -195,23 +195,25 @@ def nightly(decorated: TDecoratedNightly = None, prefix: str = '', stacklevel=2) if decorated is None: NightlyWarning.enabled = False return None # type: ignore + if isinstance(decorated, type): + prefix = f'{prefix}{decorated.__name__}.' decorated.__init__ = nightly( - decorated.__init__, f'{decorated.__name__}.' + decorated.__init__, prefix ) decorated.__init_subclass__ = nightly( - decorated.__init_subclass__, f'{decorated.__name__}.', stacklevel=3 + decorated.__init_subclass__, prefix, stacklevel=3 ) return decorated # type: ignore - assert callable(decorated) + message = f"{prefix}{decorated.__name__}" @wraps(decorated) def wrap(*args, **kwargs): if NightlyWarning.enabled: warnings.warn(message, NightlyWarning, stacklevel=stacklevel) - return decorated(*args, **kwargs) + return wrap.__non_nightly__(*args, **kwargs) if wrap.__doc__ is None or not wrap.__doc__: wrap.__doc__ = '@nightly' @@ -220,6 +222,8 @@ def nightly(decorated: TDecoratedNightly = None, prefix: str = '', stacklevel=2) else: wrap.__doc__ = '@nightly\n\n' + wrap.__doc__ + wrap.__non_nightly__ = decorated + return wrap # type: ignore diff --git a/ptvp35/instrumentation.py b/ptvp35/instrumentation.py new file mode 100644 index 0000000..b19ec87 --- /dev/null +++ b/ptvp35/instrumentation.py @@ -0,0 +1,23 @@ +from rainbowadn.instrument import Instrumentation +from . import DbConnection + + +class InstrumentDiskWrites(Instrumentation): + def __init__(self, /): + super().__init__(DbConnection, '_write_to_disk_sync') + + def on_write(self, line: str, /) -> None: + pass + + def instrument(self, method, db, line, /): + self.on_write(line) + return method(db, line) + + +class NightlyInstrumentation(Instrumentation): + def __init__(self, target, methodname: str): + method = getattr(target, methodname) + if hasattr(method, '__non_nightly__'): + target = method + methodname = '__non_nightly__' + super().__init__(target, methodname) diff --git a/traced_example.py b/traced_example.py index e25840f..3afdf5b 100644 --- a/traced_example.py +++ b/traced_example.py @@ -5,26 +5,25 @@ import threading from contextlib import ExitStack from ptvp35 import DbConnection, DbFactory, KVJson -from rainbowadn.instrument import Instrumentation +from ptvp35.instrumentation import InstrumentDiskWrites, NightlyInstrumentation async def aprint(*args, **kwargs): print(*args, **kwargs) -class LogWrites(Instrumentation): - def __init__(self): - super().__init__(DbConnection, '_write_to_disk_sync') +class LogWrites(InstrumentDiskWrites): + def __init__(self, /): + super().__init__() self.loop = asyncio.get_running_loop() - def instrument(self, method, db, line, /): + def on_write(self, line: str, /) -> None: asyncio.run_coroutine_threadsafe( aprint(f'{self.methodname}[{line}]'), self.loop ).result() - return method(db, line) -class LogEE(Instrumentation): +class LogEE(NightlyInstrumentation): def __init__(self, target, methodname: str): super().__init__(target, methodname) self.loop = asyncio.get_running_loop() @@ -146,18 +145,27 @@ async def main(): LogEE(__import__('ptvp35').Request, 'set_result').enter(es) LogEE(__import__('ptvp35').Request, 'set_exception').enter(es) ALogEE(__import__('ptvp35').Request, 'wait').enter(es) + LogEE(__import__('ptvp35').LineRequest, '__init__').enter(es) + LogEE(__import__('ptvp35').KVFactory, 'run').enter(es) LogEE(__import__('ptvp35').KVFactory, 'request').enter(es) LogEE(__import__('ptvp35').KVFactory, 'free').enter(es) LogEE(__import__('ptvp35').KVFactory, 'io2db').enter(es) LogEE(__import__('ptvp35').KVFactory, 'db2io').enter(es) + LogEE(__import__('ptvp35').KVRequest, '__init__').enter(es) + LogEE(__import__('ptvp35').KVJson, 'line').enter(es) LogEE(__import__('ptvp35').KVJson, '_load_key').enter(es) LogEE(__import__('ptvp35').KVJson, 'fromline').enter(es) + LogEE(__import__('ptvp35').TransactionRequest, '__init__').enter(es) + LogEE(__import__('ptvp35').DbParametres, '__init__').enter(es) + + LogEE(__import__('ptvp35').VirtualConnection, 'transaction').enter(es) + LogEE(__import__('ptvp35').DbConnection, '__init__').enter(es) LogEE(__import__('ptvp35').DbConnection, '_create_future').enter(es) LogEE(__import__('ptvp35').DbConnection, '_save_error_sync').enter(es) @@ -222,14 +230,32 @@ async def main(): LogEE(__import__('ptvp35').DbConnection, 'submit_transaction').enter(es) LogEE(__import__('ptvp35').DbConnection, 'submit_transaction_request').enter(es) ALogEE(__import__('ptvp35').DbConnection, 'commit').enter(es) + LogEE(__import__('ptvp35').DbConnection, 'loop').enter(es) LogEE(__import__('ptvp35').DbConnection, 'transaction').enter(es) + LogEE(__import__('ptvp35').DbFactory, '__init__').enter(es) ALogEE(__import__('ptvp35').DbFactory, '__aenter__').enter(es) ALogEE(__import__('ptvp35').DbFactory, '__aexit__').enter(es) + LogEE(__import__('ptvp35').Db, '__init__').enter(es) ALogEE(__import__('ptvp35').Db, '__aenter__').enter(es) ALogEE(__import__('ptvp35').Db, '__aexit__').enter(es) + + LogEE(__import__('ptvp35').FutureContext, '__init__').enter(es) + ALogEE(__import__('ptvp35').FutureContext, '__aenter__').enter(es) + ALogEE(__import__('ptvp35').FutureContext, '__aexit__').enter(es) + LogEE(__import__('ptvp35').TransactionView, '__init__').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'future_context').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'rollback').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'illuminate').enter(es) + ALogEE(__import__('ptvp35').TransactionView, 'ailluminate').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'fork').enter(es) + ALogEE(__import__('ptvp35').TransactionView, 'afork').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'clear').enter(es) + ALogEE(__import__('ptvp35').TransactionView, 'aclear').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'reset').enter(es) + ALogEE(__import__('ptvp35').TransactionView, 'areset').enter(es) LogEE(__import__('ptvp35').TransactionView, 'get').enter(es) LogEE(__import__('ptvp35').TransactionView, 'set_nowait').enter(es) LogEE(__import__('ptvp35').TransactionView, '_delta').enter(es) @@ -238,6 +264,12 @@ async def main(): LogEE(__import__('ptvp35').TransactionView, '_do_gather').enter(es) LogEE(__import__('ptvp35').TransactionView, '_reduce_future').enter(es) LogEE(__import__('ptvp35').TransactionView, '_gather').enter(es) + ALogEE(__import__('ptvp35').TransactionView, 'commit_transaction').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'submit_transaction').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'submit_transaction_request').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'loop').enter(es) + LogEE(__import__('ptvp35').TransactionView, 'transaction').enter(es) + LogEE(__import__('ptvp35').Transaction, '__init__').enter(es) ALogEE(__import__('ptvp35').Transaction, '__aenter__').enter(es) ALogEE(__import__('ptvp35').Transaction, '__aexit__').enter(es)