changeset 39654:2ee326e1aad9

modules: swap dependencies and demanders; cleanup
author Dmitry Selyutin <ghostmansd@gmail.com>
date Thu, 28 Jun 2018 01:00:53 +0300
parents dca47f1378a9
children fe5d80416ea7
files pygnulib/module.py
diffstat 1 files changed, 20 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/pygnulib/module.py	Thu Jun 28 00:55:04 2018 +0300
+++ b/pygnulib/module.py	Thu Jun 28 01:00:53 2018 +0300
@@ -716,7 +716,7 @@
 
 class TransitiveClosure:
     """transitive closure table"""
-    __slots__ = ("__lookup", "__dependencies", "__demanders", "__paths", "__conditionals")
+    __slots__ = ("__lookup", "__dependencies", "__demanders", "__paths", "__conditional")
 
 
     __AUTOMAKE_CONDITION = _re.compile("^if\\s+", _re.S | _re.M)
@@ -734,6 +734,7 @@
         previous = set()
         demanders = _collections.defaultdict(dict)
         dependencies = _collections.defaultdict(dict)
+
         def _update(demander, dependency, condition):
             table[dependency.name] = dependency
             if dependency.mask == mask:
@@ -760,6 +761,7 @@
         for module in modules:
             dependency = lookup(module)
             _update(None, dependency, None)
+
         while True:
             modules = current.difference(previous)
             if not modules:
@@ -770,14 +772,14 @@
                 if tests and not demander.test:
                     dependency = _lookup(demander.name + "-tests")
                     if dependency is not None:
-                        _update(None, dependency, bool(dependencies[demander]))
+                        _update(None, dependency, bool(demanders[demander]))
                 for (dependency, condition) in demander.dependencies:
                     dependency = _lookup(dependency)
                     _update(demander, dependency, condition)
 
         self.__lookup = _lookup
         self.__paths = dict()
-        self.__conditionals = dict()
+        self.__conditional = dict()
         self.__demanders = dict(demanders)
         self.__dependencies = dict(dependencies)
 
@@ -788,10 +790,10 @@
 
 
     def paths(self, module):
+        if module in self.__paths:
+            return self.__paths[module]
         graph = self.__dependencies
         module = self.__lookup(module).name
-        if module in self.__paths:
-            return self.__paths[module]
         def _paths():
             path = [module]
             seen = {module}
@@ -806,10 +808,10 @@
                         path.pop()
                         seen.remove(neighbour)
                 if dead_end:
-                    yield tuple(path)
+                    yield path
             yield from search()
-        result = self.__paths[module] = tuple(path[:-1] for path in _paths())
-        return result
+        self.__paths[module] = (tuple(path[:-1]) for path in _paths())
+        return tuple(self.__paths[module])
 
 
     def conditional(self, module):
@@ -817,27 +819,17 @@
         Test whether module is a conditional dependency.
         Note that this check also takes all parent modules into account.
         """
-        table = self.__dependencies
-        module = self.__lookup(module).name
-        def _conditional():
-            if module in self.__demanders[None]:
+        if module in self.__conditional:
+            return self.__conditional[module]
+        for path in self.paths(module):
+            unconditional = list()
+            for (dependency, demander) in zip(path, path[1:]):
+                unconditional.append(not self.__dependencies[dependency][demander])
+            if all(unconditional):
+                self.__conditional[module] = False
                 return False
-            if module in self.__conditionals:
-                return self.__conditionals[module]
-            conditions = set()
-            paths = self.paths(module)
-            for path in paths:
-                conditions.add(any({bool(table[dep][dem]) for (dep, dem) in zip(path, path[1:])}))
-            return all(conditions)
-        return self.__conditionals.setdefault(module, _conditional())
-
-
-    def unconditional(self, module):
-        """
-        Test whether module is an unconditional dependency.
-        Note that this check also takes all parent modules into account.
-        """
-        return not self.conditional(module)
+        self.__conditional[module] = True
+        return True
 
 
     def dump(self, indent="  "):