diff --git a/radicale/__main__.py b/radicale/__main__.py index 323b57f..e2ed260 100644 --- a/radicale/__main__.py +++ b/radicale/__main__.py @@ -28,6 +28,7 @@ import contextlib import os import signal import socket +import sys from radicale import VERSION, config, log, server, storage from radicale.log import logger @@ -113,7 +114,7 @@ def run(): configuration.update(arguments_config, "arguments") except Exception as e: logger.fatal("Invalid configuration: %s", e, exc_info=True) - exit(1) + sys.exit(1) # Configure logging log.set_level(configuration.get("logging", "level")) @@ -128,11 +129,11 @@ def run(): with storage_.acquire_lock("r"): if not storage_.verify(): logger.fatal("Storage verifcation failed") - exit(1) + sys.exit(1) except Exception as e: logger.fatal("An exception occurred during storage verification: " "%s", e, exc_info=True) - exit(1) + sys.exit(1) return # Create a socket pair to notify the server of program shutdown @@ -149,7 +150,7 @@ def run(): except Exception as e: logger.fatal("An exception occurred during server startup: %s", e, exc_info=True) - exit(1) + sys.exit(1) if __name__ == "__main__": diff --git a/radicale/item/filter.py b/radicale/item/filter.py index 4c46dff..2d1d179 100644 --- a/radicale/item/filter.py +++ b/radicale/item/filter.py @@ -450,8 +450,7 @@ def text_match(vobject_item, filter_, child_name, ns, attrib_name=None): condition = any(match(child.value) for child in children) if filter_.get("negate-condition") == "yes": return not condition - else: - return condition + return condition def param_filter_match(vobject_item, filter_, parent_name, ns): @@ -467,10 +466,9 @@ def param_filter_match(vobject_item, filter_, parent_name, ns): if filter_[0].tag == xmlutils.make_clark("%s:text-match" % ns): return condition and text_match( vobject_item, filter_[0], parent_name, ns, name) - elif filter_[0].tag == xmlutils.make_clark("%s:is-not-defined" % ns): + if filter_[0].tag == xmlutils.make_clark("%s:is-not-defined" % ns): return not condition - else: - return condition + return condition def simplify_prefilters(filters, collection_tag="VCALENDAR"): diff --git a/radicale/rights/from_file.py b/radicale/rights/from_file.py index 4dffb8a..9548112 100644 --- a/radicale/rights/from_file.py +++ b/radicale/rights/from_file.py @@ -77,9 +77,8 @@ class Rights(rights.BaseRights): collection_pattern, section) return rights.intersect_permissions( permissions, rights_config.get(section, "permissions")) - else: - logger.debug("Rule %r:%r doesn't match %r:%r from section %r", - user, sane_path, user_pattern, - collection_pattern, section) + logger.debug("Rule %r:%r doesn't match %r:%r from section %r", + user, sane_path, user_pattern, collection_pattern, + section) logger.info("Rights: %r:%r doesn't match any section", user, sane_path) return "" diff --git a/radicale/storage/__init__.py b/radicale/storage/__init__.py index 2437834..b957451 100644 --- a/radicale/storage/__init__.py +++ b/radicale/storage/__init__.py @@ -240,7 +240,7 @@ class BaseCollection: return (template[:template_insert_pos] + vtimezones + components + template[template_insert_pos:]) - elif self.get_meta("tag") == "VADDRESSBOOK": + if self.get_meta("tag") == "VADDRESSBOOK": return "".join((item.serialize() for item in self.get_all())) return "" diff --git a/radicale/storage/multifilesystem/cache.py b/radicale/storage/multifilesystem/cache.py index e1a087c..c143a71 100644 --- a/radicale/storage/multifilesystem/cache.py +++ b/radicale/storage/multifilesystem/cache.py @@ -53,7 +53,8 @@ class CollectionCacheMixin: if modified: self._storage._sync_directory(folder) - def _item_cache_hash(self, raw_text): + @staticmethod + def _item_cache_hash(raw_text): _hash = sha256() _hash.update(storage.CACHE_VERSION) _hash.update(raw_text) diff --git a/radicale/tests/test_auth.py b/radicale/tests/test_auth.py index 635ab5e..7faad0d 100644 --- a/radicale/tests/test_auth.py +++ b/radicale/tests/test_auth.py @@ -84,10 +84,9 @@ class TestBaseAuthRequests(BaseTest): ("😁", "🔑", False), ("😀", "", False), ("", "🔑", False), ("", "", False)) for user, password, valid in test_matrix: - status, _ = self.propfind( - "/", check=207 if valid else 401, HTTP_AUTHORIZATION=( - "Basic %s" % base64.b64encode( - ("%s:%s" % (user, password)).encode()).decode())) + self.propfind("/", check=207 if valid else 401, + HTTP_AUTHORIZATION=("Basic %s" % base64.b64encode( + ("%s:%s" % (user, password)).encode()).decode())) def test_htpasswd_plain(self): self._test_htpasswd("plain", "tmp:bepo") diff --git a/radicale/xmlutils.py b/radicale/xmlutils.py index 76961f2..a76f803 100644 --- a/radicale/xmlutils.py +++ b/radicale/xmlutils.py @@ -54,25 +54,24 @@ for short, url in NAMESPACES.items(): ET.register_namespace("" if short == "D" else short, url) -def pretty_xml(element, level=0): +def pretty_xml(element): """Indent an ElementTree ``element`` and its children.""" - if not level: - element = copy.deepcopy(element) - i = "\n" + level * " " - if len(element) > 0: - if not element.text or not element.text.strip(): - element.text = i + " " - if not element.tail or not element.tail.strip(): - element.tail = i - for sub_element in element: - pretty_xml(sub_element, level + 1) - if not sub_element.tail or not sub_element.tail.strip(): - sub_element.tail = i - else: - if level and (not element.tail or not element.tail.strip()): - element.tail = i - if not level: - return '\n%s' % ET.tostring(element, "unicode") + def pretty_xml_recursive(element, level): + indent = "\n" + level * " " + if len(element) > 0: + if not (element.text or "").strip(): + element.text = indent + " " + if not (element.tail or "").strip(): + element.tail = indent + for sub_element in element: + pretty_xml_recursive(sub_element, level + 1) + if not (sub_element.tail or "").strip(): + sub_element.tail = indent + elif level > 0 and not (element.tail or "").strip(): + element.tail = indent + element = copy.deepcopy(element) + pretty_xml_recursive(element, 0) + return '\n%s' % ET.tostring(element, "unicode") def make_clark(human_tag): @@ -168,7 +167,7 @@ def props_from_request(xml_request, actions=("set", "remove")): if resource_type.tag == make_clark("C:calendar"): result["tag"] = "VCALENDAR" break - elif resource_type.tag == make_clark("CR:addressbook"): + if resource_type.tag == make_clark("CR:addressbook"): result["tag"] = "VADDRESSBOOK" break elif prop.tag == make_clark("C:supported-calendar-component-set"):