diff --git a/pylintrc b/pylintrc index f781e2ed9a3a83e8da2152f0e81c4051c1256474..d3a2e89ae1990480e5377daf443e0a63224342bc 100644 --- a/pylintrc +++ b/pylintrc @@ -1,5 +1,3 @@ -# -*- mode:conf; -*- - [FORMAT] # Good variable names which should always be accepted, separated by a comma good-names=ii,rt,df diff --git a/src/caosadvancedtools/cfoods/h5.py b/src/caosadvancedtools/cfoods/h5.py index 4e6832f2e96e0950ed99146d4907f1ffb70d8494..f3d41dd0037ce9393b5b7dac3cc5bb6cc3db41d8 100644 --- a/src/caosadvancedtools/cfoods/h5.py +++ b/src/caosadvancedtools/cfoods/h5.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 -# This file is a part of the CaosDB Project. +# This file is a part of the LinkAhead Project. # # Copyright (C) 2020,2021 IndiScale GmbH <www.indiscale.com> -# Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com> +# Copyright (C) 2020-2025 Daniel Hornung <d.hornung@indiscale.com> # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com> # Copyright (C) 2021 Alexander Kreft # Copyright (C) 2021 Laboratory for Fluid Physics and Biocomplexity, @@ -33,19 +33,14 @@ attributes. Groups and datasets are mapped to Records and attributes to Properties. """ -import re from copy import deepcopy import caosdb as db import h5py import numpy as np from caosadvancedtools.cfood import fileguide -from caosdb.common.datatype import is_reference -from caosdb.common.utils import uuid -from ..cfood import (AbstractFileCFood, assure_has_description, - assure_has_parent, assure_has_property, - assure_property_is) +from ..cfood import AbstractFileCFood from ..structure_mapping import (EntityMapping, collect_existing_structure, update_structure) @@ -100,8 +95,7 @@ def h5_attr_to_property(val): if hasattr(val, 'ndim'): if not isinstance(val, np.ndarray) and val.ndim != 0: print(val, val.ndim) - raise Exception( - "Implementation assumes that only np.arrays have ndim.") + raise RuntimeError("Implementation assumes that only np.arrays have ndim.") return val, dtype @@ -127,6 +121,8 @@ class H5CFood(AbstractFileCFood): self.identifiable_root = None self.root_name = "root" self.hdf5Container = db.Container() + self.to_be_inserted = db.Container() + self.structure = db.Container() self.em = EntityMapping() def collect_information(self): @@ -165,7 +161,8 @@ class H5CFood(AbstractFileCFood): """ - self.structure._cuid = "root element" + # TODO Why do we need a protected member here? + self.structure._cuid = "root element" # pylint: disable=protected-access self.em.add(self.structure, self.identifiable_root) collect_existing_structure(self.structure, self.identifiable_root, self.em) @@ -282,7 +279,7 @@ class H5CFood(AbstractFileCFood): return rec def insert_missing_structure(self, target_structure: db.Record): - if target_structure._cuid not in self.em.to_existing: + if target_structure._cuid not in self.em.to_existing: # pylint: disable=protected-access self.to_be_inserted.append(target_structure) for prop in target_structure.get_properties(): diff --git a/src/caosadvancedtools/scifolder/analysis_cfood.py b/src/caosadvancedtools/scifolder/analysis_cfood.py index 27cb871aed08f41531c367567ea36ea9a3faaf69..608054cf1fa0eacd3e86f086bfc98b526357302a 100644 --- a/src/caosadvancedtools/scifolder/analysis_cfood.py +++ b/src/caosadvancedtools/scifolder/analysis_cfood.py @@ -16,17 +16,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. -import os -from itertools import chain - import caosdb as db -from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_parent, +from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_property, - assure_object_is_in_list, get_entity) -from caosadvancedtools.read_md_header import get_header + assure_object_is_in_list, + ) from .generic_pattern import full_pattern -from .utils import (get_files_referenced_by_field, parse_responsibles, +from .utils import (parse_responsibles, reference_records_corresponding_to_files) from .withreadme import DATAMODEL as dm from .withreadme import (RESULTS, REVISIONOF, SCRIPTS, SOURCES, WithREADME, diff --git a/src/caosadvancedtools/scifolder/experiment_cfood.py b/src/caosadvancedtools/scifolder/experiment_cfood.py index 38606b5f8ffd372d7bf6f507ed96738d9345f16c..d217719b1ab054ef57d818d18713d476c6e6eed9 100644 --- a/src/caosadvancedtools/scifolder/experiment_cfood.py +++ b/src/caosadvancedtools/scifolder/experiment_cfood.py @@ -17,15 +17,13 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. import caosdb as db -from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_description, - assure_has_parent, assure_has_property, - assure_object_is_in_list, get_entity) -from caosadvancedtools.read_md_header import get_header +from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_property, + assure_object_is_in_list) from .generic_pattern import full_pattern from .utils import parse_responsibles, reference_records_corresponding_to_files from .withreadme import DATAMODEL as dm -from .withreadme import RESULTS, REVISIONOF, SCRIPTS, WithREADME, get_glob +from .withreadme import RESULTS, REVISIONOF, WithREADME, get_glob class ExperimentCFood(AbstractFileCFood, WithREADME): @@ -40,6 +38,9 @@ class ExperimentCFood(AbstractFileCFood, WithREADME): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.project = db.Record() + self.experiment = db.Record() + self.people = [] WithREADME.__init__(self) self.name_map = {}, @@ -52,7 +53,7 @@ class ExperimentCFood(AbstractFileCFood, WithREADME): self.find_referenced_files([RESULTS]) @staticmethod - def create_identifiable_experiment(match): + def create_identifiable_experiment(match) -> tuple[db.Record, db.Record]: # create the project identifiable name = ExperimentCFood.name_beautifier( match.group("project_identifier")) diff --git a/src/caosadvancedtools/scifolder/publication_cfood.py b/src/caosadvancedtools/scifolder/publication_cfood.py index fc78e5b759e98e8989c952ccbafeef117e2ed33d..b4bc70b8b86b7af21dbb7acde3b36aa120e5d508 100644 --- a/src/caosadvancedtools/scifolder/publication_cfood.py +++ b/src/caosadvancedtools/scifolder/publication_cfood.py @@ -16,18 +16,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. -import os -from itertools import chain - import caosdb as db from caosadvancedtools.cfood import (AbstractFileCFood, assure_object_is_in_list, fileguide, - get_entity) + ) from caosadvancedtools.read_md_header import get_header -from caosadvancedtools.utils import find_records_that_reference_ids from .generic_pattern import date_suffix_pattern, readme_pattern -from .utils import (get_files_referenced_by_field, parse_responsibles, +from .utils import (parse_responsibles, reference_records_corresponding_to_files) from .withreadme import DATAMODEL as dm from .withreadme import (RESULTS, REVISIONOF, SCRIPTS, SOURCES, WithREADME, @@ -57,6 +53,8 @@ class PublicationCFood(AbstractFileCFood, WithREADME): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.publication = db.Record() + self.people = [] WithREADME.__init__(self) def collect_information(self): diff --git a/src/caosadvancedtools/scifolder/result_table_cfood.py b/src/caosadvancedtools/scifolder/result_table_cfood.py index deaa2d00118659a9b177a05fe40b19a1793a16fb..71668d3a3a7bda1351780ad4e059200ebedb1713 100644 --- a/src/caosadvancedtools/scifolder/result_table_cfood.py +++ b/src/caosadvancedtools/scifolder/result_table_cfood.py @@ -20,17 +20,12 @@ import re import caosdb as db import pandas as pd -from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_description, - assure_has_parent, assure_has_property, - assure_object_is_in_list, get_entity) -from caosadvancedtools.read_md_header import get_header +from caosadvancedtools.cfood import (AbstractFileCFood, + ) from ..cfood import assure_property_is, fileguide from .experiment_cfood import ExperimentCFood from .generic_pattern import date_pattern, date_suffix_pattern, project_pattern -from .utils import parse_responsibles, reference_records_corresponding_to_files -from .withreadme import DATAMODEL as dm -from .withreadme import RESULTS, REVISIONOF, SCRIPTS, WithREADME, get_glob # TODO similarities with TableCrawler @@ -48,6 +43,8 @@ class ResultTableCFood(AbstractFileCFood): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.recs = [] + self.experiment, self.project = (db.Record(), db.Record()) self.table = pd.read_csv(fileguide.access(self.crawled_path)) @staticmethod @@ -60,7 +57,7 @@ class ResultTableCFood(AbstractFileCFood): self.experiment, self.project = ( ExperimentCFood.create_identifiable_experiment(self.match)) - for idx, row in self.table.iterrows(): + for _, row in self.table.iterrows(): rec = db.Record() rec.add_parent(self.match.group("recordtype")) @@ -77,10 +74,11 @@ class ResultTableCFood(AbstractFileCFood): self.identifiables.extend([self.project, self.experiment]) def update_identifiables(self): - for ii, (idx, row) in enumerate(self.table.iterrows()): + for ii, (_, row) in enumerate(self.table.iterrows()): for col in row.index: match = re.match(ResultTableCFood.property_name_re, col) - assure_property_is(self.recs[ii], match.group("pname"), row.loc[col], to_be_updated=self.to_be_updated) + assure_property_is(self.recs[ii], match.group("pname"), row.loc[col], + to_be_updated=self.to_be_updated) assure_property_is(self.experiment, self.match.group("recordtype"), self.recs, to_be_updated=self.to_be_updated, datatype=db.LIST(self.match.group("recordtype"))) diff --git a/src/caosadvancedtools/scifolder/simulation_cfood.py b/src/caosadvancedtools/scifolder/simulation_cfood.py index c8f23f1485d7a1f64dcd940552051d2e1ec5bb07..24f4fdafd94e848299d16e6055f3176feb0672a8 100644 --- a/src/caosadvancedtools/scifolder/simulation_cfood.py +++ b/src/caosadvancedtools/scifolder/simulation_cfood.py @@ -16,17 +16,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. -import os -from itertools import chain - import caosdb as db -from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_parent, +from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_property, - assure_object_is_in_list, get_entity) -from caosadvancedtools.read_md_header import get_header + assure_object_is_in_list) from .generic_pattern import full_pattern -from .utils import (get_files_referenced_by_field, parse_responsibles, +from .utils import (parse_responsibles, reference_records_corresponding_to_files) from .withreadme import DATAMODEL as dm from .withreadme import (RESULTS, REVISIONOF, SCRIPTS, SOURCES, WithREADME, @@ -41,6 +37,9 @@ class SimulationCFood(AbstractFileCFood, WithREADME): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.project = db.Record() + self.simulation = db.Record() + self.people = [] WithREADME.__init__(self) def collect_information(self): diff --git a/src/caosadvancedtools/scifolder/software_cfood.py b/src/caosadvancedtools/scifolder/software_cfood.py index 77fb46521e9aab875b6f99d0a1ee4ac44177e09c..47abda230be6e136c0b8486b210117ca19131110 100644 --- a/src/caosadvancedtools/scifolder/software_cfood.py +++ b/src/caosadvancedtools/scifolder/software_cfood.py @@ -17,20 +17,16 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. -import os -from itertools import chain import caosdb as db -from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_parent, +from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_property, assure_name_is, - assure_object_is_in_list, get_entity) + assure_object_is_in_list) from caosadvancedtools.guard import global_guard as guard -from caosadvancedtools.read_md_header import get_header from .generic_pattern import full_pattern -from .utils import get_files_referenced_by_field, parse_responsibles +from .utils import parse_responsibles from .withreadme import BINARIES -from .withreadme import DATAMODEL as dm from .withreadme import SOURCECODE, WithREADME @@ -43,6 +39,9 @@ class SoftwareCFood(AbstractFileCFood, WithREADME): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.software = db.Record() + self.softwareversion = db.Record() + self.people = [] WithREADME.__init__(self) def collect_information(self): diff --git a/src/caosadvancedtools/scifolder/utils.py b/src/caosadvancedtools/scifolder/utils.py index 50e897c7d2f19c6269ec622489c5a2c6ce1a28e0..cbf87c4b802c829f34f4368c3605ce05fa42cfb2 100644 --- a/src/caosadvancedtools/scifolder/utils.py +++ b/src/caosadvancedtools/scifolder/utils.py @@ -26,7 +26,6 @@ import pandas as pd from caosadvancedtools.cfood import assure_object_is_in_list, fileguide from caosadvancedtools.utils import (find_records_that_reference_ids, read_field_as_list, - return_field_or_property, string_to_person) logger = logging.getLogger("caosadvancedtools") diff --git a/src/caosadvancedtools/scifolder/withreadme.py b/src/caosadvancedtools/scifolder/withreadme.py index e1968ba49799827467c7ef93a7070b7f090010fb..2b9108bc7eaf078fb2609a08f37000007dbfe288 100644 --- a/src/caosadvancedtools/scifolder/withreadme.py +++ b/src/caosadvancedtools/scifolder/withreadme.py @@ -26,8 +26,7 @@ import caosdb as db from caosadvancedtools.cfood import (assure_has_description, assure_has_parent, assure_object_is_in_list, fileguide) from caosadvancedtools.read_md_header import get_header as get_md_header -from caosadvancedtools.table_importer import (win_path_converter, - win_path_list_converter) +from caosadvancedtools.table_importer import win_path_converter from caosadvancedtools.utils import return_field_or_property from .utils import (get_entity_ids_from_include_file, @@ -157,8 +156,8 @@ class WithREADME(object): for f in sublist] if len(flat_list) == 0: - LOGGER.warn("ATTENTION: the field {} does not reference any " - "known files".format(field.key)) + LOGGER.warning("ATTENTION: the field {} does not reference any " + "known files".format(field.key)) self.attached_filenames.extend(flat_list) # pylint: disable=no-member diff --git a/src/caosadvancedtools/serverside/helper.py b/src/caosadvancedtools/serverside/helper.py index a7db25197911de4640e64ff6b3e302d6c8969422..a5f82988c7f61669d81a4f6c1b29525fe91e44cf 100644 --- a/src/caosadvancedtools/serverside/helper.py +++ b/src/caosadvancedtools/serverside/helper.py @@ -223,6 +223,7 @@ def init_data_model(entities): "be a {}.".format(e.role, local_role)) raise DataModelError(e.name, info) except db.exceptions.EntityDoesNotExistError: + # pylint: disable-next=raise-missing-from raise DataModelError(e.name, "This entity does not exist.") return True @@ -242,11 +243,11 @@ def get_data(filename, default=None): Returns ------- - dict + out: dict Data from the given file. """ result = default.copy() if default is not None else {} - with open(filename, 'r') as fi: + with open(filename, "r", encoding="utf8") as fi: data = json.load(fi) result.update(data) diff --git a/src/caosadvancedtools/table_json_conversion/fill_xlsx.py b/src/caosadvancedtools/table_json_conversion/fill_xlsx.py index 05ec84386f0bfff5a05d3f7c431545a32ea4b615..60b5c96c7de141b1ecb12254e6928252fe4a9f5c 100644 --- a/src/caosadvancedtools/table_json_conversion/fill_xlsx.py +++ b/src/caosadvancedtools/table_json_conversion/fill_xlsx.py @@ -173,7 +173,7 @@ class TemplateFiller: def next_level(self, next_level: str) -> TemplateFiller.Context: result = self.copy() - result._current_path.append(next_level) + result._current_path.append(next_level) # pylint: disable=protected-access return result def __getitem__(self, path: Union[List[str], str], owner=None) -> Any: