From 55cf80df9108dbb6e807b0b2f8d0c1e95113ef57 Mon Sep 17 00:00:00 2001 From: Joba Hassan Date: Fri, 2 Jan 2026 16:29:11 -0500 Subject: [PATCH 1/2] Update dependencies and improve version handling - Updated falcon dependency in requirements.txt to be between versions 3.0.0 and 5.0.0. - Refactored setup.py to read version from version.py using regex for better reliability. - Adjusted Python version support in setup.py to include 3.10 through 3.13. - Modified GitHub Actions workflow to support multiple Python versions and improved version verification logic. - Changed response handling in RestServerFloe to use `req.bounded_stream.read()` for better stream handling. - Updated version in version.py to 0.1.0b1 for the upcoming beta release. --- .github/workflows/publish.yml | 30 +++++++++++++++++++++++------- floe/connector.py | 5 +---- floe/restserver.py | 16 ++++++++-------- floe/version.py | 2 +- requirements.txt | 2 +- setup.py | 15 +++++++++------ test.py | 2 +- 7 files changed, 44 insertions(+), 28 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 70e0632..cfbb8a0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,15 +4,20 @@ on: push: tags: - 'v*' + branches: + - 'beta/**' jobs: test: runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.10', '3.11', '3.12', '3.13'] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: ${{ matrix.python-version }} - name: Install dependencies run: pip install -r dev-requirements.txt - name: Run tests @@ -25,14 +30,25 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' - - name: Verify tag matches version.py + python-version: '3.13' + - name: Verify version (tag or beta branch) run: | - TAG=${GITHUB_REF#refs/tags/v} VERSION=$(python -c "exec(open('floe/version.py').read()); print(__version__)") - if [ "$TAG" != "$VERSION" ]; then - echo "Tag v$TAG does not match version.py ($VERSION)" - exit 1 + echo "VERSION=$VERSION" >> $GITHUB_ENV + + if [[ "$GITHUB_REF" == refs/tags/v* ]]; then + TAG=${GITHUB_REF#refs/tags/v} + if [ "$TAG" != "$VERSION" ]; then + echo "::error::Tag v$TAG does not match version.py ($VERSION)" + exit 1 + fi + echo "Publishing stable release: $VERSION" + elif [[ "$GITHUB_REF" == refs/heads/beta/* ]]; then + if [[ ! "$VERSION" =~ (a|b|rc)[0-9]+$ ]]; then + echo "::error::Beta branch requires pre-release version (e.g., 0.1.0b1), got: $VERSION" + exit 1 + fi + echo "Publishing beta release: $VERSION" fi - name: Install build tools run: pip install build wheel diff --git a/floe/connector.py b/floe/connector.py index b1721b8..27bc3c0 100644 --- a/floe/connector.py +++ b/floe/connector.py @@ -9,10 +9,7 @@ except ImportError: MySQLFloe = None -try: - from urllib.parse import urlparse, parse_qs -except ImportError: - from urlparse import urlparse, parse_qs +from urllib.parse import urlparse, parse_qs logger = logging.getLogger(__name__) diff --git a/floe/restserver.py b/floe/restserver.py index 2db40e5..3c521ab 100644 --- a/floe/restserver.py +++ b/floe/restserver.py @@ -46,7 +46,7 @@ def on_get(self, req, resp, domain, key): @app_trace def on_put(self, req, resp, domain, key): cs = get_connection(domain) - cs.set(key, req.stream.read()) + cs.set(key, req.bounded_stream.read()) resp.text = self.OK_RESPONSE @app_trace @@ -72,42 +72,42 @@ def format_error(ex, resp, code='INTERNAL', resp.text = str(ex.message) -def generic_error_handler(ex, req, resp, params): +def generic_error_handler(req, resp, ex, params): logger.exception("Internal error: %s", ex) format_error(ex, resp, code='INTERNAL', status=falcon.HTTP_INTERNAL_SERVER_ERROR) -def configuration_error_handler(ex, req, resp, params): +def configuration_error_handler(req, resp, ex, params): logger.error("Configuration error: %s", ex) format_error(ex, resp, code='CONFIGURATION', status=falcon.HTTP_400) -def operational_error_handler(ex, req, resp, params): +def operational_error_handler(req, resp, ex, params): logger.exception("Operational error: %s", ex) format_error(ex, resp, code='OPERATIONAL', status=falcon.HTTP_INTERNAL_SERVER_ERROR) -def read_error_handler(ex, req, resp, params): +def read_error_handler(req, resp, ex, params): logger.exception("Read error: %s", ex) format_error(ex, resp, code='READ', status=falcon.HTTP_INTERNAL_SERVER_ERROR) -def write_error_handler(ex, req, resp, params): +def write_error_handler(req, resp, ex, params): logger.exception("Write error: %s", ex) format_error(ex, resp, code='WRITE', status=falcon.HTTP_INTERNAL_SERVER_ERROR) -def delete_error_handler(ex, req, resp, params): +def delete_error_handler(req, resp, ex, params): logger.exception("Delete error: %s", ex) format_error(ex, resp, code='DELETE', status=falcon.HTTP_INTERNAL_SERVER_ERROR) -def invalid_key_handler(ex, req, resp, params): +def invalid_key_handler(req, resp, ex, params): logger.warning("Invalid key: %s", ex) format_error(ex, resp, code='INVALID-KEY', status=falcon.HTTP_400) diff --git a/floe/version.py b/floe/version.py index 19c6940..408bb3f 100644 --- a/floe/version.py +++ b/floe/version.py @@ -1 +1 @@ -__version__ = '0.0.16' +__version__ = '0.1.0b1' diff --git a/requirements.txt b/requirements.txt index 543316c..87353bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -falcon<4.0.0 +falcon>=3.0.0,<5.0.0 requests opentelemetry-api diff --git a/setup.py b/setup.py index 0de827d..a87a167 100755 --- a/setup.py +++ b/setup.py @@ -1,14 +1,14 @@ #!/usr/bin/env python import os +import re from os import path from setuptools import setup -import imp MYDIR = path.abspath(os.path.dirname(__file__)) long_description = open(os.path.join(MYDIR, 'README.md')).read() -version = imp.load_source('version', - path.join('.', 'floe', 'version.py')).__version__ +with open(path.join(MYDIR, 'floe', 'version.py')) as f: + version = re.search(r"__version__ = ['\"]([^'\"]+)['\"]", f.read()).group(1) setup( name='floe', @@ -21,17 +21,20 @@ classifiers=[ 'Development Status :: 4 - Beta', 'Programming Language :: Python', - 'Programming Language :: Python', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', 'Environment :: Web Environment', 'Operating System :: POSIX', ], license='MIT', + python_requires='>=3.10', install_requires=[ - 'falcon>=0.3.0,<4.0.0', + 'falcon>=3.0.0,<5.0.0', 'requests', 'opentelemetry-api', ], diff --git a/test.py b/test.py index 4570c15..95e799b 100644 --- a/test.py +++ b/test.py @@ -253,7 +253,7 @@ class RestServerAdditionalRoute(object): def on_get(self, req, resp): resp.content_type = 'text/plain' - resp.body = 'additional' + resp.text = 'additional' class RestServerTest(unittest.TestCase): From f09a6c0163b0052b57914fac50bab3e09c57585e Mon Sep 17 00:00:00 2001 From: Joba Hassan Date: Tue, 6 Jan 2026 12:52:04 -0500 Subject: [PATCH 2/2] Bump version to 0.1.0 for stable release --- floe/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/floe/version.py b/floe/version.py index 408bb3f..b794fd4 100644 --- a/floe/version.py +++ b/floe/version.py @@ -1 +1 @@ -__version__ = '0.1.0b1' +__version__ = '0.1.0'