Skip to content

Commit 6ef84f9

Browse files
authored
✨ codegen events
1 parent 0763299 commit 6ef84f9

File tree

5 files changed

+1347
-16
lines changed

5 files changed

+1347
-16
lines changed

codegen/__init__.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
from typing import List
1+
import inspect
2+
from pathlib import Path
3+
from itertools import chain
24
from dataclasses import dataclass
5+
from typing import List, Union, get_args, get_origin
36

7+
from jinja2 import Environment, PackageLoader
8+
from githubkit.webhooks.models import GitHubWebhookModel
49
from githubkit.webhooks.types import webhook_action_types
510

611

@@ -10,11 +15,35 @@ class Data:
1015
payload_type: str
1116

1217

18+
def pascal_case(*names: str) -> str:
19+
words = chain.from_iterable(name.split("_") for name in names)
20+
return "".join(word if word.isupper() else word.capitalize() for word in words)
21+
22+
1323
def build_event():
24+
imports: List[str] = []
1425
events: List[Data] = []
1526
for event, types in webhook_action_types.items():
1627
if not isinstance(types, dict):
17-
events.append(Data(types.__name__, types.__name__))
28+
imports.append(f"{types.__name__} as {types.__name__}Payload")
29+
events.append(Data(types.__name__, f"{types.__name__}Payload"))
30+
continue
1831

1932
for action, type in types.items():
20-
...
33+
if inspect.isclass(type) and issubclass(type, GitHubWebhookModel):
34+
imports.append(f"{type.__name__} as {type.__name__}Payload")
35+
events.append(Data(type.__name__, f"{type.__name__}Payload"))
36+
else:
37+
assert get_origin(type) is Union
38+
imports.extend(model.__name__ for model in get_args(type))
39+
events.append(
40+
Data(
41+
pascal_case(event, action),
42+
f"Union[{', '.join(model.__name__ for model in get_args(type))}]",
43+
)
44+
)
45+
46+
env = Environment(loader=PackageLoader("codegen"))
47+
template = env.get_template("event.py.jinja")
48+
event_text = template.render(imports=imports, events=events)
49+
Path("./nonebot/adapters/github/event.py").write_text(event_text)

codegen/templates/event.py.jinja

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
from typing import Any
1+
from typing import Any, Union
22

3+
{% for import_ in imports %}
4+
from githubkit.webhooks.models import {{ import_ }}
5+
{% endfor %}
36
from githubkit.utils import UNSET
47
from nonebot.typing import overrides
8+
from nonebot.utils import escape_tag
59

610
from nonebot.adapters import Event as BaseEvent
711

@@ -19,14 +23,24 @@ class Event(BaseEvent):
1923

2024
@overrides(BaseEvent)
2125
def get_event_name(self) -> str:
22-
return self.event_name + f".{action}" if (action := getattr(self, "action", UNSET)) else ""
26+
return self.name + (
27+
f".{action}" if (action := getattr(self.payload, "action", None)) else ""
28+
)
2329

2430
@overrides(BaseEvent)
2531
def get_event_description(self) -> str:
2632
return escape_tag(
27-
f"{self.__class__.__name__} " +
28-
(f"from sender {sender.login}" if (sender := getattr(self, "sender", UNSET)) else "") +
29-
(f"in repository {repo.full_name}" if (repo := getattr(self, "repository", UNSET)) else "") +
33+
f"{self.__class__.__name__} "
34+
+ (
35+
f"from sender {sender.login}"
36+
if (sender := getattr(self.payload, "sender", None))
37+
else ""
38+
)
39+
+ (
40+
f"in repository {repo.full_name}"
41+
if (repo := getattr(self.payload, "repository", None))
42+
else ""
43+
)
3044
)
3145

3246
@overrides(BaseEvent)
@@ -35,7 +49,7 @@ class Event(BaseEvent):
3549

3650
@overrides(BaseEvent)
3751
def get_user_id(self) -> str:
38-
if sender := getattr(self, "sender", UNSET):
52+
if sender := getattr(self.payload, "sender", None):
3953
return sender.login
4054
raise ValueError("Event has no context!")
4155

@@ -46,3 +60,11 @@ class Event(BaseEvent):
4660
@overrides(BaseEvent)
4761
def is_tome(self) -> bool:
4862
return self.to_me
63+
64+
65+
{% for event in events %}
66+
67+
class {{ event.class_name }}(Event):
68+
payload: {{ event.payload_type }}
69+
70+
{% endfor %}

0 commit comments

Comments
 (0)