From d636c45c5e69e81a4bdfb16829ea8c51480c248c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com> Date: Thu, 4 Apr 2024 09:51:02 +0200 Subject: [PATCH] revert some lilnkahead renamings --- .../test_crawl_with_datamodel_problems.py | 2 +- src/caosadvancedtools/cache.py | 2 +- src/caosadvancedtools/cfood.py | 8 +-- src/caosadvancedtools/crawler.py | 72 +++++++++---------- src/caosadvancedtools/datamodel_problems.py | 6 +- src/caosadvancedtools/guard.py | 2 +- src/caosadvancedtools/loadFiles.py | 13 +--- .../scifolder/experiment_cfood.py | 15 ++-- .../scifolder/publication_cfood.py | 10 +-- .../scifolder/result_table_cfood.py | 18 ++--- .../scifolder/simulation_cfood.py | 13 ++-- .../scifolder/software_cfood.py | 13 ++-- src/caosadvancedtools/scifolder/utils.py | 1 + src/caosadvancedtools/scifolder/withreadme.py | 7 +- .../serverside/generic_analysis.py | 4 +- src/caosadvancedtools/serverside/helper.py | 7 +- src/caosadvancedtools/utils.py | 4 +- 17 files changed, 95 insertions(+), 102 deletions(-) diff --git a/integrationtests/test_crawl_with_datamodel_problems.py b/integrationtests/test_crawl_with_datamodel_problems.py index 08c80ea1..8623d57d 100644 --- a/integrationtests/test_crawl_with_datamodel_problems.py +++ b/integrationtests/test_crawl_with_datamodel_problems.py @@ -25,7 +25,7 @@ """ -import linkahead as db +import caosdb as db from caosadvancedtools import loadFiles from caosadvancedtools.cfood import fileguide from caosadvancedtools.crawler import FileCrawler diff --git a/src/caosadvancedtools/cache.py b/src/caosadvancedtools/cache.py index 0ffc7282..cf74e330 100644 --- a/src/caosadvancedtools/cache.py +++ b/src/caosadvancedtools/cache.py @@ -33,7 +33,7 @@ from abc import ABC, abstractmethod from copy import deepcopy from hashlib import sha256 -import linkahead as db +import caosdb as db from lxml import etree diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py index 7c71f8a4..c0da4f01 100644 --- a/src/caosadvancedtools/cfood.py +++ b/src/caosadvancedtools/cfood.py @@ -43,10 +43,10 @@ import warnings from abc import ABCMeta, abstractmethod from datetime import datetime -import linkahead as db -from linkahead.common.models import Entity -from linkahead.exceptions import (BadQueryError, EmptyUniqueQueryError, - QueryNotUniqueError, TransactionError) +import caosdb as db +from caosdb.common.models import Entity +from caosdb.exceptions import (BadQueryError, EmptyUniqueQueryError, + QueryNotUniqueError, TransactionError) from .datamodel_problems import DataModelProblems from .guard import global_guard as guard diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py index 6655919e..5e84bc8a 100644 --- a/src/caosadvancedtools/crawler.py +++ b/src/caosadvancedtools/crawler.py @@ -41,14 +41,14 @@ match. This occurs in basically three steps: import logging import os +import subprocess import traceback import uuid from datetime import datetime from sqlite3 import IntegrityError -from xml.sax.saxutils import escape -import linkahead as db -from linkahead.exceptions import BadQueryError, TransactionError +import caosdb as db +from caosdb.exceptions import BadQueryError from .cache import IdentifiableCache, UpdateCache, get_pretty_xml from .cfood import RowCFood, add_files, get_ids_for_entities_with_names @@ -67,7 +67,7 @@ def separated(text): return "-"*60 + "\n" + text -def apply_list_of_updates(to_be_updated, update_flags=None, +def apply_list_of_updates(to_be_updated, update_flags={}, update_cache=None, run_id=None): """Updates the `to_be_updated` Container, i.e., pushes the changes to CaosDB after removing possible duplicates. If a chace is provided, uauthorized @@ -87,8 +87,6 @@ def apply_list_of_updates(to_be_updated, update_flags=None, Id with which the pending updates are cached. Only meaningful if `update_cache` is provided. Default is None. """ - if update_flags is None: - update_flags = {} if len(to_be_updated) == 0: return @@ -134,7 +132,7 @@ def apply_list_of_updates(to_be_updated, update_flags=None, ) logger.debug(traceback.format_exc()) logger.debug(e) - except TransactionError as e: + except Exception as e: DataModelProblems.evaluate_exception(e) @@ -222,27 +220,25 @@ class Crawler(object): new_cont = db.Container.from_xml(new) ids = [] tmp = db.Container() - # TODO what was this for? - # update_incomplete = False + update_incomplete = False # remove duplicate entities for el in new_cont: if el.id not in ids: ids.append(el.id) tmp.append(el) else: - pass - # update_incomplete = True + update_incomplete = True new_cont = tmp - if new_cont[0].version: # pylint: disable=no-member + if new_cont[0].version: valids = db.Container() nonvalids = db.Container() for ent in new_cont: remote_ent = db.Entity(id=ent.id).retrieve() - if ent.version == remote_ent.version: # pylint: disable=no-member + if ent.version == remote_ent.version: valids.append(ent) else: - # update_incomplete = True + update_incomplete = True nonvalids.append(remote_ent) valids.update(unique=False) logger.info("Successfully updated {} records!".format( @@ -321,10 +317,10 @@ class Crawler(object): logger.debug(e) # TODO: Generally: in which cases should exceptions be raised? When is # errors_occured set to True? The expected behavior must be documented. - except TransactionError as e: + except Exception as e: try: DataModelProblems.evaluate_exception(e) - except BaseException: # pylint: disable=broad-exception-caught + except BaseException: pass logger.debug("Failed during execution of {}!".format( Cfood.__name__)) @@ -353,12 +349,13 @@ class Crawler(object): logger.info("Cannot access {}. However, it might be needed for" " the correct execution".format(e.filename)) remove_cfoods.append(cfood) - except TransactionError as e: + except Exception as e: try: DataModelProblems.evaluate_exception(e) - except BaseException: # pylint: disable=broad-exception-caught + except BaseException: pass - logger.debug("Failed during execution of {}!".format(cfood.__name__)) + logger.debug("Failed during execution of {}!".format( + Cfood.__name__)) logger.debug(traceback.format_exc()) logger.debug(e) remove_cfoods.append(cfood) @@ -418,8 +415,8 @@ class Crawler(object): self.cache.insert_list(hashes, identifiables) def crawl(self, security_level=RETRIEVE, path=None): - run_id = uuid.uuid1() - logger.info("Run Id: " + str(run_id)) + self.run_id = uuid.uuid1() + logger.info("Run Id: " + str(self.run_id)) guard.set_level(level=security_level) logger.info("Scanning the objects to be treated...") @@ -438,17 +435,17 @@ class Crawler(object): cfood.to_be_updated, cfood.update_flags, update_cache=self.update_cache, - run_id=run_id) + run_id=self.run_id) except FileNotFoundError as e: logger.info("Cannot access {}. However, it might be needed for" " the correct execution".format(e.filename)) except DataInconsistencyError as e: logger.debug(traceback.format_exc()) logger.debug(e) - except TransactionError as e: + except Exception as e: try: DataModelProblems.evaluate_exception(e) - except Exception: # pylint: disable=broad-exception-caught + except Exception: pass logger.info("Failed during execution of {}!".format( cfood.__class__.__name__)) @@ -460,7 +457,7 @@ class Crawler(object): errors_occured = True tbs.append(e) - pending_changes = self.update_cache.get_updates(run_id) + pending_changes = self.update_cache.get_updates(self.run_id) if pending_changes: # Sending an Email with a link to a form to authorize updates is @@ -468,7 +465,7 @@ class Crawler(object): if "SHARED_DIR" in os.environ: filename = Crawler.save_form([el[3] - for el in pending_changes], path, run_id) + for el in pending_changes], path, self.run_id) Crawler.send_mail([el[3] for el in pending_changes], filename) for i, el in enumerate(pending_changes): @@ -480,7 +477,7 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3])) logger.info("There where unauthorized changes (see above). An " "email was sent to the curator.\n" "You can authorize the updates by invoking the crawler" - " with the run id: {rid}\n".format(rid=run_id)) + " with the run id: {rid}\n".format(rid=self.run_id)) if len(DataModelProblems.missing) > 0: err_msg = ("There were problems with one or more RecordType or " @@ -491,9 +488,8 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3])) logger.error(err_msg) logger.error('Crawler finished with Datamodel Errors') elif errors_occured: - msg = ("There were fatal errors during execution, please " - "contact the system administrator!" - ) + msg = "There were fatal errors during execution, please " + "contact the system administrator!" if self.debug_file: msg += "\nPlease provide the following path:\n{}".format( @@ -520,6 +516,7 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3])) path: the path defining the subtree that is crawled """ + from xml.sax.saxutils import escape # TODO move path related stuff to sss_helper form = """ @@ -596,7 +593,7 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3])) randname = os.path.basename(os.path.abspath(directory)) filepath = os.path.abspath(os.path.join(directory, filename)) filename = os.path.join(randname, filename) - with open(filepath, "w", encoding="utf8") as f: + with open(filepath, "w") as f: f.write(form) return filename @@ -676,7 +673,7 @@ carefully and if the changes are ok, click on the following link: guard.safe_insert(missing, unique=False, flags={"force-missing-obligatory": "ignore"}) inserted.append(ent) - except TransactionError as e: + except Exception as e: DataModelProblems.evaluate_exception(e) if len(existing) > 0: info = "Identified the following existing entities:\n" @@ -777,13 +774,14 @@ class FileCrawler(Crawler): path if path.endswith("/") else path + "/") + "**'" q_info = "Sending the following query: '" + query_str + "'\n" files = db.execute_query(query_str) - logger.info(q_info + f"Found {len(files)} files that need to be processed.") + logger.info( + q_info + "Found {} files that need to be processed.".format( + len(files))) return files class TableCrawler(Crawler): - """Crawler for table like data.""" def __init__(self, table, unique_cols, recordtype, **kwargs): """ @@ -798,7 +796,6 @@ class TableCrawler(Crawler): # TODO I do not like this yet, but I do not see a better way so far. class ThisRowCF(RowCFood): - """CFood for rows.""" def __init__(self, item): super().__init__(item, unique_cols, recordtype) @@ -824,6 +821,7 @@ def get_value(prop): if isinstance(prop.value, db.Entity): return prop.value.id - if isinstance(prop.value, datetime): + elif isinstance(prop.value, datetime): return prop.value.isoformat() - return prop.value + else: + return prop.value diff --git a/src/caosadvancedtools/datamodel_problems.py b/src/caosadvancedtools/datamodel_problems.py index a83da009..df5b7e56 100644 --- a/src/caosadvancedtools/datamodel_problems.py +++ b/src/caosadvancedtools/datamodel_problems.py @@ -28,9 +28,9 @@ or updating entities with missing parents and/or properties. """ from caosdb.exceptions import (EntityDoesNotExistError, - TransactionError, - UnqualifiedParentsError, - UnqualifiedPropertiesError) + TransactionError, + UnqualifiedParentsError, + UnqualifiedPropertiesError) class DataModelProblems(object): diff --git a/src/caosadvancedtools/guard.py b/src/caosadvancedtools/guard.py index 16cf7304..aa37448d 100644 --- a/src/caosadvancedtools/guard.py +++ b/src/caosadvancedtools/guard.py @@ -18,7 +18,7 @@ # 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 linkahead as db +import caosdb as db RETRIEVE = 0 INSERT = 1 diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py index 26b6c1c0..405b3d13 100755 --- a/src/caosadvancedtools/loadFiles.py +++ b/src/caosadvancedtools/loadFiles.py @@ -129,14 +129,7 @@ def create_re_for_file_list(files, localroot, remoteroot): def loadpath(path, include, exclude, prefix, dryrun, forceAllowSymlinks, caosdbignore=None, - localpath=None) -> dict: - """ -Returns -------- - -inserted: dict - A dict with the files to be included for each of the ``include`` elements. - """ + localpath=None): if caosdbignore: # create list of files and create regular expression for small chunks @@ -153,7 +146,6 @@ inserted: dict else: includes = [include] - inserted = {} # if no caosdbignore file is used, this iterates over a single include for include in includes: if dryrun: @@ -185,9 +177,8 @@ inserted: dict logger.info( f"Made new files accessible: {len(files)}, combined size: {convert_size(totalsize)} ") - inserted[include] = files - return inserted + return def main(argv=None): diff --git a/src/caosadvancedtools/scifolder/experiment_cfood.py b/src/caosadvancedtools/scifolder/experiment_cfood.py index 502314ad..38606b5f 100644 --- a/src/caosadvancedtools/scifolder/experiment_cfood.py +++ b/src/caosadvancedtools/scifolder/experiment_cfood.py @@ -16,16 +16,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/>. -from typing import TYPE_CHECKING, Tuple - import caosdb as db -from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_property, - assure_object_is_in_list) +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 .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, WithREADME, get_glob +from .withreadme import RESULTS, REVISIONOF, SCRIPTS, WithREADME, get_glob class ExperimentCFood(AbstractFileCFood, WithREADME): @@ -40,9 +40,6 @@ 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 = {}, @@ -55,7 +52,7 @@ class ExperimentCFood(AbstractFileCFood, WithREADME): self.find_referenced_files([RESULTS]) @staticmethod - def create_identifiable_experiment(match) -> Tuple[db.Record, db.Record]: + def create_identifiable_experiment(match): # 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 b4bc70b8..fc78e5b7 100644 --- a/src/caosadvancedtools/scifolder/publication_cfood.py +++ b/src/caosadvancedtools/scifolder/publication_cfood.py @@ -16,14 +16,18 @@ # 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 (parse_responsibles, +from .utils import (get_files_referenced_by_field, parse_responsibles, reference_records_corresponding_to_files) from .withreadme import DATAMODEL as dm from .withreadme import (RESULTS, REVISIONOF, SCRIPTS, SOURCES, WithREADME, @@ -53,8 +57,6 @@ 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 71668d3a..deaa2d00 100644 --- a/src/caosadvancedtools/scifolder/result_table_cfood.py +++ b/src/caosadvancedtools/scifolder/result_table_cfood.py @@ -20,12 +20,17 @@ import re import caosdb as db import pandas as pd -from caosadvancedtools.cfood import (AbstractFileCFood, - ) +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 ..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 @@ -43,8 +48,6 @@ 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 @@ -57,7 +60,7 @@ class ResultTableCFood(AbstractFileCFood): self.experiment, self.project = ( ExperimentCFood.create_identifiable_experiment(self.match)) - for _, row in self.table.iterrows(): + for idx, row in self.table.iterrows(): rec = db.Record() rec.add_parent(self.match.group("recordtype")) @@ -74,11 +77,10 @@ class ResultTableCFood(AbstractFileCFood): self.identifiables.extend([self.project, self.experiment]) def update_identifiables(self): - for ii, (_, row) in enumerate(self.table.iterrows()): + for ii, (idx, 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 24f4fdaf..c8f23f14 100644 --- a/src/caosadvancedtools/scifolder/simulation_cfood.py +++ b/src/caosadvancedtools/scifolder/simulation_cfood.py @@ -16,13 +16,17 @@ # 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, +from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_parent, assure_has_property, - assure_object_is_in_list) + assure_object_is_in_list, get_entity) +from caosadvancedtools.read_md_header import get_header from .generic_pattern import full_pattern -from .utils import (parse_responsibles, +from .utils import (get_files_referenced_by_field, parse_responsibles, reference_records_corresponding_to_files) from .withreadme import DATAMODEL as dm from .withreadme import (RESULTS, REVISIONOF, SCRIPTS, SOURCES, WithREADME, @@ -37,9 +41,6 @@ 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 47abda23..77fb4652 100644 --- a/src/caosadvancedtools/scifolder/software_cfood.py +++ b/src/caosadvancedtools/scifolder/software_cfood.py @@ -17,16 +17,20 @@ # 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, +from caosadvancedtools.cfood import (AbstractFileCFood, assure_has_parent, assure_has_property, assure_name_is, - assure_object_is_in_list) + assure_object_is_in_list, get_entity) 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 parse_responsibles +from .utils import get_files_referenced_by_field, parse_responsibles from .withreadme import BINARIES +from .withreadme import DATAMODEL as dm from .withreadme import SOURCECODE, WithREADME @@ -39,9 +43,6 @@ 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 cbf87c4b..50e897c7 100644 --- a/src/caosadvancedtools/scifolder/utils.py +++ b/src/caosadvancedtools/scifolder/utils.py @@ -26,6 +26,7 @@ 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 2b9108bc..e1968ba4 100644 --- a/src/caosadvancedtools/scifolder/withreadme.py +++ b/src/caosadvancedtools/scifolder/withreadme.py @@ -26,7 +26,8 @@ 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 +from caosadvancedtools.table_importer import (win_path_converter, + win_path_list_converter) from caosadvancedtools.utils import return_field_or_property from .utils import (get_entity_ids_from_include_file, @@ -156,8 +157,8 @@ class WithREADME(object): for f in sublist] if len(flat_list) == 0: - LOGGER.warning("ATTENTION: the field {} does not reference any " - "known files".format(field.key)) + LOGGER.warn("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/generic_analysis.py b/src/caosadvancedtools/serverside/generic_analysis.py index a0ff479d..85d0c860 100644 --- a/src/caosadvancedtools/serverside/generic_analysis.py +++ b/src/caosadvancedtools/serverside/generic_analysis.py @@ -87,8 +87,8 @@ import logging import os import sys -import linkahead as db -from linkahead.utils.server_side_scripting import run_server_side_script +import caosdb as db +from caosdb.utils.server_side_scripting import run_server_side_script logger = logging.getLogger(__name__) diff --git a/src/caosadvancedtools/serverside/helper.py b/src/caosadvancedtools/serverside/helper.py index a5f82988..ba75739e 100644 --- a/src/caosadvancedtools/serverside/helper.py +++ b/src/caosadvancedtools/serverside/helper.py @@ -30,7 +30,7 @@ import sys from email import message, policy, utils from tempfile import NamedTemporaryFile -import linkahead as db +import caosdb as db def wrap_bootstrap_alert(text, kind): @@ -223,7 +223,6 @@ 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 @@ -243,11 +242,11 @@ def get_data(filename, default=None): Returns ------- - out: dict + dict Data from the given file. """ result = default.copy() if default is not None else {} - with open(filename, "r", encoding="utf8") as fi: + with open(filename, 'r') as fi: data = json.load(fi) result.update(data) diff --git a/src/caosadvancedtools/utils.py b/src/caosadvancedtools/utils.py index d03583a1..4d6a4b36 100644 --- a/src/caosadvancedtools/utils.py +++ b/src/caosadvancedtools/utils.py @@ -27,8 +27,8 @@ import logging import os import pathlib -import linkahead as db -from linkahead.exceptions import TransactionError +import caosdb as db +from caosdb.exceptions import TransactionError logger = logging.getLogger(__name__) -- GitLab