Explorar o código

upd: made css_inline and pandas optional

Mikael Koli %!s(int64=2) %!d(string=hai) anos
pai
achega
95fb0647c0
Modificáronse 2 ficheiros con 17 adicións e 7 borrados
  1. 6 4
      redmail/email/body.py
  2. 11 3
      redmail/email/utils.py

+ 6 - 4
redmail/email/body.py

@@ -4,8 +4,6 @@ from io import BytesIO
 from pathlib import Path
 from typing import TYPE_CHECKING, Dict, Union, ByteString
 from pathlib import Path
-from css_inline import CSSInliner
-
 
 from redmail.utils import is_bytes
 from redmail.utils import import_from_string
@@ -19,7 +17,7 @@ from markupsafe import Markup
 from pandas.io.formats.style import Styler
 
 # We try to import matplotlib and PIL but if fails, they will be None
-from .utils import PIL, plt, pd
+from .utils import PIL, plt, pd, css_inline
 
 if TYPE_CHECKING:
     # For type hinting
@@ -65,12 +63,16 @@ class Body:
         if pd is None:
             raise ImportError("Missing package 'pandas'. Prettifying tables requires Pandas.")
         
+        from pandas.io.formats.style import Styler
+
         extra = {} if extra is None else extra
 
         # Allow for pandas styler object, convert to inline CSS for email client rendering
         # https://pandas.pydata.org/docs/reference/api/pandas.io.formats.style.Styler.html
         if isinstance(tbl, Styler):
-            inliner = CSSInliner()
+            if css_inline is None:
+                raise ImportError("Missing package 'css_inline'. Prettifying tables with Pandas styler requires css_inline.")
+            inliner = css_inline.CSSInliner()
             return inliner.inline(tbl.to_html())
 
         df = pd.DataFrame(tbl)

+ 11 - 3
redmail/email/utils.py

@@ -1,6 +1,14 @@
 
+from typing import TYPE_CHECKING
 from redmail.utils import import_from_string
 
-plt = import_from_string("matplotlib.pyplot", if_missing="ignore")
-PIL = import_from_string("PIL", if_missing="ignore")
-pd = import_from_string("pandas", if_missing="ignore")
+if TYPE_CHECKING:
+    import matplotlib.pyplot as plt_lib
+    import PIL as PIL_lib
+    import pandas as pandas_lib
+    import css_inline as css_inline_lib
+
+plt: 'plt_lib' = import_from_string("matplotlib.pyplot", if_missing="ignore")
+PIL: 'PIL_lib' = import_from_string("PIL", if_missing="ignore")
+pd: 'pandas_lib' = import_from_string("pandas", if_missing="ignore")
+css_inline: 'css_inline_lib' = import_from_string("css_inline", if_missing="ignore")