"""
Issues extension
----------------
"""
from functools import lru_cache
import os
from urllib.parse import urljoin
from ..utils.base import ExtensionBase
[docs]class Issue(ExtensionBase):
"""
The BuildService issue(-tracker) API is accessible through this object.
.. versionadded:: 0.2.2
"""
base_path = "/issue_trackers/"
@staticmethod
def _validate(value):
return str(value)
[docs] @lru_cache(maxsize=1)
def get_trackers(self):
"""
Get all issue trackers with data
"""
response = self.osc.request(
url=urljoin(self.osc.url, self.base_path),
method="GET",
)
return self.osc.get_objectified_xml(response)
[docs] def get_tracker(self, name):
"""
Get information on one issue tracker
:param str name: issue tracker name
:return: Objectified XML element
:rtype: lxml.objectify.ObjectifiedElement
"""
response = self.osc.request(
url=urljoin(self.osc.url, os.path.join(self.base_path, name)),
method="GET",
)
return self.osc.get_objectified_xml(response)
[docs] def get(self, tracker, name, force_update=False):
"""
Get details for an issue
:param str tracker: issue tracker name
:param str name: issue name
:param bool force_update: If ``True``, BuildService will update the issue
details internally prior to returning the response
:return: Objectified XML element
:rtype: lxml.objectify.ObjectifiedElement
"""
tracker, name = [self._validate(x) for x in [tracker, name]]
trackers = self.get_trackers()
can_get_details = trackers.xpath(
"issue-tracker/name[text()='{}']/../enable-fetch".format(tracker))
response = self.osc.request(
url=urljoin(self.osc.url,
os.path.join(self.base_path, tracker, "issues", name)),
method="GET",
params={'force_update': force_update}
)
response = self.osc.get_objectified_xml(response)
if not force_update and can_get_details and all(can_get_details):
if not getattr(getattr(response, "summary", None), "text", None):
return self.get(tracker, name, force_update=True)
return response