Skip to content

Bound and test the supported Reflex compatibility window for xy[reflex] #447

Description

@Alek99

Summary

The extra claims to select a compatible Reflex version but declares only reflex>=0.9.6. Every future Reflex release therefore remains resolver-compatible without an upper bound, while package/release smokes install the same open-ended constraint and do not establish a min/max compatibility window.

Evidence

  • Package metadata has only the lower bound:

    xy/pyproject.toml

    Lines 17 to 23 in 99eda6d

    [project.optional-dependencies]
    # The adapter source ships in every xy wheel so the framework integration and
    # render client can never drift. The extra only selects the supported Reflex
    # floor; importing plain `xy` remains framework-free.
    reflex = [
    "reflex>=0.9.6",
    ]
  • Public docs say the extra selects a compatible version and then tell users to pin it themselves:
    - The bundled Reflex integration supports state-backed application charts and
    remains experimental. Install the extra to select a compatible Reflex
    version. With uv:
    ~~~bash
    uv add "xy[reflex]"
    ~~~
    Or with pip:
    ~~~bash
    python -m pip install "xy[reflex]"
    ~~~
    The `xy` wheel already carries the `reflex_xy` integration; the extra adds
    only the supported Reflex dependency floor. Pin resolved versions for
    production deployments. Continue with the
    [Reflex integration guide](/docs/xy/integrations/reflex/) for its current
    limitations and setup.
  • CI/release smoke the unbounded reflex>=0.9.6, not exact lower/upper versions:

    xy/.github/workflows/ci.yml

    Lines 642 to 670 in 99eda6d

    python scripts/verify_sdist.py "$sdist"
    - name: Build and load native core from sdist
    shell: bash
    env:
    XY_REQUIRE_CARGO: "1"
    run: |
    uv venv smoke-native
    uv pip install --no-cache -p smoke-native dist/*.tar.gz numpy anywidget "reflex>=0.9.6"
    ./smoke-native/bin/python - <<'PY'
    import importlib.metadata as metadata
    import reflex_xy
    import xy
    import xy.kernels as kernels
    version = metadata.version("xy")
    assert xy.__version__ == version
    assert reflex_xy.__version__ == version
    assert kernels.BACKEND == "native", kernels.BACKEND
    print("sdist built and loaded the native Rust core")
    PY
    - name: Verify coreless sdist imports reflex_xy
    shell: bash
    env:
    XY_SKIP_CARGO: "1"
    run: |
    uv venv smoke-no-rust
    and
    - name: Verify the wheel installs and loads the native core
    # Only host-arch wheels can be imported on the runner; cross-compiled
    # arches (aarch64/armv7/win-arm64/win32) are content-verified instead.
    if: matrix.native
    shell: bash
    run: |
    uv venv smoke
    uv pip install -p smoke dist/*.whl numpy anywidget "reflex>=0.9.6"
    ./smoke/bin/python -c "import importlib.metadata as m, reflex_xy, xy.kernels as k; assert k.BACKEND=='native', k.BACKEND; assert reflex_xy.__version__ == m.version('xy'); print('native', k.__file__)" \
    || ./smoke/Scripts/python.exe -c "import importlib.metadata as m, reflex_xy, xy.kernels as k; assert k.BACKEND=='native', k.BACKEND; assert reflex_xy.__version__ == m.version('xy'); print('native')"
  • The docs app follows Reflex main, which is useful forward signal but is not a released compatibility contract:
    dependencies = [
    "numpy",
    "pillow",
    "reflex @ git+https://github.com/reflex-dev/reflex@main",
    "reflex-components-internal @ git+https://github.com/reflex-dev/reflex@main#subdirectory=packages/reflex-components-internal",
    "reflex-docgen @ git+https://github.com/reflex-dev/reflex@main#subdirectory=packages/reflex-docgen",
    "reflex-site-shared @ git+https://github.com/reflex-dev/reflex@main#subdirectory=packages/reflex-site-shared",
    "xy[reflex]",
    ]

Acceptance criteria

  • Declare and document a tested Reflex range, including an upper bound at the next known-incompatible boundary.
  • CI runs integration compile/event smokes at the exact minimum and highest supported released Reflex versions.
  • Keep a separate allowed-to-fail/forward-compatibility job against Reflex main if desired.
  • Resolver metadata rejects untested newer versions instead of admitting them silently.
  • The release checklist requires widening the range only after the compatibility matrix passes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions