Skip to content

Commit

Permalink
Add log method.
Browse files Browse the repository at this point in the history
  • Loading branch information
pietrzakacper committed Sep 21, 2024
1 parent b9ca388 commit 4daf84d
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 12 deletions.
2 changes: 1 addition & 1 deletion reporters/python/TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
- [x] Thread safety
- [x] Manage exiting
- [x] Check circular references
- [ ] Add log method
- [x] Add log method
- [ ] Export only what's needed and rename to `trace_that`
- [ ] Manage connection health (stale/reopening/error handling)
- [ ] Release to pip
6 changes: 3 additions & 3 deletions reporters/python/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
from trace_that import trace_that

@trace_that
def hello(name: str, greeting='Hello') -> str:
time.sleep(1)
async def hello(name: str, greeting='Hello') -> str:
await asyncio.sleep(1)
return f'{greeting}, {name}!'

async def main():
hello(name='Kacper', greeting='Yo')
await hello(name='Kacper', greeting='Yo')

if __name__ == '__main__':
asyncio.run(main())
5 changes: 3 additions & 2 deletions reporters/python/json_marhsaller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

def serialize(obj, seen=None):
if seen is None:
seen = {}
seen = set()
obj_id = id(obj)

if obj_id in seen:
# Circular reference detected; return a reference placeholder
return "<circular reference>"

seen = seen.copy()
# Mark the current object as seen
seen[obj_id] = obj
seen.add(obj_id)

# Handle basic data types
if isinstance(obj, (str, int, float, bool, type(None))):
Expand Down
23 changes: 23 additions & 0 deletions reporters/python/log_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from trace_that import create_log
import unittest

class MemoryReporter:
def __init__(self):
self.messages = []

def send(self, msg: str) -> None:
self.messages.append(msg)

class TestLog(unittest.TestCase):
def test_log(self):
reporter = MemoryReporter()
log = create_log(reporter)
log('hello', {'a': 1})

ok_msg = next(m for m in reporter.messages if m['status'] == 'ok')
self.assertIsNotNone(ok_msg)
self.assertEqual(ok_msg['name'], 'hello')
self.assertEqual(ok_msg['details'], {'a': 1})

if __name__ == '__main__':
unittest.main()
39 changes: 33 additions & 6 deletions reporters/python/trace_that.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
from typing import Callable, TypeVar, Type
from typing import Callable, TypeVar, Type, Any
from typing_extensions import ParamSpec
import time
import uuid
import inspect
from ws_reporter import WebSocketReporter

class Reporter:
def send(self, msg: str) -> None:
pass

T = TypeVar('T')
R = TypeVar('R')
P = ParamSpec('P')

class TraceThat:
def __init__(self, trace_that_fn: Callable[[Callable[P, R]], Callable[P,R]], log: Callable[[str, Any], None]):
self.trace_that_fn = trace_that_fn
self.log = log

def __call__(self, func: Callable[P, R]) -> Callable[P, R]:
return self.trace_that_fn(func)

class Reporter:
def send(self, msg: str) -> None:
pass

def create_trace_that(reporter: Type[Reporter]):
def trace_that(func: Callable[P, R]) -> Callable[P, R]:
def before(*args: P.args, **kwargs: P.kwargs) -> None:
Expand Down Expand Up @@ -87,5 +95,24 @@ async def awaiter():

return trace_that

def create_log(reporter: Type[Reporter]):
def log(name: str, msg: any) -> None:
print(f'[trace_that] {name} {msg=}')
call_id = uuid.uuid4().hex
start_time = int(time.time() * 1000)
reporter.send({
'status': 'ok',
'callId': call_id,
'name': name,
'startEpochMs': start_time,
'endEpochMs': start_time,
'details': msg
})

return log

reporter = WebSocketReporter()
log = create_log(reporter)
trace_that_fun = create_trace_that(reporter)

trace_that = create_trace_that(WebSocketReporter())
trace_that = TraceThat(trace_that_fun, log)

0 comments on commit 4daf84d

Please sign in to comment.