Skip to content

Commit a363c25

Browse files
committed
Added action registry
- Accessing the registry ensures the built-in actions are loaded.
1 parent 29942ac commit a363c25

4 files changed

Lines changed: 50 additions & 22 deletions

File tree

generate_changelog/pipeline.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
"""Simple pipeline workflow processing."""
22
from typing import Any, Callable, Optional, Union
33

4-
from dataclasses import dataclass, field
5-
6-
from generate_changelog.configuration import StrOrCallable
7-
from generate_changelog.processors import BUILT_INS, load_builtins
8-
9-
load_builtins()
4+
from generate_changelog.processors import BUILT_INS
105

116

127
def noop_func(**kwargs):

generate_changelog/processors/__init__.py

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,41 @@
11
"""Processing module for changelog generation."""
2-
32
from typing import Callable, Union
43

5-
BUILT_INS = {}
4+
from collections import UserDict
5+
6+
7+
class Registry(UserDict):
8+
"""
9+
Built-in action registry.
10+
11+
This allows setting keys normally. When getting a key, it makes sure the
12+
appropriate modules are imported to fill the internal dictionary before
13+
getting the key.
14+
"""
15+
16+
def __init__(self, initialdata=None):
17+
super().__init__(initialdata)
18+
self._loaded = False
19+
20+
def __getitem__(self, key):
21+
"""Make sure the built-in actions are loaded."""
22+
if not self._loaded:
23+
self.load_builtins()
24+
return super().__getitem__(key)
25+
26+
def load_builtins(self):
27+
"""Import all submodules so the decorated functions get registered."""
28+
import importlib
29+
30+
importlib.import_module(".text_processing", "generate_changelog.processors")
31+
importlib.import_module(".file_processing", "generate_changelog.processors")
32+
importlib.import_module(".shell", "generate_changelog.processors")
33+
importlib.import_module(".metadata", "generate_changelog.processors")
34+
35+
self._loaded = True
36+
37+
38+
BUILT_INS = Registry()
639
"""The registered actions that are considered to be built-in."""
740

841

@@ -21,13 +54,3 @@ def inner(f: Callable) -> Callable:
2154
else:
2255
name = function_or_name
2356
return inner
24-
25-
26-
def load_builtins():
27-
"""Import all submodules so the decorated functions get registered."""
28-
import importlib
29-
30-
importlib.import_module(".text_processing", "generate_changelog.processors")
31-
importlib.import_module(".file_processing", "generate_changelog.processors")
32-
importlib.import_module(".shell", "generate_changelog.processors")
33-
importlib.import_module(".metadata", "generate_changelog.processors")

generate_changelog/templating.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,8 @@
1313
from generate_changelog.configuration import Configuration, get_config
1414
from generate_changelog.lazy import LazyObject
1515
from generate_changelog.pipeline import pipeline_factory
16-
from generate_changelog.processors import load_builtins
1716
from generate_changelog.processors.metadata import MetadataCollector
1817

19-
load_builtins()
20-
21-
2218
default_env = LazyObject(
2319
lambda: Environment(
2420
loader=ChoiceLoader([FileSystemLoader(get_config().template_dirs), PackageLoader("generate_changelog")]),

test/processors/test_registry.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""Tests of the registry system."""
2+
3+
from generate_changelog.processors import Registry
4+
5+
6+
def test_registry_get_key_loads_builtins():
7+
"""Getting a key from the registry should load the built-ins."""
8+
r = Registry()
9+
r["new_attr"] = "foo"
10+
assert r.data["new_attr"] == "foo"
11+
assert "new_attr" in r
12+
assert not r._loaded
13+
assert r["new_attr"] == "foo"
14+
assert r._loaded

0 commit comments

Comments
 (0)