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 <noreply@anthropic.com>
This commit is contained in:
2026-03-05 22:17:26 +00:00
parent 7982a07f94
commit 5aa13a99d1
4 changed files with 44 additions and 9 deletions

View File

@@ -69,7 +69,11 @@ def clear_handlers(service: str | None = None) -> None:
def load_handler_file(filepath: str, service_name: str) -> list[HandlerDef]: def load_handler_file(filepath: str, service_name: str) -> list[HandlerDef]:
"""Parse an .sx file, evaluate it, and register any HandlerDef values.""" """Parse an .sx file, evaluate it, and register any HandlerDef values."""
from .parser import parse_all 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)) _eval = lambda expr, env: _trampoline(_raw_eval(expr, env))
from .jinja_bridge import get_component_env from .jinja_bridge import get_component_env
@@ -126,7 +130,11 @@ async def execute_handler(
4. Return ``SxExpr`` wire format 4. Return ``SxExpr`` wire format
""" """
from .jinja_bridge import get_component_env, _get_request_context 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 from .types import NIL
if args is None: if args is None:

View File

@@ -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. **Private** — service code should use ``sx_call()`` or defmacros instead.
""" """
from .jinja_bridge import get_component_env, _get_request_context 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 from .types import Symbol, Keyword, NIL as _NIL
# Build AST with extra_env entries as keyword args so _aser_component # 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. Only infrastructure code (helpers.py, layouts.py) should call this.
""" """
from .jinja_bridge import get_component_env, _get_request_context 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) ast = _build_component_ast(__name, **kwargs)
env = dict(get_component_env()) 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). format. Used by route renders that need HTML (full pages, fragments).
""" """
from .jinja_bridge import get_component_env, _get_request_context 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) ast = _build_component_ast(__name, **kwargs)
env = dict(get_component_env()) env = dict(get_component_env())

View File

@@ -27,7 +27,11 @@ from typing import Any
from .types import NIL, Component, Keyword, Macro, Symbol from .types import NIL, Component, Keyword, Macro, Symbol
from .parser import parse 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))))) (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)) _eval = lambda expr, env: _trampoline(_raw_eval(expr, env))
from .parser import parse_all from .parser import parse_all
from .css_registry import scan_classes_from_sx from .css_registry import scan_classes_from_sx

View File

@@ -20,7 +20,11 @@ async def execute_query(query_def: QueryDef, params: dict[str, str]) -> Any:
Parameters are bound from request query string args. Parameters are bound from request query string args.
""" """
from .jinja_bridge import get_component_env, _get_request_context 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 = dict(get_component_env())
env.update(query_def.closure) 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. Parameters are bound from the JSON request body.
""" """
from .jinja_bridge import get_component_env, _get_request_context 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 = dict(get_component_env())
env.update(action_def.closure) env.update(action_def.closure)