unifi-network-maps 1.4.14__tar.gz → 1.4.15__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 (134) hide show
  1. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/CHANGELOG.md +7 -0
  2. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/PKG-INFO +1 -1
  3. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/pyproject.toml +1 -1
  4. unifi_network_maps-1.4.15/src/unifi_network_maps/__init__.py +1 -0
  5. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/adapters/unifi.py +3 -5
  6. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/model/topology.py +21 -1
  7. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps.egg-info/PKG-INFO +1 -1
  8. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_topology.py +46 -0
  9. unifi_network_maps-1.4.14/src/unifi_network_maps/__init__.py +0 -1
  10. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/CONTRIBUTING.md +0 -0
  11. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/LICENSE +0 -0
  12. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/LICENSES.md +0 -0
  13. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/MANIFEST.in +0 -0
  14. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/README.md +0 -0
  15. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/RELEASING.md +0 -0
  16. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/SECURITY.md +0 -0
  17. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/setup.cfg +0 -0
  18. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/__main__.py +0 -0
  19. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/adapters/__init__.py +0 -0
  20. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/adapters/config.py +0 -0
  21. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/__init__.py +0 -0
  22. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/__init__.py +0 -0
  23. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/access-point.svg +0 -0
  24. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/ISOPACKS_LICENSE +0 -0
  25. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/block.svg +0 -0
  26. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/cache.svg +0 -0
  27. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/cardterminal.svg +0 -0
  28. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/cloud.svg +0 -0
  29. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/cronjob.svg +0 -0
  30. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/cube.svg +0 -0
  31. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/desktop.svg +0 -0
  32. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/diamond.svg +0 -0
  33. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/dns.svg +0 -0
  34. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/document.svg +0 -0
  35. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/firewall.svg +0 -0
  36. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/function-module.svg +0 -0
  37. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/image.svg +0 -0
  38. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/laptop.svg +0 -0
  39. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/loadbalancer.svg +0 -0
  40. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/lock.svg +0 -0
  41. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/mail.svg +0 -0
  42. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/mailmultiple.svg +0 -0
  43. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/mobiledevice.svg +0 -0
  44. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/office.svg +0 -0
  45. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/package-module.svg +0 -0
  46. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/paymentcard.svg +0 -0
  47. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/plane.svg +0 -0
  48. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/printer.svg +0 -0
  49. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/pyramid.svg +0 -0
  50. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/queue.svg +0 -0
  51. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/router.svg +0 -0
  52. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/server.svg +0 -0
  53. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/speech.svg +0 -0
  54. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/sphere.svg +0 -0
  55. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/storage.svg +0 -0
  56. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/switch-module.svg +0 -0
  57. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/tower.svg +0 -0
  58. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/truck-2.svg +0 -0
  59. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/truck.svg +0 -0
  60. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/user.svg +0 -0
  61. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/isometric/vm.svg +0 -0
  62. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/laptop.svg +0 -0
  63. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/router-network.svg +0 -0
  64. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/server-network.svg +0 -0
  65. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/icons/server.svg +0 -0
  66. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/themes/dark.yaml +0 -0
  67. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/assets/themes/default.yaml +0 -0
  68. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/cli/__init__.py +0 -0
  69. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/cli/__main__.py +0 -0
  70. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/cli/args.py +0 -0
  71. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/cli/main.py +0 -0
  72. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/cli/render.py +0 -0
  73. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/cli/runtime.py +0 -0
  74. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/io/__init__.py +0 -0
  75. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/io/debug.py +0 -0
  76. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/io/export.py +0 -0
  77. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/io/mkdocs_assets.py +0 -0
  78. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/io/mock_data.py +0 -0
  79. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/io/mock_generate.py +0 -0
  80. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/io/paths.py +0 -0
  81. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/model/__init__.py +0 -0
  82. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/model/labels.py +0 -0
  83. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/model/lldp.py +0 -0
  84. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/model/mock.py +0 -0
  85. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/model/ports.py +0 -0
  86. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/model/vlans.py +0 -0
  87. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/__init__.py +0 -0
  88. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/device_ports_md.py +0 -0
  89. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/legend.py +0 -0
  90. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/lldp_md.py +0 -0
  91. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/markdown_tables.py +0 -0
  92. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/mermaid.py +0 -0
  93. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/mermaid_theme.py +0 -0
  94. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/mkdocs.py +0 -0
  95. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/svg.py +0 -0
  96. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/svg_theme.py +0 -0
  97. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/device_port_block.md.j2 +0 -0
  98. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/legend_compact.html.j2 +0 -0
  99. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/lldp_device_section.md.j2 +0 -0
  100. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/markdown_section.md.j2 +0 -0
  101. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/mermaid_legend.mmd.j2 +0 -0
  102. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/mkdocs_document.md.j2 +0 -0
  103. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/mkdocs_dual_theme_style.html.j2 +0 -0
  104. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/mkdocs_html_block.html.j2 +0 -0
  105. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/mkdocs_legend.css.j2 +0 -0
  106. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/mkdocs_legend.js.j2 +0 -0
  107. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templates/mkdocs_mermaid_block.md.j2 +0 -0
  108. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/templating.py +0 -0
  109. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps/render/theme.py +0 -0
  110. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps.egg-info/SOURCES.txt +0 -0
  111. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps.egg-info/dependency_links.txt +0 -0
  112. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps.egg-info/entry_points.txt +0 -0
  113. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps.egg-info/requires.txt +0 -0
  114. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/src/unifi_network_maps.egg-info/top_level.txt +0 -0
  115. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_cli.py +0 -0
  116. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_clients.py +0 -0
  117. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_config.py +0 -0
  118. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_contract_unifi.py +0 -0
  119. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_contract_unifi_live.py +0 -0
  120. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_debug.py +0 -0
  121. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_device_ports_md.py +0 -0
  122. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_export.py +0 -0
  123. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_groups.py +0 -0
  124. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_labels.py +0 -0
  125. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_lldp.py +0 -0
  126. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_lldp_md.py +0 -0
  127. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_mermaid.py +0 -0
  128. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_mkdocs.py +0 -0
  129. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_mock_generate.py +0 -0
  130. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_svg.py +0 -0
  131. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_svg_iso.py +0 -0
  132. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_theme.py +0 -0
  133. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_unifi.py +0 -0
  134. {unifi_network_maps-1.4.14 → unifi_network_maps-1.4.15}/tests/test_vlan_info.py +0 -0
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.4.15] - 2026-02-01
9
+ ### Changed
10
+ - Displaying of friendly device/model names
11
+
12
+ ### Fixed
13
+ - Handle disabled WAN interfaces gracefully (avoid unifi-controller-api model parse errors)
14
+
8
15
  ## [1.4.14] - 2026-02-01
9
16
  ### Added
10
17
  - JSON output with VLAN inventory
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unifi-network-maps
3
- Version: 1.4.14
3
+ Version: 1.4.15
4
4
  Summary: Dynamic UniFi -> network maps in mermaid or svg
5
5
  Author: Merlijn
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "unifi-network-maps"
7
- version = "1.4.14"
7
+ version = "1.4.15"
8
8
  description = "Dynamic UniFi -> network maps in mermaid or svg"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -0,0 +1 @@
1
+ __version__ = "1.4.15"
@@ -513,11 +513,9 @@ def fetch_networks(
513
513
  controller = _init_controller(config, is_udm_pro=False)
514
514
 
515
515
  def _fetch() -> Sequence[object]:
516
- try:
517
- return controller.get_unifi_site_networkconf(site_name=site_name, raw=False)
518
- except Exception as exc: # noqa: BLE001 - fallback to raw network data
519
- logger.warning("Networkconf model parse failed; retrying raw fetch: %s", exc)
520
- return controller.get_unifi_site_networkconf(site_name=site_name, raw=True)
516
+ # Always use raw=True to avoid model parsing issues with disabled WAN interfaces
517
+ # (the UnifiNetworkConf model requires an 'enabled' field that may be absent)
518
+ return controller.get_unifi_site_networkconf(site_name=site_name, raw=True)
521
519
 
522
520
  try:
523
521
  networks = _call_with_retries("network fetch", _fetch)
@@ -302,9 +302,29 @@ def _uplink_info(device: DeviceSource) -> tuple[UplinkInfo | None, UplinkInfo |
302
302
  return uplink, last_uplink
303
303
 
304
304
 
305
+ def _get_model_display_name(device: DeviceSource) -> str | None:
306
+ """Extract the human-readable model name from device data.
307
+
308
+ UniFi stores the friendly model name (e.g., 'USW Flex 2.5G 8 PoE') in various
309
+ fields depending on controller version. This function checks multiple candidates
310
+ and returns the first non-empty value found.
311
+ """
312
+ candidates = (
313
+ "model_in_lts",
314
+ "model_in_eol",
315
+ "shortname",
316
+ "model_name",
317
+ )
318
+ for key in candidates:
319
+ value = _get_attr(device, key)
320
+ if isinstance(value, str) and value.strip():
321
+ return value.strip()
322
+ return None
323
+
324
+
305
325
  def coerce_device(device: DeviceSource) -> Device:
306
326
  name = _get_attr(device, "name")
307
- model_name = _get_attr(device, "model_name") or _get_attr(device, "model")
327
+ model_name = _get_model_display_name(device) or _get_attr(device, "model")
308
328
  model = _get_attr(device, "model")
309
329
  mac = _get_attr(device, "mac")
310
330
  ip = _get_attr(device, "ip") or _get_attr(device, "ip_address")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unifi-network-maps
3
- Version: 1.4.14
3
+ Version: 1.4.15
4
4
  Summary: Dynamic UniFi -> network maps in mermaid or svg
5
5
  Author: Merlijn
6
6
  License-Expression: MIT
@@ -20,6 +20,7 @@ from unifi_network_maps.model.topology import (
20
20
  _client_unifi_flag,
21
21
  _client_uplink_mac,
22
22
  _client_uplink_port,
23
+ _get_model_display_name,
23
24
  _parse_uplink,
24
25
  _poe_ports_from_device,
25
26
  _port_speed_by_idx,
@@ -735,3 +736,48 @@ def test_port_speed_by_idx_reads_speed():
735
736
  def test_classify_device_type_from_name():
736
737
  device = SimpleNamespace(type="", name="Gateway Main")
737
738
  assert classify_device_type(device) == "gateway"
739
+
740
+
741
+ def test_get_model_display_name_prefers_model_in_lts():
742
+ device = SimpleNamespace(
743
+ model_in_lts="USW Flex 2.5G 8 PoE",
744
+ model_name="USW-Flex-2.5G-8-PoE",
745
+ model="USWFLEXPOE8",
746
+ )
747
+ assert _get_model_display_name(device) == "USW Flex 2.5G 8 PoE"
748
+
749
+
750
+ def test_get_model_display_name_uses_model_in_eol():
751
+ device = SimpleNamespace(model_in_eol="USW Pro 24", model="USWPRO24")
752
+ assert _get_model_display_name(device) == "USW Pro 24"
753
+
754
+
755
+ def test_get_model_display_name_uses_shortname():
756
+ device = SimpleNamespace(shortname="USW Mini", model="USWMINI")
757
+ assert _get_model_display_name(device) == "USW Mini"
758
+
759
+
760
+ def test_get_model_display_name_falls_back_to_model_name():
761
+ device = SimpleNamespace(model_name="Dream Machine", model="UDM")
762
+ assert _get_model_display_name(device) == "Dream Machine"
763
+
764
+
765
+ def test_get_model_display_name_returns_none_without_candidates():
766
+ device = SimpleNamespace(model="USWFLEX")
767
+ assert _get_model_display_name(device) is None
768
+
769
+
770
+ def test_coerce_device_uses_model_in_lts_for_model_name():
771
+ device = SimpleNamespace(
772
+ name="Switch",
773
+ mac="aa:bb:cc:dd:ee:ff",
774
+ model_in_lts="USW Flex 2.5G 8 PoE",
775
+ model="USWFLEXPOE8",
776
+ ip="",
777
+ type="usw",
778
+ lldp_info=[],
779
+ port_table=[],
780
+ )
781
+ result = coerce_device(device)
782
+ assert result.model_name == "USW Flex 2.5G 8 PoE"
783
+ assert result.model == "USWFLEXPOE8"
@@ -1 +0,0 @@
1
- __version__ = "1.4.14"