OSDN Git Service

CMake: if pylint is available, run it as part of the test-suite
authorAdriaan de Groot <groot@kde.org>
Mon, 27 Sep 2021 15:52:02 +0000 (17:52 +0200)
committerAdriaan de Groot <groot@kde.org>
Mon, 27 Sep 2021 19:02:18 +0000 (21:02 +0200)
This introduces a stub-implementation (fake) that mimics the
API offered by libcalamares (the library is actually exposed
to Python via Boost::Python, so it doesn't act like a C-extension).
Using that stub-implementation, we can check Python modules for
validity as part of the test-suite.

The stub-implementation is needed, because otherwise every
Python module already fails at `import libcalamares`.

- stub-implement the API that is actually used by the Python modules
- in globalstorage, be slightly smart about what keys are being
  requested (so that e.g. all the modules that handle partitions
  information get an empty list and can manipulate that, instead of
  erroring out when they get a string)

CMakeModules/CalamaresAddModuleSubdirectory.cmake
ci/libcalamares/__init__.py
ci/libcalamares/globalstorage.py
ci/libcalamares/utils.py

index 1f1c023..91524a0 100644 (file)
@@ -42,6 +42,18 @@ include( CalamaresCheckModuleSelection )
 
 set( MODULE_DATA_DESTINATION share/calamares/modules )
 
+# We look for Pylint (just once) so that unittests can be added that
+# check the syntax / variables of Python modules. This should help
+# avoid more typo's-in-releases.
+if(BUILD_TESTING AND NOT PYLINT_COMMAND_SEARCHED)
+    set(PYLINT_COMMAND_SEARCHED TRUE)
+    find_program(
+        PYLINT_COMMAND
+        NAMES pylint3 pylint
+        PATHS $ENV{HOME}/.local/bin
+        )
+endif()
+
 function( _calamares_add_module_subdirectory_impl )
     set( SUBDIRECTORY ${ARGV0} )
 
@@ -241,6 +253,19 @@ function( _calamares_add_module_subdirectory_impl )
         if ( EXISTS ${_testdir}/CMakeTests.txt AND NOT EXISTS ${_mod_dir}/CMakeLists.txt )
             include( ${_testdir}/CMakeTests.txt )
         endif()
+        if ( PYLINT_COMMAND AND MODULE_INTERFACE MATCHES "python" )
+            # Python modules get an additional test via pylint; this
+            # needs to run at top-level because the ci/libcalamares directory
+            # contains API stubs.
+            #
+            # TODO: the entry point is assumed to be `main.py`, but that is
+            #       configurable through module.desc
+            add_test(
+                NAME lint-${SUBDIRECTORY}
+                COMMAND env PYTHONPATH=ci: ${PYLINT_COMMAND} -E ${_mod_dir}/main.py
+                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+                )
+        endif()
     endif()
 endfunction()
 
index 11bf0ff..1f7a094 100644 (file)
@@ -6,4 +6,4 @@
 # Boost::Python, not as a bare C-extension) so that
 # pylint doesn't complain about libcalamares internals.
 
-pass
+VERSION_SHORT="1.0"
index 3c2acb8..d40a282 100644 (file)
@@ -6,4 +6,19 @@
 # Boost::Python, not as a bare C-extension) so that
 # pylint doesn't complain about libcalamares internals.
 
-def value(_): return 1
+def count(): return 1
+
+def keys(): return []
+
+def contains(_): return True
+
+def value(key):
+    if key in ("branding",):
+        return dict()
+    if key in ("partitions",):
+        return list()
+    return ""
+
+def insert(key, value): pass
+
+def remove(_): pass
index 1d42389..706e4a9 100644 (file)
@@ -10,6 +10,14 @@ def debug(_): pass
 
 def warning(_): pass
 
+def error(_): pass
+
 def gettext_path(): pass
 
 def gettext_languages(): pass
+
+def target_env_call(_): return 0
+
+def check_target_env_call(_): pass
+
+def mount(device, mountpoint, fstype, options): return 0