Browse Source

Extension library elements access through the Page Builder API (#2447)

Add the element entry points to the library package module (and not the library module).
Fabien Lelaquais 3 months ago
parent
commit
cf9a9113a5
2 changed files with 15 additions and 14 deletions
  1. 11 10
      taipy/gui/builder/_api_generator.py
  2. 4 4
      taipy/gui/gui.py

+ 11 - 10
taipy/gui/builder/_api_generator.py

@@ -82,7 +82,7 @@ class _ElementApiGenerator(object, metaclass=_Singleton):
                     ),
                 )
 
-    def add_library(self, library: "ElementLibrary"):
+    def add_library(self, library: "ElementLibrary") -> None:
         library_name = library.get_name()
         if self.__module is None:
             _TaipyLogger._get_logger().info(
@@ -90,24 +90,25 @@ class _ElementApiGenerator(object, metaclass=_Singleton):
             )
             return
         library_module = sys.modules[library.__module__]
+        if not library_module.__package__:
+            _TaipyLogger._get_logger().info(f"Cannot locate package for extension library `{library_name}`.")
+            return
+        package_module = sys.modules[library_module.__package__]
         for element_name, element in library.get_elements().items():
-            setattr(
-                library_module,
+            element_api = _ElementApiGenerator().create_control_api(
                 element_name,
-                _ElementApiGenerator().create_control_api(
-                    element_name,
-                    f"{library_name}.{element_name}",
-                    element.default_attribute,
-                    {name: str(prop.property_type) for name, prop in element.attributes.items()},
-                ),
+                f"{library_name}.{element_name}",
+                element.default_attribute,
+                {name: str(prop.property_type) for name, prop in element.attributes.items()},
             )
+            setattr(package_module, element_name, element_api)
             # Allow element to be accessed from this module (taipy.gui.builder)
             if hasattr(self.__module, element_name):
                 _TaipyLogger._get_logger().info(
                     f"Can't add element `{element_name}` of library `{library_name}` to the root of Builder API as another element with the same name already exists."  # noqa: E501
                 )
             else:
-                setattr(self.__module, element_name, getattr(library_module, element_name))
+                setattr(self.__module, element_name, element_api)
 
     @staticmethod
     def create_block_api(

+ 4 - 4
taipy/gui/gui.py

@@ -977,7 +977,7 @@ class Gui:
         return ("", 404)
 
     def __get_version(self) -> str:
-        return f'{self.__version.get("major", 0)}.{self.__version.get("minor", 0)}.{self.__version.get("patch", 0)}'
+        return f"{self.__version.get('major', 0)}.{self.__version.get('minor', 0)}.{self.__version.get('patch', 0)}"
 
     def __append_libraries_to_status(self, status: t.Dict[str, t.Any]):
         libraries: t.Dict[str, t.Any] = {}
@@ -1009,7 +1009,7 @@ class Gui:
                 {
                     "flask_version": str(metadata.version("flask") or ""),
                     "backend_version": self.__get_version(),
-                    "host": f'{self._get_config("host", "localhost")}:{self._get_config("port", "default")}',
+                    "host": f"{self._get_config('host', 'localhost')}:{self._get_config('port', 'default')}",
                     "python_version": sys.version,
                 }
             )
@@ -2116,7 +2116,7 @@ class Gui:
             page = Markdown(page, frame=None)
         elif not isinstance(page, Page):  # pragma: no cover
             raise Exception(
-                f'Parameter "page" is invalid for page name "{name if name != Gui.__root_page_name else "/"}.'
+                f'Parameter "page" is invalid for page name "{name if name != Gui.__root_page_name else "/"}".'
             )
         # Init a new page
         new_page = _Page()
@@ -2724,7 +2724,7 @@ class Gui:
         css_vars = []
         if stylekit := self._get_config("stylekit", _default_stylekit):
             for k, v in stylekit.items():
-                css_vars.append(f'--{k.replace("_", "-")}:{_get_css_var_value(v)};')
+                css_vars.append(f"--{k.replace('_', '-')}:{_get_css_var_value(v)};")
         return " ".join(css_vars)
 
     def __init_server(self):