Skip to content

Commit c0cea0b

Browse files
committed
Saving example
1 parent 19b623c commit c0cea0b

6 files changed

Lines changed: 192 additions & 0 deletions

File tree

default.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
workflow:
2+
- UpperHook

extend.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
workflow:
2+
- UpperHook
3+
- LowerHook
4+
- ReverseHook

plugin_base.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import pluggy
2+
3+
HOOK_NAMESPACE = "data_transformer"
4+
PROJECT_NAME = "data_transformer"
5+
6+
hook_spec = pluggy.HookspecMarker(HOOK_NAMESPACE)
7+
hook_impl = pluggy.HookimplMarker(HOOK_NAMESPACE)
8+
9+
def get_class(class_name):
10+
return globals()[class_name]
11+
12+
class DataTransformerSpecs:
13+
@hook_spec
14+
def transform(self, data_transformer: 'DataTransformer') -> None:
15+
pass
16+
17+
18+
class DataTransformer:
19+
def __init__(self, data="", hooks=None) -> None:
20+
self._pm = pluggy.PluginManager(PROJECT_NAME)
21+
self._pm.add_hookspecs(DataTransformerSpecs)
22+
self.data = data
23+
hooks.reverse()
24+
self.hooks = hooks
25+
if hooks:
26+
self._register_hooks()
27+
28+
def _register_hooks(self) -> None:
29+
for hook in self.hooks:
30+
self._pm.register(hook)
31+
32+
def run(self):
33+
self._pm.hook.transform(data_transformer=self)
34+
return self.data
35+
36+
37+
class UpperHook:
38+
@hook_impl
39+
def transform(data_transformer):
40+
print("inside UpperHook.transform()")
41+
data_transformer.data = data_transformer.data.upper()
42+
print(data_transformer.data)
43+
44+
class LowerHook:
45+
@hook_impl
46+
def transform(data_transformer):
47+
print("inside LowerHook.transform()")
48+
data_transformer.data = data_transformer.data.lower()
49+
print(data_transformer.data)
50+
51+
class ReverseHook:
52+
@hook_impl
53+
def transform(data_transformer):
54+
print("inside ReverseHook.transform()")
55+
data_transformer.data = data_transformer.data[::-1]
56+
print(data_transformer.data)
57+
58+
if __name__ == "__main__":
59+
pe = DataTransformer(
60+
data="hello world",
61+
hooks=[
62+
UpperHook,
63+
],
64+
)
65+
pe.run()

plugin_extend.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from plugin_base import DataTransformer, get_class
2+
import yaml
3+
import sys
4+
5+
if __name__ == "__main__":
6+
yaml_file = "extend.yaml"
7+
if len(sys.argv) > 1:
8+
yaml_file = sys.argv[1]
9+
10+
with open(yaml_file) as stream:
11+
config = yaml.safe_load(stream)
12+
13+
hook_list = config["workflow"]
14+
15+
hooks = [
16+
get_class(hook_name) for hook_name in hook_list
17+
]
18+
19+
pe = DataTransformer(
20+
data="hello world",
21+
hooks=hooks
22+
)
23+
24+
pe.run()

poetry.lock

Lines changed: 81 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[tool.poetry]
2+
name = "pluggy-test-python"
3+
version = "0.1.0"
4+
description = ""
5+
authors = ["James Bristow <jbris@users.noreply.github.com>"]
6+
readme = "README.md"
7+
8+
[tool.poetry.dependencies]
9+
python = "^3.10"
10+
pluggy = "^1.4.0"
11+
pyyaml = "^6.0.1"
12+
13+
14+
[build-system]
15+
requires = ["poetry-core"]
16+
build-backend = "poetry.core.masonry.api"

0 commit comments

Comments
 (0)