summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Schubert <contact@benschubert.me>2019-05-20 22:10:29 +0100
committerBenjamin Schubert <contact@benschubert.me>2019-05-29 19:50:17 +0100
commit4c92789fa42a6414ba20586daed63ccf19c991d0 (patch)
treedd4ce24000a4ce339a5e65157ed42e4e8c795fca
parent8d1022bb610364e6bad563eef05f011b0d6a17c6 (diff)
downloadbuildstream-4c92789fa42a6414ba20586daed63ccf19c991d0.tar.gz
_yaml: introduce FileInfo extension class
We used to have a tuple to keep file information. This makes it hard to read, accessing attributes by index. With an extension class FileInfo, we get better readability, without sacrificing performance
-rw-r--r--src/buildstream/_yaml.pyx51
1 files changed, 38 insertions, 13 deletions
diff --git a/src/buildstream/_yaml.pyx b/src/buildstream/_yaml.pyx
index 3a81595bb..044f5d2a3 100644
--- a/src/buildstream/_yaml.pyx
+++ b/src/buildstream/_yaml.pyx
@@ -75,6 +75,26 @@ cdef class Node:
# code which has access to such nodes would do this.
return what in self.value
+
+# Metadata container for a yaml toplevel node.
+#
+# This class contains metadata around a yaml node in order to be able
+# to trace back the provenance of a node to the file.
+#
+cdef class FileInfo:
+
+ cdef str filename, shortname, displayname
+ cdef Node toplevel,
+ cdef object project
+
+ def __init__(self, str filename, str shortname, str displayname, Node toplevel, object project):
+ self.filename = filename
+ self.shortname = shortname
+ self.displayname = displayname
+ self.toplevel = toplevel
+ self.project = project
+
+
# File name handling
cdef _FILE_LIST = []
@@ -100,6 +120,8 @@ cdef class ProvenanceInformation:
cdef public bint is_synthetic
def __init__(self, Node nodeish):
+ cdef FileInfo fileinfo
+
self.node = nodeish
if (nodeish is None) or (nodeish.file_index is None):
self.filename = ""
@@ -110,15 +132,15 @@ cdef class ProvenanceInformation:
self.toplevel = None
self.project = None
else:
- fileinfo = _FILE_LIST[nodeish.file_index]
- self.filename = fileinfo[0]
- self.shortname = fileinfo[1]
- self.displayname = fileinfo[2]
+ fileinfo = <FileInfo> _FILE_LIST[nodeish.file_index]
+ self.filename = fileinfo.filename
+ self.shortname = fileinfo.shortname
+ self.displayname = fileinfo.displayname
# We add 1 here to convert from computerish to humanish
self.line = nodeish.line + 1
self.col = nodeish.column
- self.toplevel = fileinfo[3]
- self.project = fileinfo[4]
+ self.toplevel = fileinfo.toplevel
+ self.project = fileinfo.project
self.is_synthetic = (self.filename == '') or (self.col < 0)
# Convert a Provenance to a string for error reporting
@@ -351,7 +373,7 @@ cpdef Node load(str filename, str shortname=None, bint copy_tree=False, object p
displayname = shortname
cdef Py_ssize_t file_number = len(_FILE_LIST)
- _FILE_LIST.append((filename, shortname, displayname, None, project))
+ _FILE_LIST.append(FileInfo(filename, shortname, displayname, None, project))
cdef Node data
@@ -380,6 +402,7 @@ cpdef Node load(str filename, str shortname=None, bint copy_tree=False, object p
#
cpdef Node load_data(str data, int file_index=_SYNTHETIC_FILE_INDEX, str file_name=None, bint copy_tree=False):
cdef Representer rep
+ cdef FileInfo f_info
try:
rep = Representer(file_index)
@@ -410,12 +433,14 @@ cpdef Node load_data(str data, int file_index=_SYNTHETIC_FILE_INDEX, str file_na
# Store this away because we'll use it later for "top level" provenance
if file_index is not None:
- _FILE_LIST[file_index] = (
- _FILE_LIST[file_index][0], # Filename
- _FILE_LIST[file_index][1], # Shortname
- _FILE_LIST[file_index][2], # Displayname
+ f_info = <FileInfo> _FILE_LIST[file_index]
+
+ _FILE_LIST[file_index] = FileInfo(
+ f_info.filename,
+ f_info.shortname,
+ f_info.displayname,
contents,
- _FILE_LIST[file_index][4], # Project
+ f_info.project,
)
if copy_tree:
@@ -761,7 +786,7 @@ def new_synthetic_file(str filename, object project=None):
cdef Py_ssize_t file_index = len(_FILE_LIST)
cdef Node node = Node({}, file_index, 0, 0)
- _FILE_LIST.append((filename,
+ _FILE_LIST.append(FileInfo(filename,
filename,
"<synthetic {}>".format(filename),
node,