From 9e2a51017477464336f370f6e70043876e508b6b Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Fri, 1 Apr 2022 13:23:11 +0200
Subject: [PATCH] MAINT: Linting tests run through now.

Issue for real fix: #80
---
 pylintrc                                      | 16 +++++++++++---
 src/caosadvancedtools/cfood.py                | 10 +++++++--
 src/caosadvancedtools/cfoods/h5.py            |  1 +
 .../converter/labfolder_api.py                |  2 +-
 src/caosadvancedtools/models/parser.py        |  4 ++--
 .../scifolder/simulation_cfood.py             | 10 ++++-----
 src/caosadvancedtools/scifolder/withreadme.py | 22 +++++++++----------
 .../serverside/generic_analysis.py            |  3 +--
 src/caosadvancedtools/serverside/helper.py    |  2 +-
 9 files changed, 43 insertions(+), 27 deletions(-)

diff --git a/pylintrc b/pylintrc
index 8a12125d..625f83ce 100644
--- a/pylintrc
+++ b/pylintrc
@@ -2,8 +2,18 @@
 
 [FORMAT]
 # Good variable names which should always be accepted, separated by a comma
-good-names=ii,rt
-
+good-names=ii,rt,df
 
 [TYPECHECK]                                                                    
-ignored-modules=etree
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis
+ignored-modules=etree,h5py,labfolder
+
+[MASTER]
+# TODO: The max_inferred size is necessary for https://github.com/PyCQA/pylint/issues/4577,
+# otherwise pandas.read_csv's return value would be inferred as TextFileReader.
+init-hook=
+  import sys; sys.path.extend(["src/caosadvancedtools"]);
+  import astroid; astroid.context.InferenceContext.max_inferred = 500;
+
diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index 3c2d5408..f060bed5 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -841,8 +841,14 @@ class CMeal(object):
     matching_groups = []
 
     def __init__(self):
+        self.item = None
+        self.match = None
         self.__class__.existing_instances.append(self)
 
+    @staticmethod
+    def get_re():
+        raise NotImplementedError("Subclasses must implement this function.")
+
     @classmethod
     def all_groups_equal(cls, m1, m2):
         equal = True
@@ -878,5 +884,5 @@ class CMeal(object):
 
         if match is None:
             return False
-        else:
-            return self.all_groups_equal(match, self.match)
+
+        return self.all_groups_equal(match, self.match)
diff --git a/src/caosadvancedtools/cfoods/h5.py b/src/caosadvancedtools/cfoods/h5.py
index 6c68edd3..cbf9d0ba 100644
--- a/src/caosadvancedtools/cfoods/h5.py
+++ b/src/caosadvancedtools/cfoods/h5.py
@@ -124,6 +124,7 @@ class H5CFood(AbstractFileCFood):
         """CFood which consumes HDF5 files."""
         super().__init__(*args, **kwargs)
         self.h5file = None
+        self.identifiable_root = None
         self.root_name = "root"
         self.hdf5Container = db.Container()
         self.em = EntityMapping()
diff --git a/src/caosadvancedtools/converter/labfolder_api.py b/src/caosadvancedtools/converter/labfolder_api.py
index a29d965b..cf57c015 100644
--- a/src/caosadvancedtools/converter/labfolder_api.py
+++ b/src/caosadvancedtools/converter/labfolder_api.py
@@ -28,7 +28,7 @@ import time
 import html2text
 
 import caosdb as db
-from labfolder.connection import configure_connection
+from labfolder.connection import configure_connection  # pylint: disable=import-error
 
 
 class Importer(object):
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index b290b1b7..48fc1e72 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -566,9 +566,9 @@ class Parser(object):
                              db.BOOLEAN]:
 
                     if is_list:
-                        value.datatype = db.LIST(db.__getattribute__(dtype))
+                        value.datatype = db.LIST(db.__getattribute__(dtype))  # pylint: disable=no-member
                     else:
-                        value.datatype = db.__getattribute__(dtype)
+                        value.datatype = db.__getattribute__(dtype)  # pylint: disable=no-member
 
                     continue
 
diff --git a/src/caosadvancedtools/scifolder/simulation_cfood.py b/src/caosadvancedtools/scifolder/simulation_cfood.py
index ae129e6a..c8f23f14 100644
--- a/src/caosadvancedtools/scifolder/simulation_cfood.py
+++ b/src/caosadvancedtools/scifolder/simulation_cfood.py
@@ -88,22 +88,22 @@ class SimulationCFood(AbstractFileCFood, WithREADME):
                                  self.to_be_updated,
                                  datatype=db.LIST(db.REFERENCE))
 
-        if SOURCES.key in self.header:
+        if SOURCES.key in self.header:                         # pylint: disable=unsupported-membership-test
             reference_records_corresponding_to_files(
                     record=self.simulation,
                     recordtypes=["Experiment", "Publication", "Simulation",
                                  "Analysis"],
-                    globs=get_glob(self.header[SOURCES.key]),
+                    globs=get_glob(self.header[SOURCES.key]),  # pylint: disable=unsubscriptable-object
                     property_name=dm.sources,
                     path=self.crawled_path,
                     to_be_updated=self.to_be_updated)
         self.reference_files_from_header(record=self.simulation)
 
-        if REVISIONOF.key in self.header:
+        if REVISIONOF.key in self.header:                      # pylint: disable=unsupported-membership-test
             reference_records_corresponding_to_files(
                 record=self.simulation,
-                recordtypes=[dm.Software],
+                recordtypes=[dm.Software],                     # pylint: disable=no-member
                 property_name=dm.revisionOf,
-                globs=get_glob(self.header[dm.revisionOf]),
+                globs=get_glob(self.header[dm.revisionOf]),    # pylint: disable=unsubscriptable-object
                 path=self.crawled_path,
                 to_be_updated=self.to_be_updated)
diff --git a/src/caosadvancedtools/scifolder/withreadme.py b/src/caosadvancedtools/scifolder/withreadme.py
index 8a63e1f6..e1968ba4 100644
--- a/src/caosadvancedtools/scifolder/withreadme.py
+++ b/src/caosadvancedtools/scifolder/withreadme.py
@@ -121,12 +121,12 @@ class WithREADME(object):
     @property
     def header(self):
         if self._header is None:
-            if self.crawled_path.lower().endswith(".md"):
+            if self.crawled_path.lower().endswith(".md"):  # pylint: disable=no-member
                 self._header = get_md_header(
-                    fileguide.access(self.crawled_path))
-            elif self.crawled_path.lower().endswith(".xlsx"):
+                    fileguide.access(self.crawled_path))   # pylint: disable=no-member
+            elif self.crawled_path.lower().endswith(".xlsx"):  # pylint: disable=no-member
                 self._header = get_xls_header(
-                    fileguide.access(self.crawled_path))
+                    fileguide.access(self.crawled_path))       # pylint: disable=no-member
             else:
                 raise RuntimeError("Readme format not recognized.")
             self.convert_win_paths()
@@ -145,7 +145,7 @@ class WithREADME(object):
 
             globs = get_glob(self.header[field.key])
             files = get_files_referenced_by_field(
-                globs, prefix=os.path.dirname(self.crawled_path))
+                globs, prefix=os.path.dirname(self.crawled_path))  # pylint: disable=no-member
 
             description = [get_description(val) for val in
                            self.header[field.key]]
@@ -160,7 +160,7 @@ class WithREADME(object):
                 LOGGER.warn("ATTENTION: the field {} does not reference any "
                             "known files".format(field.key))
 
-            self.attached_filenames.extend(flat_list)
+            self.attached_filenames.extend(flat_list)  # pylint: disable=no-member
 
     def convert_path(self, el):
         """ converts the path in el to unix type
@@ -185,7 +185,7 @@ class WithREADME(object):
             return win_path_converter(el)
 
     def convert_win_paths(self):
-        for field in self.win_paths:
+        for field in self.win_paths:  # pylint: disable=no-member
             if field in self.header:
 
                 if isinstance(self.header[field], list):
@@ -245,7 +245,7 @@ class WithREADME(object):
                 references[ref_type],
                 record,
                 ref_type,
-                to_be_updated=self.to_be_updated,
+                to_be_updated=self.to_be_updated,  # pylint: disable=no-member
             )
 
     def reference_included_records(self, record, fields, to_be_updated):
@@ -255,16 +255,16 @@ class WithREADME(object):
 
         for field in fields:
 
-            if field.key not in self.header:
+            if field.key not in self.header:  # pylint: disable=no-member
                 continue
             included = []
 
-            for item in self.header[field.key]:
+            for item in self.header[field.key]:  # pylint: disable=no-member
                 if INCLUDE.key in item:
                     try:
                         included.extend(
                             get_entity_ids_from_include_file(
-                                os.path.dirname(self.crawled_path),
+                                os.path.dirname(self.crawled_path),  # pylint: disable=no-member
                                 item[INCLUDE.key]))
                     except ValueError:
                         al = logging.getLogger("caosadvancedtools")
diff --git a/src/caosadvancedtools/serverside/generic_analysis.py b/src/caosadvancedtools/serverside/generic_analysis.py
index 66bec8a7..85d0c860 100644
--- a/src/caosadvancedtools/serverside/generic_analysis.py
+++ b/src/caosadvancedtools/serverside/generic_analysis.py
@@ -210,5 +210,4 @@ def main():
 
 
 if __name__ == "__main__":
-    args = _parse_arguments()
-    sys.exit(main(args))
+    sys.exit(main())
diff --git a/src/caosadvancedtools/serverside/helper.py b/src/caosadvancedtools/serverside/helper.py
index 33deb8cc..ba75739e 100644
--- a/src/caosadvancedtools/serverside/helper.py
+++ b/src/caosadvancedtools/serverside/helper.py
@@ -394,7 +394,7 @@ def send_mail(from_addr, to, subject, body, cc=None, bcc=None,
             err_msg = ("No sendmail executable configured. "
                        "Please configure `Misc.sendmail` "
                        "in your pycaosdb.ini.")
-            raise db.ConfigurationException(err_msg)
+            raise db.ConfigurationError(err_msg)
         sendmail = caosdb_config["Misc"]["sendmail"]
 
     # construct sendmail command
-- 
GitLab