Class diagram
All of the Hook* classes are somewhat confusing to me, and I always have to rediscover how they relate. So I created an ASCII diagram of it. I think it's worth shoving in a comment somewhere, or in some "architecture" document. I'll use this issue as a placeholder for that.
┌──────────┐
│ HookSpec │
└──────────┘
▲ plugin1 ┌────────┐
│ ┌──────────────►│HookImpl│
│ │ └────────┘
foo_hook1 ┌─────┴──┴─┐
┌──────────┤HookCaller├───►...
│ └────────┬─┘
│ │ ┌────────┐
│ └──────────────►│HookImpl│
│ plugin2 └────────┘
┌─────────────┐ pm.hook ┌───────┴─┐
│PluginManager├──────────►│HookRelay├───►...
└─────────────┘ └───────┬─┘
│ plugin2 ┌────────┐
│ ┌───────────────►│HookImpl│
│ │ └────────┘
│ ┌───────┴──┐
└─────────►│HookCaller├───►...
foo_hook2 └─────┬─┬──┘
│ │ ┌────────┐
│ └───────────────►│HookImpl│
▼ plugin3 └────────┘
┌──────────┐
│ HookSpec │
└──────────┘
Maybe we should plntuml this
Just saw this https://github.com/github/roadmap/issues/372 which is similar to planetuml, I might try it.
Leaving their example here to see when it actually works :)
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
sounds fun, will wait for that then,
All of the Hook* classes are somewhat confusing to me, and I always have to rediscover how they relate. So I created an ASCII diagram of it. I think it's worth shoving in a comment somewhere, or in some "architecture" document. I'll use this issue as a placeholder for that.
┌──────────┐ │ HookSpec │ └──────────┘ ▲ plugin1 ┌────────┐ │ ┌──────────────►│HookImpl│ │ │ └────────┘ foo_hook1 ┌─────┴──┴─┐ ┌──────────┤HookCaller├───►... │ └────────┬─┘ │ │ ┌────────┐ │ └──────────────►│HookImpl│ │ plugin2 └────────┘ ┌─────────────┐ pm.hook ┌───────┴─┐ │PluginManager├──────────►│HookRelay├───►... └─────────────┘ └───────┬─┘ │ plugin2 ┌────────┐ │ ┌───────────────►│HookImpl│ │ │ └────────┘ │ ┌───────┴──┐ └─────────►│HookCaller├───►... foo_hook2 └─────┬─┬──┘ │ │ ┌────────┐ │ └───────────────►│HookImpl│ ▼ plugin3 └────────┘ ┌──────────┐ │ HookSpec │ └──────────┘
I was lucky to see this flowchart, which can be said to be a simple illustration of the core calling logic of pluggy. If you need to continue improving, or have something to help with, I'd be happy to do some!
Gave it a quick go, just to see if it has potential:
flowchart LR
PluginManager -.- pm.hook --> HookRelay
HookRelay -- foo_hook --> HookCaller --> HookSpec
HookRelay -- foo_hook2 --> HookCaller -- plugin1 --> HookImpl1
HookCaller -- plugin2 --> HookImpl2
Looks nice! https://mermaid-js.github.io/mermaid
Thanks for converting @nicoddemus!
It does lose some details - namely it merges the nodes when it's better not, the placing of the HookSpec and the .... Maybe this can be added in though. I'll need to learn the mermaid syntax.
[off topic] Is it possible that we use a class structure like this? Or are there specialised intentions? I mean, the HookRelay class seemed meaningless to me...
┌──────────┐
│ HookSpec │
└──────────┘
▲ plugin1 ┌────────┐
│ ┌──────────────►│HookImpl│
│ │ └────────┘
pm.hook1 ┌─────┴──┴─┐
┌──────────┤HookCaller├───►...
│ └────────┬─┘
│ │ ┌────────┐
│ └──────────────►│HookImpl│
│ plugin2 └────────┘
┌─────────────┐ |
│PluginManager|-----|
└─────────────┘ |
│ plugin2 ┌────────┐
│ ┌───────────────►│HookImpl│
│ │ └────────┘
│ ┌───────┴──┐
└─────────►│HookCaller├───►...
pm.hook2 └─────┬─┬──┘
│ │ ┌────────┐
│ └───────────────►│HookImpl│
▼ plugin3 └────────┘
┌──────────┐
│ HookSpec │
└──────────┘
@CofinCup HookRelay does seem redundant but I think the main problem it solves is that hook names don't conflict with PluginManager method/attribute names.