diff sat_frontends/jp/common.py @ 4037:524856bd7b19

massive refactoring to switch from camelCase to snake_case: historically, Libervia (SàT before) was using camelCase as allowed by PEP8 when using a pre-PEP8 code, to use the same coding style as in Twisted. However, snake_case is more readable and it's better to follow PEP8 best practices, so it has been decided to move on full snake_case. Because Libervia has a huge codebase, this ended with a ugly mix of camelCase and snake_case. To fix that, this patch does a big refactoring by renaming every function and method (including bridge) that are not coming from Twisted or Wokkel, to use fully snake_case. This is a massive change, and may result in some bugs.
author Goffi <goffi@goffi.org>
date Sat, 08 Apr 2023 13:54:42 +0200
parents 742e466fa000
children 4b842c1fb686
line wrap: on
line diff
--- a/sat_frontends/jp/common.py	Fri Apr 07 15:18:39 2023 +0200
+++ b/sat_frontends/jp/common.py	Sat Apr 08 13:54:42 2023 +0200
@@ -65,13 +65,13 @@
 
 def ansi_ljust(s, width):
     """ljust method handling ANSI escape codes"""
-    cleaned = regex.ansiRemove(s)
+    cleaned = regex.ansi_remove(s)
     return s + " " * (width - len(cleaned))
 
 
 def ansi_center(s, width):
     """ljust method handling ANSI escape codes"""
-    cleaned = regex.ansiRemove(s)
+    cleaned = regex.ansi_remove(s)
     diff = width - len(cleaned)
     half = diff / 2
     return half * " " + s + (half + diff % 2) * " "
@@ -79,25 +79,25 @@
 
 def ansi_rjust(s, width):
     """ljust method handling ANSI escape codes"""
-    cleaned = regex.ansiRemove(s)
+    cleaned = regex.ansi_remove(s)
     return " " * (width - len(cleaned)) + s
 
 
-def getTmpDir(sat_conf, cat_dir, sub_dir=None):
+def get_tmp_dir(sat_conf, cat_dir, sub_dir=None):
     """Return directory used to store temporary files
 
     @param sat_conf(ConfigParser.ConfigParser): instance opened on sat configuration
     @param cat_dir(str): directory of the category (e.g. "blog")
     @param sub_dir(str): sub directory where data need to be put
         profile can be used here, or special directory name
-        sub_dir will be escaped to be usable in path (use regex.pathUnescape to find
+        sub_dir will be escaped to be usable in path (use regex.path_unescape to find
         initial str)
     @return (Path): path to the dir
     """
-    local_dir = config.getConfig(sat_conf, "", "local_dir", Exception)
+    local_dir = config.config_get(sat_conf, "", "local_dir", Exception)
     path_elts = [local_dir, cat_dir]
     if sub_dir is not None:
-        path_elts.append(regex.pathEscape(sub_dir))
+        path_elts.append(regex.path_escape(sub_dir))
     return Path(*path_elts)
 
 
@@ -141,7 +141,7 @@
         self.cat_dir = cat_dir
         self.use_metadata = use_metadata
 
-    def secureUnlink(self, path):
+    def secure_unlink(self, path):
         """Unlink given path after keeping it for a while
 
         This method is used to prevent accidental deletion of a draft
@@ -152,7 +152,7 @@
         path = Path(path).resolve()
         if not path.is_file:
             raise OSError("path must link to a regular file")
-        if path.parent != getTmpDir(self.sat_conf, self.cat_dir):
+        if path.parent != get_tmp_dir(self.sat_conf, self.cat_dir):
             self.disp(
                 f"File {path} is not in SàT temporary hierarchy, we do not remove " f"it",
                 2,
@@ -160,7 +160,7 @@
             return
             # we have 2 files per draft with use_metadata, so we double max
         unlink_max = SECURE_UNLINK_MAX * 2 if self.use_metadata else SECURE_UNLINK_MAX
-        backup_dir = getTmpDir(self.sat_conf, self.cat_dir, SECURE_UNLINK_DIR)
+        backup_dir = get_tmp_dir(self.sat_conf, self.cat_dir, SECURE_UNLINK_DIR)
         if not os.path.exists(backup_dir):
             os.makedirs(backup_dir)
         filename = os.path.basename(path)
@@ -179,7 +179,7 @@
                 self.host.disp("Purging backup file {}".format(path), 2)
                 os.unlink(path)
 
-    async def runEditor(
+    async def run_editor(
         self,
         editor_args_opt,
         content_file_path,
@@ -210,12 +210,12 @@
         content_file_obj.close()
 
         # we prepare arguments
-        editor = config.getConfig(self.sat_conf, C.CONFIG_SECTION, "editor") or os.getenv(
+        editor = config.config_get(self.sat_conf, C.CONFIG_SECTION, "editor") or os.getenv(
             "EDITOR", "vi"
         )
         try:
             # is there custom arguments in sat.conf ?
-            editor_args = config.getConfig(
+            editor_args = config.config_get(
                 self.sat_conf, C.CONFIG_SECTION, editor_args_opt, Exception
             )
         except (NoOptionError, NoSectionError):
@@ -291,7 +291,7 @@
 
             if len(content) == 0:
                 self.disp("Content is empty, cancelling the edition")
-                if content_file_path.parent != getTmpDir(self.sat_conf, self.cat_dir):
+                if content_file_path.parent != get_tmp_dir(self.sat_conf, self.cat_dir):
                     self.disp(
                         "File are not in SàT temporary hierarchy, we do not remove them",
                         2,
@@ -335,22 +335,22 @@
                         )
                     self.host.quit(1)
 
-            self.secureUnlink(content_file_path)
+            self.secure_unlink(content_file_path)
             if self.use_metadata:
-                self.secureUnlink(meta_file_path)
+                self.secure_unlink(meta_file_path)
 
     async def publish(self, content):
         # if metadata is needed, publish will be called with it last argument
         raise NotImplementedError
 
-    def getTmpFile(self):
+    def get_tmp_file(self):
         """Create a temporary file
 
         @return (tuple(file, Path)): opened (w+b) file object and file path
         """
-        suff = "." + self.getTmpSuff()
+        suff = "." + self.get_tmp_suff()
         cat_dir_str = self.cat_dir
-        tmp_dir = getTmpDir(self.sat_conf, self.cat_dir, self.profile)
+        tmp_dir = get_tmp_dir(self.sat_conf, self.cat_dir, self.profile)
         if not tmp_dir.exists():
             try:
                 tmp_dir.mkdir(parents=True)
@@ -372,7 +372,7 @@
             self.disp(f"Can't create temporary file: {e}", error=True)
             self.host.quit(1)
 
-    def getCurrentFile(self, profile):
+    def get_current_file(self, profile):
         """Get most recently edited file
 
         @param profile(unicode): profile linked to the draft
@@ -381,7 +381,7 @@
         # we guess the item currently edited by choosing
         # the most recent file corresponding to temp file pattern
         # in tmp_dir, excluding metadata files
-        tmp_dir = getTmpDir(self.sat_conf, self.cat_dir, profile)
+        tmp_dir = get_tmp_dir(self.sat_conf, self.cat_dir, profile)
         available = [
             p
             for p in tmp_dir.glob(f"{self.cat_dir}_*")
@@ -395,15 +395,15 @@
             self.host.quit(1)
         return max(available, key=lambda p: p.stat().st_mtime)
 
-    async def getItemData(self, service, node, item):
+    async def get_item_data(self, service, node, item):
         """return formatted content, metadata (or not if use_metadata is false), and item id"""
         raise NotImplementedError
 
-    def getTmpSuff(self):
+    def get_tmp_suff(self):
         """return suffix used for content file"""
         return "xml"
 
-    async def getItemPath(self):
+    async def get_item_path(self):
         """Retrieve item path (i.e. service and node) from item argument
 
         This method is obviously only useful for edition of PubSub based features
@@ -415,7 +415,7 @@
 
         if self.args.current:
             # user wants to continue current draft
-            content_file_path = self.getCurrentFile(self.profile)
+            content_file_path = self.get_current_file(self.profile)
             self.disp("Continuing edition of current draft", 2)
             content_file_obj = content_file_path.open("r+b")
             # we seek at the end of file in case of an item already exist
@@ -430,15 +430,15 @@
             content_file_obj.seek(0, os.SEEK_END)
         else:
             # we need a temporary file
-            content_file_obj, content_file_path = self.getTmpFile()
+            content_file_obj, content_file_path = self.get_tmp_file()
 
         if item or last_item:
             self.disp("Editing requested published item", 2)
             try:
                 if self.use_metadata:
-                    content, metadata, item = await self.getItemData(service, node, item)
+                    content, metadata, item = await self.get_item_data(service, node, item)
                 else:
-                    content, item = await self.getItemData(service, node, item)
+                    content, item = await self.get_item_data(service, node, item)
             except Exception as e:
                 # FIXME: ugly but we have not good may to check errors in bridge
                 if "item-not-found" in str(e):
@@ -529,7 +529,7 @@
                             col_value = filter_(value)
                             # we count size without ANSI code as they will change length of the
                             # string when it's mostly style/color changes.
-                    col_size = len(regex.ansiRemove(col_value))
+                    col_size = len(regex.ansi_remove(col_value))
                 else:
                     col_value = str(value)
                     col_size = len(col_value)
@@ -558,7 +558,7 @@
         return "\n".join(self._buffer)
 
     @staticmethod
-    def readDictValues(data, keys, defaults=None):
+    def read_dict_values(data, keys, defaults=None):
         if defaults is None:
             defaults = {}
         for key in keys:
@@ -572,7 +572,7 @@
                     raise e
 
     @classmethod
-    def fromListDict(
+    def from_list_dict(
         cls, host, data, keys=None, headers=None, filters=None, defaults=None
     ):
         """Create a table from a list of dictionaries
@@ -600,7 +600,7 @@
             filters = {}
         filters = [filters.get(k) for k in keys]
         return cls(
-            host, (cls.readDictValues(d, keys, defaults) for d in data), headers, filters
+            host, (cls.read_dict_values(d, keys, defaults) for d in data), headers, filters
         )
 
     def _headers(self, head_sep, headers, sizes, alignment="left", style=None):
@@ -679,7 +679,7 @@
         if not self.sizes:
             # the table is empty
             return
-        col_sep_size = len(regex.ansiRemove(col_sep))
+        col_sep_size = len(regex.ansi_remove(col_sep))
 
         # if we have columns to hide, we remove them from headers and size
         if not hide_cols:
@@ -784,7 +784,7 @@
     host = command.host
 
     try:
-        uris_data = await host.bridge.URIFind(path, [key])
+        uris_data = await host.bridge.uri_find(path, [key])
     except Exception as e:
         host.disp(f"can't find {key} URI: {e}", error=True)
         host.quit(C.EXIT_BRIDGE_ERRBACK)
@@ -824,7 +824,7 @@
                 values.extend(json.loads(new_values_json))
                 setattr(args, dest, values)
 
-    parsed_uri = xmpp_uri.parseXMPPUri(uri)
+    parsed_uri = xmpp_uri.parse_xmpp_uri(uri)
     try:
         args.service = parsed_uri["path"]
         args.node = parsed_uri["node"]