fuaran-ui 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fuaran_ui-0.7.0/.gitattributes +31 -0
- fuaran_ui-0.7.0/.github/dependabot.yml +21 -0
- fuaran_ui-0.7.0/.github/workflows/ci.yml +231 -0
- fuaran_ui-0.7.0/.github/workflows/publish-pypi-placeholder.yml +91 -0
- fuaran_ui-0.7.0/.github/workflows/publish-pypi.yml +203 -0
- fuaran_ui-0.7.0/.gitignore +32 -0
- fuaran_ui-0.7.0/CLAUDE.md +467 -0
- fuaran_ui-0.7.0/CODE_OF_CONDUCT.md +77 -0
- fuaran_ui-0.7.0/CONTRIBUTING.md +32 -0
- fuaran_ui-0.7.0/LICENSE +215 -0
- fuaran_ui-0.7.0/NOTICE +16 -0
- fuaran_ui-0.7.0/PKG-INFO +1335 -0
- fuaran_ui-0.7.0/README.md +1305 -0
- fuaran_ui-0.7.0/SECURITY.md +105 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-accept-full.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-accept-int-for-float.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-accept-minimal.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-reject-enum.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-reject-float-range.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-reject-int-range.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-reject-missing-required.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-reject-string-len.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-reject-type-mismatch.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-ans-reject-undeclared.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-full.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-minimal.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-answered.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-declined.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-reject-empty-id.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-reject-missing-answer.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-reject-stray-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-reject-unknown-type.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-superseded-anon.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-superseded-by.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-out-timedout.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-bad-space.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-bad-timeout.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-bad-version.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-default-nonconformant.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-duplicate-field.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-empty-contract.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-empty-id.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-missing-version.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-stray-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-tree-decode.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/elicitation/elc-reject-unknown-node.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/envelope/envelope-foreign-major.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/envelope/envelope-foreign-namespace.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/envelope/envelope-known-current.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/envelope/envelope-unknown-behind.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/envelope/envelope-unknown-malformed-required-profile.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/envelope/envelope-unknown-required-profile.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-022-lvr-emphasis-loud.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-022-lvr-emphasis-loud.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-022-lvr-emphasis-normal.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-022-lvr-emphasis-normal.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1126-clipboard-literal-envelope.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1126-clipboard-literal-envelope.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1521-int-slot-integral-float.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1521-int-slot-integral-float.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1521-payload-integer-beyond-int53.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1521-payload-integer-beyond-int53.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1656-state-default-null.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1656-state-default-null.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1661-i18n-arg-tagged-static.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1661-i18n-arg-tagged-static.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1670-fragment-decl-redundant-defaults.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-1670-fragment-decl-redundant-defaults.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-emphasis-muted.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-emphasis-muted.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-emphasis-strong.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-emphasis-strong.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-tone-danger.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-tone-danger.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-tone-positive.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-alias-tone-positive.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-explicit-default-column.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-explicit-default-column.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-explicit-default-metric.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-explicit-default-metric.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-explicit-default-style.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-460-explicit-default-style.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-596-form-explicit-auto-state.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-596-form-explicit-auto-state.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-665-rows-opaque-sentinel.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-665-rows-opaque-sentinel.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-call-url.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-call-url.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-card-title-metric-value.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-card-title-metric-value.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-datagrid-data-column-type.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-datagrid-data-column-type.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-form-field-name.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-form-field-name.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-grid-columns-row.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-grid-columns-row.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-navigate-href.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-navigate-href.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-select-options-query-deps.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-alias-select-options-query-deps.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-button-label.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-button-label.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-callout.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-callout.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-heading.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-heading.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-markdown.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-bare-text-markdown.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-binding-bound-wrapper.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-binding-bound-wrapper.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-daterange-bare-array.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-daterange-bare-array.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-daterange-static-envelope.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-daterange-static-envelope.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-emphasis-cross-vocab.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-emphasis-cross-vocab.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-fact-explicit-defaults.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-fact-explicit-defaults.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-filterable-static-dashboard-compact.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-filterable-static-dashboard-compact.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-grid-field-named-compact.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-grid-field-named-compact.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-grid-transform-param-compact.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-grid-transform-param-compact.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-caption-envelope.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-caption-envelope.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-empty-srcset.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-empty-srcset.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-explicit-defaults.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-explicit-defaults.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-explicit-expandable-false.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-image-explicit-expandable-false.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-master-detail-preselected-compact.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-master-detail-preselected-compact.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-navigate-target-self.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-navigate-target-self.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-null-static-options.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-null-static-options.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-markers.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-markers.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-options.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-options.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-series.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-series.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-values.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-opaque-static-values.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-scalar-transform-composition-compact.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-scalar-transform-composition-compact.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-a11y-label-bare-scalar.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-a11y-label-bare-scalar.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-binding-scalar-fraction.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-binding-scalar-fraction.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-grid-no-cols.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-grid-no-cols.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-grid-template-no-cols.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-grid-template-no-cols.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-options-bare-strings.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-options-bare-strings.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-params-map.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-params-map.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-segmented-orientation-omitted.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-segmented-orientation-omitted.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-static-envelope-plain-scalars.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-shape-static-envelope-plain-scalars.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-tonedpill-pill-tag.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-tonedpill-pill-tag.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-tonedpill-tone-aliases.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-tonedpill-tone-aliases.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-tonedpill-tonemap-alias.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-tonedpill-tonemap-alias.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-bare-columns.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-bare-columns.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-column-member-legacy.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-column-member-legacy.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-epoch-timestamps.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-epoch-timestamps.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-expr-spellings.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-expr-spellings.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-contains.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-contains.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-filter.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-filter.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-or.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-or.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-scalar-fn.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-flat-scalar-fn.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-schemaless.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-schemaless.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-source-rowmajor.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-source-rowmajor.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-source-state-rows.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-source-state-rows.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-step-aliases.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-step-aliases.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-values-only-columns.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-transform-values-only-columns.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-window-cumsum-legacy.expected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/lenient/lenient-window-cumsum-legacy.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/manifest.json +4919 -0
- fuaran_ui-0.7.0/conformance/corpus/markdown/corpus.json +64 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/a11y-alert-assertive.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/a11y-button-named.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/a11y-image-decorative.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/a11y-link-labelled.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/a11y-wrapper-all-slots.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/a11y-wrapper-state-bound.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/a11y-wrapper-transform-label.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/action-confirm-cancel.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/action-confirm.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/action-focus.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/action-navigate-bound.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/action-navigate-target.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/badge-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/badge-transform-live.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/boundary-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/box-break-before-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/box-keep-together-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/btn-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/btn-copy-bound.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/btn-copy-link.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/btn-invoke.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/btn-json-payloads.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/btn-read-workbook.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/button-print.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/button-setstate-valuefrom.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/call-into.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/callout-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/card-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-annotation-bands.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-annotation-events.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-annotations.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-axis-titles.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-data-labels.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-legend-position.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-state-rows.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-temporal-x.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/chart-value-format.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/code-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/composite-root.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/composite-tabs-panels.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/controls-closure.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/controls-declarative.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/custom-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/custom-bounded-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/custom-bounded-advisory.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/custom-nonascii-keys.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/dash-empty.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/discl-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/drawing-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/drawing-empty.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/drawing-nonfinite-sentinels.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/drawing-rotated-labels.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/drawing-tipped-shapes.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/embed-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/embed-aspect-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/embed-permissions-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/empty-state-card.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/expr-params-state-selection.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/expr-scalar.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/fact-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filterable-static-dashboard.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-date-range.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-declarative.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-param-source-declared.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-param-source-undeclared.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-rating-colour.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-segmented.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/filters-tokens.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-color.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-combobox-freetext.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-combobox-query.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-combobox-static.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-date-range.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-date.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-declarative-minimal.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-declarative.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-field-rules.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-local-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-local-debounce.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-local-declared.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-ranged.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-rating-halves.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-rating.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-rule-tokens.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-segmented.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-toggle.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-tokens-freetext.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-tokens-query.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/form-tokens-suggested.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/format-bindings.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/format-since.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-decl-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-decl-param.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-ref-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-ref-args.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-confirm-action-pair-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-confirm-action-pair.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-empty-state-panel-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-empty-state-panel.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-filter-bar-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-filter-bar.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-kpi-strip-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-kpi-strip.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-labelled-metric-row-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-labelled-metric-row.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-loading-placeholder-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-loading-placeholder.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-metric-card-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-metric-card.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-section-header-ref.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/frag-stdlib-section-header.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/glayout-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/glayout-tpl-autofit.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/glayout-tpl-fixed.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/glayout-tpl-ratio.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-bound-sort.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-declared-edit.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-editable-state.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-exportable-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-field-named.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-keep-rows-together-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-paged-sorted.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-paged.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-reorderable.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-repeat-header-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-sort-ascending.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-sort-state-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-toned-pill.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-transform-param.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-transform-undeclared-param.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/grid-transform.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/heading-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/icon-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/image-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/image-caption-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/image-caption-i18n-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/image-expandable-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/image-expandable-figure-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/image-presentation-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/image-srcset-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/limit-expr-nodes-pipeline-at-max.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/limit-node-depth-at-max.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/limit-skeleton-rows-at-max.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/limit-tree-item-depth-at-max.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/link-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/link-protected-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/list-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/lvr-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/map-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/markdown-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/masonry-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/masonry-gap.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/master-detail-multi-field.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/master-detail-preselected-second-row.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/master-detail-preselected.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/math-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/media-audio-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/media-audio-transcript-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/media-video-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/media-video-autoplay-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/media-video-captions-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/media-video-poster-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/media-video-tracks-2.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-duration-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-float-17sig.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-float-1e17.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-float-bigint.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-float-exp-neg.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-float-exp-pos.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-inverted-polarity.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-invoke.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/metric-nonfinite-sentinel.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/modal-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/mount-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/mount-2.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/multiselect-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/multiselect-chip-list-param.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/node-visible.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/now-environment-binding.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/now-grain.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/popover-anchored-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/popover-open-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/progress-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/query-dependson.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/scalar-transform-composition.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/scroll-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/select-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/shared-source-seeded-pair.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/skel-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/spark-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/spark-nonfinite-sentinel.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/split-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/stack-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/state-absent-default.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/step-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/style-direction-isolated-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/style-direction-ltr-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/style-role-voice-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/summary-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/switch-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/switch-carousel-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/switch-on-selection.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/switch-on-transform-scalar.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/switch-predicate-only.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/switch-predicate.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/table-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/table-sortable-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tabs-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tabs-explicit-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/text-i18n-bound-arg-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/text-i18n-mixed-args-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/toast-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tooltip-button-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tooltip-icon-button-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tooltip-metric-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/transfer-board.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tree-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tree-expanded-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/tree-selection-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-capture-camera-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-capture-microphone-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-destination-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-drop-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-max-bytes-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-max-files-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/nodes/upload-paste-1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-batch.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-editnode-action-commitlocal.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-editnode.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-insertchild.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-movenode.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-removenode.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-reorderchildren.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-replacebinding.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-replaceroot.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-badfield.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-badindex.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-column0-label.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-column1-label.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-field0-required.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-field1-required.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-malformed.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-object-value.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-yfield0.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop-nested-yfield1.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updateprop.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updatestate.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updatestyle (phase 147 role=eyebrow + voice=structural).json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updatestyle (phase 1472 direction=ltr, the only style member).json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/ops/op-updatestyle.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-a11y-hidden-nonbool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-a11y-label-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-a11y-labelledby-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-a11y-liveregion-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-a11y-liveregion-unknown.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-a11y-not-object.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-a11y-role-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-action-print-with-payload.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-binding-float-bool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-binding-float-sentinel-case.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-binding-float-string.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-binding-floatseq-sentinel-case.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-binding-int-bool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-binding-int-sentinel-string.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-box-masonry-nonpositive-cols.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-chart-annotation-date-unparseable.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-chart-annotation-nonfinite.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-chart-annotation-range-unordered.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-color-value-not-hex.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-combobox-allowfreetext-nonbool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-confirm-missing-onconfirm.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-confirm-nested.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-daterange-unordered.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-embed-missing-title.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-embed-permission-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-embed-unknown-permission.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-emptynodeid.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-expr-col-reference.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-expr-unbound-param.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-fieldrule-empty.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-fieldrule-length-unordered.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-formfield-near-miss-validation.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-i18n-arg-binding-missing-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-i18n-arg-unknown-binding-case.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-image-expandable-nonbool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-image-srcset-nonpositive-width.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-image-srcset-null.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-int-slot-fractional.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-int-slot-out-of-range.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-invalid-empty.json +0 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-invalid-garbage.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-invalid-truncated.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-bare-nan.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-duplicate-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-lone-high-surrogate.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-lone-low-surrogate.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-number-empty-exponent.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-number-leading-plus.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-number-leading-zero.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-number-no-integer-part.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-number-trailing-point.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-raw-control-char.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-surrogate-pair-split.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-json-trailing-content.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-expr-nodes-derive.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-expr-nodes-filter.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-expr-nodes-transform-bypass.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-json-depth-at-max.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-json-depth.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-node-depth.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-op-depth.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-skeleton-rows.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-limit-tree-item-depth.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-local-codec-no-inverse.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-local-oncommit-and-committo.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-media-autoplay-nonbool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-media-missing-label.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-media-track-default-nonbool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-media-track-missing-srclang.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-binding-type.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-custom-moduleid.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-markdown-text.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-metric-value.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-mount-scopeid.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-node-id.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-node-kind.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-switch-cases.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-switch-default.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-missing-switch-statekey.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-modal-modality-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-modal-modality-unknown.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-navigate-target-invalid.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-a11y-aria-hidden.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-a11y-arialabel.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-a11y-live.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-a11y-liveregion-case.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-column-readonly.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-grid-behaviour-record.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-grid-current-page.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-nearmiss-grid-sortable.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-now-grain-invalid.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-null-action-aitool-args.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-null-action-notify-payload.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-null-action-setstate-value.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-null-custom-prop.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-null-i18n-arg.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-null-updateprop-value.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-insertchild-empty-childid.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-insertchild-missing-parentid.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-insertchild-retired-position.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-missing-type.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-movenode-retired-newposition.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-reorderchildren-wrongtype.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-unknown-yeet.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-updateprop-missing-path.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-updatestyle-direction-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-op-updatestyle-direction-unknown.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-rating-max-zero.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-setstate-value-and-valuefrom.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-spark-element-nonnumeric.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-state-default-without-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-style-direction-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-style-direction-unknown.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-switch-autoadvance-fractional.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-switch-autoadvance-negative.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-switch-autoadvance-zero.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-switch-case-match-and-when.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-switch-case-neither.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-tokens-closed-without-suggestions.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-tokens-value-not-list.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-tonedpill-unknown-tone.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-tooltip-nonstring.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-transform-project-columns-and-cols.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-transform-sort-key-column-and-col.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-tree-item-missing-id.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-tree-item-missing-label.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-tree-nested-item-missing-id.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-binding.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-capture-source.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-drawing-curve-command.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-drawing-shape.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-image-aspect.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-link-protection.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-media-kind.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-mount-direction.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-static-sort-direction.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-textsource.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-tone.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-unknown-trend-polarity.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-upload-acceptpaste-nonbool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-upload-destination-empty.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-upload-droptarget-nonbool.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-upload-maxbytes-nonint.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-upload-maxbytes-nonpositive.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-upload-maxfiles-nonint.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-upload-maxfiles-nonpositive.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongnodekind-sparkler.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongnodekind-widget.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-box-break-before.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-box-children.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-box-keep-together.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-clipboard-payload.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-discriminator.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-default-sort-column.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-exportable-number.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-exportable.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-keep-rows-together.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-page-size-zero.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-repeat-header.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-transfer-in-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-grid-transfer-out-key.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-heading-level.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-id.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-kind.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-static-sort-column.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/reject/reject-wrongtype-style-tone.json +1 -0
- fuaran_ui-0.7.0/conformance/corpus/render-fidelity.json +1100 -0
- fuaran_ui-0.7.0/conformance/corpus/render-text.json +203 -0
- fuaran_ui-0.7.0/conformance/corpus/schema.json +10028 -0
- fuaran_ui-0.7.0/conformance/corpus/snapshot.json +4 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/accent-indistinct-toned-tint.json +17 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/budget-at-the-tolerance-edge.json +11 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/budget-breached.json +13 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/budget-within-tolerance.json +11 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/contrast-below-aa-grey-on-white.json +17 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/first-opaque-layer-wins.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/font-role-monospace.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/font-role-sans-serif.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/font-role-serif.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/font-role-unknown.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/invisible-and-accent-indistinct.json +18 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/invisible-white-on-white.json +17 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/legible-black-on-white.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/manifest-contrast-below-declared-floor.json +10 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/manifest-off-palette-colour.json +10 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/manifest-token-resolution-failed-escaped-slot.json +10 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/manifest-token-resolution-failed.json +10 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/manifest-untoned-node-is-exempt.json +8 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/no-layers-means-the-implicit-white-canvas.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/toned-observation-carries-its-tone.json +17 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/transparent-layers-fall-through-to-white.json +15 -0
- fuaran_ui-0.7.0/conformance/corpus/style-observer/untoned-tint-is-exempt.json +15 -0
- fuaran_ui-0.7.0/conformance/host-capability-manifest.json +204 -0
- fuaran_ui-0.7.0/conformance/sync_corpus.py +471 -0
- fuaran_ui-0.7.0/docs/AUTHORING.md +553 -0
- fuaran_ui-0.7.0/docs/decoder-robustness.json +28 -0
- fuaran_ui-0.7.0/docs/decoder-robustness.md +21 -0
- fuaran_ui-0.7.0/docs/fable-python-decision.md +127 -0
- fuaran_ui-0.7.0/examples/getting_started.py +679 -0
- fuaran_ui-0.7.0/examples/notebook_display.ipynb +2992 -0
- fuaran_ui-0.7.0/examples/quickstart_client.py +36 -0
- fuaran_ui-0.7.0/examples/quickstart_reactive_data_app.py +119 -0
- fuaran_ui-0.7.0/examples/quickstart_terse_dashboard.py +106 -0
- fuaran_ui-0.7.0/pyproject.toml +98 -0
- fuaran_ui-0.7.0/run.ps1 +133 -0
- fuaran_ui-0.7.0/samples/fastapi-host/README.md +168 -0
- fuaran_ui-0.7.0/samples/fastapi-host/app.py +364 -0
- fuaran_ui-0.7.0/src/fuaran_ui/__init__.py +113 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ai_tools/__init__.py +86 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ai_tools/dispatch.py +99 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ai_tools/introspect.py +190 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ai_tools/surface.py +194 -0
- fuaran_ui-0.7.0/src/fuaran_ui/canonical.py +216 -0
- fuaran_ui-0.7.0/src/fuaran_ui/charts/__init__.py +3391 -0
- fuaran_ui-0.7.0/src/fuaran_ui/cli/__init__.py +31 -0
- fuaran_ui-0.7.0/src/fuaran_ui/cli/core.py +387 -0
- fuaran_ui-0.7.0/src/fuaran_ui/client/__init__.py +77 -0
- fuaran_ui-0.7.0/src/fuaran_ui/client/client.py +284 -0
- fuaran_ui-0.7.0/src/fuaran_ui/client/contract.py +199 -0
- fuaran_ui-0.7.0/src/fuaran_ui/client/session.py +66 -0
- fuaran_ui-0.7.0/src/fuaran_ui/client/wire.py +250 -0
- fuaran_ui-0.7.0/src/fuaran_ui/compute/__init__.py +42 -0
- fuaran_ui-0.7.0/src/fuaran_ui/compute/evaluate.py +658 -0
- fuaran_ui-0.7.0/src/fuaran_ui/conformance/__init__.py +7 -0
- fuaran_ui-0.7.0/src/fuaran_ui/conformance/bridge.py +84 -0
- fuaran_ui-0.7.0/src/fuaran_ui/conformance/decoder_fuzz.py +1046 -0
- fuaran_ui-0.7.0/src/fuaran_ui/conformance/fuzz_exchange.py +209 -0
- fuaran_ui-0.7.0/src/fuaran_ui/conformance/harness.py +111 -0
- fuaran_ui-0.7.0/src/fuaran_ui/conformance/host_capability.py +366 -0
- fuaran_ui-0.7.0/src/fuaran_ui/conformance/refusal_report.py +123 -0
- fuaran_ui-0.7.0/src/fuaran_ui/dag.py +277 -0
- fuaran_ui-0.7.0/src/fuaran_ui/dataframe/__init__.py +149 -0
- fuaran_ui-0.7.0/src/fuaran_ui/dataframe/codec.py +1104 -0
- fuaran_ui-0.7.0/src/fuaran_ui/dataframe/evaluate.py +940 -0
- fuaran_ui-0.7.0/src/fuaran_ui/dataframe/model.py +428 -0
- fuaran_ui-0.7.0/src/fuaran_ui/elicitation.py +559 -0
- fuaran_ui-0.7.0/src/fuaran_ui/envelope.py +166 -0
- fuaran_ui-0.7.0/src/fuaran_ui/function.py +294 -0
- fuaran_ui-0.7.0/src/fuaran_ui/layout_observer/__init__.py +70 -0
- fuaran_ui-0.7.0/src/fuaran_ui/layout_observer/flags.py +260 -0
- fuaran_ui-0.7.0/src/fuaran_ui/layout_observer/observer.py +248 -0
- fuaran_ui-0.7.0/src/fuaran_ui/limits.py +136 -0
- fuaran_ui-0.7.0/src/fuaran_ui/merge.py +676 -0
- fuaran_ui-0.7.0/src/fuaran_ui/model.py +89 -0
- fuaran_ui-0.7.0/src/fuaran_ui/op_stream/__init__.py +140 -0
- fuaran_ui-0.7.0/src/fuaran_ui/op_stream/hash_chain.py +230 -0
- fuaran_ui-0.7.0/src/fuaran_ui/op_stream/in_memory_sink.py +144 -0
- fuaran_ui-0.7.0/src/fuaran_ui/op_stream/replay.py +375 -0
- fuaran_ui-0.7.0/src/fuaran_ui/op_stream/types.py +280 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ops/__init__.py +72 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ops/apply.py +1053 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ops/decode.py +236 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ops/diff.py +305 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ops/encode.py +11 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ops/placement.py +504 -0
- fuaran_ui-0.7.0/src/fuaran_ui/render_fidelity.py +561 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/__init__.py +152 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/bindings.py +873 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/content/fuaran-reference.css +4072 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/document.py +925 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/egress.py +596 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/email.py +1437 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/html.py +67 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/markdown.py +1211 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/notebook.py +406 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/projection.py +176 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/render.py +2793 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/sanitize.py +591 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/seeds.py +159 -0
- fuaran_ui-0.7.0/src/fuaran_ui/renderer/theme.py +263 -0
- fuaran_ui-0.7.0/src/fuaran_ui/result.py +71 -0
- fuaran_ui-0.7.0/src/fuaran_ui/runtime/__init__.py +22 -0
- fuaran_ui-0.7.0/src/fuaran_ui/runtime/runtime.py +259 -0
- fuaran_ui-0.7.0/src/fuaran_ui/runtime/sample.py +57 -0
- fuaran_ui-0.7.0/src/fuaran_ui/schema/__init__.py +15 -0
- fuaran_ui-0.7.0/src/fuaran_ui/schema/decode.py +4406 -0
- fuaran_ui-0.7.0/src/fuaran_ui/schema/encode.py +11 -0
- fuaran_ui-0.7.0/src/fuaran_ui/schema/types.py +4007 -0
- fuaran_ui-0.7.0/src/fuaran_ui/shapeguard.py +315 -0
- fuaran_ui-0.7.0/src/fuaran_ui/style_observer/__init__.py +129 -0
- fuaran_ui-0.7.0/src/fuaran_ui/style_observer/color.py +91 -0
- fuaran_ui-0.7.0/src/fuaran_ui/style_observer/flags.py +326 -0
- fuaran_ui-0.7.0/src/fuaran_ui/style_observer/manifest_flags.py +108 -0
- fuaran_ui-0.7.0/src/fuaran_ui/style_observer/observer.py +334 -0
- fuaran_ui-0.7.0/src/fuaran_ui/teleport.py +263 -0
- fuaran_ui-0.7.0/src/fuaran_ui/theme_manifest/__init__.py +91 -0
- fuaran_ui-0.7.0/src/fuaran_ui/theme_manifest/decode.py +174 -0
- fuaran_ui-0.7.0/src/fuaran_ui/theme_manifest/manifest.py +184 -0
- fuaran_ui-0.7.0/src/fuaran_ui/theme_manifest/project.py +173 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ui/__init__.py +1663 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ui/capability.py +242 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ui/compute.py +759 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ui/controls.py +313 -0
- fuaran_ui-0.7.0/src/fuaran_ui/ui/quick.py +381 -0
- fuaran_ui-0.7.0/src/fuaran_ui/validator/__init__.py +7 -0
- fuaran_ui-0.7.0/src/fuaran_ui/validator/validate.py +780 -0
- fuaran_ui-0.7.0/tests/_corpus.py +147 -0
- fuaran_ui-0.7.0/tests/_reference_host.py +139 -0
- fuaran_ui-0.7.0/tests/fixtures/cli_parity/contract.json +95 -0
- fuaran_ui-0.7.0/tests/fixtures/cli_parity/missing-kind.json +1 -0
- fuaran_ui-0.7.0/tests/fixtures/cli_parity/not-json.json +1 -0
- fuaran_ui-0.7.0/tests/fixtures/cli_parity/valid-node.json +1 -0
- fuaran_ui-0.7.0/tests/fixtures/dataframe_parity.json +1 -0
- fuaran_ui-0.7.0/tests/test_action_cases.py +62 -0
- fuaran_ui-0.7.0/tests/test_active_index_omit_default.py +84 -0
- fuaran_ui-0.7.0/tests/test_ai_tools.py +179 -0
- fuaran_ui-0.7.0/tests/test_authoring_toggle_now_selection.py +158 -0
- fuaran_ui-0.7.0/tests/test_bare_state_source.py +75 -0
- fuaran_ui-0.7.0/tests/test_bindings_actions.py +402 -0
- fuaran_ui-0.7.0/tests/test_bridge.py +91 -0
- fuaran_ui-0.7.0/tests/test_browser_style_observer.py +80 -0
- fuaran_ui-0.7.0/tests/test_canonical_numbers.py +48 -0
- fuaran_ui-0.7.0/tests/test_capability_seam.py +118 -0
- fuaran_ui-0.7.0/tests/test_chart_lowering.py +940 -0
- fuaran_ui-0.7.0/tests/test_cli.py +211 -0
- fuaran_ui-0.7.0/tests/test_cli_parity.py +178 -0
- fuaran_ui-0.7.0/tests/test_client.py +517 -0
- fuaran_ui-0.7.0/tests/test_client_mock_endpoint.py +132 -0
- fuaran_ui-0.7.0/tests/test_compute.py +417 -0
- fuaran_ui-0.7.0/tests/test_compute_authoring.py +123 -0
- fuaran_ui-0.7.0/tests/test_controls.py +309 -0
- fuaran_ui-0.7.0/tests/test_corpus_sentinel.py +220 -0
- fuaran_ui-0.7.0/tests/test_corpus_sync.py +119 -0
- fuaran_ui-0.7.0/tests/test_dag_roundtrip.py +174 -0
- fuaran_ui-0.7.0/tests/test_dataframe_parity.py +72 -0
- fuaran_ui-0.7.0/tests/test_decode_determinism.py +321 -0
- fuaran_ui-0.7.0/tests/test_decoder_fuzz.py +202 -0
- fuaran_ui-0.7.0/tests/test_diff.py +365 -0
- fuaran_ui-0.7.0/tests/test_diff_golden.py +116 -0
- fuaran_ui-0.7.0/tests/test_document_bytes.py +106 -0
- fuaran_ui-0.7.0/tests/test_egress_policy.py +494 -0
- fuaran_ui-0.7.0/tests/test_elicitation.py +115 -0
- fuaran_ui-0.7.0/tests/test_emission_grammar.py +214 -0
- fuaran_ui-0.7.0/tests/test_envelope.py +93 -0
- fuaran_ui-0.7.0/tests/test_fastapi_host.py +194 -0
- fuaran_ui-0.7.0/tests/test_fastapi_spend_guards.py +179 -0
- fuaran_ui-0.7.0/tests/test_field_rule.py +323 -0
- fuaran_ui-0.7.0/tests/test_field_widening.py +524 -0
- fuaran_ui-0.7.0/tests/test_function.py +159 -0
- fuaran_ui-0.7.0/tests/test_fuzz_exchange.py +168 -0
- fuaran_ui-0.7.0/tests/test_generative_parity.py +234 -0
- fuaran_ui-0.7.0/tests/test_host_capability_manifest.py +236 -0
- fuaran_ui-0.7.0/tests/test_isnull_evaluation.py +116 -0
- fuaran_ui-0.7.0/tests/test_kind_set.py +125 -0
- fuaran_ui-0.7.0/tests/test_layout_observer.py +162 -0
- fuaran_ui-0.7.0/tests/test_lenient.py +32 -0
- fuaran_ui-0.7.0/tests/test_limits.py +176 -0
- fuaran_ui-0.7.0/tests/test_list_params.py +429 -0
- fuaran_ui-0.7.0/tests/test_local_wire.py +160 -0
- fuaran_ui-0.7.0/tests/test_manifest_flags.py +135 -0
- fuaran_ui-0.7.0/tests/test_markdown_corpus.py +176 -0
- fuaran_ui-0.7.0/tests/test_masonry_layout.py +119 -0
- fuaran_ui-0.7.0/tests/test_merge_conformance.py +207 -0
- fuaran_ui-0.7.0/tests/test_merge_primacy.py +207 -0
- fuaran_ui-0.7.0/tests/test_node_child_routing.py +105 -0
- fuaran_ui-0.7.0/tests/test_node_envelope_members.py +109 -0
- fuaran_ui-0.7.0/tests/test_node_kinds_drawing_fact_mount.py +285 -0
- fuaran_ui-0.7.0/tests/test_notebook_display.py +356 -0
- fuaran_ui-0.7.0/tests/test_op_stream.py +602 -0
- fuaran_ui-0.7.0/tests/test_ops_apply.py +451 -0
- fuaran_ui-0.7.0/tests/test_packaging_contract.py +37 -0
- fuaran_ui-0.7.0/tests/test_placement.py +777 -0
- fuaran_ui-0.7.0/tests/test_projections.py +441 -0
- fuaran_ui-0.7.0/tests/test_reject.py +20 -0
- fuaran_ui-0.7.0/tests/test_render_a11y_corpus.py +154 -0
- fuaran_ui-0.7.0/tests/test_render_a11y_placement.py +88 -0
- fuaran_ui-0.7.0/tests/test_render_a11y_projection.py +125 -0
- fuaran_ui-0.7.0/tests/test_render_conditional_visibility.py +133 -0
- fuaran_ui-0.7.0/tests/test_render_fidelity.py +143 -0
- fuaran_ui-0.7.0/tests/test_render_obligations.py +1132 -0
- fuaran_ui-0.7.0/tests/test_render_parity.py +345 -0
- fuaran_ui-0.7.0/tests/test_render_sanitize.py +228 -0
- fuaran_ui-0.7.0/tests/test_render_text_corpus.py +225 -0
- fuaran_ui-0.7.0/tests/test_render_tooltip.py +193 -0
- fuaran_ui-0.7.0/tests/test_renderer.py +395 -0
- fuaran_ui-0.7.0/tests/test_retired_position.py +68 -0
- fuaran_ui-0.7.0/tests/test_roundtrip.py +24 -0
- fuaran_ui-0.7.0/tests/test_runtime.py +146 -0
- fuaran_ui-0.7.0/tests/test_sanitization_corpus.py +137 -0
- fuaran_ui-0.7.0/tests/test_scalar_compute_parity.py +174 -0
- fuaran_ui-0.7.0/tests/test_schema_conformance.py +75 -0
- fuaran_ui-0.7.0/tests/test_sparkline_lowering.py +204 -0
- fuaran_ui-0.7.0/tests/test_stacked_omit_default.py +74 -0
- fuaran_ui-0.7.0/tests/test_state_seeding.py +220 -0
- fuaran_ui-0.7.0/tests/test_style_observer.py +219 -0
- fuaran_ui-0.7.0/tests/test_style_observer_corpus.py +176 -0
- fuaran_ui-0.7.0/tests/test_tabs_stepper_typed_spec.py +140 -0
- fuaran_ui-0.7.0/tests/test_teleport.py +131 -0
- fuaran_ui-0.7.0/tests/test_theme_manifest.py +118 -0
- fuaran_ui-0.7.0/tests/test_toned_pill.py +160 -0
- fuaran_ui-0.7.0/tests/test_trend_polarity.py +248 -0
- fuaran_ui-0.7.0/tests/test_ui_authoring.py +2346 -0
- fuaran_ui-0.7.0/tests/test_ui_quick.py +277 -0
- fuaran_ui-0.7.0/tests/test_validator.py +280 -0
- fuaran_ui-0.7.0/tests/test_validator_coverage.py +83 -0
- fuaran_ui-0.7.0/validator-coverage.json +42 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Pin canonical text-file line endings to LF.
|
|
2
|
+
#
|
|
3
|
+
# `text=auto` lets git detect text vs. binary; `eol=lf` pins the
|
|
4
|
+
# canonical in-repo line ending. On a Windows checkout, files stay LF
|
|
5
|
+
# on disk (no autocrlf round-trip churn), eliminating the recurring
|
|
6
|
+
# "LF will be replaced by CRLF the next time Git touches it" warnings
|
|
7
|
+
# and phantom "modified" churn on tool-regenerated files.
|
|
8
|
+
|
|
9
|
+
* text=auto eol=lf
|
|
10
|
+
|
|
11
|
+
# Explicit binary types — git's auto-detection is usually correct
|
|
12
|
+
# but spell out the common ones to be safe.
|
|
13
|
+
*.png binary
|
|
14
|
+
*.jpg binary
|
|
15
|
+
*.jpeg binary
|
|
16
|
+
*.gif binary
|
|
17
|
+
*.ico binary
|
|
18
|
+
*.svg binary
|
|
19
|
+
*.dll binary
|
|
20
|
+
*.exe binary
|
|
21
|
+
*.pdb binary
|
|
22
|
+
*.nupkg binary
|
|
23
|
+
*.snupkg binary
|
|
24
|
+
*.zip binary
|
|
25
|
+
*.tar binary
|
|
26
|
+
*.gz binary
|
|
27
|
+
*.pdf binary
|
|
28
|
+
*.woff binary
|
|
29
|
+
*.woff2 binary
|
|
30
|
+
*.ttf binary
|
|
31
|
+
*.eot binary
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Dependabot — the other half of SHA-pinning a GitHub Action.
|
|
2
|
+
#
|
|
3
|
+
# A digest pin removes the "a moved tag silently changed the credential-bearing
|
|
4
|
+
# code in my publish job" hazard, and replaces it with "the pin is now frozen at
|
|
5
|
+
# whatever was current the day it was written". This config is what keeps the
|
|
6
|
+
# second from becoming permanent: Dependabot proposes each bump as a reviewable
|
|
7
|
+
# PR carrying the new digest and the release notes behind it, so an upgrade is a
|
|
8
|
+
# decision somebody made rather than one that happened.
|
|
9
|
+
#
|
|
10
|
+
# Scope is `github-actions` only. The language ecosystems in this repository are
|
|
11
|
+
# pinned and reviewed through their own lockfiles/props and are deliberately not
|
|
12
|
+
# on Dependabot's schedule here.
|
|
13
|
+
version: 2
|
|
14
|
+
updates:
|
|
15
|
+
- package-ecosystem: github-actions
|
|
16
|
+
directory: "/"
|
|
17
|
+
schedule:
|
|
18
|
+
interval: monthly
|
|
19
|
+
open-pull-requests-limit: 5
|
|
20
|
+
commit-message:
|
|
21
|
+
prefix: ci
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Build, test and wire-format conformance gate for the Python host.
|
|
2
|
+
#
|
|
3
|
+
# ── Layout ───────────────────────────────────────────────────────────────────
|
|
4
|
+
# The conformance corpus is its own public repository. The test suite resolves
|
|
5
|
+
# it as a SIBLING of this repo root (tests/_corpus.py walks to
|
|
6
|
+
# `<container>/wire-format-fixtures`), so this repo is checked out into a
|
|
7
|
+
# subdirectory and the corpus beside it:
|
|
8
|
+
#
|
|
9
|
+
# $GITHUB_WORKSPACE/
|
|
10
|
+
# ├── fuaran-py/ ← this repo
|
|
11
|
+
# └── wire-format-fixtures/ ← the corpus (fuaran-ui/fuaran-ui-specification)
|
|
12
|
+
#
|
|
13
|
+
# The corpus repository is PUBLIC, so the checkout is anonymous — no token.
|
|
14
|
+
#
|
|
15
|
+
# ── Why the corpus assertion below is not optional ───────────────────────────
|
|
16
|
+
# When the corpus is absent, tests/_corpus.py does NOT fail — it silently falls
|
|
17
|
+
# back to the committed offline snapshot under conformance/corpus/. A layout
|
|
18
|
+
# drift would therefore leave the suite certifying against a stale local copy of
|
|
19
|
+
# the spec while the job stayed green, which is the one failure mode a
|
|
20
|
+
# conformance gate must never have. The assertion turns that into a hard stop.
|
|
21
|
+
|
|
22
|
+
name: CI
|
|
23
|
+
|
|
24
|
+
on:
|
|
25
|
+
push:
|
|
26
|
+
branches: [main]
|
|
27
|
+
pull_request:
|
|
28
|
+
branches: [main]
|
|
29
|
+
|
|
30
|
+
permissions:
|
|
31
|
+
contents: read
|
|
32
|
+
|
|
33
|
+
env:
|
|
34
|
+
# ── QUARANTINE ──────────────────────────────────────────────────────────────────────────
|
|
35
|
+
# Cases that fail on a clean tree are excluded from the blocking gate here, so
|
|
36
|
+
# that a NEW regression is caught while known drift stays visible. An entry is
|
|
37
|
+
# not a judgement that a case is wrong — it is a record of known, understood,
|
|
38
|
+
# outstanding work, and the list SHRINKS TO EMPTY as the decoder catches up.
|
|
39
|
+
# Delete entries as they start passing; do not add to it to make a red build
|
|
40
|
+
# green without a root-cause note — a new failure here is the regression this
|
|
41
|
+
# gate exists to catch.
|
|
42
|
+
#
|
|
43
|
+
# EMPTY as of 2026-08-13: the Toggle/Now/Switch vocabulary landed
|
|
44
|
+
# (3ac3c87/8e9fac3), the offline corpus snapshot was re-synced (392abd6), and
|
|
45
|
+
# every formerly quarantined case passes against the current corpus —
|
|
46
|
+
# verified by the full suite at 1627 passed with zero deselections AND each
|
|
47
|
+
# former entry re-run by node ID (24 passed). The machinery stays armed; a
|
|
48
|
+
# future corpus advance repopulates the list the same way.
|
|
49
|
+
QUARANTINE: ""
|
|
50
|
+
|
|
51
|
+
jobs:
|
|
52
|
+
build:
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
strategy:
|
|
55
|
+
fail-fast: false
|
|
56
|
+
matrix:
|
|
57
|
+
# 3.12 is the declared floor (pyproject requires-python); 3.13 stays as the
|
|
58
|
+
# workspace's own interpreter. Both must pass, or the floor is a claim.
|
|
59
|
+
python-version: ['3.12', '3.13']
|
|
60
|
+
# The `live-host` extra carries what `samples/fastapi-host/` needs to be
|
|
61
|
+
# TESTED. Both rows are needed and they prove different things: with the
|
|
62
|
+
# extra, `tests/test_fastapi_host.py` gates — the sample's credential
|
|
63
|
+
# containment is asserted rather than assumed; without it, the suite is
|
|
64
|
+
# proven to skip CLEANLY, which is what lets `fuaran-ui` claim to be
|
|
65
|
+
# dependency-light. Before this axis existed only the second arrangement
|
|
66
|
+
# ever ran, so the sample's tests skipped on every run in a green job.
|
|
67
|
+
extras: ['dev', 'dev,live-host']
|
|
68
|
+
name: "Test (py${{ matrix.python-version }}, ${{ matrix.extras }})"
|
|
69
|
+
defaults:
|
|
70
|
+
run:
|
|
71
|
+
working-directory: fuaran-py
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v4
|
|
74
|
+
with:
|
|
75
|
+
path: fuaran-py
|
|
76
|
+
|
|
77
|
+
# Deliberately UNPINNED: the corpus is the shared conformance authority
|
|
78
|
+
# every host certifies against, and one current spec for all hosts is the
|
|
79
|
+
# point of giving it a single home. Pinning here would let this host drift
|
|
80
|
+
# from the spec without anything going red.
|
|
81
|
+
- name: Check out the wire-format conformance corpus
|
|
82
|
+
uses: actions/checkout@v4
|
|
83
|
+
with:
|
|
84
|
+
repository: fuaran-ui/fuaran-ui-specification
|
|
85
|
+
path: wire-format-fixtures
|
|
86
|
+
# Full history, because the drift step below measures the DISTANCE
|
|
87
|
+
# between the committed snapshot's recorded commit and this HEAD. The
|
|
88
|
+
# default depth of 1 holds HEAD and nothing else, under which that
|
|
89
|
+
# distance is unmeasurable — the check would report "unknown" on every
|
|
90
|
+
# run and the number the report exists to give would never appear.
|
|
91
|
+
fetch-depth: 0
|
|
92
|
+
|
|
93
|
+
- name: Assert the corpus is where the tests resolve it
|
|
94
|
+
run: test -f ../wire-format-fixtures/manifest.json
|
|
95
|
+
|
|
96
|
+
# ── The reference host, for the render-parity oracles ────────────────────
|
|
97
|
+
# The class-vocabulary parity lock and the reference-stylesheet byte-copy
|
|
98
|
+
# check read the F# reference host's own sources. Before this step those
|
|
99
|
+
# oracles SKIPPED here — this job was a single-host checkout, which is the
|
|
100
|
+
# one shape in which skipping is honest, and the note further down said so
|
|
101
|
+
# at length. Honest is not the same as useful: the drift they exist to
|
|
102
|
+
# catch was therefore visible only on a maintainer's workspace checkout,
|
|
103
|
+
# so a stale oracle looked valid everywhere a machine actually ran it, and
|
|
104
|
+
# the one that mattered had gone vacuous for months.
|
|
105
|
+
#
|
|
106
|
+
# Sparse: only the renderer projects are read (the vocabulary derivation
|
|
107
|
+
# globs `src/Fuaran.UI.Renderer*`, and the stylesheet lives under one of
|
|
108
|
+
# them), so the checkout stays small. The repo is PUBLIC — anonymous, no
|
|
109
|
+
# token — and deliberately UNPINNED, for the reason the corpus checkout
|
|
110
|
+
# above gives: pinning would let this host drift from the reference
|
|
111
|
+
# without anything going red.
|
|
112
|
+
- name: Check out the F# reference host (render-parity oracles)
|
|
113
|
+
uses: actions/checkout@v4
|
|
114
|
+
with:
|
|
115
|
+
repository: fuaran-ui/fuaran-dotnet
|
|
116
|
+
path: fuaran-dotnet
|
|
117
|
+
sparse-checkout: src/Fuaran.UI.Renderer*
|
|
118
|
+
sparse-checkout-cone-mode: false
|
|
119
|
+
|
|
120
|
+
- name: Assert the reference host is where the oracles resolve it
|
|
121
|
+
run: test -d ../fuaran-dotnet/src/Fuaran.UI.Renderer.Core
|
|
122
|
+
|
|
123
|
+
- uses: actions/setup-python@v5
|
|
124
|
+
with:
|
|
125
|
+
python-version: ${{ matrix.python-version }}
|
|
126
|
+
|
|
127
|
+
# Non-blocking, on every push: how far the committed offline snapshot
|
|
128
|
+
# (conformance/corpus/, and the authority commit it records in
|
|
129
|
+
# snapshot.json) has fallen behind the authority at HEAD.
|
|
130
|
+
#
|
|
131
|
+
# It is a WARN and not a gate on purpose. A snapshot lagging the authority
|
|
132
|
+
# is not by itself a defect — the suite certifies against the AUTHORITY
|
|
133
|
+
# here, so a lagging snapshot changes nothing about what this run proved,
|
|
134
|
+
# and reddening main for it would train people to ignore it. What it does
|
|
135
|
+
# is make the distance visible before the release gesture, where the same
|
|
136
|
+
# check IS a refusal (publish-pypi.yml). The first v0.1.0 tag failed its
|
|
137
|
+
# gated test_corpus_sync because the authority had moved twice after CI
|
|
138
|
+
# passed on that head, and nothing between the two runs said so.
|
|
139
|
+
#
|
|
140
|
+
# Needs no install: the check is standard library plus git.
|
|
141
|
+
- name: Corpus snapshot drift (reported, non-blocking)
|
|
142
|
+
continue-on-error: true
|
|
143
|
+
run: |
|
|
144
|
+
set +e
|
|
145
|
+
python conformance/sync_corpus.py --check 2>&1 | tee corpus-drift.log
|
|
146
|
+
status=${PIPESTATUS[0]}
|
|
147
|
+
{
|
|
148
|
+
echo "### Corpus snapshot vs the authority"
|
|
149
|
+
echo
|
|
150
|
+
echo '```'
|
|
151
|
+
cat corpus-drift.log
|
|
152
|
+
echo '```'
|
|
153
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
154
|
+
exit $status
|
|
155
|
+
|
|
156
|
+
- name: Install
|
|
157
|
+
run: |
|
|
158
|
+
python -m pip install --upgrade pip
|
|
159
|
+
python -m pip install ".[${{ matrix.extras }}]"
|
|
160
|
+
|
|
161
|
+
- name: Lint (ruff check)
|
|
162
|
+
run: python -m ruff check .
|
|
163
|
+
|
|
164
|
+
- name: Format check (ruff format)
|
|
165
|
+
run: python -m ruff format --check .
|
|
166
|
+
|
|
167
|
+
- name: Type check (mypy)
|
|
168
|
+
run: python -m mypy
|
|
169
|
+
|
|
170
|
+
# Print what this gate does NOT cover, on every run. A cap nobody can see
|
|
171
|
+
# reads as "covered everything".
|
|
172
|
+
- name: Report the conformance quarantine
|
|
173
|
+
run: |
|
|
174
|
+
if [ -n "$QUARANTINE" ]; then
|
|
175
|
+
echo "The blocking gate below EXCLUDES these known-failing cases:"
|
|
176
|
+
echo "$QUARANTINE" | tr ' ' '\n' | grep -v '^--deselect$' | sed 's/^/ - /'
|
|
177
|
+
else
|
|
178
|
+
echo "Quarantine EMPTY — the blocking gate covers the full conformance suite."
|
|
179
|
+
fi
|
|
180
|
+
echo
|
|
181
|
+
echo "ALSO NOT GATED HERE — inert rather than quarantined (see the skip"
|
|
182
|
+
echo "summary that -rs prints under each test run below):"
|
|
183
|
+
echo " - NOTHING, on the reference-renderer parity axis, as of Phase 1654."
|
|
184
|
+
echo " This job now checks the F# reference host out beside the corpus, so"
|
|
185
|
+
echo " the class-vocabulary parity lock and the stylesheet byte-copy check"
|
|
186
|
+
echo " GATE here rather than skipping. They used to skip, honestly and"
|
|
187
|
+
echo " uselessly: this was a single-host checkout, which is the one shape in"
|
|
188
|
+
echo " which skipping is right, and the consequence was that the oracle ran"
|
|
189
|
+
echo " only on a maintainer's workspace checkout. It had been VACUOUS for"
|
|
190
|
+
echo " months when that was finally measured — admitting every possible"
|
|
191
|
+
echo " class through one over-broad prefix extracted from a doc comment —"
|
|
192
|
+
echo " and no run anywhere would have said so."
|
|
193
|
+
echo " - the FastAPI sample-host tests, on the rows that install [dev] ALONE."
|
|
194
|
+
echo " fastapi is a sample-only dependency, so the skip there is honest and is"
|
|
195
|
+
echo " itself the evidence that this package is dependency-light. The [dev,live-host]"
|
|
196
|
+
echo " rows install it and those tests GATE — read the matrix row name to know"
|
|
197
|
+
echo " which arrangement this run is."
|
|
198
|
+
{
|
|
199
|
+
echo "### Conformance quarantine (excluded from the blocking gate)"
|
|
200
|
+
echo
|
|
201
|
+
if [ -n "$QUARANTINE" ]; then
|
|
202
|
+
echo '```'
|
|
203
|
+
echo "$QUARANTINE" | tr ' ' '\n' | grep -v '^--deselect$'
|
|
204
|
+
echo '```'
|
|
205
|
+
else
|
|
206
|
+
echo "Empty — the blocking gate covers the full conformance suite."
|
|
207
|
+
fi
|
|
208
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
209
|
+
|
|
210
|
+
# Non-blocking: runs the FULL suite so the size of the existing drift is
|
|
211
|
+
# measured on every run rather than inferred from the quarantine list.
|
|
212
|
+
- name: Conformance drift (reported, non-blocking)
|
|
213
|
+
continue-on-error: true
|
|
214
|
+
run: |
|
|
215
|
+
set +e
|
|
216
|
+
python -m pytest -q -rs > drift.log 2>&1
|
|
217
|
+
status=$?
|
|
218
|
+
tail -40 drift.log
|
|
219
|
+
{
|
|
220
|
+
echo "### Full suite, including quarantined cases (non-blocking)"
|
|
221
|
+
echo
|
|
222
|
+
echo '```'
|
|
223
|
+
grep -E '^[0-9]+ (failed|passed)|failed,|passed,' drift.log | tail -3
|
|
224
|
+
echo '```'
|
|
225
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
226
|
+
exit 0
|
|
227
|
+
|
|
228
|
+
# THE GATE. Everything the suite currently passes, including every
|
|
229
|
+
# conformance case outside the quarantine above.
|
|
230
|
+
- name: Test (gated)
|
|
231
|
+
run: python -m pytest -q -rs $QUARANTINE
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Publish the BARE-NAME PLACEHOLDER distribution `fuaran` to PyPI, via Trusted Publishing.
|
|
2
|
+
#
|
|
3
|
+
# This is not the host. The host is `fuaran-ui`, published by `publish-pypi.yml` from the same
|
|
4
|
+
# repository on a `v*` tag. This workflow publishes `placeholder/` — a package that exports
|
|
5
|
+
# nothing and never will — so the unqualified name `fuaran` cannot be taken by an unrelated
|
|
6
|
+
# project and mistaken for the Python host. Same posture as the unscoped npm name `fuaran` and
|
|
7
|
+
# the bare `fuaran` crate.
|
|
8
|
+
#
|
|
9
|
+
# Trigger: a `placeholder-v*` tag ONLY. That prefix is deliberate and load-bearing: the host's
|
|
10
|
+
# workflow triggers on `v*`, which matches tags BEGINNING with `v`, so `placeholder-v0.0.0`
|
|
11
|
+
# reaches this workflow and never that one. Do not "tidy" the prefix to `v*`.
|
|
12
|
+
#
|
|
13
|
+
# Prerequisites (one-time, on pypi.org, operator only): register a PENDING PUBLISHER for project
|
|
14
|
+
# `fuaran` — owner `fuaran-ui`, repository `fuaran-py`, workflow `publish-pypi-placeholder.yml`,
|
|
15
|
+
# environment `pypi`. It is a SEPARATE registration from the `fuaran-ui` one: a
|
|
16
|
+
# trusted-publisher policy is scoped to a project name.
|
|
17
|
+
#
|
|
18
|
+
# PEP 541 tolerates a held name that points somewhere real and refuses an empty squat, so
|
|
19
|
+
# `placeholder/README.md` is part of what makes this publishable rather than decoration — it
|
|
20
|
+
# names the real distribution, the import, the repository and the docs.
|
|
21
|
+
name: publish-pypi-placeholder
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
push:
|
|
25
|
+
tags: ["placeholder-v*"]
|
|
26
|
+
|
|
27
|
+
permissions:
|
|
28
|
+
contents: read
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
build:
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
defaults:
|
|
34
|
+
run:
|
|
35
|
+
working-directory: placeholder
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v4
|
|
38
|
+
- uses: actions/setup-python@v5
|
|
39
|
+
with:
|
|
40
|
+
python-version: "3.13"
|
|
41
|
+
|
|
42
|
+
# The tag must equal the placeholder's own version, for the reason the host's workflow
|
|
43
|
+
# states: a mistyped tag must not publish a mismatched release.
|
|
44
|
+
- name: Version gate — tag must equal placeholder/pyproject.toml
|
|
45
|
+
run: |
|
|
46
|
+
set -euo pipefail
|
|
47
|
+
tag="${GITHUB_REF_NAME#placeholder-v}"
|
|
48
|
+
ver="$(python - <<'PY'
|
|
49
|
+
import tomllib
|
|
50
|
+
print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])
|
|
51
|
+
PY
|
|
52
|
+
)"
|
|
53
|
+
if [ "$tag" != "$ver" ]; then
|
|
54
|
+
echo "tag placeholder-v$tag does not match placeholder version $ver" >&2
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# The only assertion worth making about this package: that it exports nothing. A
|
|
59
|
+
# placeholder that grew an API would be a different thing under the same held name.
|
|
60
|
+
- name: Assert the package is empty
|
|
61
|
+
run: |
|
|
62
|
+
set -euo pipefail
|
|
63
|
+
python -c "import sys; sys.path.insert(0, 'src'); import fuaran; assert fuaran.__all__ == [], fuaran.__all__"
|
|
64
|
+
|
|
65
|
+
- name: Build sdist + wheel
|
|
66
|
+
run: |
|
|
67
|
+
python -m pip install --upgrade pip build
|
|
68
|
+
python -m build
|
|
69
|
+
- uses: actions/upload-artifact@v4
|
|
70
|
+
with:
|
|
71
|
+
name: dist-placeholder
|
|
72
|
+
path: placeholder/dist/
|
|
73
|
+
if-no-files-found: error
|
|
74
|
+
|
|
75
|
+
publish:
|
|
76
|
+
needs: [build]
|
|
77
|
+
runs-on: ubuntu-latest
|
|
78
|
+
environment: pypi
|
|
79
|
+
permissions:
|
|
80
|
+
id-token: write
|
|
81
|
+
contents: read
|
|
82
|
+
steps:
|
|
83
|
+
- uses: actions/download-artifact@v4
|
|
84
|
+
with:
|
|
85
|
+
name: dist-placeholder
|
|
86
|
+
path: dist/
|
|
87
|
+
# SHA-pinned for the reason the host's workflow states: this step holds the OIDC-minted
|
|
88
|
+
# publishing identity, so a moved `release/v1` is credential-bearing code nobody reviewed.
|
|
89
|
+
# `skip-existing` is deliberately absent here too.
|
|
90
|
+
- name: Publish to PyPI (Trusted Publishing)
|
|
91
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Publish fuaran-ui to PyPI on a version tag, via PyPI Trusted Publishing (OIDC — no stored token).
|
|
2
|
+
#
|
|
3
|
+
# THE PROJECT IS `fuaran-ui`; THE REPOSITORY IS STILL `fuaran-py`. Registry names carry the
|
|
4
|
+
# domain and drop the language (`Fuaran.UI.*`, `@fuaran-ui/*`, the `fuaran-ui` crate,
|
|
5
|
+
# `io.fuaran:fuaran-ui`), while repo names stay — `fuaran-ui/fuaran-py` is disambiguated by the
|
|
6
|
+
# org, and renaming it would cost redirects, CI checkouts, corpus resolvers and `workspace.json`
|
|
7
|
+
# for no consumer-visible gain.
|
|
8
|
+
#
|
|
9
|
+
# THE `fuaran-py` PROJECT ON PYPI IS LEFT EXACTLY AS IT STANDS (operator decision, 2026-09-10).
|
|
10
|
+
# Its releases up to 0.5.0 remain downloadable and must remain so — a public demo page and three
|
|
11
|
+
# CI workflows still install them by exact version. It is never re-tagged and never published to
|
|
12
|
+
# again; there is no deprecation shim, because nothing has ever consumed it as a dependency.
|
|
13
|
+
#
|
|
14
|
+
# Trigger: a `v*` tag push only. A branch push reaches no publish job.
|
|
15
|
+
# Prerequisites (one-time, on pypi.org): register a PENDING PUBLISHER for the NEW project —
|
|
16
|
+
# project `fuaran-ui`, owner `fuaran-ui`, repository `fuaran-py`, workflow `publish-pypi.yml`,
|
|
17
|
+
# environment `pypi` — then create the `pypi` environment on this repository. The registration
|
|
18
|
+
# that named project `fuaran-py` does NOT carry over: a trusted-publisher policy is scoped to a
|
|
19
|
+
# project name, so the first `fuaran-ui` tag fails at the OIDC exchange until the new pending
|
|
20
|
+
# publisher exists. That is the right failure — loud, and before any artefact is uploaded.
|
|
21
|
+
# The tag must equal the version in pyproject.toml; the gate below refuses otherwise, so a
|
|
22
|
+
# mistyped tag never publishes a mismatched release.
|
|
23
|
+
#
|
|
24
|
+
# WHAT THIS WORKFLOW REFUSES TO PUBLISH, and why each refusal exists:
|
|
25
|
+
# * a tag whose version does not match pyproject.toml — the `build` job's version gate;
|
|
26
|
+
# * a tree whose suite is red — the `test` job below, which `publish` `needs`. Until it
|
|
27
|
+
# existed, a `v*` tag published whatever was at that commit having run no test, no lint
|
|
28
|
+
# and no type check: the ONLY gate on the released artefact was that it built. CI runs
|
|
29
|
+
# the same checks on a branch push, but a tag push is a different event on a different
|
|
30
|
+
# ref, so "CI was green on main" was never a statement about the tagged commit;
|
|
31
|
+
# * a version PyPI already serves — `skip-existing` is deliberately absent. With it, a
|
|
32
|
+
# re-tag of an already-published version exited 0 having uploaded nothing, so a release
|
|
33
|
+
# that silently did not happen was indistinguishable from one that did. Without it the
|
|
34
|
+
# run fails, by name, and the fix is to cut a new version.
|
|
35
|
+
# * a tree whose committed corpus snapshot is behind the authority — the `test` job's
|
|
36
|
+
# corpus-drift refusal, which runs FIRST and names both commits and the re-sync command.
|
|
37
|
+
# Both this workflow and CI check the corpus out at HEAD, so a snapshot that matched when
|
|
38
|
+
# CI passed can be behind it minutes later when the tag is cut; the first v0.1.0 tag failed
|
|
39
|
+
# that way, deep inside `test_corpus_sync`, and had to be withdrawn and re-cut. Refusing up
|
|
40
|
+
# front makes the failure read as what it is — a stale snapshot, not a broken host.
|
|
41
|
+
#
|
|
42
|
+
# ── THE STEP A RELEASE OFTEN NEEDS AND NOTHING ELSE ASKS FOR: the no-op re-sync ──────────
|
|
43
|
+
#
|
|
44
|
+
# The drift refusal above compares the authority COMMIT the snapshot records against the
|
|
45
|
+
# authority's HEAD, and nothing else. It is deliberately not a payload diff: the authority is
|
|
46
|
+
# a REPOSITORY, and a snapshot that cannot say which revision of it was copied cannot answer
|
|
47
|
+
# "is this current" at all — only "do these bytes happen to match today's", which is a
|
|
48
|
+
# different and weaker claim. `conformance/corpus/snapshot.json` is what carries the answer.
|
|
49
|
+
#
|
|
50
|
+
# The cost of that choice, which is real and lands on the person cutting a tag: a corpus
|
|
51
|
+
# commit touching NO bundled fixture — a README edit, a doc pointer, a change under
|
|
52
|
+
# `conformance/` or `dag/` or any path the sync does not copy — still moves the authority's
|
|
53
|
+
# HEAD, so the recorded commit no longer equals it and this job refuses, with the snapshot's
|
|
54
|
+
# payload byte-for-byte correct. The refusal is accurate ("your snapshot was taken from an
|
|
55
|
+
# older revision") and reads as alarming ("the corpus moved and you did not adopt it").
|
|
56
|
+
#
|
|
57
|
+
# So the recipe is: BEFORE cutting a `v*` tag, run
|
|
58
|
+
#
|
|
59
|
+
# python conformance/sync_corpus.py
|
|
60
|
+
#
|
|
61
|
+
# and commit whatever it writes — frequently `conformance/corpus/snapshot.json` alone. That
|
|
62
|
+
# is a legitimate, expected commit and not a workaround; it is the snapshot recording which
|
|
63
|
+
# revision of the authority it was last checked against. Run it even when you are confident
|
|
64
|
+
# no fixture changed: confirming it costs one command, and discovering it costs a withdrawn
|
|
65
|
+
# tag (the version cannot simply be re-tagged — `skip-existing` is absent above, on purpose).
|
|
66
|
+
#
|
|
67
|
+
# Do NOT "fix" this by making `--check` diff the payload instead. That would report a stale
|
|
68
|
+
# snapshot as current whenever the authority's change happened to miss the copied set, which
|
|
69
|
+
# is precisely the state a release must not be able to enter unknowingly.
|
|
70
|
+
name: publish-pypi
|
|
71
|
+
|
|
72
|
+
on:
|
|
73
|
+
push:
|
|
74
|
+
tags: ["v*"]
|
|
75
|
+
|
|
76
|
+
permissions:
|
|
77
|
+
contents: read
|
|
78
|
+
|
|
79
|
+
jobs:
|
|
80
|
+
# The gate on the TAGGED tree. Mirrors ci.yml's blocking steps — the corpus
|
|
81
|
+
# checkout it certifies against, the lint/format/type checks, and the suite —
|
|
82
|
+
# on the release interpreter. Its failure is what stops `publish` below.
|
|
83
|
+
test:
|
|
84
|
+
runs-on: ubuntu-latest
|
|
85
|
+
defaults:
|
|
86
|
+
run:
|
|
87
|
+
working-directory: fuaran-py
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v4
|
|
90
|
+
with:
|
|
91
|
+
path: fuaran-py
|
|
92
|
+
|
|
93
|
+
# Deliberately UNPINNED, for the reason ci.yml states: the corpus is the
|
|
94
|
+
# shared conformance authority and one current spec for all hosts is the
|
|
95
|
+
# point of giving it a single home.
|
|
96
|
+
- name: Check out the wire-format conformance corpus
|
|
97
|
+
uses: actions/checkout@v4
|
|
98
|
+
with:
|
|
99
|
+
repository: fuaran-ui/fuaran-ui-specification
|
|
100
|
+
path: wire-format-fixtures
|
|
101
|
+
# Full history — the refusal below reports how many commits the
|
|
102
|
+
# snapshot is behind, which the default depth of 1 cannot answer.
|
|
103
|
+
fetch-depth: 0
|
|
104
|
+
|
|
105
|
+
# Every corpus-dependent test skips when the corpus is absent, so a layout
|
|
106
|
+
# drift would retire the conformance leg and still report green. Assert it.
|
|
107
|
+
- name: Assert the corpus is where the tests resolve it
|
|
108
|
+
run: test -f ../wire-format-fixtures/manifest.json
|
|
109
|
+
|
|
110
|
+
- uses: actions/setup-python@v5
|
|
111
|
+
with:
|
|
112
|
+
python-version: "3.13"
|
|
113
|
+
|
|
114
|
+
# THE RELEASE-PATH REFUSAL, and deliberately the FIRST thing this job
|
|
115
|
+
# decides — before the install, the lint, the type check and the suite.
|
|
116
|
+
#
|
|
117
|
+
# The same check CI runs as a warning on every push is a hard refusal here,
|
|
118
|
+
# because the two workflows differ in exactly the way that matters: on a
|
|
119
|
+
# push a lagging snapshot costs nothing (the suite certifies against the
|
|
120
|
+
# authority it just checked out), while on a tag the gated
|
|
121
|
+
# `test_corpus_sync` compares the snapshot to a HEAD that may have moved
|
|
122
|
+
# since CI passed. That is not hypothetical — it is how the first v0.1.0
|
|
123
|
+
# tag failed and had to be withdrawn.
|
|
124
|
+
#
|
|
125
|
+
# Running it first is the whole point. The same staleness reached as a
|
|
126
|
+
# `test_corpus_sync` failure two minutes into pytest reads as a broken
|
|
127
|
+
# host; reached here it reads as what it is, and the message carries both
|
|
128
|
+
# commits and the one command that fixes it.
|
|
129
|
+
#
|
|
130
|
+
# Needs no install: the check is standard library plus git.
|
|
131
|
+
- name: Refuse a corpus snapshot behind the authority
|
|
132
|
+
run: python conformance/sync_corpus.py --check
|
|
133
|
+
|
|
134
|
+
- name: Install
|
|
135
|
+
run: |
|
|
136
|
+
python -m pip install --upgrade pip
|
|
137
|
+
python -m pip install ".[dev]"
|
|
138
|
+
|
|
139
|
+
- name: Lint (ruff check)
|
|
140
|
+
run: python -m ruff check .
|
|
141
|
+
|
|
142
|
+
- name: Format check (ruff format)
|
|
143
|
+
run: python -m ruff format --check .
|
|
144
|
+
|
|
145
|
+
- name: Type check (mypy)
|
|
146
|
+
run: python -m mypy
|
|
147
|
+
|
|
148
|
+
- name: Test (gated)
|
|
149
|
+
run: python -m pytest -q -rs
|
|
150
|
+
|
|
151
|
+
build:
|
|
152
|
+
runs-on: ubuntu-latest
|
|
153
|
+
steps:
|
|
154
|
+
- uses: actions/checkout@v4
|
|
155
|
+
- uses: actions/setup-python@v5
|
|
156
|
+
with:
|
|
157
|
+
python-version: "3.13"
|
|
158
|
+
- name: Version gate — tag must equal pyproject version
|
|
159
|
+
run: |
|
|
160
|
+
set -euo pipefail
|
|
161
|
+
tag="${GITHUB_REF_NAME#v}"
|
|
162
|
+
ver="$(python - <<'PY'
|
|
163
|
+
import tomllib
|
|
164
|
+
print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])
|
|
165
|
+
PY
|
|
166
|
+
)"
|
|
167
|
+
if [ "$tag" != "$ver" ]; then
|
|
168
|
+
echo "tag v$tag does not match pyproject version $ver" >&2
|
|
169
|
+
exit 1
|
|
170
|
+
fi
|
|
171
|
+
- name: Build sdist + wheel
|
|
172
|
+
run: |
|
|
173
|
+
python -m pip install --upgrade pip build
|
|
174
|
+
python -m build
|
|
175
|
+
- uses: actions/upload-artifact@v4
|
|
176
|
+
with:
|
|
177
|
+
name: dist
|
|
178
|
+
path: dist/
|
|
179
|
+
if-no-files-found: error
|
|
180
|
+
|
|
181
|
+
publish:
|
|
182
|
+
# BOTH, not just `build`: a green build says the artefact assembles, which is
|
|
183
|
+
# not a statement about whether the code in it works.
|
|
184
|
+
needs: [test, build]
|
|
185
|
+
runs-on: ubuntu-latest
|
|
186
|
+
environment: pypi
|
|
187
|
+
permissions:
|
|
188
|
+
id-token: write
|
|
189
|
+
contents: read
|
|
190
|
+
steps:
|
|
191
|
+
- uses: actions/download-artifact@v4
|
|
192
|
+
with:
|
|
193
|
+
name: dist
|
|
194
|
+
path: dist/
|
|
195
|
+
# SHA-PINNED, not tag-pinned: this step holds the OIDC-minted publishing
|
|
196
|
+
# identity, so a moved `release/v1` is credential-bearing code nobody
|
|
197
|
+
# reviewed. `# v1.14.2` records which release the digest is; Dependabot's
|
|
198
|
+
# `github-actions` schedule proposes the bumps as reviewable PRs.
|
|
199
|
+
#
|
|
200
|
+
# `skip-existing` is deliberately ABSENT — see the header. A re-tag of an
|
|
201
|
+
# already-published version must fail, not exit 0 having uploaded nothing.
|
|
202
|
+
- name: Publish to PyPI (Trusted Publishing)
|
|
203
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
|
|
9
|
+
# Virtual environments
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
env/
|
|
13
|
+
|
|
14
|
+
# Tooling caches
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.mypy_cache/
|
|
17
|
+
.ruff_cache/
|
|
18
|
+
.coverage
|
|
19
|
+
htmlcov/
|
|
20
|
+
coverage.xml
|
|
21
|
+
|
|
22
|
+
# Editors / OS
|
|
23
|
+
.vscode/
|
|
24
|
+
.idea/
|
|
25
|
+
.DS_Store
|
|
26
|
+
Thumbs.db
|
|
27
|
+
|
|
28
|
+
# The synced corpus snapshot (conformance/corpus/) IS committed — it makes
|
|
29
|
+
# fuaran-py standalone-testable offline and gives the drift guard
|
|
30
|
+
# (tests/test_corpus_sync.py) a committed baseline to pin against the authority.
|
|
31
|
+
# Re-sync + re-commit it whenever the authoritative corpus regenerates
|
|
32
|
+
# (python conformance/sync_corpus.py), per the §11 forward-coupling rule.
|