mayutils 1.2.36__tar.gz → 1.2.38__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. {mayutils-1.2.36 → mayutils-1.2.38}/PKG-INFO +3 -1
  2. {mayutils-1.2.36 → mayutils-1.2.38}/pyproject.toml +3 -1
  3. mayutils-1.2.38/src/mayutils/export/html.py +63 -0
  4. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/plotly/charts.py +49 -22
  5. {mayutils-1.2.36 → mayutils-1.2.38}/LICENSE +0 -0
  6. {mayutils-1.2.36 → mayutils-1.2.38}/README.md +0 -0
  7. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/__init__.py +0 -0
  8. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/core/__init__.py +0 -0
  9. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/core/constants.py +0 -0
  10. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/__init__.py +0 -0
  11. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/analysis/__init__.py +0 -0
  12. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/cache/.gitkeep +0 -0
  13. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/live.py +0 -0
  14. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/local.py +0 -0
  15. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/queries/.gitkeep +0 -0
  16. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/queries/__init__.py +0 -0
  17. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/queries/examples/.gitkeep +0 -0
  18. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/data/read.py +0 -0
  19. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/__init__.py +0 -0
  20. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/benchmarking.py +0 -0
  21. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/databases.py +0 -0
  22. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/filesystem.py +0 -0
  23. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/logging.py +0 -0
  24. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/memoisation.py +0 -0
  25. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/oauth.py +0 -0
  26. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/secrets.py +0 -0
  27. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/environment/webdrivers.py +0 -0
  28. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/export/__init__.py +0 -0
  29. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/export/images.py +0 -0
  30. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/export/pdf.py +0 -0
  31. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/export/slides.py +0 -0
  32. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/interfaces/__init__.py +0 -0
  33. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/interfaces/google.py +0 -0
  34. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/interfaces/microsoft.py +0 -0
  35. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/interfaces/streamlit.py +0 -0
  36. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/mathematics/__init__.py +0 -0
  37. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/mathematics/numba.py +0 -0
  38. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/mathematics/numpy.py +0 -0
  39. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/__init__.py +0 -0
  40. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/classes.py +0 -0
  41. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/colours.py +0 -0
  42. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/dataframes.py +0 -0
  43. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/datetime.py +0 -0
  44. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/decorators.py +0 -0
  45. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/dictionaries.py +0 -0
  46. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/functions.py +0 -0
  47. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/hashing.py +0 -0
  48. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/numbers.py +0 -0
  49. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/strings.py +0 -0
  50. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/objects/types.py +0 -0
  51. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/py.typed +0 -0
  52. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/scripts/__init__.py +0 -0
  53. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/scripts/clear_cache.py +0 -0
  54. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/scripts/versioning.py +0 -0
  55. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/testing/__init__.py +0 -0
  56. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/__init__.py +0 -0
  57. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/console.py +0 -0
  58. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/__init__.py +0 -0
  59. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/combine.py +0 -0
  60. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/matplotlib/__init__.py +0 -0
  61. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/matplotlib/template.py +0 -0
  62. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/plotly/__init__.py +0 -0
  63. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/plotly/templates.py +0 -0
  64. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/plotly/traces.py +0 -0
  65. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/graphs/plotly/utilities.py +0 -0
  66. {mayutils-1.2.36 → mayutils-1.2.38}/src/mayutils/visualisation/notebook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mayutils
3
- Version: 1.2.36
3
+ Version: 1.2.38
4
4
  Summary: Utilities for Python from Mayuran Visakan
5
5
  Author: Mayuran Visakan
6
6
  Author-email: Mayuran Visakan <mayuran.k.v@gmail.com>
@@ -43,6 +43,7 @@ Requires-Dist: jupysql>=0.11.1
43
43
  Requires-Dist: jupyter>=1.1.1
44
44
  Requires-Dist: kaleido>=1.0.0
45
45
  Requires-Dist: keyring>=25.6.0
46
+ Requires-Dist: markdown
46
47
  Requires-Dist: matplotlib>=3.10.5
47
48
  Requires-Dist: modin[all]>=0.35.0
48
49
  Requires-Dist: nbconvert>=7.16.6
@@ -79,6 +80,7 @@ Requires-Dist: streamlit>=1.49.0
79
80
  Requires-Dist: typer
80
81
  Requires-Dist: types-cachetools>=6.2.0.20251022
81
82
  Requires-Dist: types-decorator>=5.2.0.20250324
83
+ Requires-Dist: types-markdown>=3.10.0.20251106
82
84
  Requires-Dist: types-openpyxl>=3.1.5.20250919
83
85
  Requires-Dist: types-pycurl>=7.45.7.20250926
84
86
  Requires-Dist: types-python-dateutil>=2.9.0.20251008
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mayutils"
3
- version = "1.2.36"
3
+ version = "1.2.38"
4
4
  description = "Utilities for Python from Mayuran Visakan"
5
5
  authors = [
6
6
  { name = "Mayuran Visakan", email = "mayuran.k.v@gmail.com" }
@@ -30,6 +30,7 @@ dependencies = [
30
30
  "jupyter>=1.1.1",
31
31
  "kaleido>=1.0.0",
32
32
  "keyring>=25.6.0",
33
+ "markdown",
33
34
  "matplotlib>=3.10.5",
34
35
  "modin[all]>=0.35.0",
35
36
  "nbconvert>=7.16.6",
@@ -66,6 +67,7 @@ dependencies = [
66
67
  "typer",
67
68
  "types-cachetools>=6.2.0.20251022",
68
69
  "types-decorator>=5.2.0.20250324",
70
+ "types-markdown>=3.10.0.20251106",
69
71
  "types-openpyxl>=3.1.5.20250919",
70
72
  "types-pycurl>=7.45.7.20250926",
71
73
  "types-python-dateutil>=2.9.0.20251008",
@@ -0,0 +1,63 @@
1
+ import time
2
+ from typing import Optional
3
+ from pathlib import Path
4
+ from html2image import Html2Image
5
+ from markdown import markdown
6
+ from mayutils.environment.logging import Logger
7
+
8
+ H2I = Html2Image()
9
+ logger = Logger.spawn()
10
+
11
+
12
+ def markdown_to_html(
13
+ text: str,
14
+ ) -> str:
15
+ return markdown(
16
+ text=text,
17
+ ).replace(
18
+ "\n",
19
+ "<br>",
20
+ )
21
+
22
+
23
+ def html_to_image(
24
+ html: str,
25
+ path: Path | str,
26
+ css: Optional[str] = None,
27
+ size: Optional[tuple[int, int]] = None,
28
+ sleep_time: int = 1,
29
+ ) -> Path:
30
+ path = Path(path)
31
+
32
+ kwargs = {}
33
+
34
+ if size is not None:
35
+ kwargs["size"] = size
36
+
37
+ H2I.screenshot(
38
+ html_str=html,
39
+ css_str=css or "",
40
+ save_as=path.name,
41
+ **kwargs,
42
+ )
43
+
44
+ time.sleep(0.5)
45
+ while not path.exists():
46
+ logger.debug(f"Waiting {sleep_time} second for {path} to be created...")
47
+ time.sleep(sleep_time)
48
+
49
+ Path(path.name).replace(target=path)
50
+
51
+ return path
52
+
53
+
54
+ def html_pill(
55
+ text: str,
56
+ background_colour: str,
57
+ text_colour: str = "black",
58
+ bold: bool = True,
59
+ padding: tuple[float, float] = (0.2, 0.4),
60
+ relative_font_size: float = 0.9,
61
+ rounding: float = 5.625,
62
+ ) -> str:
63
+ return f'<span style="display: inline-block; background-color: {background_colour}; color: {text_colour}; padding: {padding[0]}em {padding[1]}em; border-radius: {rounding}em; font-size: {relative_font_size}em; font-weight: {"bold" if bold else "normal"};">{text}</span>'
@@ -1319,36 +1319,63 @@ class Plot(go.Figure):
1319
1319
 
1320
1320
  return self
1321
1321
 
1322
- def set_visible_yrange(
1322
+ def set_visible_y_range(
1323
1323
  self,
1324
1324
  y_min: Optional[float] = None,
1325
1325
  y_max: Optional[float] = None,
1326
1326
  y_padding: float = 0.05,
1327
1327
  ) -> Self:
1328
- trace_limits = [
1329
- (
1330
- np.nanmin(trace.y[visible_mask]),
1331
- np.nanmax(trace.y[visible_mask]),
1328
+ for yaxis in [prop for prop in self.layout if prop.startswith("yaxis")]:
1329
+ yaxis_suffix = yaxis.removeprefix("yaxis")
1330
+
1331
+ trace_limits = np.asarray(
1332
+ [
1333
+ (
1334
+ np.nanmin(visible_y)
1335
+ if not (np.isnan(visible_y := trace.y[visible_mask])).all()
1336
+ and not visible_y.shape == (0,)
1337
+ else np.nan,
1338
+ np.nanmax(visible_y)
1339
+ if not (np.isnan(visible_y)).all()
1340
+ and not visible_y.shape == (0,)
1341
+ else np.nan,
1342
+ )
1343
+ for trace in self.data
1344
+ if (trace.visible is None or trace.visible is True)
1345
+ and isinstance(trace.y, np.ndarray)
1346
+ and trace.yaxis == f"y{yaxis_suffix}"
1347
+ and (
1348
+ visible_mask := (trace.x < self.layout.xaxis.range[1]) # type: ignore
1349
+ & (trace.x > self.layout.xaxis.range[0]) # type: ignore
1350
+ ).any()
1351
+ ]
1332
1352
  )
1333
- for trace in self.data
1334
- if (trace.visible is None or trace.visible is True)
1335
- and (
1336
- visible_mask := (trace.x < self.layout.xaxis.range[1]) # type: ignore
1337
- & (trace.x > self.layout.xaxis.range[0]) # type: ignore
1338
- ).any()
1339
- ]
1340
1353
 
1341
- traces_min = min(map(min, trace_limits))
1342
- traces_max = max(map(max, trace_limits))
1343
- span = traces_max - traces_min
1354
+ traces_min = (
1355
+ np.nanmin(trace_limits) if not np.isnan(trace_limits).all() else None
1356
+ )
1357
+ traces_max = (
1358
+ np.nanmax(trace_limits) if not np.isnan(trace_limits).all() else None
1359
+ )
1344
1360
 
1345
- y_range = (
1346
- (traces_min - span * y_padding).clip(min=y_min),
1347
- (traces_max + span * y_padding).clip(max=y_max),
1348
- )
1349
- self.update_layout(
1350
- yaxis_range=y_range,
1351
- )
1361
+ if traces_min is not None and traces_max is not None:
1362
+ span = traces_max - traces_min
1363
+
1364
+ y_range = (
1365
+ (traces_min - span * y_padding).clip(min=y_min),
1366
+ (traces_max + span * y_padding).clip(max=y_max),
1367
+ )
1368
+ else:
1369
+ y_range = (
1370
+ traces_min * (1 - y_padding) if traces_min is not None else None,
1371
+ traces_max * (1 + y_padding) if traces_max is not None else None,
1372
+ )
1373
+
1374
+ self.update_layout(
1375
+ {
1376
+ f"yaxis{yaxis_suffix}_range": y_range,
1377
+ }
1378
+ )
1352
1379
 
1353
1380
  return self
1354
1381
 
File without changes
File without changes