summaryrefslogtreecommitdiff
path: root/src/buildstream/_yaml.pyx
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 /src/buildstream/_yaml.pyx
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
Diffstat (limited to 'src/buildstream/_yaml.pyx')
-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,