python-netgear-switch-library 0.1.post16__tar.gz → 0.1.post26__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.
- python_netgear_switch_library-0.1.post26/.github/apt-packaging.toml +9 -0
- python_netgear_switch_library-0.1.post26/.github/workflows/deb.yml +177 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/.github/workflows/publish-pypi.yml +12 -8
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/.gitignore +5 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/PKG-INFO +30 -28
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/README.md +29 -27
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/RELEASING.md +29 -27
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/debian/rules +7 -4
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/conf.py +4 -3
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/development.rst +5 -4
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/guide/installation.rst +12 -13
- python_netgear_switch_library-0.1.post26/packaging/install-test.sh +76 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/pyproject.toml +3 -1
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/_version.py +2 -2
- python_netgear_switch_library-0.1.post16/.github/workflows/ci.yml +0 -86
- python_netgear_switch_library-0.1.post16/.github/workflows/deb.yml +0 -81
- python_netgear_switch_library-0.1.post16/debian/changelog +0 -6
- python_netgear_switch_library-0.1.post16/packaging/ci-build.sh +0 -27
- python_netgear_switch_library-0.1.post16/packaging/deb-version.py +0 -121
- python_netgear_switch_library-0.1.post16/tests/test_deb_version.py +0 -237
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/.readthedocs.yaml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/CLAUDE.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/LICENSE +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/debian/control +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/debian/copyright +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/debian/source/format +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/Makefile +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_ext/filelinks.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_ext/support_tables.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/gs105pe.png +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/gs110emx.png +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/gs305ep.png +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/gs728tpp.png +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/gsm7228ps.jpg +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/gsm7252ps.jpg +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/m4300-16x.png +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/models/m4300-24x.png +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/_static/ngsw.css +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/cli.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/core.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/facades.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/index.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/mcp.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/operations.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/protocols.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/transport.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/api/virtual.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/cli.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/fake/index.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/fake/internals.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/fake/serving.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/fake/testing.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/guide/concepts.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/guide/configuration.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/guide/principles.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/guide/quickstart.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/guide/reading.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/guide/writing.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/index.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/mcp.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/gs105pe.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/gs110emx.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/gs305ep.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/gs728tpp.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/gsm7228ps.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/gsm7252ps.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/index.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/m4300-16x.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/m4300-24x.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/models/support.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/cli.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/http/cheetah-form.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/http/cheetah-v1.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/http/gambit.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/http/merge-hash-cgi.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/http/xml-api.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/http.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/index.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/nsdp.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/protocols/snmp.rst +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-15-foundation.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-17-slice-02-snmp-read-core.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-17-slice-03-read-apis.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-18-slice-04-snmp-write.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-18-slice-05-nsdp.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-18-slice-06-http.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-18-slice-07-cli.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-18-slice-08-packaging-ci.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/plans/2026-07-23-gsm7252ps-http-xe-dialect.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/specs/2026-07-15-netgear-control-library-design.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/specs/2026-07-23-gsm7252ps-http-xe-dialect-design.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/specs/2026-08-02-gs728tpp-poe-vlan-live.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/specs/2026-08-02-snmp-surface-findings.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/superpowers/specs/2026-08-03-snmp-vendor-oid-sweep.md +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/packaging/apt-intro.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/_dispatch.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/aio_api.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/capabilities.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli/capture.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli/context.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli/format.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli/main.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli/resolve.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli/safety.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/cli_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/config.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/errors.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/http_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/http_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/mcp/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/mcp/server.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/models.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/nsdp_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/nsdp_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/cli/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/cli/commands.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/cli/parse.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/crypt.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/endpoints.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/forms.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/goahead.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/parse.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/session.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/http/types.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/nsdp/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/nsdp/auth.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/nsdp/client.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/nsdp/parsers.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/nsdp/protocol.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/nsdp/types.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/nsdp/write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/snmp/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/snmp/client.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/snmp/oids.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/snmp/parse.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/protocols/snmp/write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/py.typed +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/registry.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/snmp_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/snmp_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/sync_api.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/aio/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/aio/nsdp_udp.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/aio/snmp_pysnmp.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/cli/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/cli/console.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/cli/session.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/cli/ssh.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/cli/telnet.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/http/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/http/client.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/sync/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/sync/nsdp_udp.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/transport/sync/snmp_netsnmp_cli.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/cli_fastpath.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/faces/__init__.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/faces/cli.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/faces/http.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/faces/mibview.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/faces/nsdp.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/faces/snmp.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/seed.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/server.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/state.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_fastpath_vlan.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_fastpath_xui.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_gs105pe.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_gs110emx.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_gs110emx_templates.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_gs728tpp.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_gsm7228ps.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_gsm7252ps.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/src/netgear_switch/virtual/web_m4300.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/capture_parity.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_capture.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_cli_integration.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_control_poe_port.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_control_vlan_ip.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_format.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_main_framework.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_new_commands.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_op_coverage.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_prompt_wiring.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_read_commands.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_resolve.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_safety.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/cli/test_serve.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/conftest.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/equivalence.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/captures/gsm7228ps.json +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/captures/gsm7252ps.json +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/captures/m4300-16x.json +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/captures/m4300-24x.json +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_environment.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_lldp.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_mac_table.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_network.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_poe.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_show_version.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_vlan.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_vlan_brief.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7228ps_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_environment.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_interface_ethernet_1_0_1.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_lldp_remote_device_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_mac_addr_table.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_network.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_poe_port_info_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_version.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_vlan_90.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_vlan_brief.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/gsm7252ps_show_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_environment.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_interface_ethernet_1_0_1.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_ip_management.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_lldp_remote_device_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_mac_addr_table.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_poe_port_info_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_version.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_vlan.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_vlan_1.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_vlan_4.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_vlan_5.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_16x_show_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_environment.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_interface_ethernet_1_0_1.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_ip_management.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_lldp_remote_device_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_mac_addr_table.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_version.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_vlan.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_vlan_5.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_vlan_90.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/cli/m4300_24x_show_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs105pe_membership.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs105pe_portstats.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs105pe_pvid.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs105pe_status.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs105pe_switch_info.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs105pe_vlancfg.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_cf8021q.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_interface_stats.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_login.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_port_settings.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_pvid.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_redirect.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_sysinfo.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs110emx_vlanmembership.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs305ep_dashboard.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs305ep_login.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs305ep_membership.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs305ep_poestatus.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs305ep_portstats.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs305ep_pvid.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs305ep_vlancfg.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_device_info_and_sensors.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_lldp.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_macs.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_mgmt_ip.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_poe.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_ports.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_pvids_membership.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_vlan_membership_per_vlan.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gs728tpp_vlans.xml +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_basicAddressTable.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_http_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_ipConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_portPvidConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_portStatistics.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_portsConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_sysInfo.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_syslog_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_vlanPortCfg_vlan5.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7228ps_vlanStatus.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_basicAddressTable.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_http_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_https_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_ipConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_login.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_portPvidConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_portStatistics.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_portsConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_ssh_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_sysInfo.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_syslog_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_telnet.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_user_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_user_management.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan1.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan141.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_vlanStatus.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_vlan_add_form.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_vlan_configuration.js +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_vlan_configuration_live.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/gsm7252ps_vlan_status_live.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_16x_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_16x_mgmtVlanIpv4Configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_16x_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_16x_portsConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_16x_syslog_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_16x_vlanportcfg_vlan4.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_24x_http_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_24x_https_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_24x_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_24x_ssh_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_24x_syslog_configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_24x_telnet.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_24x_user_management.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_addresstable.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_mgmtVlanIpv4Configuration.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_ports.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_portstats.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_pvid.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_sysinfo.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_vlanportcfg_vlan1.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/http/m4300_vlanstatus.html +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/snmp/gsm7252ps_fans.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/snmp/gsm7252ps_ifhighspeed.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/snmp/gsm7252ps_ifoperstatus.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/fixtures/snmp/gsm7252ps_psu.txt +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/http_specs.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/cli/test_cli_parse.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/http/test_crypt.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/http/test_endpoints.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/http/test_forms.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/http/test_goahead_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/http/test_parse.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/nsdp/test_auth.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/nsdp/test_parsers.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/nsdp/test_protocol.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/nsdp/test_write_frame.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_client.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_oids.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_parse_lldp_macs.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_parse_mgmt_ip.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_parse_poe_sensors.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_parse_ports.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_parse_system_info.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_parse_vlans.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/protocols/snmp/test_write_encode.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/snmp_fakes.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_aio_api.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_capabilities.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_cli_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_cli_vlan_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_cli_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_config.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_cross_backend_equivalence.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_dispatch.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_docs_coverage.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_errors.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_facade_equivalence.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_flow_control.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_dispatch.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_equivalence.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_hostname_emx.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_services.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_syslog.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_users.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_vlan_membership.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_http_xui_writes.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_import.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_mcp_server.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_models.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_models_snmp_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_nsdp_integration.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_nsdp_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_nsdp_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_port_speed.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_port_speed_http.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_public_api.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_quality_gates.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_registry.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_snmp_integration.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_snmp_read.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_snmp_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_sync_api.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_syslog_collectors.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_version.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/test_write_equivalence.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/_fastpath_fake.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_cli_console.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_cli_scp_cert.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_cli_telnet.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_http_client.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_nsdp_udp_sync.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_set_transport.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_snmp_netsnmp_cli.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_snmp_pysnmp.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/transport/test_value_parity.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_cli_cross_backend.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_cli_gsm7228ps_parity.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_gs728tpp_vlan_fidelity.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_gsm7228ps_seed.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_hostname.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_m4300_seeds.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_mibview.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_mutable_state.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_nsdp_state.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_port_description_outcomes.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_serve_daemon.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_snmp_write_face.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_state_seed.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_switchport_vlan_write.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_syslog_fidelity.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_virtual_http_face.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_virtual_nsdp_face.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_virtual_snmp_face.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_web_projection.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/tests/virtual/test_write_outcomes.py +0 -0
- {python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/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 "
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
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: [
|
|
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
|
|
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
|
{python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/.gitignore
RENAMED
|
@@ -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
|
|
{python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: python-netgear-switch-library
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.post26
|
|
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
|
-
##
|
|
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
|
-
(`
|
|
109
|
-
to PyPI and the apt
|
|
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
|
|
{python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/README.md
RENAMED
|
@@ -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
|
-
##
|
|
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
|
-
(`
|
|
74
|
-
to PyPI and the apt
|
|
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
|
|
{python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/RELEASING.md
RENAMED
|
@@ -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
|
-
|
|
6
|
-
`
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
14
|
-
run publishes nothing, and the checkout is pinned to the SHA
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
|
@@ -82,21 +90,15 @@ re-runs idempotent.
|
|
|
82
90
|
gpg --armor --export-secret-keys me@mith.ro | pbcopy # or xclip / paste manually
|
|
83
91
|
```
|
|
84
92
|
|
|
85
|
-
|
|
86
|
-
`netgear-switch.gpg`
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
`
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
`packaging/apt-index.html` both tell users to configure their `sources.list`
|
|
95
|
-
entry with `[signed-by=/etc/apt/keyrings/python-netgear-switch-library.gpg]` (never
|
|
96
|
-
`[trusted=yes]`), so `apt update` will fail closed (unable to fetch the
|
|
97
|
-
missing/invalid signature) rather than silently accepting an unsigned repo.
|
|
98
|
-
Setting this secret is therefore **required** before the apt repo works at
|
|
99
|
-
all, not just before it works securely.
|
|
93
|
+
`mithro/apt-repo-action`'s publish workflow imports this key and publishes
|
|
94
|
+
the matching public key as `python-netgear-switch-library.gpg` (binary) and
|
|
95
|
+
`.asc` (armoured) at the apt repo root; users install the `.gpg` into
|
|
96
|
+
`/etc/apt/keyrings/` (see the repo's index page).
|
|
97
|
+
|
|
98
|
+
3. **Until `APT_GPG_PRIVATE_KEY` is set, the publish job fails.**
|
|
99
|
+
`mithro/apt-repo-action` refuses to publish an unsigned repository, so
|
|
100
|
+
nothing is deployed rather than something consumers would have to trust
|
|
101
|
+
with `[trusted=yes]`.
|
|
100
102
|
|
|
101
103
|
### 3. GitHub Pages
|
|
102
104
|
|
|
@@ -113,7 +115,7 @@ re-runs idempotent.
|
|
|
113
115
|
`X.Y.postN` version (matches `git describe --tags` on `main`, e.g. `v0.1-3-g…`
|
|
114
116
|
→ `0.1.post3`).
|
|
115
117
|
- apt: `sudo apt update && apt-cache policy python3-netgear-switch-library` on a
|
|
116
|
-
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
|
|
117
119
|
(see step 2 above), expect `apt update` to fail with a signature error for
|
|
118
120
|
this repo — that confirms the fail-closed behavior is working, not that
|
|
119
121
|
something is broken.
|
{python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/debian/rules
RENAMED
|
@@ -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 (
|
|
7
|
-
#
|
|
8
|
-
#
|
|
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
|
{python_netgear_switch_library-0.1.post16 → python_netgear_switch_library-0.1.post26}/docs/conf.py
RENAMED
|
@@ -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
|
|
232
|
-
``.github/workflows/
|
|
233
|
-
runs, or a failure like this one reaches production
|
|
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/
|
|
127
|
-
documentation build across supported Python versions
|
|
128
|
-
|
|
129
|
-
|
|
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
|
|
80
|
-
|
|
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``, …).
|
|
108
|
-
|
|
109
|
-
|
|
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"
|