Skip to content

Commit

Permalink
Introduce an abstraction over source services
Browse files Browse the repository at this point in the history
  • Loading branch information
dcermak committed Oct 14, 2024
1 parent 4703fc1 commit 31f06bd
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
41 changes: 41 additions & 0 deletions src/bci_build/service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""This module includes an abstraction over source services in the Open Build
Service.
"""

import xml.etree.ElementTree as ET
from dataclasses import dataclass
from dataclasses import field
from typing import Literal


@dataclass(kw_only=True, frozen=True)
class Service:
"""Representation of an arbitrary source service in the Open Build Service."""

#: service mode (i.e. when the service runs)
mode: Literal["buildtime"] = "buildtime"

#: name of this service
name: str

#: unsorted list of parameters of this source service as a list of tuples
#: where the first value is the parameter's name and the second is the
#: parameter's value
param: list[tuple[str, str]] = field(default_factory=list)

def as_xml_element(self) -> ET.Element:
"""Coverts this source service into a
:py:class:`~xml.etree.ElementTree.Element`.
"""
root = ET.Element("service", attrib={"name": self.name, "mode": self.mode})

for param in self.param:
(p := ET.Element("param", attrib={"name": param[0]})).text = param[1]
root.append(p)

return root

def __str__(self) -> str:
return ET.tostring(self.as_xml_element()).decode("utf-8")
13 changes: 13 additions & 0 deletions tests/test_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,19 @@
from bci_build.package import ParseVersion
from bci_build.package import Replacement
from bci_build.templates import SERVICE_TEMPLATE
from bci_build.service import Service


def test_service_without_params_as_xml():
assert """<service name="foo" mode="buildtime" />""" == str(Service(name="foo"))


def test_service_with_params_as_xml():
assert (
"""<service name="foo" mode="buildtime"><param name="baz">bar</param><param name="baz">foo</param></service>"""
== str(Service(name="foo", param=[("baz", "bar"), ("baz", "foo")]))
)


_BASE_KWARGS = {
"name": "test",
Expand Down

0 comments on commit 31f06bd

Please sign in to comment.