unifi-network-maps 1.4.11__py3-none-any.whl

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 (99) hide show
  1. unifi_network_maps/__init__.py +1 -0
  2. unifi_network_maps/__main__.py +8 -0
  3. unifi_network_maps/adapters/__init__.py +1 -0
  4. unifi_network_maps/adapters/config.py +49 -0
  5. unifi_network_maps/adapters/unifi.py +457 -0
  6. unifi_network_maps/assets/__init__.py +0 -0
  7. unifi_network_maps/assets/icons/__init__.py +0 -0
  8. unifi_network_maps/assets/icons/access-point.svg +1 -0
  9. unifi_network_maps/assets/icons/isometric/ISOPACKS_LICENSE +7 -0
  10. unifi_network_maps/assets/icons/isometric/block.svg +23 -0
  11. unifi_network_maps/assets/icons/isometric/cache.svg +48 -0
  12. unifi_network_maps/assets/icons/isometric/cardterminal.svg +316 -0
  13. unifi_network_maps/assets/icons/isometric/cloud.svg +89 -0
  14. unifi_network_maps/assets/icons/isometric/cronjob.svg +409 -0
  15. unifi_network_maps/assets/icons/isometric/cube.svg +24 -0
  16. unifi_network_maps/assets/icons/isometric/desktop.svg +107 -0
  17. unifi_network_maps/assets/icons/isometric/diamond.svg +23 -0
  18. unifi_network_maps/assets/icons/isometric/dns.svg +46 -0
  19. unifi_network_maps/assets/icons/isometric/document.svg +62 -0
  20. unifi_network_maps/assets/icons/isometric/firewall.svg +200 -0
  21. unifi_network_maps/assets/icons/isometric/function-module.svg +215 -0
  22. unifi_network_maps/assets/icons/isometric/image.svg +65 -0
  23. unifi_network_maps/assets/icons/isometric/laptop.svg +37 -0
  24. unifi_network_maps/assets/icons/isometric/loadbalancer.svg +65 -0
  25. unifi_network_maps/assets/icons/isometric/lock.svg +155 -0
  26. unifi_network_maps/assets/icons/isometric/mail.svg +35 -0
  27. unifi_network_maps/assets/icons/isometric/mailmultiple.svg +91 -0
  28. unifi_network_maps/assets/icons/isometric/mobiledevice.svg +66 -0
  29. unifi_network_maps/assets/icons/isometric/office.svg +136 -0
  30. unifi_network_maps/assets/icons/isometric/package-module.svg +39 -0
  31. unifi_network_maps/assets/icons/isometric/paymentcard.svg +92 -0
  32. unifi_network_maps/assets/icons/isometric/plane.svg +1 -0
  33. unifi_network_maps/assets/icons/isometric/printer.svg +122 -0
  34. unifi_network_maps/assets/icons/isometric/pyramid.svg +28 -0
  35. unifi_network_maps/assets/icons/isometric/queue.svg +38 -0
  36. unifi_network_maps/assets/icons/isometric/router.svg +39 -0
  37. unifi_network_maps/assets/icons/isometric/server.svg +112 -0
  38. unifi_network_maps/assets/icons/isometric/speech.svg +70 -0
  39. unifi_network_maps/assets/icons/isometric/sphere.svg +15 -0
  40. unifi_network_maps/assets/icons/isometric/storage.svg +92 -0
  41. unifi_network_maps/assets/icons/isometric/switch-module.svg +45 -0
  42. unifi_network_maps/assets/icons/isometric/tower.svg +50 -0
  43. unifi_network_maps/assets/icons/isometric/truck-2.svg +1 -0
  44. unifi_network_maps/assets/icons/isometric/truck.svg +1 -0
  45. unifi_network_maps/assets/icons/isometric/user.svg +231 -0
  46. unifi_network_maps/assets/icons/isometric/vm.svg +50 -0
  47. unifi_network_maps/assets/icons/laptop.svg +1 -0
  48. unifi_network_maps/assets/icons/router-network.svg +1 -0
  49. unifi_network_maps/assets/icons/server-network.svg +1 -0
  50. unifi_network_maps/assets/icons/server.svg +1 -0
  51. unifi_network_maps/assets/themes/dark.yaml +50 -0
  52. unifi_network_maps/assets/themes/default.yaml +47 -0
  53. unifi_network_maps/cli/__init__.py +5 -0
  54. unifi_network_maps/cli/__main__.py +8 -0
  55. unifi_network_maps/cli/args.py +166 -0
  56. unifi_network_maps/cli/main.py +134 -0
  57. unifi_network_maps/cli/render.py +255 -0
  58. unifi_network_maps/cli/runtime.py +157 -0
  59. unifi_network_maps/io/__init__.py +1 -0
  60. unifi_network_maps/io/debug.py +60 -0
  61. unifi_network_maps/io/export.py +32 -0
  62. unifi_network_maps/io/mkdocs_assets.py +21 -0
  63. unifi_network_maps/io/mock_data.py +23 -0
  64. unifi_network_maps/io/mock_generate.py +7 -0
  65. unifi_network_maps/model/__init__.py +1 -0
  66. unifi_network_maps/model/labels.py +35 -0
  67. unifi_network_maps/model/lldp.py +99 -0
  68. unifi_network_maps/model/mock.py +307 -0
  69. unifi_network_maps/model/ports.py +23 -0
  70. unifi_network_maps/model/topology.py +909 -0
  71. unifi_network_maps/render/__init__.py +1 -0
  72. unifi_network_maps/render/device_ports_md.py +492 -0
  73. unifi_network_maps/render/legend.py +30 -0
  74. unifi_network_maps/render/lldp_md.py +352 -0
  75. unifi_network_maps/render/markdown_tables.py +21 -0
  76. unifi_network_maps/render/mermaid.py +273 -0
  77. unifi_network_maps/render/mermaid_theme.py +56 -0
  78. unifi_network_maps/render/mkdocs.py +167 -0
  79. unifi_network_maps/render/svg.py +1235 -0
  80. unifi_network_maps/render/svg_theme.py +64 -0
  81. unifi_network_maps/render/templates/device_port_block.md.j2 +5 -0
  82. unifi_network_maps/render/templates/legend_compact.html.j2 +14 -0
  83. unifi_network_maps/render/templates/lldp_device_section.md.j2 +15 -0
  84. unifi_network_maps/render/templates/markdown_section.md.j2 +3 -0
  85. unifi_network_maps/render/templates/mermaid_legend.mmd.j2 +30 -0
  86. unifi_network_maps/render/templates/mkdocs_document.md.j2 +23 -0
  87. unifi_network_maps/render/templates/mkdocs_dual_theme_style.html.j2 +8 -0
  88. unifi_network_maps/render/templates/mkdocs_html_block.html.j2 +2 -0
  89. unifi_network_maps/render/templates/mkdocs_legend.css.j2 +29 -0
  90. unifi_network_maps/render/templates/mkdocs_legend.js.j2 +18 -0
  91. unifi_network_maps/render/templates/mkdocs_mermaid_block.md.j2 +4 -0
  92. unifi_network_maps/render/templating.py +19 -0
  93. unifi_network_maps/render/theme.py +109 -0
  94. unifi_network_maps-1.4.11.dist-info/METADATA +290 -0
  95. unifi_network_maps-1.4.11.dist-info/RECORD +99 -0
  96. unifi_network_maps-1.4.11.dist-info/WHEEL +5 -0
  97. unifi_network_maps-1.4.11.dist-info/entry_points.txt +2 -0
  98. unifi_network_maps-1.4.11.dist-info/licenses/LICENSE +21 -0
  99. unifi_network_maps-1.4.11.dist-info/top_level.txt +1 -0
@@ -0,0 +1,167 @@
1
+ """MkDocs-specific rendering helpers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from dataclasses import dataclass
7
+ from datetime import datetime
8
+ from zoneinfo import ZoneInfo
9
+
10
+ from ..model.topology import ClientPortMap, Device, PortMap, build_node_type_map
11
+ from .device_ports_md import render_device_port_overview
12
+ from .mermaid import render_legend, render_legend_compact, render_mermaid
13
+ from .mermaid_theme import MermaidTheme
14
+ from .templating import render_template
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class MkdocsRenderOptions:
21
+ direction: str
22
+ legend_style: str
23
+ legend_scale: float
24
+ timestamp_zone: str
25
+ client_scope: str
26
+ dual_theme: bool
27
+
28
+
29
+ def render_mkdocs(
30
+ edges: list,
31
+ devices: list[Device],
32
+ *,
33
+ mermaid_theme: MermaidTheme,
34
+ port_map: PortMap,
35
+ client_ports: ClientPortMap | None,
36
+ options: MkdocsRenderOptions,
37
+ dark_mermaid_theme: MermaidTheme | None = None,
38
+ ) -> str:
39
+ clients = None
40
+ node_types = build_node_type_map(devices, clients, client_mode=options.client_scope)
41
+ content = render_mermaid(
42
+ edges,
43
+ direction=options.direction,
44
+ node_types=node_types,
45
+ theme=mermaid_theme,
46
+ )
47
+ dual_theme = options.dual_theme and dark_mermaid_theme is not None
48
+ legend_title = "Legend" if options.legend_style != "compact" else ""
49
+ if dual_theme and dark_mermaid_theme is not None:
50
+ dark_content = render_mermaid(
51
+ edges,
52
+ direction=options.direction,
53
+ node_types=node_types,
54
+ theme=dark_mermaid_theme,
55
+ )
56
+ map_block = _mkdocs_dual_mermaid_block(content, dark_content, base_class="unifi-mermaid")
57
+ legend_block = _mkdocs_dual_legend_block(
58
+ options.legend_style,
59
+ mermaid_theme=mermaid_theme,
60
+ dark_mermaid_theme=dark_mermaid_theme,
61
+ legend_scale=options.legend_scale,
62
+ )
63
+ dual_style = _mkdocs_dual_theme_style()
64
+ else:
65
+ map_block = _mkdocs_mermaid_block(content, class_name="unifi-mermaid")
66
+ legend_block = _mkdocs_single_legend_block(
67
+ options.legend_style,
68
+ mermaid_theme=mermaid_theme,
69
+ legend_scale=options.legend_scale,
70
+ )
71
+ dual_style = ""
72
+ return render_template(
73
+ "mkdocs_document.md.j2",
74
+ title="UniFi network",
75
+ timestamp_line=_timestamp_line(options.timestamp_zone),
76
+ dual_style=dual_style,
77
+ map_block=map_block,
78
+ legend_title=legend_title,
79
+ legend_block=legend_block,
80
+ device_overview=render_device_port_overview(
81
+ devices, port_map, client_ports=client_ports
82
+ ).rstrip()
83
+ + "\n",
84
+ )
85
+
86
+
87
+ def _timestamp_line(timestamp_zone: str) -> str:
88
+ if timestamp_zone.strip().lower() in {"off", "none", "false"}:
89
+ return ""
90
+ try:
91
+ zone = ZoneInfo(timestamp_zone)
92
+ except Exception as exc: # noqa: BLE001
93
+ logger.warning("Invalid mkdocs timestamp zone '%s': %s", timestamp_zone, exc)
94
+ return ""
95
+ generated_at = datetime.now(zone).strftime("%Y-%m-%d %H:%M:%S %Z")
96
+ return f"Generated: {generated_at}"
97
+
98
+
99
+ def _mkdocs_mermaid_block(content: str, *, class_name: str) -> str:
100
+ return render_template(
101
+ "mkdocs_mermaid_block.md.j2",
102
+ class_name=class_name,
103
+ content=content,
104
+ )
105
+
106
+
107
+ def _mkdocs_dual_mermaid_block(
108
+ light_content: str,
109
+ dark_content: str,
110
+ *,
111
+ base_class: str,
112
+ ) -> str:
113
+ light = _mkdocs_mermaid_block(light_content, class_name=f"{base_class} {base_class}--light")
114
+ dark = _mkdocs_mermaid_block(dark_content, class_name=f"{base_class} {base_class}--dark")
115
+ return f"{light}\n{dark}"
116
+
117
+
118
+ def _mkdocs_single_legend_block(
119
+ legend_style: str,
120
+ *,
121
+ mermaid_theme: MermaidTheme,
122
+ legend_scale: float,
123
+ ) -> str:
124
+ if legend_style == "compact":
125
+ return render_template(
126
+ "mkdocs_html_block.html.j2",
127
+ class_name="unifi-legend",
128
+ data_unifi_legend=True,
129
+ content=render_legend_compact(theme=mermaid_theme),
130
+ )
131
+ return "```mermaid\n" + render_legend(theme=mermaid_theme, legend_scale=legend_scale) + "```"
132
+
133
+
134
+ def _mkdocs_dual_legend_block(
135
+ legend_style: str,
136
+ *,
137
+ mermaid_theme: MermaidTheme,
138
+ dark_mermaid_theme: MermaidTheme,
139
+ legend_scale: float,
140
+ ) -> str:
141
+ if legend_style == "compact":
142
+ light = render_template(
143
+ "mkdocs_html_block.html.j2",
144
+ class_name="unifi-legend unifi-legend--light",
145
+ data_unifi_legend=True,
146
+ content=render_legend_compact(theme=mermaid_theme),
147
+ )
148
+ dark = render_template(
149
+ "mkdocs_html_block.html.j2",
150
+ class_name="unifi-legend unifi-legend--dark",
151
+ data_unifi_legend=True,
152
+ content=render_legend_compact(theme=dark_mermaid_theme),
153
+ )
154
+ return f"{light}\n{dark}"
155
+ light = _mkdocs_mermaid_block(
156
+ render_legend(theme=mermaid_theme, legend_scale=legend_scale),
157
+ class_name="unifi-legend unifi-legend--light",
158
+ )
159
+ dark = _mkdocs_mermaid_block(
160
+ render_legend(theme=dark_mermaid_theme, legend_scale=legend_scale),
161
+ class_name="unifi-legend unifi-legend--dark",
162
+ )
163
+ return f"{light}\n{dark}"
164
+
165
+
166
+ def _mkdocs_dual_theme_style() -> str:
167
+ return render_template("mkdocs_dual_theme_style.html.j2") + "\n"