Problem
The repository's documented Python support, dependency declarations, packaging metadata, automation, examples, and local development instructions have drifted apart. Several elements are obsolete or materially stale, and a documented setup currently produces an end-of-life Python environment linked against unsupported LibreSSL.
This issue records the confirmed problems. It intentionally does not choose a remediation plan yet.
Confirmed findings
Python support and local environment
- The README claims support for Python 3.7 and newer, but Python 3.7, 3.8, and 3.9 are end-of-life.
- The runtime constraint
websockets==15.* requires Python 3.9 or newer, so the advertised Python 3.7 support is already false.
- The package publishes no
Requires-Python metadata, allowing installers to attempt unsupported interpreter versions.
- CI tests only Python 3.11, while documentation promises a much wider range.
- Following the current local setup resulted in Python 3.9.6 linked against LibreSSL 2.8.3.
urllib3 v2 does not support LibreSSL, producing NotOpenSSLWarning during real SDK use.
- That local environment also contained pip 21.2.4 and setuptools 58.0.4.
Runtime and development dependencies
observable==0.3.* pins 0.3.2 from 2017. The upstream project's latest release is 1.0.3 from 2018, so this dependency is stale and apparently dormant.
websockets==15.* is behind the current 17.1 release by two major versions.
discover==0.4.0, released in 2010, remains a development dependency even though test discovery is built into Python 3's standard-library unittest.
pdoc==14.4.0 is pinned behind the current 16.0.0 release.
- Minimum constraints such as
coverage>=4.3.1, coveralls>=1.1, and requests-mock>=1.2.0 are many years old and no longer describe meaningful tested dependency bounds.
- There is no committed lockfile, so development and CI dependency resolution changes over time.
Packaging and release metadata
- The project has no
pyproject.toml or standardized [build-system] declaration.
- Package metadata is maintained only in executable
setup.py code, including a hard-coded version and requirements loaded from a separate file.
- Published metadata omits an explicit supported-Python range and useful modern project metadata.
- Release automation uses stored PyPI username/password secrets through Twine rather than a credentialless trusted-publishing flow.
GitHub Actions
- All workflows use
actions/checkout@v3 and actions/setup-python@v3; current releases are v6.
- Documentation deployment uses
peaceiris/actions-gh-pages@v3; the current release is v4.
- Workflows manually create and activate another virtual environment after
setup-python has already provisioned an isolated runner.
- The unit-test and release steps are named “Test with pytest” but execute
unittest.
- The documentation workflow installs
python-dotenv explicitly and then installs the development requirements that already include it.
Python examples and contributor documentation
- WebSocket demos use
asyncio.get_event_loop().run_until_complete(). On Python 3.14, get_event_loop() raises when no current event loop exists; top-level applications should use asyncio.run().
- Contributor notes instruct users to copy
.env.sample, but that file does not exist.
- Contributor notes claim a subscription test requires credentials, but the repository currently has no subscription test.
- The README SMS example compares a string with
is instead of == and calls time.sleep() without importing time.
- Documentation alternates among
python, python3, pip, and pip3 without defining one reproducible environment workflow.
Impact
- New contributors can reproduce an unsupported TLS/Python environment by following repository guidance.
- The published compatibility promise is not enforced by package metadata or CI.
- Builds and tests are not reproducible across time or machines.
- Old actions and dependencies increase maintenance and compatibility risk.
- Some documented demos and examples fail on currently supported Python versions.
Planning boundary
A complete remediation plan, supported Python range, dependency upgrade policy, packaging backend, CI matrix, and release authentication approach still need to be decided. No implementation is authorized by this issue alone.
References
Problem
The repository's documented Python support, dependency declarations, packaging metadata, automation, examples, and local development instructions have drifted apart. Several elements are obsolete or materially stale, and a documented setup currently produces an end-of-life Python environment linked against unsupported LibreSSL.
This issue records the confirmed problems. It intentionally does not choose a remediation plan yet.
Confirmed findings
Python support and local environment
websockets==15.*requires Python 3.9 or newer, so the advertised Python 3.7 support is already false.Requires-Pythonmetadata, allowing installers to attempt unsupported interpreter versions.urllib3v2 does not support LibreSSL, producingNotOpenSSLWarningduring real SDK use.Runtime and development dependencies
observable==0.3.*pins 0.3.2 from 2017. The upstream project's latest release is 1.0.3 from 2018, so this dependency is stale and apparently dormant.websockets==15.*is behind the current 17.1 release by two major versions.discover==0.4.0, released in 2010, remains a development dependency even though test discovery is built into Python 3's standard-libraryunittest.pdoc==14.4.0is pinned behind the current 16.0.0 release.coverage>=4.3.1,coveralls>=1.1, andrequests-mock>=1.2.0are many years old and no longer describe meaningful tested dependency bounds.Packaging and release metadata
pyproject.tomlor standardized[build-system]declaration.setup.pycode, including a hard-coded version and requirements loaded from a separate file.GitHub Actions
actions/checkout@v3andactions/setup-python@v3; current releases are v6.peaceiris/actions-gh-pages@v3; the current release is v4.setup-pythonhas already provisioned an isolated runner.unittest.python-dotenvexplicitly and then installs the development requirements that already include it.Python examples and contributor documentation
asyncio.get_event_loop().run_until_complete(). On Python 3.14,get_event_loop()raises when no current event loop exists; top-level applications should useasyncio.run()..env.sample, but that file does not exist.isinstead of==and callstime.sleep()without importingtime.python,python3,pip, andpip3without defining one reproducible environment workflow.Impact
Planning boundary
A complete remediation plan, supported Python range, dependency upgrade policy, packaging backend, CI matrix, and release authentication approach still need to be decided. No implementation is authorized by this issue alone.
References