changeset 39007:b7726271fb5d

module: multiple statuses support; fixed transitive closure
author Dmitry Selyutin <ghostmansd@gmail.com>
date Fri, 29 Sep 2017 00:12:01 +0300
parents bd1cd2b92bdd
children 0ca80883f391
files pygnulib/module.py
diffstat 1 files changed, 30 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/pygnulib/module.py	Thu Sep 28 21:08:01 2017 +0300
+++ b/pygnulib/module.py	Fri Sep 29 00:12:01 2017 +0300
@@ -21,7 +21,7 @@
     _TABLE_ = {
         "description"            : (0x00, str, "Description"),
         "comment"                : (0x01, str, "Comment"),
-        "status"                 : (0x02, str, "Status"),
+        "status"                 : (0x02, set, "Status"),
         "notice"                 : (0x03, str, "Notice"),
         "applicability"          : (0x04, str, "Applicability"),
         "files"                  : (0x05, set, "Files"),
@@ -102,34 +102,38 @@
 
     @status.setter
     def status(self, value):
-        _type_assert_("status", value, str)
-        self.__table["status"] = value
+        _type_assert_("status", value, (list, set, tuple))
+        result = []
+        for item in value:
+            _type_assert_("status", item, str)
+            result += [item]
+        self.__table["status"] = set(result)
 
 
     @property
     def obsolete(self):
         """module is obsolete?"""
-        return self.status == "obsolete"
+        return "obsolete" in self.status
 
     @property
     def cxx_test(self):
         """module is C++ test?"""
-        return self.status == "c++-test"
+        return "c++-test" in self.status
 
     @property
     def longrunning_test(self):
         """module is C++ test?"""
-        return self.status == "longrunning-test"
+        return "longrunning-test" in self.status
 
     @property
     def privileged_test(self):
         """module is privileged test?"""
-        return self.status == "privileged-test"
+        return "privileged-test" in self.status
 
     @property
     def unportable_test(self):
         """module is unportable test?"""
-        return self.status == "unportable-test"
+        return "unportable-test" in self.status
 
 
     @property
@@ -146,7 +150,7 @@
     @property
     def applicability(self):
         """applicability (usually "main" or "tests")"""
-        default = "main" if self.name.endswith("-tests") else "tests"
+        default = "main" if not self.name.endswith("-tests") else "tests"
         result = self.__table.get("applicability")
         return result if result else default
 
@@ -396,7 +400,7 @@
     _TABLE_ = {
         "Description"        : (str, "description"),
         "Comment"            : (str, "comment"),
-        "Status"             : (str, "status"),
+        "Status"             : (set, "status"),
         "Notice"             : (str, "notice"),
         "Applicability"      : (str, "applicability"),
         "Files"              : (set, "files"),
@@ -430,7 +434,7 @@
                         if not line.strip() or line.startswith("#"):
                             continue
                         lines += [line]
-                    table[key] = lines
+                    table[key] = typeid(lines)
                 else:
                     table[key] = value.strip()
             if "licenses" not in table:
@@ -495,6 +499,15 @@
     unportable_tests = bool(options & _ConfigOption_.Unportable)
     modules = set(lookup(module) for module in modules)
 
+    def _exclude_(module):
+        return any((
+            (not obsolete and module.obsolete),
+            (not cxx_tests and module.cxx_test),
+            (not longrunning_tests and module.longrunning_test),
+            (not privileged_tests and module.privileged_test),
+            (not unportable_tests and module.unportable_test),
+        ))
+
     def _transitive_closure_(tests):
         queue = set()
         previous = set()
@@ -508,20 +521,14 @@
                     continue
                 if tests and not demander.name.endswith("-tests"):
                     try:
-                        name = "{0}-tests".format(demander.name)
-                        current.add((lookup(name), None, None))
+                        module = lookup("{0}-tests".format(demander.name))
+                        if not _exclude_(module):
+                            current.add((module, None, None))
                     except _UnknownModuleError_:
                         pass # ignore non-existent tests
                 for (dependency, condition) in demander.dependencies:
                     module = lookup(dependency)
-                    exclude = (
-                        (not obsolete and module.obsolete),
-                        (not cxx_tests and module.cxx_test),
-                        (not longrunning_tests and module.longrunning_test),
-                        (not privileged_tests and module.privileged_test),
-                        (not unportable_tests and module.unportable_test),
-                    )
-                    if not any(exclude):
+                    if not _exclude_(module):
                         condition = condition if condition.strip() else None
                         current.add((module, demander, condition))
                 queue.add(demander)
@@ -530,10 +537,8 @@
     base = _transitive_closure_(False)
     full = _transitive_closure_(True)
     main = set(module for (module, _, _) in base)
-    final = set(module for (module, _, _) in full) if tests else set(main)
-    tests_final = set(module for module in final if not tests or module.applicability != "all")
-    tests_main = set(module for module in main if module.applicability != "all")
-    tests = (tests_final ^ tests_main)
+    final = set(module for (module, _, _) in full)
+    tests = (final - {module for module in main if module.applicability != "all"})
     return (base, full, main, final, tests)