Skip to content

Add CI and PyPI release pipeline; fix packaging metadata - #61

Merged
nahumtimerman merged 2 commits into
masterfrom
feature/release-pipeline
Sep 7, 2026
Merged

nahumtimerman merged 2 commits into
masterfrom
feature/release-pipeline

Conversation

@nahumtimerman

Copy link
Copy Markdown
Contributor

This repo has no GitHub Actions workflows at all, so 1.1.0 (the cloudshell-snmp 6.0 adoption, merged in #60) had no way to reach PyPI — the last published version is still 1.0.0.

  • ci.yml — runs the 100 unit tests on Python 3.9 and 3.13, plus a build + twine check job
  • deploy-package.yml — publishes to PyPI on release, using the org PYPI_TOKEN like the other shell repos
  • setup.py — declares long_description_content_type="text/markdown". Without it twine defaults to RST and twine check FAILED, so the description would not have rendered on PyPI
  • test_requirements.txt — nose 1.3.7 does not run on modern Python, and nothing in tests/ imports it (it was only the runner), so moved to pytest; dropped the unused coveralls pin and unpinned mock from 2.0.0

Verified locally: 100/100 tests pass on 3.13 and twine check passes on both artifacts.

🤖 Generated with Claude Code

nahumtimerman and others added 2 commits September 7, 2026 12:19
This repo had no workflows at all, so 1.1.0 (the cloudshell-snmp 6.0
adoption) had no way to reach PyPI - the last published version was
1.0.0.

- ci.yml: run the 100 unit tests on 3.9 and 3.13, plus a build/twine
  validation job
- deploy-package.yml: publish to PyPI when a release is published,
  using the org PYPI_TOKEN like the other shell repos
- setup.py: declare long_description_content_type='text/markdown'.
  Without it twine defaults to RST and 'twine check' FAILED, so the
  description would not have rendered on PyPI
- test_requirements.txt: nose 1.3.7 doesn't run on modern Python (and
  nothing in tests/ imports it - it was only the runner); moved to
  pytest, dropped the unused coveralls pin, unpinned mock from 2.0.0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The exact pins (PyYAML==3.12, click==6.7, openpyxl==2.4.5,
xlsxwriter==0.9.6) predate cp313 wheels, so a clean install on 3.13
tried to build PyYAML 3.12 from source and failed. It only appeared to
work locally off a stale wheel cache.

- PyYAML>=6,<7, click>=8,<9, openpyxl>=3,<4, xlsxwriter>=3,<4,
  terminaltables>=3.1,<4. Audited the API surface first: only
  load_workbook, xlsxwriter.Workbook, AsciiTable and
  click.{Choice,echo,group,option,secho} are used, all stable across
  those ranges.
- Dropped the ipaddress==1.0.18 pin - that's the Python 2 backport of a
  module that has been in the stdlib since 3.3, and nothing imports it.
- yaml.load(data) -> yaml.safe_load(data) at both call sites: PyYAML 6
  requires an explicit Loader, and safe_load is the right choice for
  reading user-supplied input files anyway. Tests updated to match.
- cloudshell-cli>=5.0,<7 to pick up cli 6.x, matching the rest of the
  wave. The standard-telnetlib marker stays: unlike the shells, this
  package imports telnetlib in its own code
  (autodiscovery/cli_sessions/telnet.py), not only via cloudshell-cli.

Verified: clean no-cache install on 3.13, 100/100 tests, and the
echo-input-template CLI exercised in both yml and json modes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@nahumtimerman
nahumtimerman merged commit 0369461 into master Sep 7, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant