From 5aa13a99d16c8beb22ccf07410b321616a1cfc99 Mon Sep 17 00:00:00 2001 From: giles Date: Thu, 5 Mar 2026 22:17:26 +0000 Subject: [PATCH] Wire SX_USE_REF=1 switching through all route intermediaries jinja_bridge, helpers, handlers, query_executor now conditionally import from ref/sx_ref and ref/async_eval_ref when SX_USE_REF=1. Co-Authored-By: Claude Opus 4.6 --- shared/sx/handlers.py | 12 ++++++++++-- shared/sx/helpers.py | 18 +++++++++++++++--- shared/sx/jinja_bridge.py | 11 +++++++++-- shared/sx/query_executor.py | 12 ++++++++++-- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/shared/sx/handlers.py b/shared/sx/handlers.py index 40b3b57..0aabd8a 100644 --- a/shared/sx/handlers.py +++ b/shared/sx/handlers.py @@ -69,7 +69,11 @@ def clear_handlers(service: str | None = None) -> None: def load_handler_file(filepath: str, service_name: str) -> list[HandlerDef]: """Parse an .sx file, evaluate it, and register any HandlerDef values.""" from .parser import parse_all - from .evaluator import _eval as _raw_eval, _trampoline + import os + if os.environ.get("SX_USE_REF") == "1": + from .ref.sx_ref import eval_expr as _raw_eval, trampoline as _trampoline + else: + from .evaluator import _eval as _raw_eval, _trampoline _eval = lambda expr, env: _trampoline(_raw_eval(expr, env)) from .jinja_bridge import get_component_env @@ -126,7 +130,11 @@ async def execute_handler( 4. Return ``SxExpr`` wire format """ from .jinja_bridge import get_component_env, _get_request_context - from .async_eval import async_eval_to_sx + import os + if os.environ.get("SX_USE_REF") == "1": + from .ref.async_eval_ref import async_eval_to_sx + else: + from .async_eval import async_eval_to_sx from .types import NIL if args is None: diff --git a/shared/sx/helpers.py b/shared/sx/helpers.py index 004083f..a137753 100644 --- a/shared/sx/helpers.py +++ b/shared/sx/helpers.py @@ -346,7 +346,11 @@ async def _render_to_sx_with_env(__name: str, extra_env: dict, **kwargs: Any) -> **Private** — service code should use ``sx_call()`` or defmacros instead. """ from .jinja_bridge import get_component_env, _get_request_context - from .async_eval import async_eval_slot_to_sx + import os + if os.environ.get("SX_USE_REF") == "1": + from .ref.async_eval_ref import async_eval_slot_to_sx + else: + from .async_eval import async_eval_slot_to_sx from .types import Symbol, Keyword, NIL as _NIL # Build AST with extra_env entries as keyword args so _aser_component @@ -377,7 +381,11 @@ async def _render_to_sx(__name: str, **kwargs: Any) -> str: Only infrastructure code (helpers.py, layouts.py) should call this. """ from .jinja_bridge import get_component_env, _get_request_context - from .async_eval import async_eval_to_sx + import os + if os.environ.get("SX_USE_REF") == "1": + from .ref.async_eval_ref import async_eval_to_sx + else: + from .async_eval import async_eval_to_sx ast = _build_component_ast(__name, **kwargs) env = dict(get_component_env()) @@ -397,7 +405,11 @@ async def render_to_html(__name: str, **kwargs: Any) -> str: format. Used by route renders that need HTML (full pages, fragments). """ from .jinja_bridge import get_component_env, _get_request_context - from .async_eval import async_render + import os + if os.environ.get("SX_USE_REF") == "1": + from .ref.async_eval_ref import async_render + else: + from .async_eval import async_render ast = _build_component_ast(__name, **kwargs) env = dict(get_component_env()) diff --git a/shared/sx/jinja_bridge.py b/shared/sx/jinja_bridge.py index f8aaf42..50b9a94 100644 --- a/shared/sx/jinja_bridge.py +++ b/shared/sx/jinja_bridge.py @@ -27,7 +27,11 @@ from typing import Any from .types import NIL, Component, Keyword, Macro, Symbol from .parser import parse -from .html import render as html_render, _render_component +import os as _os +if _os.environ.get("SX_USE_REF") == "1": + from .ref.sx_ref import render as html_render, render_html_component as _render_component +else: + from .html import render as html_render, _render_component # --------------------------------------------------------------------------- @@ -169,7 +173,10 @@ def register_components(sx_source: str) -> None: (div :class "..." (div :class "..." title))))) ''') """ - from .evaluator import _eval as _raw_eval, _trampoline + if _os.environ.get("SX_USE_REF") == "1": + from .ref.sx_ref import eval_expr as _raw_eval, trampoline as _trampoline + else: + from .evaluator import _eval as _raw_eval, _trampoline _eval = lambda expr, env: _trampoline(_raw_eval(expr, env)) from .parser import parse_all from .css_registry import scan_classes_from_sx diff --git a/shared/sx/query_executor.py b/shared/sx/query_executor.py index 70cfece..aa59e48 100644 --- a/shared/sx/query_executor.py +++ b/shared/sx/query_executor.py @@ -20,7 +20,11 @@ async def execute_query(query_def: QueryDef, params: dict[str, str]) -> Any: Parameters are bound from request query string args. """ from .jinja_bridge import get_component_env, _get_request_context - from .async_eval import async_eval + import os + if os.environ.get("SX_USE_REF") == "1": + from .ref.async_eval_ref import async_eval + else: + from .async_eval import async_eval env = dict(get_component_env()) env.update(query_def.closure) @@ -45,7 +49,11 @@ async def execute_action(action_def: ActionDef, payload: dict[str, Any]) -> Any: Parameters are bound from the JSON request body. """ from .jinja_bridge import get_component_env, _get_request_context - from .async_eval import async_eval + import os + if os.environ.get("SX_USE_REF") == "1": + from .ref.async_eval_ref import async_eval + else: + from .async_eval import async_eval env = dict(get_component_env()) env.update(action_def.closure)