diff options
author | Benjamin Schubert <contact@benschubert.me> | 2019-05-22 22:55:20 +0100 |
---|---|---|
committer | Benjamin Schubert <contact@benschubert.me> | 2019-05-22 22:55:20 +0100 |
commit | 760a9ab23285282d211b0ae6302f9a22f192d0df (patch) | |
tree | e8e67a71999e09ddec7b834dcdb761fd75008308 | |
parent | 7d713b5487aa7d6ea9a6144152446c3d0504c186 (diff) | |
download | buildstream-more-cython.tar.gz |
WIP: cythonize extract_depends_from_nodemore-cython
-rw-r--r-- | src/buildstream/_loader/_loader.pyx | 54 | ||||
-rw-r--r-- | src/buildstream/_loader/loadelement.py | 47 | ||||
-rw-r--r-- | src/buildstream/_loader/loader.py | 6 | ||||
-rw-r--r-- | src/buildstream/_yaml.pxd | 3 | ||||
-rw-r--r-- | src/buildstream/_yaml.pyx | 2 |
5 files changed, 60 insertions, 52 deletions
diff --git a/src/buildstream/_loader/_loader.pyx b/src/buildstream/_loader/_loader.pyx index dc55dcbfb..2ab1491fb 100644 --- a/src/buildstream/_loader/_loader.pyx +++ b/src/buildstream/_loader/_loader.pyx @@ -1,3 +1,6 @@ +from .. cimport _yaml +from .types import Symbol, Dependency + # Check if given filename containers valid characters. # # Args: @@ -29,3 +32,54 @@ def valid_chars_name(str name): return False return True + + +cdef _extract_depends_from_node(_yaml.Node node, str key): + cdef str default_dep_type + + if key == Symbol.BUILD_DEPENDS: + default_dep_type = Symbol.BUILD + elif key == Symbol.RUNTIME_DEPENDS: + default_dep_type = Symbol.RUNTIME + elif key == Symbol.DEPENDS: + default_dep_type = None + else: + assert False, "Unexpected value of key '{}'".format(key) + + cdef list depends = <list> _yaml.node_get(node, list, key, None, []) + cdef list output_deps = [] + cdef int index + cdef str dep + + for index, dep in enumerate(depends): + dep_provenance = _yaml.node_get_provenance(node, key=key, indices=[index]) + dependency = Dependency(dep, dep_provenance, default_dep_type=default_dep_type) + output_deps.append(dependency) + + # Now delete the field, we dont want it anymore + _yaml.node_del(node, key, True) + return output_deps + + +# _extract_depends_from_node(): +# +# Creates an array of Dependency objects from a given dict node 'node', +# allows both strings and dicts for expressing the dependency and +# throws a comprehensive LoadError in the case that the node is malformed. +# +# After extracting depends, the symbol is deleted from the node +# +# Args: +# node (dict): A YAML loaded dictionary +# +# Returns: +# (list): a list of Dependency objects +# +def extract_depends_from_node(_yaml.Node node): + cdef list build_depends, runtime_depends, depends + + build_depends = _extract_depends_from_node(node, key=Symbol.BUILD_DEPENDS) + runtime_depends = _extract_depends_from_node(node, key=Symbol.RUNTIME_DEPENDS) + depends = _extract_depends_from_node(node, key=Symbol.DEPENDS) + + return build_depends + runtime_depends + depends diff --git a/src/buildstream/_loader/loadelement.py b/src/buildstream/_loader/loadelement.py index 684c32554..d8dc70b8d 100644 --- a/src/buildstream/_loader/loadelement.py +++ b/src/buildstream/_loader/loadelement.py @@ -22,12 +22,8 @@ from itertools import count from pyroaring import BitMap, FrozenBitMap # pylint: disable=no-name-in-module -# BuildStream toplevel imports from .. import _yaml -# Local package imports -from .types import Symbol, Dependency - # LoadElement(): # @@ -136,46 +132,3 @@ class LoadElement(): self._dep_cache.update(elt._dep_cache) self._dep_cache = FrozenBitMap(self._dep_cache) - - -# _extract_depends_from_node(): -# -# Creates an array of Dependency objects from a given dict node 'node', -# allows both strings and dicts for expressing the dependency and -# throws a comprehensive LoadError in the case that the node is malformed. -# -# After extracting depends, the symbol is deleted from the node -# -# Args: -# node (dict): A YAML loaded dictionary -# -# Returns: -# (list): a list of Dependency objects -# -def _extract_depends_from_node(node, *, key=None): - if key is None: - build_depends = _extract_depends_from_node(node, key=Symbol.BUILD_DEPENDS) - runtime_depends = _extract_depends_from_node(node, key=Symbol.RUNTIME_DEPENDS) - depends = _extract_depends_from_node(node, key=Symbol.DEPENDS) - return build_depends + runtime_depends + depends - elif key == Symbol.BUILD_DEPENDS: - default_dep_type = Symbol.BUILD - elif key == Symbol.RUNTIME_DEPENDS: - default_dep_type = Symbol.RUNTIME - elif key == Symbol.DEPENDS: - default_dep_type = None - else: - assert False, "Unexpected value of key '{}'".format(key) - - depends = _yaml.node_get(node, list, key, default_value=[]) - output_deps = [] - - for index, dep in enumerate(depends): - dep_provenance = _yaml.node_get_provenance(node, key=key, indices=[index]) - dependency = Dependency(dep, dep_provenance, default_dep_type=default_dep_type) - output_deps.append(dependency) - - # Now delete the field, we dont want it anymore - _yaml.node_del(node, key, safe=True) - - return output_deps diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py index 9246bb1ab..e682f92f0 100644 --- a/src/buildstream/_loader/loader.py +++ b/src/buildstream/_loader/loader.py @@ -28,9 +28,9 @@ from ..element import Element from .._profile import Topics, PROFILER from .._includes import Includes -from ._loader import valid_chars_name +from ._loader import valid_chars_name, extract_depends_from_node from .types import Symbol -from .loadelement import LoadElement, _extract_depends_from_node +from .loadelement import LoadElement from .metaelement import MetaElement from .metasource import MetaSource from ..types import CoreWarnings @@ -249,7 +249,7 @@ class Loader(): self._elements[filename] = element - dependencies = _extract_depends_from_node(node) + dependencies = extract_depends_from_node(node) # Load all dependency files for the new LoadElement for dep in dependencies: diff --git a/src/buildstream/_yaml.pxd b/src/buildstream/_yaml.pxd index 8be11a519..62c00d30b 100644 --- a/src/buildstream/_yaml.pxd +++ b/src/buildstream/_yaml.pxd @@ -38,5 +38,6 @@ cdef class ProvenanceInformation: cpdef object node_get(Node node, object expected_type, str key, list indices=*, object default_value=*, bint allow_none=*) cpdef void node_set(Node node, object key, object value, list indices=*) except * +cpdef void node_del(Node node, str key, bint safe=*) except * cpdef list node_keys(object node) -cpdef ProvenanceInformation node_get_provenance(Node node, str key=*, list indices=*)
\ No newline at end of file +cpdef ProvenanceInformation node_get_provenance(Node node, str key=*, list indices=*) diff --git a/src/buildstream/_yaml.pyx b/src/buildstream/_yaml.pyx index 886ac10fb..160db238d 100644 --- a/src/buildstream/_yaml.pyx +++ b/src/buildstream/_yaml.pyx @@ -716,7 +716,7 @@ cpdef list node_keys(object node): # key (str): The key we want to remove # safe (bool): Whether to raise a KeyError if unable # -def node_del(Node node, str key, bint safe=False): +cpdef void node_del(Node node, str key, bint safe=False) except *: try: del node.value[key] except KeyError: |