[Bf-blender-cvs] [c9ff8b5cd68] master: Various fixes, cleanup and improvements to i18n module.

Bastien Montagne noreply at git.blender.org
Tue May 5 18:33:13 CEST 2020


Commit: c9ff8b5cd68079d2ea2fa0faf51dd1dd53ab6200
Author: Bastien Montagne
Date:   Tue May 5 18:04:22 2020 +0200
Branches: master
https://developer.blender.org/rBc9ff8b5cd68079d2ea2fa0faf51dd1dd53ab6200

Various fixes, cleanup and improvements to i18n module.

* Remove multi-processing in messages class update, was no giving much
  speedup if any at all.
* Remove some debug prints.
* Make messages class pickleable.

* Filter better actual setting values from Settings class.
* Make settings pickleable.

All this will allow to use multi-processing in the i18n addon itself.

===================================================================

M	release/scripts/modules/bl_i18n_utils/settings.py
M	release/scripts/modules/bl_i18n_utils/utils.py

===================================================================

diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py
index c233681dc41..e522ec3fcf9 100644
--- a/release/scripts/modules/bl_i18n_utils/settings.py
+++ b/release/scripts/modules/bl_i18n_utils/settings.py
@@ -28,6 +28,7 @@
 import json
 import os
 import sys
+import types
 
 import bpy
 
@@ -556,6 +557,10 @@ def _gen_get_set_path(ref, name):
     return _get, _set
 
 
+def _check_valid_data(uid, val):
+    return not uid.startswith("_") and type(val) not in tuple(types.__dict__.values()) + (type,)
+
+
 class I18nSettings:
     """
     Class allowing persistence of our settings!
@@ -567,20 +572,32 @@ class I18nSettings:
         # Addon preferences are singleton by definition, so is this class!
         if not I18nSettings._settings:
             cls._settings = super(I18nSettings, cls).__new__(cls)
-            cls._settings.__dict__ = {uid: data for uid, data in globals().items() if not uid.startswith("_")}
+            cls._settings.__dict__ = {uid: val for uid, val in globals().items() if _check_valid_data(uid, val)}
         return I18nSettings._settings
 
-    def from_json(self, string):
-        data = dict(json.loads(string))
+    def __getstate__(self):
+        return self.to_dict()
+
+    def __setstate__(self, mapping):
+        return self.from_dict(mapping)
+
+    def from_dict(self, mapping):
         # Special case... :/
-        if "INTERN_PY_SYS_PATHS" in data:
-            self.PY_SYS_PATHS = data["INTERN_PY_SYS_PATHS"]
-        self.__dict__.update(data)
+        if "INTERN_PY_SYS_PATHS" in mapping:
+            self.PY_SYS_PATHS = mapping["INTERN_PY_SYS_PATHS"]
+        self.__dict__.update(mapping)
+
+    def to_dict(self):
+        glob = globals()
+        return {uid: val for uid, val in self.__dict__.items() if _check_valid_data(uid, val) and uid in glob}
+
+    def from_json(self, string):
+        self.from_dict(dict(json.loads(string)))
 
     def to_json(self):
         # Only save the diff from default i18n_settings!
         glob = globals()
-        export_dict = {uid: val for uid, val in self.__dict__.items() if glob.get(uid) != val}
+        export_dict = {uid: val for uid, val in self.__dict__.items() if _check_valid_data(uid, val) and glob.get(uid) != val}
         return json.dumps(export_dict)
 
     def load(self, fname, reset=False):
diff --git a/release/scripts/modules/bl_i18n_utils/utils.py b/release/scripts/modules/bl_i18n_utils/utils.py
index 493afc53267..61837cc0956 100644
--- a/release/scripts/modules/bl_i18n_utils/utils.py
+++ b/release/scripts/modules/bl_i18n_utils/utils.py
@@ -21,7 +21,6 @@
 # Some misc utilities...
 
 import collections
-import concurrent.futures
 import copy
 import hashlib
 import os
@@ -238,6 +237,12 @@ class I18nMessage:
         self.is_fuzzy = is_fuzzy
         self.is_commented = is_commented
 
+    # ~ def __getstate__(self):
+        # ~ return {key: getattr(self, key) for key in self.__slots__}
+
+    # ~ def __getstate__(self):
+        # ~ return {key: getattr(self, key) for key in self.__slots__}
+
     def _get_msgctxt(self):
         return "".join(self.msgctxt_lines)
 
@@ -426,6 +431,14 @@ class I18nMessages:
 
         self._reverse_cache = None
 
+    def __getstate__(self):
+        return (self.settings, self.uid, self.msgs, self.parsing_errors)
+
+    def __setstate__(self, data):
+        self.__init__()
+        self.settings, self.uid, self.msgs, self.parsing_errors = data
+        self.update_info()
+
     @staticmethod
     def _new_messages():
         return getattr(collections, 'OrderedDict', dict)()
@@ -566,24 +579,23 @@ class I18nMessages:
 
         # Next process new keys.
         if use_similar > 0.0:
-            with concurrent.futures.ProcessPoolExecutor() as exctr:
-                for key, msgid in exctr.map(get_best_similar,
-                                            tuple((nk, use_similar, tuple(similar_pool.keys())) for nk in new_keys)):
-                    if msgid:
-                        # Try to get the same context, else just get one...
-                        skey = (key[0], msgid)
-                        if skey not in similar_pool[msgid]:
-                            skey = tuple(similar_pool[msgid])[0]
-                        # We keep org translation and comments, and mark message as fuzzy.
-                        msg, refmsg = self.msgs[skey].copy(), ref.msgs[key]
-                        msg.msgctxt = refmsg.msgctxt
-                        msg.msgid = refmsg.msgid
-                        msg.sources = refmsg.sources
-                        msg.is_fuzzy = True
-                        msg.is_commented = refmsg.is_commented
-                        msgs[key] = msg
-                    else:
-                        msgs[key] = ref.msgs[key]
+            for key, msgid in map(get_best_similar,
+                                  tuple((nk, use_similar, tuple(similar_pool.keys())) for nk in new_keys)):
+                if msgid:
+                    # Try to get the same context, else just get one...
+                    skey = (key[0], msgid)
+                    if skey not in similar_pool[msgid]:
+                        skey = tuple(similar_pool[msgid])[0]
+                    # We keep org translation and comments, and mark message as fuzzy.
+                    msg, refmsg = self.msgs[skey].copy(), ref.msgs[key]
+                    msg.msgctxt = refmsg.msgctxt
+                    msg.msgid = refmsg.msgid
+                    msg.sources = refmsg.sources
+                    msg.is_fuzzy = True
+                    msg.is_commented = refmsg.is_commented
+                    msgs[key] = msg
+                else:
+                    msgs[key] = ref.msgs[key]
         else:
             for key in new_keys:
                 msgs[key] = ref.msgs[key]
@@ -1075,9 +1087,7 @@ class I18nMessages:
                 "-o",
                 fname,
             )
-            print("Running ", " ".join(cmd))
             ret = subprocess.call(cmd)
-            print("Finished.")
             return
         # XXX Code below is currently broken (generates corrupted mo files it seems :( )!
         # Using http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html notation.



More information about the Bf-blender-cvs mailing list