# # Copyright (C) 2019 Bloomberg Finance LP # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library. If not, see . # # Authors: # James Ennis from . import Element from . import _cachekey from ._exceptions import ArtifactElementError from ._loader.metaelement import MetaElement # ArtifactElement() # # Object to be used for directly processing an artifact # # Args: # context (Context): The Context object # ref (str): The artifact ref # class ArtifactElement(Element): def __init__(self, context, ref): _, element, key = verify_artifact_ref(ref) self._ref = ref self._key = key project = context.get_toplevel_project() meta = MetaElement(project, element) # NOTE element has no .bst suffix plugin_conf = None super().__init__(context, project, meta, plugin_conf) # Override Element.get_artifact_name() def get_artifact_name(self, key=None): return self._ref # Dummy configure method def configure(self, node): pass # Dummy preflight method def preflight(self): pass # Override Element._calculate_cache_key def _calculate_cache_key(self, dependencies=None): return self._key # Override Element._get_cache_key() def _get_cache_key(self, strength=None): return self._key # verify_artifact_ref() # # Verify that a ref string matches the format of an artifact # # Args: # ref (str): The artifact ref # # Returns: # project (str): The project's name # element (str): The element's name # key (str): The cache key # # Raises: # ArtifactElementError if the ref string does not match # the expected format # def verify_artifact_ref(ref): try: project, element, key = ref.split('/', 2) # This will raise a Value error if unable to split # Explicitly raise a ValueError if the key length is not as expected if not _cachekey.is_key(key): raise ValueError except ValueError: raise ArtifactElementError("Artifact: {} is not of the expected format".format(ref)) return project, element, key