python-netgear-switch-library 0.1.post18__tar.gz → 0.1.post29__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 (430) hide show
  1. python_netgear_switch_library-0.1.post29/.github/apt-packaging.toml +9 -0
  2. python_netgear_switch_library-0.1.post29/.github/workflows/deb.yml +177 -0
  3. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/.github/workflows/publish-pypi.yml +12 -8
  4. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/.gitignore +5 -0
  5. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/PKG-INFO +30 -28
  6. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/README.md +29 -27
  7. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/RELEASING.md +20 -12
  8. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/debian/rules +7 -4
  9. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/conf.py +4 -3
  10. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/development.rst +5 -4
  11. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/guide/installation.rst +12 -13
  12. python_netgear_switch_library-0.1.post29/packaging/install-test.sh +76 -0
  13. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/pyproject.toml +3 -1
  14. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/_version.py +2 -2
  15. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/models.py +10 -0
  16. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/snmp/parse.py +3 -0
  17. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_parse_ports.py +17 -0
  18. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_snmp_read.py +18 -0
  19. python_netgear_switch_library-0.1.post18/.github/workflows/ci.yml +0 -86
  20. python_netgear_switch_library-0.1.post18/.github/workflows/deb.yml +0 -81
  21. python_netgear_switch_library-0.1.post18/debian/changelog +0 -6
  22. python_netgear_switch_library-0.1.post18/packaging/ci-build.sh +0 -27
  23. python_netgear_switch_library-0.1.post18/packaging/deb-version.py +0 -121
  24. python_netgear_switch_library-0.1.post18/tests/test_deb_version.py +0 -237
  25. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/.readthedocs.yaml +0 -0
  26. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/CLAUDE.md +0 -0
  27. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/LICENSE +0 -0
  28. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/debian/control +0 -0
  29. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/debian/copyright +0 -0
  30. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/debian/source/format +0 -0
  31. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/Makefile +0 -0
  32. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_ext/filelinks.py +0 -0
  33. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_ext/support_tables.py +0 -0
  34. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/gs105pe.png +0 -0
  35. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/gs110emx.png +0 -0
  36. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/gs305ep.png +0 -0
  37. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/gs728tpp.png +0 -0
  38. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/gsm7228ps.jpg +0 -0
  39. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/gsm7252ps.jpg +0 -0
  40. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/m4300-16x.png +0 -0
  41. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/models/m4300-24x.png +0 -0
  42. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/_static/ngsw.css +0 -0
  43. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/cli.rst +0 -0
  44. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/core.rst +0 -0
  45. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/facades.rst +0 -0
  46. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/index.rst +0 -0
  47. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/mcp.rst +0 -0
  48. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/operations.rst +0 -0
  49. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/protocols.rst +0 -0
  50. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/transport.rst +0 -0
  51. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/api/virtual.rst +0 -0
  52. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/cli.rst +0 -0
  53. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/fake/index.rst +0 -0
  54. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/fake/internals.rst +0 -0
  55. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/fake/serving.rst +0 -0
  56. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/fake/testing.rst +0 -0
  57. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/guide/concepts.rst +0 -0
  58. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/guide/configuration.rst +0 -0
  59. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/guide/principles.rst +0 -0
  60. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/guide/quickstart.rst +0 -0
  61. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/guide/reading.rst +0 -0
  62. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/guide/writing.rst +0 -0
  63. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/index.rst +0 -0
  64. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/mcp.rst +0 -0
  65. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/gs105pe.rst +0 -0
  66. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/gs110emx.rst +0 -0
  67. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/gs305ep.rst +0 -0
  68. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/gs728tpp.rst +0 -0
  69. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/gsm7228ps.rst +0 -0
  70. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/gsm7252ps.rst +0 -0
  71. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/index.rst +0 -0
  72. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/m4300-16x.rst +0 -0
  73. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/m4300-24x.rst +0 -0
  74. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/models/support.rst +0 -0
  75. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/cli.rst +0 -0
  76. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/http/cheetah-form.rst +0 -0
  77. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/http/cheetah-v1.rst +0 -0
  78. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/http/gambit.rst +0 -0
  79. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/http/merge-hash-cgi.rst +0 -0
  80. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/http/xml-api.rst +0 -0
  81. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/http.rst +0 -0
  82. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/index.rst +0 -0
  83. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/nsdp.rst +0 -0
  84. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/protocols/snmp.rst +0 -0
  85. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-15-foundation.md +0 -0
  86. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-17-slice-02-snmp-read-core.md +0 -0
  87. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-17-slice-03-read-apis.md +0 -0
  88. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-18-slice-04-snmp-write.md +0 -0
  89. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-18-slice-05-nsdp.md +0 -0
  90. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-18-slice-06-http.md +0 -0
  91. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-18-slice-07-cli.md +0 -0
  92. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-18-slice-08-packaging-ci.md +0 -0
  93. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/plans/2026-07-23-gsm7252ps-http-xe-dialect.md +0 -0
  94. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/specs/2026-07-15-netgear-control-library-design.md +0 -0
  95. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/specs/2026-07-23-gsm7252ps-http-xe-dialect-design.md +0 -0
  96. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/specs/2026-08-02-gs728tpp-poe-vlan-live.md +0 -0
  97. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/specs/2026-08-02-snmp-surface-findings.md +0 -0
  98. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/docs/superpowers/specs/2026-08-03-snmp-vendor-oid-sweep.md +0 -0
  99. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/packaging/apt-intro.html +0 -0
  100. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/__init__.py +0 -0
  101. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/_dispatch.py +0 -0
  102. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/aio_api.py +0 -0
  103. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/capabilities.py +0 -0
  104. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli/__init__.py +0 -0
  105. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli/capture.py +0 -0
  106. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli/context.py +0 -0
  107. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli/format.py +0 -0
  108. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli/main.py +0 -0
  109. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli/resolve.py +0 -0
  110. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli/safety.py +0 -0
  111. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli_read.py +0 -0
  112. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/cli_write.py +0 -0
  113. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/config.py +0 -0
  114. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/errors.py +0 -0
  115. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/http_read.py +0 -0
  116. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/http_write.py +0 -0
  117. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/mcp/__init__.py +0 -0
  118. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/mcp/server.py +0 -0
  119. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/nsdp_read.py +0 -0
  120. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/nsdp_write.py +0 -0
  121. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/__init__.py +0 -0
  122. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/cli/__init__.py +0 -0
  123. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/cli/commands.py +0 -0
  124. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/cli/parse.py +0 -0
  125. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/__init__.py +0 -0
  126. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/crypt.py +0 -0
  127. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/endpoints.py +0 -0
  128. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/forms.py +0 -0
  129. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/goahead.py +0 -0
  130. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/parse.py +0 -0
  131. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/session.py +0 -0
  132. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/http/types.py +0 -0
  133. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/nsdp/__init__.py +0 -0
  134. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/nsdp/auth.py +0 -0
  135. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/nsdp/client.py +0 -0
  136. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/nsdp/parsers.py +0 -0
  137. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/nsdp/protocol.py +0 -0
  138. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/nsdp/types.py +0 -0
  139. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/nsdp/write.py +0 -0
  140. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/snmp/__init__.py +0 -0
  141. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/snmp/client.py +0 -0
  142. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/snmp/oids.py +0 -0
  143. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/protocols/snmp/write.py +0 -0
  144. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/py.typed +0 -0
  145. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/registry.py +0 -0
  146. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/snmp_read.py +0 -0
  147. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/snmp_write.py +0 -0
  148. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/sync_api.py +0 -0
  149. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/__init__.py +0 -0
  150. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/aio/__init__.py +0 -0
  151. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/aio/nsdp_udp.py +0 -0
  152. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/aio/snmp_pysnmp.py +0 -0
  153. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/cli/__init__.py +0 -0
  154. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/cli/console.py +0 -0
  155. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/cli/session.py +0 -0
  156. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/cli/ssh.py +0 -0
  157. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/cli/telnet.py +0 -0
  158. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/http/__init__.py +0 -0
  159. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/http/client.py +0 -0
  160. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/sync/__init__.py +0 -0
  161. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/sync/nsdp_udp.py +0 -0
  162. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/transport/sync/snmp_netsnmp_cli.py +0 -0
  163. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/__init__.py +0 -0
  164. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/cli_fastpath.py +0 -0
  165. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/faces/__init__.py +0 -0
  166. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/faces/cli.py +0 -0
  167. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/faces/http.py +0 -0
  168. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/faces/mibview.py +0 -0
  169. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/faces/nsdp.py +0 -0
  170. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/faces/snmp.py +0 -0
  171. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/seed.py +0 -0
  172. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/server.py +0 -0
  173. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/state.py +0 -0
  174. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web.py +0 -0
  175. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_fastpath_vlan.py +0 -0
  176. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_fastpath_xui.py +0 -0
  177. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_gs105pe.py +0 -0
  178. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_gs110emx.py +0 -0
  179. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_gs110emx_templates.py +0 -0
  180. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_gs728tpp.py +0 -0
  181. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_gsm7228ps.py +0 -0
  182. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_gsm7252ps.py +0 -0
  183. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/src/netgear_switch/virtual/web_m4300.py +0 -0
  184. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/capture_parity.py +0 -0
  185. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_capture.py +0 -0
  186. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_cli_integration.py +0 -0
  187. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_control_poe_port.py +0 -0
  188. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_control_vlan_ip.py +0 -0
  189. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_format.py +0 -0
  190. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_main_framework.py +0 -0
  191. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_new_commands.py +0 -0
  192. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_op_coverage.py +0 -0
  193. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_prompt_wiring.py +0 -0
  194. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_read_commands.py +0 -0
  195. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_resolve.py +0 -0
  196. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_safety.py +0 -0
  197. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/cli/test_serve.py +0 -0
  198. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/conftest.py +0 -0
  199. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/equivalence.py +0 -0
  200. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/captures/gsm7228ps.json +0 -0
  201. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/captures/gsm7252ps.json +0 -0
  202. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/captures/m4300-16x.json +0 -0
  203. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/captures/m4300-24x.json +0 -0
  204. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_environment.txt +0 -0
  205. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_lldp.txt +0 -0
  206. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_mac_table.txt +0 -0
  207. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_network.txt +0 -0
  208. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_poe.txt +0 -0
  209. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_port_all.txt +0 -0
  210. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_show_version.txt +0 -0
  211. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_vlan.txt +0 -0
  212. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_vlan_brief.txt +0 -0
  213. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7228ps_vlan_port_all.txt +0 -0
  214. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_environment.txt +0 -0
  215. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_interface_ethernet_1_0_1.txt +0 -0
  216. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_lldp_remote_device_all.txt +0 -0
  217. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_mac_addr_table.txt +0 -0
  218. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_network.txt +0 -0
  219. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_poe_port_info_all.txt +0 -0
  220. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_port_all.txt +0 -0
  221. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_version.txt +0 -0
  222. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_vlan_90.txt +0 -0
  223. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_vlan_brief.txt +0 -0
  224. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/gsm7252ps_show_vlan_port_all.txt +0 -0
  225. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_environment.txt +0 -0
  226. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_interface_ethernet_1_0_1.txt +0 -0
  227. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_ip_management.txt +0 -0
  228. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_lldp_remote_device_all.txt +0 -0
  229. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_mac_addr_table.txt +0 -0
  230. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_poe_port_info_all.txt +0 -0
  231. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_port_all.txt +0 -0
  232. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_version.txt +0 -0
  233. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_vlan.txt +0 -0
  234. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_vlan_1.txt +0 -0
  235. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_vlan_4.txt +0 -0
  236. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_vlan_5.txt +0 -0
  237. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_16x_show_vlan_port_all.txt +0 -0
  238. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_environment.txt +0 -0
  239. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_interface_ethernet_1_0_1.txt +0 -0
  240. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_ip_management.txt +0 -0
  241. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_lldp_remote_device_all.txt +0 -0
  242. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_mac_addr_table.txt +0 -0
  243. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_port_all.txt +0 -0
  244. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_version.txt +0 -0
  245. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_vlan.txt +0 -0
  246. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_vlan_5.txt +0 -0
  247. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_vlan_90.txt +0 -0
  248. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/cli/m4300_24x_show_vlan_port_all.txt +0 -0
  249. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs105pe_membership.html +0 -0
  250. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs105pe_portstats.html +0 -0
  251. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs105pe_pvid.html +0 -0
  252. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs105pe_status.html +0 -0
  253. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs105pe_switch_info.html +0 -0
  254. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs105pe_vlancfg.html +0 -0
  255. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_cf8021q.html +0 -0
  256. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_interface_stats.html +0 -0
  257. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_login.html +0 -0
  258. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_port_settings.html +0 -0
  259. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_pvid.html +0 -0
  260. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_redirect.html +0 -0
  261. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_sysinfo.html +0 -0
  262. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs110emx_vlanmembership.html +0 -0
  263. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs305ep_dashboard.html +0 -0
  264. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs305ep_login.html +0 -0
  265. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs305ep_membership.html +0 -0
  266. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs305ep_poestatus.html +0 -0
  267. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs305ep_portstats.html +0 -0
  268. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs305ep_pvid.html +0 -0
  269. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs305ep_vlancfg.html +0 -0
  270. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_device_info_and_sensors.xml +0 -0
  271. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_lldp.xml +0 -0
  272. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_macs.xml +0 -0
  273. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_mgmt_ip.xml +0 -0
  274. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_poe.xml +0 -0
  275. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_ports.xml +0 -0
  276. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_pvids_membership.xml +0 -0
  277. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_vlan_membership_per_vlan.xml +0 -0
  278. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gs728tpp_vlans.xml +0 -0
  279. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_basicAddressTable.html +0 -0
  280. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_http_configuration.html +0 -0
  281. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_ipConfiguration.html +0 -0
  282. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_lldpRemoteInventory.html +0 -0
  283. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_poeInterfaceConfiguration.html +0 -0
  284. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_portPvidConfiguration.html +0 -0
  285. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_portStatistics.html +0 -0
  286. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_portsConfiguration.html +0 -0
  287. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_sysInfo.html +0 -0
  288. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_syslog_configuration.html +0 -0
  289. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_vlanPortCfg_vlan5.html +0 -0
  290. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7228ps_vlanStatus.html +0 -0
  291. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_basicAddressTable.html +0 -0
  292. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_http_configuration.html +0 -0
  293. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_https_configuration.html +0 -0
  294. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_ipConfiguration.html +0 -0
  295. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_lldpRemoteInventory.html +0 -0
  296. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_login.html +0 -0
  297. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_poeInterfaceConfiguration.html +0 -0
  298. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_portPvidConfiguration.html +0 -0
  299. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_portStatistics.html +0 -0
  300. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_portsConfiguration.html +0 -0
  301. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_ssh_configuration.html +0 -0
  302. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_sysInfo.html +0 -0
  303. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_syslog_configuration.html +0 -0
  304. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_telnet.html +0 -0
  305. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_user_configuration.html +0 -0
  306. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_user_management.html +0 -0
  307. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan1.html +0 -0
  308. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan141.html +0 -0
  309. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_vlanStatus.html +0 -0
  310. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_vlan_add_form.html +0 -0
  311. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_vlan_configuration.js +0 -0
  312. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_vlan_configuration_live.html +0 -0
  313. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/gsm7252ps_vlan_status_live.html +0 -0
  314. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_16x_lldpRemoteInventory.html +0 -0
  315. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_16x_mgmtVlanIpv4Configuration.html +0 -0
  316. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_16x_poeInterfaceConfiguration.html +0 -0
  317. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_16x_portsConfiguration.html +0 -0
  318. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_16x_syslog_configuration.html +0 -0
  319. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_16x_vlanportcfg_vlan4.html +0 -0
  320. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_24x_http_configuration.html +0 -0
  321. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_24x_https_configuration.html +0 -0
  322. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_24x_poeInterfaceConfiguration.html +0 -0
  323. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_24x_ssh_configuration.html +0 -0
  324. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_24x_syslog_configuration.html +0 -0
  325. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_24x_telnet.html +0 -0
  326. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_24x_user_management.html +0 -0
  327. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_addresstable.html +0 -0
  328. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_lldpRemoteInventory.html +0 -0
  329. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_mgmtVlanIpv4Configuration.html +0 -0
  330. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_ports.html +0 -0
  331. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_portstats.html +0 -0
  332. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_pvid.html +0 -0
  333. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_sysinfo.html +0 -0
  334. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_vlanportcfg_vlan1.html +0 -0
  335. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/http/m4300_vlanstatus.html +0 -0
  336. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/snmp/gsm7252ps_fans.txt +0 -0
  337. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/snmp/gsm7252ps_ifhighspeed.txt +0 -0
  338. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/snmp/gsm7252ps_ifoperstatus.txt +0 -0
  339. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/fixtures/snmp/gsm7252ps_psu.txt +0 -0
  340. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/http_specs.py +0 -0
  341. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/cli/test_cli_parse.py +0 -0
  342. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/http/test_crypt.py +0 -0
  343. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/http/test_endpoints.py +0 -0
  344. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/http/test_forms.py +0 -0
  345. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/http/test_goahead_write.py +0 -0
  346. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/http/test_parse.py +0 -0
  347. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/nsdp/test_auth.py +0 -0
  348. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/nsdp/test_parsers.py +0 -0
  349. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/nsdp/test_protocol.py +0 -0
  350. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/nsdp/test_write_frame.py +0 -0
  351. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_client.py +0 -0
  352. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_oids.py +0 -0
  353. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_parse_lldp_macs.py +0 -0
  354. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_parse_mgmt_ip.py +0 -0
  355. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_parse_poe_sensors.py +0 -0
  356. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_parse_system_info.py +0 -0
  357. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_parse_vlans.py +0 -0
  358. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/protocols/snmp/test_write_encode.py +0 -0
  359. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/snmp_fakes.py +0 -0
  360. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_aio_api.py +0 -0
  361. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_capabilities.py +0 -0
  362. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_cli_read.py +0 -0
  363. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_cli_vlan_write.py +0 -0
  364. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_cli_write.py +0 -0
  365. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_config.py +0 -0
  366. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_cross_backend_equivalence.py +0 -0
  367. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_dispatch.py +0 -0
  368. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_docs_coverage.py +0 -0
  369. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_errors.py +0 -0
  370. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_facade_equivalence.py +0 -0
  371. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_flow_control.py +0 -0
  372. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_dispatch.py +0 -0
  373. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_equivalence.py +0 -0
  374. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_hostname_emx.py +0 -0
  375. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_read.py +0 -0
  376. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_services.py +0 -0
  377. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_syslog.py +0 -0
  378. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_users.py +0 -0
  379. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_vlan_membership.py +0 -0
  380. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_write.py +0 -0
  381. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_http_xui_writes.py +0 -0
  382. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_import.py +0 -0
  383. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_mcp_server.py +0 -0
  384. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_models.py +0 -0
  385. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_models_snmp_read.py +0 -0
  386. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_nsdp_integration.py +0 -0
  387. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_nsdp_read.py +0 -0
  388. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_nsdp_write.py +0 -0
  389. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_port_speed.py +0 -0
  390. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_port_speed_http.py +0 -0
  391. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_public_api.py +0 -0
  392. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_quality_gates.py +0 -0
  393. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_registry.py +0 -0
  394. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_snmp_integration.py +0 -0
  395. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_snmp_write.py +0 -0
  396. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_sync_api.py +0 -0
  397. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_syslog_collectors.py +0 -0
  398. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_version.py +0 -0
  399. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/test_write_equivalence.py +0 -0
  400. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/_fastpath_fake.py +0 -0
  401. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_cli_console.py +0 -0
  402. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_cli_scp_cert.py +0 -0
  403. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_cli_telnet.py +0 -0
  404. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_http_client.py +0 -0
  405. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_nsdp_udp_sync.py +0 -0
  406. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_set_transport.py +0 -0
  407. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_snmp_netsnmp_cli.py +0 -0
  408. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_snmp_pysnmp.py +0 -0
  409. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/transport/test_value_parity.py +0 -0
  410. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_cli_cross_backend.py +0 -0
  411. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_cli_gsm7228ps_parity.py +0 -0
  412. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_gs728tpp_vlan_fidelity.py +0 -0
  413. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_gsm7228ps_seed.py +0 -0
  414. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_hostname.py +0 -0
  415. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_m4300_seeds.py +0 -0
  416. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_mibview.py +0 -0
  417. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_mutable_state.py +0 -0
  418. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_nsdp_state.py +0 -0
  419. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_port_description_outcomes.py +0 -0
  420. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_serve_daemon.py +0 -0
  421. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_snmp_write_face.py +0 -0
  422. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_state_seed.py +0 -0
  423. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_switchport_vlan_write.py +0 -0
  424. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_syslog_fidelity.py +0 -0
  425. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_virtual_http_face.py +0 -0
  426. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_virtual_nsdp_face.py +0 -0
  427. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_virtual_snmp_face.py +0 -0
  428. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_web_projection.py +0 -0
  429. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/tests/virtual/test_write_outcomes.py +0 -0
  430. {python_netgear_switch_library-0.1.post18 → python_netgear_switch_library-0.1.post29}/uv.lock +0 -0
@@ -0,0 +1,9 @@
1
+ # How this repository is packaged, and why it differs from the defaults.
2
+ # See https://github.com/mithro/apt-repo-action/blob/main/docs/packaging.md
3
+
4
+ kind = "B" # our own code: debian/ at the root of main
5
+ architectures = "all" # pure Python
6
+ suites = ["bookworm", "trixie", "forky", "sid"]
7
+
8
+ [exceptions]
9
+ PKG-SUITES = "fpgas.online uses it"
@@ -0,0 +1,177 @@
1
+ name: Debian packages
2
+
3
+ # Rolling release: every push to main runs the gates (ruff, mypy --strict,
4
+ # pytest with coverage >= 90, the documentation build), builds
5
+ # python3-netgear-switch-library for each suite and republishes a signed apt
6
+ # repository per suite on GitHub Pages
7
+ # (https://mith.ro/python-netgear-switch-library/<suite>/). The package is
8
+ # Architecture: all (pure Python), so one x86 build per suite serves every
9
+ # architecture. A pull request runs the same gates and builds, and publishes
10
+ # nothing. The version is git-derived (vX.Y at a tag, vX.Y.postN after it --
11
+ # identical to the wheel's).
12
+ #
13
+ # publish-pypi.yml is triggered by this workflow completing on main, and
14
+ # proceeds only when it succeeded. Renaming this workflow breaks that trigger.
15
+ #
16
+ # This follows mithro/apt-repo-action's docs/packaging.md; the differences
17
+ # from its defaults are declared in .github/apt-packaging.toml.
18
+ on:
19
+ push:
20
+ branches: [main]
21
+ pull_request:
22
+ workflow_dispatch:
23
+
24
+ permissions:
25
+ contents: read
26
+
27
+ concurrency:
28
+ group: deb-${{ github.ref }}
29
+ # A newer push to a pull request cancels the older build. On the default
30
+ # branch a running publish is never cancelled: the newest push waits for it,
31
+ # and replaces any older push still waiting (it contains that one's commits).
32
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
33
+
34
+ jobs:
35
+ test:
36
+ # The same gates as local development. A green run is what "mergeable"
37
+ # means.
38
+ runs-on: ubuntu-24.04
39
+ timeout-minutes: 25
40
+ strategy:
41
+ fail-fast: false
42
+ matrix:
43
+ python-version: ["3.11", "3.12", "3.13"]
44
+ include:
45
+ # The documentation is built once, on the newest Python.
46
+ - python-version: "3.13"
47
+ docs: true
48
+ steps:
49
+ - uses: actions/checkout@v5
50
+ with:
51
+ fetch-depth: 0 # full history so hatch-vcs can derive the version
52
+
53
+ # The build generates debian/changelog: apt-repo-action's shared
54
+ # scripts/deb-version.py writes the build's entry, with the version
55
+ # derived from git. Committing a build's output would pin a stale
56
+ # version (and name a commit that may not exist), so it must not be
57
+ # tracked. (This job runs on the runner, not in a container, so git is
58
+ # already there and the checkout is a real clone.)
59
+ - name: debian/changelog is not committed
60
+ run: |
61
+ git rev-parse --is-inside-work-tree
62
+ if git ls-files --error-unmatch debian/changelog; then
63
+ echo "::error file=debian/changelog::debian/changelog is committed, but the build generates it: git rm it"
64
+ exit 1
65
+ fi
66
+
67
+ - name: Install net-snmp CLI (system dependency for the sync transport)
68
+ run: |
69
+ sudo apt-get update
70
+ sudo apt-get install -y --no-install-recommends snmp
71
+
72
+ - uses: astral-sh/setup-uv@v7
73
+
74
+ - name: Install the matrix Python
75
+ run: uv python install ${{ matrix.python-version }}
76
+
77
+ - name: Sync all extras and the dev group
78
+ run: uv sync --all-extras --dev --python ${{ matrix.python-version }}
79
+
80
+ - name: Lint (ruff)
81
+ run: uv run ruff check
82
+
83
+ - name: Type-check (mypy --strict)
84
+ run: uv run mypy
85
+
86
+ - name: Tests + coverage gate (>= 90)
87
+ run: uv run pytest
88
+
89
+ # The published documentation generates its model/backend support tables
90
+ # from the library itself and links every file reference to the file, so
91
+ # a stale table or a renamed file is a build failure rather than a page
92
+ # that quietly misleads. Warnings are errors here exactly as they are on
93
+ # Read the Docs (see .readthedocs.yaml's fail_on_warning).
94
+ #
95
+ # Read the Docs' EXACT invocation, `-j auto` included. That flag matters:
96
+ # a parallel read needs every registered Sphinx domain to implement
97
+ # merge_domaindata, and sphinx-argparse's does not -- which broke the
98
+ # published build while a gate without `-j auto` stayed green. Run what
99
+ # production runs.
100
+ - name: Build the documentation (Read the Docs' command, warnings are errors)
101
+ if: matrix.docs
102
+ run: >
103
+ uv run python -m sphinx -T -W --keep-going -j auto -b html
104
+ -d docs/_build/doctrees -D language=en docs docs/_build/html
105
+
106
+ - name: Upload the built documentation
107
+ if: matrix.docs
108
+ uses: actions/upload-artifact@v7
109
+ with:
110
+ name: docs-html
111
+ path: docs/_build/html
112
+ retention-days: 7
113
+
114
+ build-deb:
115
+ name: build-deb (${{ matrix.suite }} ${{ matrix.arch }})
116
+ needs: test
117
+ runs-on: ubuntu-24.04
118
+ strategy:
119
+ fail-fast: false
120
+ matrix:
121
+ suite: [bookworm, trixie, forky, sid]
122
+ arch: [all]
123
+ steps:
124
+ - name: Check out
125
+ uses: actions/checkout@v5
126
+ with:
127
+ fetch-depth: 0 # full history + tags: the version is git describe's
128
+
129
+ # The shared build: debian:<suite>, build deps from debian/control, and
130
+ # the version from the shared deb-version.py (with ~deb<R>, and ~pr<P>
131
+ # on a pull request). Writes the .debs to built-debs/.
132
+ - name: Build
133
+ uses: mithro/apt-repo-action/build-deb@main
134
+ with:
135
+ suite: ${{ matrix.suite }}
136
+ arch: ${{ matrix.arch }}
137
+
138
+ # Install what was just built into a clean container of the same suite,
139
+ # dependencies from the Debian archive: the module imports with the
140
+ # package's version, the CLI runs, and it reads a mock switch's ports
141
+ # over HTTP (`ngsw serve`). No real switch is needed.
142
+ - name: Install test
143
+ run: |
144
+ docker run --rm \
145
+ -v "${PWD}/built-debs:/debs:ro" \
146
+ -v "${PWD}/packaging:/packaging:ro" \
147
+ docker.io/library/debian:${{ matrix.suite }} \
148
+ sh /packaging/install-test.sh
149
+
150
+ - name: Upload
151
+ uses: actions/upload-artifact@v7
152
+ with:
153
+ name: debs-${{ matrix.suite }}-${{ matrix.arch }}
154
+ path: built-debs/*.deb
155
+ retention-days: 14
156
+
157
+ publish-apt:
158
+ # Build and test pull requests, but never publish from one (or from any
159
+ # branch but main): that would overwrite the live repository with
160
+ # unreviewed packages.
161
+ if: github.event_name != 'pull_request' && github.ref_name == github.event.repository.default_branch
162
+ needs: build-deb
163
+ # Scoped to this job alone. A job calling a reusable workflow sets the
164
+ # maximum permissions available to it, so the elevated Pages scopes stay
165
+ # here rather than applying to the whole workflow.
166
+ permissions:
167
+ contents: read
168
+ pages: write
169
+ id-token: write
170
+ uses: mithro/apt-repo-action/.github/workflows/publish-apt.yml@main
171
+ with:
172
+ suites: "bookworm trixie forky sid"
173
+ # Pure Python: one Architecture: all deb serves every architecture.
174
+ architectures: "all"
175
+ description: "Python library and CLI (ngsw) for Netgear switches"
176
+ secrets:
177
+ gpg-private-key: ${{ secrets.APT_GPG_PRIVATE_KEY }}
@@ -4,11 +4,12 @@ name: Publish to PyPI
4
4
  # hatch-vcs (see pyproject.toml): vX.Y at a tag, vX.Y.postN N commits later, so
5
5
  # each commit produces a new, unique version -- no manual bump.
6
6
  #
7
- # This workflow is gated on CI: it runs when the "CI" workflow (ruff, mypy,
8
- # pytest + coverage, docs) COMPLETES for a push to main, and the build job only
9
- # proceeds when that run SUCCEEDED. Before this gate, a red CI run and a PyPI
10
- # upload raced each other and broken commits were published (13ef042 shipped
11
- # with the docs job failing, a60bae6 with every test job failing). The
7
+ # This workflow is gated on CI: it runs when the "Debian packages" workflow
8
+ # (deb.yml: its test job runs ruff, mypy, pytest + coverage and the docs build,
9
+ # then it builds and publishes the .debs) COMPLETES for main, and the build job
10
+ # only proceeds when that run SUCCEEDED. Before this gate, a red CI run and a
11
+ # PyPI upload raced each other and broken commits were published (13ef042
12
+ # shipped with the docs job failing, a60bae6 with every test job failing). The
12
13
  # workflow_dispatch path stays for manual re-runs.
13
14
  #
14
15
  # Publishing uses PyPI Trusted Publishing (OIDC): there is no API token in the
@@ -16,7 +17,7 @@ name: Publish to PyPI
16
17
  # RELEASING.md).
17
18
  on:
18
19
  workflow_run:
19
- workflows: [CI]
20
+ workflows: [Debian packages]
20
21
  types: [completed]
21
22
  branches: [main]
22
23
  workflow_dispatch:
@@ -24,10 +25,13 @@ on:
24
25
  jobs:
25
26
  build:
26
27
  # workflow_run fires on EVERY completion (failure and cancelled included);
27
- # only a successful CI run is a release. Dependent jobs inherit the skip.
28
+ # only a successful run is a release. `branches: [main]` matches a pull
29
+ # request from a fork's own `main` too, so a pull request's run is
30
+ # excluded explicitly. Dependent jobs inherit the skip.
28
31
  if: >-
29
32
  github.event_name == 'workflow_dispatch' ||
30
- github.event.workflow_run.conclusion == 'success'
33
+ (github.event.workflow_run.conclusion == 'success' &&
34
+ github.event.workflow_run.event != 'pull_request')
31
35
  runs-on: ubuntu-latest
32
36
  steps:
33
37
  - uses: actions/checkout@v5
@@ -34,7 +34,12 @@ htmlcov/
34
34
  *.buildinfo
35
35
  *.changes
36
36
  /debian/.debhelper/
37
+ # Written by each build (apt-repo-action's scripts/deb-version.py); never committed.
38
+ /debian/changelog
37
39
  /debian/files
40
+ /debian/*.substvars
41
+ /debian/*.debhelper
42
+ /debian/*.debhelper.log
38
43
  /debian/python3-netgear-switch-library/
39
44
  /debian/debhelper-build-stamp
40
45
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-netgear-switch-library
3
- Version: 0.1.post18
3
+ Version: 0.1.post29
4
4
  Summary: Python library and CLI to query and control Netgear switches over SNMP, NSDP and HTTP.
5
5
  Author-email: Tim Ansell <me@mith.ro>
6
6
  License: Apache-2.0
@@ -59,7 +59,30 @@ test your own tools against a mock), and generated
59
59
  Status: **early development.** See `docs/superpowers/specs/` for the design and
60
60
  `docs/superpowers/plans/` for the implementation plans.
61
61
 
62
- ## Installation
62
+ ## Install
63
+
64
+ ### Debian (apt)
65
+
66
+ Signed `.deb` packages are published as an apt repository per Debian suite:
67
+ **bookworm**, **trixie**, **forky** and **sid** (`Architecture: all`, so every
68
+ architecture, including Raspberry Pi OS). Put your suite's name in place of
69
+ `trixie` below:
70
+
71
+ ```sh
72
+ sudo install -d -m0755 /etc/apt/keyrings
73
+ curl -fsSL https://mith.ro/python-netgear-switch-library/python-netgear-switch-library.gpg | sudo tee /etc/apt/keyrings/python-netgear-switch-library.gpg > /dev/null
74
+ echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/trixie/ ./" \
75
+ | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
76
+ sudo apt update
77
+ sudo apt install python3-netgear-switch-library
78
+ ```
79
+
80
+ The repository's signing key has the fingerprint
81
+ `E870 0619 795F D931 79E2 600A 8F51 2272 5C6D 8239`
82
+ (`gpg --show-keys /etc/apt/keyrings/python-netgear-switch-library.gpg`).
83
+
84
+ This installs the `netgear_switch` library and the `ngsw` CLI, and pulls in the
85
+ `snmp` net-snmp CLI tools automatically.
63
86
 
64
87
  ### pip / uv (PyPI)
65
88
 
@@ -76,37 +99,16 @@ transport shells out to the **net-snmp command-line tools**, a system package
76
99
  sudo apt install snmp # provides snmpget/snmpbulkwalk/snmpset
77
100
  ```
78
101
 
79
- ### Debian / Ubuntu (apt)
80
-
81
- Signed `.deb` packages for Debian **trixie** and **sid** are published to a
82
- GitHub Pages apt repository. Pick the line matching your suite:
83
-
84
- ```sh
85
- sudo install -d -m0755 /etc/apt/keyrings
86
- curl -fsSL https://mith.ro/python-netgear-switch-library/python-netgear-switch-library.gpg \
87
- | sudo tee /etc/apt/keyrings/python-netgear-switch-library.gpg > /dev/null
88
-
89
- # trixie:
90
- echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/trixie/ ./" \
91
- | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
92
- # sid:
93
- echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/sid/ ./" \
94
- | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
95
-
96
- sudo apt update
97
- sudo apt install python3-netgear-switch-library
98
- ```
99
-
100
- This installs the `netgear_switch` library and the `ngsw` CLI, and pulls in the
101
- `snmp` net-snmp CLI tools automatically.
102
-
103
102
  Either way, once installed run `ngsw --help` to see available commands.
104
103
 
105
104
  ### Versioning
106
105
 
107
106
  This project is a **rolling release**: the version is derived from git
108
- (`0.0.postN` / `X.Y.postN`), and every merge to `main` publishes a new version
109
- to PyPI and the apt repo. There are no tags or manual version bumps.
107
+ (`X.Y` at a `vX.Y` tag, `X.Y.postN` N commits after it), and every merge to
108
+ `main` publishes a new version to PyPI and the apt repository, with no manual
109
+ version bumps. The `.deb` adds the suite (`0.1.post23~deb12` on bookworm,
110
+ `~deb13` trixie, `~deb14` forky, nothing on sid), so an upgrade to the next
111
+ Debian release also upgrades the package. See `RELEASING.md`.
110
112
 
111
113
  ## Mock switch daemons (`ngsw serve`)
112
114
 
@@ -24,7 +24,30 @@ test your own tools against a mock), and generated
24
24
  Status: **early development.** See `docs/superpowers/specs/` for the design and
25
25
  `docs/superpowers/plans/` for the implementation plans.
26
26
 
27
- ## Installation
27
+ ## Install
28
+
29
+ ### Debian (apt)
30
+
31
+ Signed `.deb` packages are published as an apt repository per Debian suite:
32
+ **bookworm**, **trixie**, **forky** and **sid** (`Architecture: all`, so every
33
+ architecture, including Raspberry Pi OS). Put your suite's name in place of
34
+ `trixie` below:
35
+
36
+ ```sh
37
+ sudo install -d -m0755 /etc/apt/keyrings
38
+ curl -fsSL https://mith.ro/python-netgear-switch-library/python-netgear-switch-library.gpg | sudo tee /etc/apt/keyrings/python-netgear-switch-library.gpg > /dev/null
39
+ echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/trixie/ ./" \
40
+ | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
41
+ sudo apt update
42
+ sudo apt install python3-netgear-switch-library
43
+ ```
44
+
45
+ The repository's signing key has the fingerprint
46
+ `E870 0619 795F D931 79E2 600A 8F51 2272 5C6D 8239`
47
+ (`gpg --show-keys /etc/apt/keyrings/python-netgear-switch-library.gpg`).
48
+
49
+ This installs the `netgear_switch` library and the `ngsw` CLI, and pulls in the
50
+ `snmp` net-snmp CLI tools automatically.
28
51
 
29
52
  ### pip / uv (PyPI)
30
53
 
@@ -41,37 +64,16 @@ transport shells out to the **net-snmp command-line tools**, a system package
41
64
  sudo apt install snmp # provides snmpget/snmpbulkwalk/snmpset
42
65
  ```
43
66
 
44
- ### Debian / Ubuntu (apt)
45
-
46
- Signed `.deb` packages for Debian **trixie** and **sid** are published to a
47
- GitHub Pages apt repository. Pick the line matching your suite:
48
-
49
- ```sh
50
- sudo install -d -m0755 /etc/apt/keyrings
51
- curl -fsSL https://mith.ro/python-netgear-switch-library/python-netgear-switch-library.gpg \
52
- | sudo tee /etc/apt/keyrings/python-netgear-switch-library.gpg > /dev/null
53
-
54
- # trixie:
55
- echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/trixie/ ./" \
56
- | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
57
- # sid:
58
- echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/sid/ ./" \
59
- | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
60
-
61
- sudo apt update
62
- sudo apt install python3-netgear-switch-library
63
- ```
64
-
65
- This installs the `netgear_switch` library and the `ngsw` CLI, and pulls in the
66
- `snmp` net-snmp CLI tools automatically.
67
-
68
67
  Either way, once installed run `ngsw --help` to see available commands.
69
68
 
70
69
  ### Versioning
71
70
 
72
71
  This project is a **rolling release**: the version is derived from git
73
- (`0.0.postN` / `X.Y.postN`), and every merge to `main` publishes a new version
74
- to PyPI and the apt repo. There are no tags or manual version bumps.
72
+ (`X.Y` at a `vX.Y` tag, `X.Y.postN` N commits after it), and every merge to
73
+ `main` publishes a new version to PyPI and the apt repository, with no manual
74
+ version bumps. The `.deb` adds the suite (`0.1.post23~deb12` on bookworm,
75
+ `~deb13` trixie, `~deb14` forky, nothing on sid), so an upgrade to the next
76
+ Debian release also upgrades the package. See `RELEASING.md`.
75
77
 
76
78
  ## Mock switch daemons (`ngsw serve`)
77
79
 
@@ -2,18 +2,26 @@
2
2
 
3
3
  This project is a **rolling release**. There are no manual version bumps: the
4
4
  version is derived from `git describe` (`hatch-vcs` for the wheel,
5
- `packaging/deb-version.py` for the `.deb`) — `X.Y` at a `vX.Y` tag,
6
- `X.Y.postN` N commits after it — and **every green merge to `main` publishes
7
- new packages** automatically:
8
-
9
- - `.github/workflows/ci.yml` — runs the gates (ruff, mypy --strict, pytest with
10
- coverage >= 90, docs build) on every push and PR. A green run is what
11
- "mergeable" means, and it is what triggers the two release workflows.
5
+ [apt-repo-action](https://github.com/mithro/apt-repo-action)'s shared
6
+ `scripts/deb-version.py` for the `.deb`) — `X.Y` at a `vX.Y` tag,
7
+ `X.Y.postN` N commits after it, and for the `.deb` the suite's `~deb<R>`
8
+ (`~deb12` bookworm, `~deb13` trixie, `~deb14` forky, none on sid) — and
9
+ **every green merge to `main` publishes new packages** automatically:
10
+
11
+ - `.github/workflows/deb.yml` ("Debian packages") — its `test` job runs the
12
+ gates (ruff, mypy --strict, pytest with coverage >= 90, docs build) on every
13
+ push and PR; a green run is what "mergeable" means. Then `build-deb` builds
14
+ the `.deb` for bookworm, trixie, forky and sid with apt-repo-action's shared
15
+ `build-deb` action and install-tests it (`packaging/install-test.sh`), and,
16
+ on `main` only, `publish-apt` republishes the signed apt repo on GitHub
17
+ Pages. A pull request builds preview packages (`~pr<N>`, sorting below
18
+ `main`'s) as workflow artifacts and publishes nothing.
12
19
  - `.github/workflows/publish-pypi.yml` — builds and uploads the wheel + sdist to
13
- PyPI when CI **succeeds** on `main` (`workflow_run`; a failed or cancelled CI
14
- run publishes nothing, and the checkout is pinned to the SHA CI validated).
15
- - `.github/workflows/deb.yml` — builds `.deb`s for trixie + sid and republishes
16
- the signed apt repo on GitHub Pages, gated the same way.
20
+ PyPI when "Debian packages" **succeeds** on `main` (`workflow_run`; a failed
21
+ or cancelled run publishes nothing, and the checkout is pinned to the SHA it
22
+ validated).
23
+
24
+ `debian/changelog` is not committed: the build writes it, with the version.
17
25
 
18
26
  Merges to `main` MUST use `--no-ff` merge commits so history stays linear per PR.
19
27
 
@@ -107,7 +115,7 @@ re-runs idempotent.
107
115
  `X.Y.postN` version (matches `git describe --tags` on `main`, e.g. `v0.1-3-g…`
108
116
  → `0.1.post3`).
109
117
  - apt: `sudo apt update && apt-cache policy python3-netgear-switch-library` on a
110
- Debian trixie/sid box configured per the README. Before the GPG key is set
118
+ Debian bookworm/trixie/forky/sid box configured per the README. Before the GPG key is set
111
119
  (see step 2 above), expect `apt update` to fail with a signature error for
112
120
  this repo — that confirms the fail-closed behavior is working, not that
113
121
  something is broken.
@@ -3,11 +3,14 @@
3
3
  # Build the netgear_switch Python package with dh-python/pybuild straight from
4
4
  # pyproject.toml (hatchling backend). The upstream version is normally derived
5
5
  # from git by hatch-vcs, but during the .deb build there may be no VCS context in
6
- # the unpacked source, so we pin it to the changelog version (set by
7
- # packaging/deb-version.py) through SETUPTOOLS_SCM_PRETEND_VERSION. dpkg source
8
- # format is native, so the changelog version has no Debian revision to strip.
6
+ # the unpacked source, so we pin it to the changelog version (written by the
7
+ # build) through SETUPTOOLS_SCM_PRETEND_VERSION. dpkg source format is native,
8
+ # so the changelog version has no Debian revision to strip. It can carry the
9
+ # Debian-only ~deb<R> suite and ~pr<P> preview suffixes (0.1.post20~deb12~pr15),
10
+ # which aren't PEP 440: everything from the first ~ is dropped, leaving the
11
+ # same X.Y[.postN] the wheel on PyPI has.
9
12
  export PYBUILD_NAME = netgear_switch
10
- export SETUPTOOLS_SCM_PRETEND_VERSION = $(shell dpkg-parsechangelog -SVersion)
13
+ export SETUPTOOLS_SCM_PRETEND_VERSION = $(firstword $(subst ~, ,$(shell dpkg-parsechangelog -SVersion)))
11
14
 
12
15
  %:
13
16
  dh $@ --with python3 --buildsystem=pybuild
@@ -228,9 +228,10 @@ def _force_serial_build(app: Sphinx) -> None:
228
228
  this project, well inside any build timeout. Remove this once
229
229
  sphinx-argparse implements ``merge_domaindata``.
230
230
 
231
- This is why the CI documentation job passes ``-j auto`` too (see
232
- ``.github/workflows/ci.yml``): the gate must run the command Read the Docs
233
- runs, or a failure like this one reaches production with CI still green.
231
+ This is why the CI documentation build passes ``-j auto`` too (see the
232
+ ``test`` job in ``.github/workflows/deb.yml``): the gate must run the
233
+ command Read the Docs runs, or a failure like this one reaches production
234
+ with CI still green.
234
235
  """
235
236
  app.parallel = 1
236
237
 
@@ -123,7 +123,8 @@ repository, with the version derived from git — no manual version bumps. See
123
123
  Continuous integration
124
124
  ----------------------
125
125
 
126
- ``.github/workflows/ci.yml`` runs the test suite, lint, type-check and the
127
- documentation build across supported Python versions;
128
- ``.github/workflows/publish-pypi.yml`` and ``.github/workflows/deb.yml`` handle
129
- publication.
126
+ ``.github/workflows/deb.yml`` ("Debian packages") runs the test suite, lint,
127
+ type-check and the documentation build across supported Python versions in its
128
+ ``test`` job, then builds the ``.deb`` for every suite and, from ``main``,
129
+ publishes the apt repository. ``.github/workflows/publish-pypi.yml`` publishes
130
+ to PyPI once that workflow has succeeded on ``main``.
@@ -76,25 +76,23 @@ from the ``[async]`` extra.
76
76
  Debian and Ubuntu
77
77
  -----------------
78
78
 
79
- Signed ``.deb`` packages for Debian **trixie** and **sid** are published to a
80
- GitHub Pages apt repository:
79
+ Signed ``.deb`` packages are published as an apt repository per Debian suite:
80
+ **bookworm**, **trixie**, **forky** and **sid** (``Architecture: all``, so every
81
+ architecture, including Raspberry Pi OS). Put your suite's name in place of
82
+ ``trixie`` below:
81
83
 
82
84
  .. code-block:: sh
83
85
 
84
86
  sudo install -d -m0755 /etc/apt/keyrings
85
- curl -fsSL https://mith.ro/python-netgear-switch-library/python-netgear-switch-library.gpg \
86
- | sudo tee /etc/apt/keyrings/python-netgear-switch-library.gpg > /dev/null
87
-
88
- # trixie:
87
+ curl -fsSL https://mith.ro/python-netgear-switch-library/python-netgear-switch-library.gpg | sudo tee /etc/apt/keyrings/python-netgear-switch-library.gpg > /dev/null
89
88
  echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/trixie/ ./" \
90
89
  | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
91
- # sid:
92
- echo "deb [signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg] https://mith.ro/python-netgear-switch-library/sid/ ./" \
93
- | sudo tee /etc/apt/sources.list.d/python-netgear-switch-library.list
94
-
95
90
  sudo apt update
96
91
  sudo apt install python3-netgear-switch-library
97
92
 
93
+ The repository's signing key has the fingerprint
94
+ ``E870 0619 795F D931 79E2 600A 8F51 2272 5C6D 8239``.
95
+
98
96
  This installs the ``netgear_switch`` library and the ``ngsw`` CLI, and pulls in
99
97
  the net-snmp tools automatically. The packaging lives in ``debian/`` and
100
98
  ``packaging/``.
@@ -104,9 +102,10 @@ Versioning
104
102
 
105
103
  A **rolling release**. The version is derived from ``git describe`` by
106
104
  ``hatch-vcs``: ``X.Y`` at a ``vX.Y`` tag, ``X.Y.postN`` N commits after it
107
- (``0.1``, ``0.1.post1``, …). Every merge to ``main`` whose CI run is green
108
- publishes to PyPI and to the apt repository — a red run publishes nothing. No
109
- manual version bumps — see ``RELEASING.md``.
105
+ (``0.1``, ``0.1.post1``, …). The ``.deb`` adds the suite: ``~deb12`` on
106
+ bookworm, ``~deb13`` trixie, ``~deb14`` forky and nothing on sid. Every merge
107
+ to ``main`` whose tests pass publishes to PyPI and to the apt repository — a
108
+ red run publishes nothing. No manual version bumps — see ``RELEASING.md``.
110
109
 
111
110
  .. note::
112
111
 
@@ -0,0 +1,76 @@
1
+ #!/bin/sh
2
+ # Install the built .debs into a clean debian:<suite> container, with their
3
+ # dependencies from the Debian archive, and exercise them without a switch.
4
+ # Run by .github/workflows/deb.yml's "Install test" step, and locally, as:
5
+ # docker run --rm -v "$PWD/built-debs:/debs:ro" -v "$PWD/packaging:/packaging:ro" \
6
+ # debian:trixie sh /packaging/install-test.sh
7
+ set -eux
8
+
9
+ export DEBIAN_FRONTEND=noninteractive
10
+ apt-get update
11
+ # Recommends too, as a plain `apt install` would: python3-httpx (the HTTP
12
+ # backend), and python3-mcp where the suite has it.
13
+ apt-get install -y /debs/*.deb
14
+
15
+ # The Python version is the package's without the Debian-only ~deb<R> and
16
+ # ~pr<P> suffixes (debian/rules strips them), and must be exactly that: the
17
+ # wheel on PyPI carries the same X.Y[.postN].
18
+ deb_version=$(dpkg-query -W -f '${Version}' python3-netgear-switch-library)
19
+ py_version=${deb_version%%~*}
20
+ python3 - "$py_version" <<'EOF'
21
+ import sys
22
+ from importlib.metadata import version
23
+
24
+ import netgear_switch
25
+ import netgear_switch.cli.main
26
+ import netgear_switch.sync_api
27
+
28
+ want = sys.argv[1]
29
+ assert netgear_switch.__version__ == want, (netgear_switch.__version__, want)
30
+ assert version("python-netgear-switch-library") == want
31
+ assert netgear_switch.__file__.startswith("/usr/lib/python3/dist-packages/"), netgear_switch.__file__
32
+ print("netgear_switch", netgear_switch.__version__, "from", netgear_switch.__file__)
33
+ EOF
34
+
35
+ # The CLI entry point, and a command that needs no switch: the model registry.
36
+ ngsw --help
37
+ models=$(ngsw models)
38
+ echo "$models"
39
+ echo "$models" | grep -q '^gsm7252ps '
40
+ echo "$models" | grep -q '^gs305ep '
41
+
42
+ # The synchronous SNMP transport shells out to net-snmp: a hard dependency.
43
+ command -v snmpget snmpbulkwalk snmpset
44
+
45
+ # The MCP server entry point is installed unconditionally; it runs when the
46
+ # suite has python3-mcp (a Recommends; sid only, so far).
47
+ command -v ngsw-mcp
48
+ if python3 -c 'import importlib.util, sys; sys.exit(importlib.util.find_spec("mcp") is None)'; then
49
+ ngsw-mcp --help
50
+ fi
51
+
52
+ # A real round trip, with no switch: serve the in-package mock GS305EP (a Plus
53
+ # switch, driven over its HTTP web UI) on port 80, where ngsw looks for it,
54
+ # and read its ports back through the HTTP backend (python3-httpx, a
55
+ # Recommends every suite has).
56
+ cd "$(mktemp -d)"
57
+ ngsw serve --model gs305ep --http-port 80 > serve.log 2>&1 &
58
+ serve=$!
59
+ tries=0
60
+ until grep -q '^serving ' serve.log; do
61
+ tries=$((tries + 1))
62
+ if [ "$tries" -gt 60 ] || ! kill -0 "$serve"; then
63
+ cat serve.log
64
+ exit 1
65
+ fi
66
+ sleep 0.5
67
+ done
68
+ cat serve.log
69
+ ports=$(ngsw --host 127.0.0.1 --model gs305ep --http-password password --backend http ports)
70
+ echo "$ports"
71
+ kill "$serve"
72
+ # The mock's seeded state: five ports, port 1 up at 1000 Mb/s.
73
+ echo "$ports" | grep -Eq '^1 +Port 1 +up +enabled +1000 '
74
+ test "$(echo "$ports" | grep -Ec '^[1-5] +Port ')" -eq 5
75
+
76
+ echo "install test passed: python3-netgear-switch-library $deb_version"
@@ -78,7 +78,9 @@ dev = ["pytest>=8.0", "ruff>=0.6", "mypy>=1.11", "pytest-cov>=5.0"]
78
78
  # count>, which reached 0.0.post405 on PyPI -- v0.1 was chosen to sort ABOVE
79
79
  # that, since re-counting from a root tag would have re-issued 0.0.post404/405.)
80
80
  # "no-local-version" keeps the version PyPI-upload safe. These forms are also
81
- # valid Debian versions verbatim; packaging/deb-version.py applies the same rule.
81
+ # valid Debian versions verbatim; apt-repo-action's shared scripts/deb-version.py
82
+ # applies the same rule to the .deb, adding its ~deb<R> suite suffix (which
83
+ # debian/rules strips again for the Python version).
82
84
  [tool.hatch.version]
83
85
  source = "vcs"
84
86
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.1.post18'
22
- __version_tuple__ = version_tuple = (0, 1, 'post18')
21
+ __version__ = version = '0.1.post29'
22
+ __version_tuple__ = version_tuple = (0, 1, 'post29')
23
23
 
24
24
  __commit_id__ = commit_id = None