| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| a2ui_core-0.2.0-py3-none-any.whl | 2026-09-28 | 178.9 kB | |
| a2ui_core-0.2.0.tar.gz | 2026-09-28 | 184.2 kB | |
| a2ui-core 0.2.0 source code.tar.gz | 2026-09-28 | 136.8 MB | |
| a2ui-core 0.2.0 source code.zip | 2026-09-28 | 139.4 MB | |
| README.md | 2026-09-28 | 12.5 kB | |
| Totals: 5 Items | 276.6 MB | 1 | |
- BREAKING: Module paths and validation interfaces moved or changed in v0.2.0. Deprecation shims are provided for renamed public module paths; importing them emits a
DeprecationWarningnaming the new path. These shims will be removed inv0.3.0.
Shimmed Modules (Deprecated; removal in v0.3.0):
Old Path (v0.1.x) |
New Path (v0.2.0) |
Notes |
|---|---|---|
a2ui.core.basic_catalog.{components,function_apis,function_impls,styles} |
a2ui.core.basic_catalog.v0_9.{components,function_apis,function_impls,styles} |
Re-exports v0.9 basic catalog symbols |
a2ui.core.basic_catalog.expression_parser |
a2ui.core.expressions.expression_parser |
Re-exports ExpressionParser, Scanner, and limits |
a2ui.core.schema.{client_capabilities,client_to_server,constants,server_to_client} |
a2ui.core.schema.v0_9.{client_capabilities,client_to_server,constants,server_to_client} |
Also aliases A2uiClientError* and SPEC_VERSION* |
Unshimmed Internal Modules & Renames:
Internal modules were moved without shims; callers should import from the new paths directly:
a2ui.core.rendering(and.component_context,.data_context,.generic_binder): moved toa2ui.core.resolution(and matching submodules).a2ui.core.validating(and.integrity_checker,.topology_analyzer): moved toa2ui.core.validation(anda2ui.core.state.validation_helpers).validate_component_integrity: moved toa2ui.core.validationas(components: dict[str, ComponentModel], root_id: str = ROOT_ID, config: ValidationConfig | None = None) -> None.analyze_topology: moved toa2ui.core.validationas(components: dict[str, ComponentModel], root_id: str = ROOT_ID, config: ValidationConfig | None = None) -> set[str].
Removed Modules and APIs:
Removed (v0.1.x) |
Replacement (v0.2.0) |
|---|---|
a2ui.core.validating.validator (A2uiValidator, A2uiValidatorError) |
a2ui.core.validation.PayloadValidator |
a2ui.core.validating.catalog_schema_validator (CatalogSchemaValidator, extract_ref_fields) |
a2ui.core.catalog.reference_map (ComponentRefSpec, build_component_ref_map) |
a2ui.core.validating.integrity_checker.get_component_references |
ComponentRefSpec.extract_child_references, ComponentModel.get_child_references |
a2ui.core.state.{node_graph,component_node} (NodeGraph, ComponentNode) |
Removed |
a2ui.core.basic_catalog.locale_config |
a2ui.core.basic_catalog.locale_formatting (Babel/CLDR) |
a2ui.core.basic_catalog.operator_apis |
a2ui.core.basic_catalog.v1_0.operator_apis |
get_client_capabilities, get_client_data_model |
Removed |
SPEC_VERSION |
PROTOCOL_VERSION (in a2ui.core.schema.v0_9.constants) |
A2uiClientErrorMessage |
A2uiRendererErrorMessage |
Catalog(spec_version=) |
Catalog(protocol_version=) |
MessageProcessor(strict_mode=) |
MessageProcessor(options=) |
- BREAKING:
DataModelstores data values by reference instead of making deep copies. Callers that mutate nested objects after setting them inDataModelwill update internal state directly. - BREAKING:
A2uiRpcErrorargument order is now(message, code, ...). - BREAKING:
DataModel.setnow raisesA2uiDataErrorinstead of resetting the root when attempting to traverse or set a subpath under a primitive root value. - BREAKING:
SurfaceComponentsModel.add_componentnow raisesA2uiStateErrorif a component with the same ID already exists in the model. - BREAKING: pending RPC requests on
RpcHandler.dispose()are now rejected with error codeCANCELLED(previouslyDISPOSED). SurfaceModelnow accepts aroot_idparameter (defaulting to"root") and provides a deprecatedcatalogproperty aliasingdefault_catalog.SurfaceComponentsModel.detect_cyclesnow correctly ignores disconnected orphan components by passingallow_orphan_components=Trueto topology analysis, reporting cycle and depth limit violations exclusively.- Bound function calls to
MAX_FUNCTION_CALL_ARGS(1,000 arguments) across bothPayloadValidator.validate_functionand runtimeDataContext._execute_functionresolution. - Bound expression template strings to
MAX_EXPRESSION_TEMPLATE_LENGTH(10,000 characters) and parsed expression segments toMAX_EXPRESSION_PARTS(1,000 parts) inExpressionParser. - Add SemVer parsing and comparison utilities (
SemVer,compare_semver,is_at_least_version,normalize_version_string,parse_semver,to_canonical_version,to_semver) ina2ui.core.common.semver. - Add
A2uiProtocolVersionandProtocolVersionenum ina2ui.core.schema. - Remove
A2uiCompileErrorfroma2ui_coreexception hierarchy. - BREAKING: locale formatting now comes from CLDR by way of
babel, replacing the hand-rolled locale tables. Currency, number, date month and weekday names, and plural category selection now match what the TypeScript engine gets fromIntl. That was the point: the two engines previously disagreed for every locale other thanen-US, on the symbol chosen and on which Unicode space separates it from the amount.
a2ui.core.basic_catalog no longer exports LocaleFormattingRules,
register_locale_rules, get_locale_rules or CURRENCY_SYMBOLS, and
locale_config.py is deleted. register_locale_rules was the extension
point for registering a custom locale; that capability goes away rather than
moving, because babel resolves locales from CLDR only.
babel is added as a runtime dependency.
babel reads its patterns and symbols from CLDR but does not implement
CLDR's currencySpacing, which ICU does apply. The package supplies that
rule itself, so a currency whose symbol is alphabetic is separated from the
amount by U+00A0 as Intl separates it: CHF 1,234.56, not CHF1,234.56.
This affects the assigned codes CHF, SEK, DKK, CZK and PLN among
others, in en-US as well as elsewhere.
One difference from Intl remains. For Arabic locales such as ar-EG,
Intl shapes digits in Eastern Arabic numerals while babel emits Latin
ones. babel offers no way to close this: requesting the locale's default
numbering system converts the separators but not the digits, which agrees
with neither engine.
A locale tag the catalog cannot use falls back to en_US rather than
raising. babel raises for a malformed tag and for a well-formed tag CLDR
does not carry, such as xx-YY, either of which would otherwise abort every
format call made by a catalog built with it. The TypeScript engine falls back
for the same tags.
- BREAKING: the
Dynamic*schema aliases no longer coerce a value of the wrong primitive type. Each admits one primitive type, a data binding, or a function call, matching the TypeScript engine and the specification. What changes in practice: DynamicNumberrejects the string"1", which previously validated as1.0, and rejectsTrue, which previously validated as1.DynamicBooleanrejects1,0and"true", which previously validated asTrue,FalseandTrue.DynamicValuekeeps an integer as an integer. It admittedfloatbut notint, so a payload carrying1came back as1.0.DynamicStringandDynamicStringListare now declared strict for consistency. This is not a behaviour change: pydantic already refused to coerce other primitives into a string.
Data bindings and function calls are unaffected.
-
The v0.9 and v1.0 basic catalogs no longer register
add,subtract,multiply,divide,equals,not_equals,greater_than,less_than,contains,starts_withorends_with. The published catalogs declare exactly 14 functions, and none of these operators is among them, so an agent had no way to know they were callable.a2ui.core.basic_catalogno longer exports their API classes or implementations, aligning Python engine behavior with the reference typescript implementation. -
The v1.0
formatDateISOpattern now returns the UTC instant with exactly three fractional digits, asweb_coredoes. It previously echoed back whichever offset the input carried, so2025-01-01T12:00:00+02:00formatted as itself instead of2025-01-01T10:00:00.000Z. A timestamp without an offset is read as UTC, so the result no longer depends on the host time zone. -
The v1.0
pluralizefunction now falls back to theotherform only when the selected category is absent, not when its value is empty. A caller that supplieszero: ""gets an empty string, matchingweb_core; previously the empty form was discarded and theotherform rendered in its place. -
ExpressionParser.MAX_DEPTHis 100, up from 10, matchingweb_coreand the Swift engine. An expression nested between 11 and 100 levels deep was rejected here and accepted there. -
A function-call argument now counts toward the expression parser's recursion depth, as it does in
web_core. Only nested interpolations were counted before, so${f(a: ${f(a: ...)})}written as${f(a: f(a: ...))}recursed unchecked and raisedRecursionErrorfrom the interpreter rather than a parse error. -
Catalog.from_jsonaccepts acommon_types_schemaargument and rewrites cross-document references such ascommon_types.json#/$defs/ChildListinto local#/$defs/...pointers, satisfying them from the supplied document or from the built-in definitions. Catalogs that reference the published shared types now load without thespecification/tree on disk, and the validator no longer reads schema files at runtime. - Deleting a list index past the end of the list is now a no-op. It previously
padded the list with
Noneup to that index, so deleting/items/10from a three-element list produced an eleven-element list. - The shared type definitions used to satisfy
common_types.jsonreferences are now checked against the published document by a test, with an explicit list of the definitions that intentionally differ. Descriptions onAccessibilityAttributes,DynamicString,DynamicNumberandDynamicBooleanwere brought back into line with the specification. - The conformance harness now fails, rather than silently skipping, when a
suite cannot be parsed, when a case has no
nameoraction, or when an action has no handler. Suites the core library cannot run are named inUNRUNNABLE_SUITESwith a reason.
Published to PyPI: a2ui-core 0.2.0
:::sh
pip install a2ui-core==0.2.0