You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by gi...@apache.org on 2020/12/29 13:13:47 UTC

[buildstream] 02/30: Pass targets to Loader.load() instead of its constructor.

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch valentindavid/flatpak-demo
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 0793cb41755216c9745212a144603e2a96a2bdeb
Author: Valentin David <va...@codethink.co.uk>
AuthorDate: Mon Jun 11 15:43:38 2018 +0200

    Pass targets to Loader.load() instead of its constructor.
    
    This is required to be able to build a Loader before the list
    of targets is known.
---
 buildstream/_loader/loader.py | 33 ++++++++++++++++-----------------
 buildstream/_pipeline.py      |  4 ++--
 tests/loader/__init__.py      |  4 ++--
 tests/loader/basics.py        | 23 ++++++++++++-----------
 tests/loader/dependencies.py  | 40 ++++++++++++++++++++--------------------
 5 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/buildstream/_loader/loader.py b/buildstream/_loader/loader.py
index 07b0de9..11afef6 100644
--- a/buildstream/_loader/loader.py
+++ b/buildstream/_loader/loader.py
@@ -46,7 +46,6 @@ from . import MetaSource
 # Args:
 #    context (Context): The Context object
 #    project (Project): The toplevel Project object
-#    filenames (list of str): Target, element-path relative bst filenames in the project
 #    parent (Loader): A parent Loader object, in the case this is a junctioned Loader
 #    tempdir (str): A directory to cleanup with the Loader, given to the loader by a parent
 #                   loader in the case that this loader is a subproject loader.
@@ -54,22 +53,13 @@ from . import MetaSource
 #
 class Loader():
 
-    def __init__(self, context, project, filenames, *, parent=None, tempdir=None, fetch_subprojects=False):
+    def __init__(self, context, project, *, parent=None, tempdir=None, fetch_subprojects=False):
 
         # Ensure we have an absolute path for the base directory
         basedir = project.element_path
         if not os.path.isabs(basedir):
             basedir = os.path.abspath(basedir)
 
-        for filename in filenames:
-            if os.path.isabs(filename):
-                # XXX Should this just be an assertion ?
-                # Expect that the caller gives us the right thing at least ?
-                raise LoadError(LoadErrorReason.INVALID_DATA,
-                                "Target '{}' was not specified as a relative "
-                                "path to the base project directory: {}"
-                                .format(filename, basedir))
-
         #
         # Public members
         #
@@ -82,7 +72,6 @@ class Loader():
         self._context = context
         self._options = project.options      # Project options (OptionPool)
         self._basedir = basedir              # Base project directory
-        self._targets = filenames            # Target bst elements
         self._tempdir = tempdir              # A directory to cleanup
         self._parent = parent                # The parent loader
 
@@ -98,17 +87,27 @@ class Loader():
     #    rewritable (bool): Whether the loaded files should be rewritable
     #                       this is a bit more expensive due to deep copies
     #    ticker (callable): An optional function for tracking load progress
+    #    targets (list of str): Target, element-path relative bst filenames in the project
     #
     # Raises: LoadError
     #
     # Returns: The toplevel LoadElement
-    def load(self, rewritable=False, ticker=None):
+    def load(self, targets, rewritable=False, ticker=None):
+
+        for filename in targets:
+            if os.path.isabs(filename):
+                # XXX Should this just be an assertion ?
+                # Expect that the caller gives us the right thing at least ?
+                raise LoadError(LoadErrorReason.INVALID_DATA,
+                                "Target '{}' was not specified as a relative "
+                                "path to the base project directory: {}"
+                                .format(filename, self._basedir))
 
         # First pass, recursively load files and populate our table of LoadElements
         #
         deps = []
 
-        for target in self._targets:
+        for target in targets:
             profile_start(Topics.LOAD_PROJECT, target)
             junction, name, loader = self._parse_name(target, rewritable, ticker)
             loader._load_file(name, rewritable, ticker)
@@ -126,7 +125,7 @@ class Loader():
         dummy = DummyTarget(name='', full_name='', deps=deps)
         self._elements[''] = dummy
 
-        profile_key = "_".join(t for t in self._targets)
+        profile_key = "_".join(t for t in targets)
         profile_start(Topics.CIRCULAR_CHECK, profile_key)
         self._check_circular_deps('')
         profile_end(Topics.CIRCULAR_CHECK, profile_key)
@@ -135,7 +134,7 @@ class Loader():
         #
         # Sort direct dependencies of elements by their dependency ordering
         #
-        for target in self._targets:
+        for target in targets:
             profile_start(Topics.SORT_DEPENDENCIES, target)
             junction, name, loader = self._parse_name(target, rewritable, ticker)
             loader._sort_dependencies(name)
@@ -546,7 +545,7 @@ class Loader():
             else:
                 raise
 
-        loader = Loader(self._context, project, [],
+        loader = Loader(self._context, project,
                         parent=self,
                         tempdir=basedir,
                         fetch_subprojects=self._fetch_subprojects)
diff --git a/buildstream/_pipeline.py b/buildstream/_pipeline.py
index 9f4504d..1474b37 100644
--- a/buildstream/_pipeline.py
+++ b/buildstream/_pipeline.py
@@ -106,11 +106,11 @@ class Pipeline():
 
         profile_start(Topics.LOAD_PIPELINE, "_".join(t.replace(os.sep, '-') for t in targets))
 
-        self._loader = Loader(self._context, self._project, targets,
+        self._loader = Loader(self._context, self._project,
                               fetch_subprojects=fetch_subprojects)
 
         with self._context.timed_activity("Loading pipeline", silent_nested=True):
-            meta_elements = self._loader.load(rewritable, None)
+            meta_elements = self._loader.load(targets, rewritable, None)
 
         # Resolve the real elements now that we've loaded the project
         with self._context.timed_activity("Resolving pipeline"):
diff --git a/tests/loader/__init__.py b/tests/loader/__init__.py
index d64b776..49db9cf 100644
--- a/tests/loader/__init__.py
+++ b/tests/loader/__init__.py
@@ -8,7 +8,7 @@ from buildstream._loader import Loader
 # be removed in favor of testing the functionality via
 # the CLI like in the frontend tests anyway.
 #
-def make_loader(basedir, targets):
+def make_loader(basedir):
     context = Context()
     project = Project(basedir, context)
-    return Loader(context, project, targets)
+    return Loader(context, project)
diff --git a/tests/loader/basics.py b/tests/loader/basics.py
index 3526697..0252683 100644
--- a/tests/loader/basics.py
+++ b/tests/loader/basics.py
@@ -18,9 +18,9 @@ DATA_DIR = os.path.join(
 def test_one_file(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/onefile.bst'])
+    loader = make_loader(basedir)
 
-    element = loader.load()[0]
+    element = loader.load(['elements/onefile.bst'])[0]
 
     assert(isinstance(element, MetaElement))
     assert(element.kind == 'pony')
@@ -30,10 +30,10 @@ def test_one_file(datafiles):
 def test_missing_file(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/missing.bst'])
+    loader = make_loader(basedir)
 
     with pytest.raises(LoadError) as exc:
-        element = loader.load()[0]
+        element = loader.load(['elements/missing.bst'])[0]
 
     assert (exc.value.reason == LoadErrorReason.MISSING_FILE)
 
@@ -42,10 +42,10 @@ def test_missing_file(datafiles):
 def test_invalid_reference(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/badreference.bst'])
+    loader = make_loader(basedir)
 
     with pytest.raises(LoadError) as exc:
-        element = loader.load()[0]
+        element = loader.load(['elements/badreference.bst'])[0]
 
     assert (exc.value.reason == LoadErrorReason.INVALID_YAML)
 
@@ -54,10 +54,10 @@ def test_invalid_reference(datafiles):
 def test_invalid_yaml(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/badfile.bst'])
+    loader = make_loader(basedir)
 
     with pytest.raises(LoadError) as exc:
-        element = loader.load()[0]
+        element = loader.load(['elements/badfile.bst'])[0]
 
     assert (exc.value.reason == LoadErrorReason.INVALID_YAML)
 
@@ -69,7 +69,8 @@ def test_fail_fullpath_target(datafiles):
     fullpath = os.path.join(basedir, 'elements', 'onefile.bst')
 
     with pytest.raises(LoadError) as exc:
-        loader = make_loader(basedir, [fullpath])
+        loader = make_loader(basedir)
+        loader.load([fullpath])
 
     assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
 
@@ -78,10 +79,10 @@ def test_fail_fullpath_target(datafiles):
 def test_invalid_key(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/invalidkey.bst'])
+    loader = make_loader(basedir)
 
     with pytest.raises(LoadError) as exc:
-        element = loader.load()[0]
+        element = loader.load(['elements/invalidkey.bst'])[0]
 
     assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
 
diff --git a/tests/loader/dependencies.py b/tests/loader/dependencies.py
index 0816e3c..4bb13a3 100644
--- a/tests/loader/dependencies.py
+++ b/tests/loader/dependencies.py
@@ -18,8 +18,8 @@ DATA_DIR = os.path.join(
 def test_two_files(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/target.bst'])
-    element = loader.load()[0]
+    loader = make_loader(basedir)
+    element = loader.load(['elements/target.bst'])[0]
 
     assert(isinstance(element, MetaElement))
     assert(element.kind == 'pony')
@@ -34,8 +34,8 @@ def test_two_files(datafiles):
 def test_shared_dependency(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/shareddeptarget.bst'])
-    element = loader.load()[0]
+    loader = make_loader(basedir)
+    element = loader.load(['elements/shareddeptarget.bst'])[0]
 
     # Toplevel is 'pony' with 2 dependencies
     #
@@ -77,8 +77,8 @@ def test_shared_dependency(datafiles):
 def test_dependency_dict(datafiles):
 
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/target-depdict.bst'])
-    element = loader.load()[0]
+    loader = make_loader(basedir)
+    element = loader.load(['elements/target-depdict.bst'])[0]
 
     assert(isinstance(element, MetaElement))
     assert(element.kind == 'pony')
@@ -92,10 +92,10 @@ def test_dependency_dict(datafiles):
 @pytest.mark.datafiles(DATA_DIR)
 def test_invalid_dependency_declaration(datafiles):
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/invaliddep.bst'])
+    loader = make_loader(basedir)
 
     with pytest.raises(LoadError) as exc:
-        element = loader.load()[0]
+        element = loader.load(['elements/invaliddep.bst'])[0]
 
     assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
 
@@ -103,10 +103,10 @@ def test_invalid_dependency_declaration(datafiles):
 @pytest.mark.datafiles(DATA_DIR)
 def test_circular_dependency(datafiles):
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/circulartarget.bst'])
+    loader = make_loader(basedir)
 
     with pytest.raises(LoadError) as exc:
-        element = loader.load()[0]
+        element = loader.load(['elements/circulartarget.bst'])[0]
 
     assert (exc.value.reason == LoadErrorReason.CIRCULAR_DEPENDENCY)
 
@@ -114,10 +114,10 @@ def test_circular_dependency(datafiles):
 @pytest.mark.datafiles(DATA_DIR)
 def test_invalid_dependency_type(datafiles):
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/invaliddeptype.bst'])
+    loader = make_loader(basedir)
 
     with pytest.raises(LoadError) as exc:
-        element = loader.load()[0]
+        element = loader.load(['elements/invaliddeptype.bst'])[0]
 
     assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
 
@@ -125,8 +125,8 @@ def test_invalid_dependency_type(datafiles):
 @pytest.mark.datafiles(DATA_DIR)
 def test_build_dependency(datafiles):
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/builddep.bst'])
-    element = loader.load()[0]
+    loader = make_loader(basedir)
+    element = loader.load(['elements/builddep.bst'])[0]
 
     assert(isinstance(element, MetaElement))
     assert(element.kind == 'pony')
@@ -141,8 +141,8 @@ def test_build_dependency(datafiles):
 @pytest.mark.datafiles(DATA_DIR)
 def test_runtime_dependency(datafiles):
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/runtimedep.bst'])
-    element = loader.load()[0]
+    loader = make_loader(basedir)
+    element = loader.load(['elements/runtimedep.bst'])[0]
 
     assert(isinstance(element, MetaElement))
     assert(element.kind == 'pony')
@@ -157,8 +157,8 @@ def test_runtime_dependency(datafiles):
 @pytest.mark.datafiles(DATA_DIR)
 def test_build_runtime_dependency(datafiles):
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/target.bst'])
-    element = loader.load()[0]
+    loader = make_loader(basedir)
+    element = loader.load(['elements/target.bst'])[0]
 
     assert(isinstance(element, MetaElement))
     assert(element.kind == 'pony')
@@ -174,8 +174,8 @@ def test_build_runtime_dependency(datafiles):
 @pytest.mark.datafiles(DATA_DIR)
 def test_all_dependency(datafiles):
     basedir = os.path.join(datafiles.dirname, datafiles.basename)
-    loader = make_loader(basedir, ['elements/alldep.bst'])
-    element = loader.load()[0]
+    loader = make_loader(basedir)
+    element = loader.load(['elements/alldep.bst'])[0]
 
     assert(isinstance(element, MetaElement))
     assert(element.kind == 'pony')