native.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import inspect
  2. import types
  3. from dataclasses import dataclass, field
  4. from multiprocessing import Queue
  5. from typing import Any, Dict, Optional
  6. import webview
  7. from .helpers import KWONLY_SLOTS
  8. queue = Queue()
  9. def create_proxy(cls):
  10. class Proxy:
  11. def __getattr__(self, name):
  12. if name.startswith('__'):
  13. return super().__getattr__(name)
  14. print(f"Attribute get: {name}")
  15. def __setattr__(self, name, value):
  16. if name.startswith('__'):
  17. super().__setattr__(name, value)
  18. return
  19. queue.put((name, (value,), {}))
  20. def mock_method(name):
  21. def wrapper(*args, **kwargs):
  22. queue.put((name, args[1:], kwargs)) # NOTE args[1:] to skip self
  23. return wrapper
  24. for name, attr in inspect.getmembers(cls):
  25. if name.startswith('__'):
  26. continue
  27. if inspect.isfunction(attr) or inspect.ismethod(attr):
  28. setattr(Proxy, name, mock_method(name))
  29. return Proxy
  30. @dataclass(**KWONLY_SLOTS)
  31. class Native:
  32. start_args: Dict[str, Any] = field(default_factory=dict)
  33. window_args: Dict[str, Any] = field(default_factory=dict)
  34. window: webview.Window = create_proxy(webview.Window)()