Skip to content

Commit

Permalink
plugins: add url support
Browse files Browse the repository at this point in the history
Add a field for plugins to declare urlpatterns. This also works with the
current way plugins' urls works, which doesn't work well but instead of
fixing something that's going away and isn't used anyway I just left it
the way it is.
  • Loading branch information
enku committed Mar 1, 2025
1 parent 1938abf commit e20e0a3
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 11 deletions.
13 changes: 11 additions & 2 deletions src/gentoo_build_publisher/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class Plugin:
name: str
app: str
graphql: Optional[str]
urls: Optional[str]

def __hash__(self) -> int:
return hash(self.app)
Expand All @@ -39,6 +40,9 @@ class PluginDef(TypedDict):
Plugins are not required to expose any GraphQL types
"""

urls: NotRequired[str]
"""Dotted path to module containing urlpatterns"""


@cache
def get_plugins() -> list[Plugin]:
Expand All @@ -57,8 +61,13 @@ def ep2plugin(ep: EntryPoint) -> Plugin:
data: str | PluginDef = ep.load()

if isinstance(data, str):
return Plugin(name=ep.name, app=data, graphql=None)
return Plugin(name=ep.name, app=data, graphql=None, urls=f"{data}.urls")
if isinstance(data, dict):
return Plugin(name=data["name"], app=data["app"], graphql=data.get("graphql"))
return Plugin(
name=data["name"],
app=data["app"],
graphql=data.get("graphql"),
urls=data.get("urls"),
)

raise ValueError(f"{data!r} is not a dict or string")
19 changes: 14 additions & 5 deletions src/gentoo_build_publisher/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,29 @@

from django.urls import URLPattern

from gentoo_build_publisher import utils
from gentoo_build_publisher.plugins import Plugin, get_plugins
from gentoo_build_publisher.views.utils import ViewFinder

urlpatterns = ViewFinder.find()


def app_urlpatterns(app: str) -> list[URLPattern]:
"""Return the urlpatterns defined in the given app"""
def plugin_urlpatterns(plugin: Plugin) -> list[URLPattern]:
"""Return the urlpatterns defined in the given plugin"""
if not plugin.urls:
return []

try:
module = import_module(f"{app}.urls")
module = import_module(plugin.urls)
except ImportError:
return []

return getattr(module, "urlpatterns", [])


utils.for_each_app(lambda app: urlpatterns.extend(app_urlpatterns(app)))
def init() -> None:
"""Initialize plugin urls"""
for plugin in get_plugins():
urlpatterns.extend(plugin_urlpatterns(plugin))


init()
13 changes: 9 additions & 4 deletions tests/test_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ def test_with_dict(self, m_entry_points: mock.Mock) -> None:
plugins.get_plugins.cache_clear()
result = plugins.get_plugins()

self.assertEqual(
[Plugin(name="test", app="test.apps.TestAppConfig", graphql=None)], result
plugin = Plugin(
name="test", app="test.apps.TestAppConfig", graphql=None, urls=None
)
self.assertEqual([plugin], result)
entry_points.select.assert_any_call(group="gentoo_build_publisher.apps")
entry_points.select.assert_any_call(group="gentoo_build_publisher.plugins")

Expand All @@ -34,8 +35,12 @@ def test_with_string(self, m_entry_points: mock.Mock) -> None:
plugins.get_plugins.cache_clear()
result = plugins.get_plugins()

self.assertEqual(
[Plugin(name="test", app="test.apps.TestAppConfig", graphql=None)], result
plugin = Plugin(
name="test",
app="test.apps.TestAppConfig",
graphql=None,
urls="test.apps.TestAppConfig.urls",
)
self.assertEqual([plugin], result)
entry_points.select.assert_any_call(group="gentoo_build_publisher.apps")
entry_points.select.assert_any_call(group="gentoo_build_publisher.plugins")

0 comments on commit e20e0a3

Please sign in to comment.