yapyon 0.5.2__tar.gz → 0.6.0.dev0__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.
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/CHANGELOG.md +123 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/MANIFEST.in +2 -0
- {yapyon-0.5.2/src/yapyon.egg-info → yapyon-0.6.0.dev0}/PKG-INFO +47 -6
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/README.md +46 -5
- yapyon-0.6.0.dev0/docs/DETAILS.md +524 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/GRAMMAR.md +232 -56
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/SPEC.md +614 -163
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/TUTORIAL.md +137 -9
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/README.md +7 -3
- yapyon-0.6.0.dev0/docs/conformance/cases/error/angle-bracket-in-a-value.meta.json +5 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/angle-bracket-in-a-value.yap +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-binding-arity.meta.json +5 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-binding-arity.yap +2 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-condition-type.meta.json +5 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-condition-type.yap +2 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-duplicate-key.meta.json +5 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-duplicate-key.yap +2 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-key-type.meta.json +5 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/comprehension-key-type.yap +2 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/merge-pipe-in-record.meta.json +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/merge-pipe-in-record.yap +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/replacement-duplicate.meta.json +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/error/replacement-duplicate.yap +2 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/30-filtered-inline-selection.expected.yap +4 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/30-filtered-inline-selection.yap +4 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/31-block-dictionary-comprehension.expected.yap +4 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/31-block-dictionary-comprehension.yap +6 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/32-multimap-comprehensions.expected.yap +7 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/32-multimap-comprehensions.yap +5 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/33-key-value-source-bindings.expected.yap +6 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/33-key-value-source-bindings.yap +4 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/34-boolean-and-comparison-expressions.expected.yap +6 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/34-boolean-and-comparison-expressions.yap +6 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/35-container-none-and-replacement.expected.yap +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/35-container-none-and-replacement.yap +6 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/36-typed-occurrence-combination.expected.yap +9 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/36-typed-occurrence-combination.yap +3 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/37-composition-grouping.expected.yap +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/37-composition-grouping.yap +2 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/38-independent-comprehension-layers.expected.yap +8 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/full/38-independent-comprehension-layers.yap +10 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/record/23-flow-multimap.expected.yap +4 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/record/23-flow-multimap.yap +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/record/24-replacement-separators.expected.yap +1 -0
- yapyon-0.6.0.dev0/docs/conformance/cases/record/24-replacement-separators.yap +5 -0
- yapyon-0.6.0.dev0/examples/comprehensions.yap +17 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/pyproject.toml +1 -1
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/__init__.py +1 -1
- yapyon-0.6.0.dev0/src/yapyon/_expressions.py +422 -0
- yapyon-0.6.0.dev0/src/yapyon/_source.py +89 -0
- yapyon-0.6.0.dev0/src/yapyon/assembly.py +353 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/emitter.py +121 -9
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/expand.py +1 -1
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/lexer.py +264 -19
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/loader.py +9 -3
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/parser.py +376 -46
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/resolver.py +94 -30
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/serializers.py +5 -5
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/tree.py +81 -35
- {yapyon-0.5.2 → yapyon-0.6.0.dev0/src/yapyon.egg-info}/PKG-INFO +47 -6
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon.egg-info/SOURCES.txt +42 -0
- yapyon-0.6.0.dev0/tests/fixtures/deferred-layer-case/agent.yap +5 -0
- yapyon-0.6.0.dev0/tests/fixtures/deferred-layer-case/base.tmpl +1 -0
- yapyon-0.6.0.dev0/tests/fixtures/deferred-layer-case/codex.tmpl +6 -0
- yapyon-0.6.0.dev0/tests/fixtures/deferred-layer-case/custom.tmpl +6 -0
- yapyon-0.6.0.dev0/tests/test_comprehensions.py +405 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_conformance_corpus.py +15 -1
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_empty_multimap.py +1 -2
- yapyon-0.6.0.dev0/tests/test_merge_source.py +1079 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_order_independence.py +7 -1
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_parser.py +4 -3
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_slot_syntax.py +1 -1
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_slots.py +1 -1
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_source.py +43 -69
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_tree.py +3 -3
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tools/run_conformance.py +12 -2
- yapyon-0.5.2/docs/DETAILS.md +0 -338
- yapyon-0.5.2/docs/conformance/cases/error/angle-bracket-in-a-value.meta.json +0 -5
- yapyon-0.5.2/docs/conformance/cases/error/angle-bracket-in-a-value.yap +0 -1
- yapyon-0.5.2/src/yapyon/_source.py +0 -163
- yapyon-0.5.2/src/yapyon/assembly.py +0 -215
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/LICENSE +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/argument-contains-the-call-site.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/argument-contains-the-call-site.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/b64-invalid-alphabet.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/b64-invalid-alphabet.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/b64-non-canonical-one-pad.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/b64-non-canonical-one-pad.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/b64-non-canonical-two-pads.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/b64-non-canonical-two-pads.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/bare-path-value.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/bare-path-value.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/bool-from-other-text.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/bool-from-other-text.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/c32-spare-bits.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/c32-spare-bits.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/cast-of-none.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/cast-of-none.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-cycle.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-cycle.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-duplicate.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-duplicate.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-in-record.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-in-record.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-metadata.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-metadata.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-not-dot.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/computed-key-not-dot.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/copy-contains-itself.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/copy-contains-itself.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/decimal-leading-zero.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/decimal-leading-zero.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/dunder-key.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/dunder-key.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/duplicate-key-after-folding.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/duplicate-key-after-folding.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/duplicate-key.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/duplicate-key.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/empty-document.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/empty-document.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/empty-key.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/empty-key.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-name-syntax.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-name-syntax.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-not-exposed.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-not-exposed.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-not-exposed.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-off-with-fallback.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-off-with-fallback.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-off-with-fallback.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-step.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-step.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-step.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-unset.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-unset.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/env-unset.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/hex-bad-symbol.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/hex-bad-symbol.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/hole-in-a-record.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/hole-in-a-record.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/int-from-float-text.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/int-from-float-text.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/int-from-text-with-a-tail.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/int-from-text-with-a-tail.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/key-not-an-identifier.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/key-not-an-identifier.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/left-of-base-column.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/left-of-base-column.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/not-a-record.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/not-a-record.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/oct-symbol-count.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/oct-symbol-count.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/parentheses-in-a-record.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/parentheses-in-a-record.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/parentheses-make-no-tuple.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/parentheses-make-no-tuple.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/quoted-key-not-name.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/quoted-key-not-name.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/safe-dot-before-a-key.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/safe-dot-before-a-key.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/serializer-on-bare-anchor.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/serializer-on-bare-anchor.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/slot-in-a-record.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/slot-in-a-record.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/slot-overrides-not-a-mapping.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/slot-overrides-not-a-mapping.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/tab-in-indent.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/tab-in-indent.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/template-in-yapyon-serializer.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/template-in-yapyon-serializer.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/toml-takes-a-table.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/toml-takes-a-table.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unbound-hole.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unbound-hole.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/undeclared-function.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/undeclared-function.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unfilled-abstract-slot.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unfilled-abstract-slot.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unfilled-slot.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unfilled-slot.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unknown-built-in.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unknown-built-in.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unknown-escape.meta.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/error/unknown-escape.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/01-splice-uses-the-value.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/01-splice-uses-the-value.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/02-nearest-wins.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/02-nearest-wins.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/03-root-is-the-escape-hatch.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/03-root-is-the-escape-hatch.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/04-a-near-uncle-beats-a-far-ancestor.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/04-a-near-uncle-beats-a-far-ancestor.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/05-parent-and-key.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/05-parent-and-key.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/06-the-dot-is-sugar-for-the-bracket.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/06-the-dot-is-sugar-for-the-bracket.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/07-indirect-key-from-a-value.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/07-indirect-key-from-a-value.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/08-negative-index-takes-pythons-meaning.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/08-negative-index-takes-pythons-meaning.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/09-multimap-list-view.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/09-multimap-list-view.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/10-chained-splice.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/10-chained-splice.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/11-serializer-json.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/11-serializer-json.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/12-serializer-toml-array-of-tables.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/12-serializer-toml-array-of-tables.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/13-serializer-yaml.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/13-serializer-yaml.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/14-serializer-on-a-sibling-through-an-anchor.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/14-serializer-on-a-sibling-through-an-anchor.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/15-serializer-yapyon.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/15-serializer-yapyon.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/16-json-records-lexemes.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/16-json-records-lexemes.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/17-multimap-in-every-format.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/17-multimap-in-every-format.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/18-toml-none.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/18-toml-none.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/19-calls.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/19-calls.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/20-a-subscript-key-written-later.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/20-a-subscript-key-written-later.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/21-environment.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/21-environment.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/21-environment.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/22-environment-not-exposed.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/22-environment-not-exposed.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/22-environment-not-exposed.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/23-environment-allowed.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/23-environment-allowed.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/23-environment-allowed.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/24-copy-keeps-the-type.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/24-copy-keeps-the-type.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/25-copy-resolves-then-copies.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/25-copy-resolves-then-copies.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/26-parentheses-group-a-literal.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/26-parentheses-group-a-literal.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/27-copy-of-a-calls-result.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/27-copy-of-a-calls-result.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/28-casters.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/28-casters.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/29-get-and-safe-calls.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/29-get-and-safe-calls.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/computed-env-key.env.json +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/computed-env-key.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/computed-env-key.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/computed-keys.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/full/computed-keys.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/01-scalars.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/01-scalars.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/02-bytes-two-spellings.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/02-bytes-two-spellings.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/03-string-quote-forms.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/03-string-quote-forms.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/04-escapes.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/04-escapes.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/05-block-vs-flow.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/05-block-vs-flow.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/06-nested-blocks.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/06-nested-blocks.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/07-empty-containers.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/07-empty-containers.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/08-number-forms.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/08-number-forms.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/09-bool-none.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/09-bool-none.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/10-unicode-values.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/10-unicode-values.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/11-keys-fold-identical.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/11-keys-fold-identical.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/12-multimap.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/12-multimap.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/13-comments-invisible.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/13-comments-invisible.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/14-key-order-pinned.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/14-key-order-pinned.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/15-raw-bytes.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/15-raw-bytes.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/16-block-strings.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/16-block-strings.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/17-indented-document.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/17-indented-document.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/18-stream-literals.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/18-stream-literals.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/19-radix-integers.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/19-radix-integers.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/20-a-single-value.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/20-a-single-value.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/21-an-empty-mapping.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/21-an-empty-mapping.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/22-the-empty-multimap.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/22-the-empty-multimap.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/quoted-keys.expected.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/docs/conformance/cases/record/quoted-keys.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/examples/bridge.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/examples/gateway.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/examples/registry.yap +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/setup.cfg +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/__main__.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/_cli.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/_digits.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/_keys.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/_wcwidth.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/_width.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/_xid.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/contract.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/environment.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/multimap.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/record.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/template.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/tier.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/typespec.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon/writers.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon.egg-info/dependency_links.txt +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon.egg-info/requires.txt +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/src/yapyon.egg-info/top_level.txt +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_as_yapyon.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_bare_calls.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_builtins.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_casters.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_cli.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_computed_keys.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_conformance.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_contracts.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_copies.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_diagnostics.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_documents.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_emitter.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_environment.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_expand.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_hole_calls.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_identifiers.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_key_integration.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_key_merges.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_key_syntax.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_lexer.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_loader.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_lookup.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_node_sources.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_numbers_streams.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_readme.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_record.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_ref_grammar.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_resolver.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_safe_calls.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_serializer_output.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_subscripts.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_tiers.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_tutorial.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tests/test_width.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tools/check_ref_grammar.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tools/gen_wcwidth_table.py +0 -0
- {yapyon-0.5.2 → yapyon-0.6.0.dev0}/tools/gen_xid_table.py +0 -0
|
@@ -9,6 +9,129 @@ before it needed `pip install yapyon --pre` to be seen.
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## 0.6.0.dev0 — Unreleased
|
|
13
|
+
|
|
14
|
+
Development prerelease targeting specification and grammar **v0.6** for
|
|
15
|
+
merge/source composition and unfinished persistence. This section records
|
|
16
|
+
unreleased work, not a publication claim.
|
|
17
|
+
|
|
18
|
+
### Changed — breaking
|
|
19
|
+
|
|
20
|
+
- **Ordinary collection merging (§15.2)** combines lists by whole typed
|
|
21
|
+
elements and multimaps by complete key/value pairs, instead of replacing
|
|
22
|
+
them wholesale. Equal items retain the greater per-input occurrence count,
|
|
23
|
+
not the sum. Earlier positions stay; incoming occurrences match the first
|
|
24
|
+
equal unmatched original earlier occurrence or append in incoming order.
|
|
25
|
+
A match takes the complete higher representation, including lexemes and
|
|
26
|
+
a dictionary item's key order/kind, without recursive member fusion.
|
|
27
|
+
Standalone and explicitly replaced collections keep authored repetitions.
|
|
28
|
+
- **Typed merge equality** distinguishes bool, int, and float: True, 1, and
|
|
29
|
+
1.0 are different items. Same-kind values ignore incidental literal spelling;
|
|
30
|
+
dictionaries compare associations independent of entry order/key kind,
|
|
31
|
+
multimaps compare ordered entry sequences, and Templates compare delivered
|
|
32
|
+
parts and hole metadata without rendering. Ordinary expression equality
|
|
33
|
+
retains its existing numeric behavior.
|
|
34
|
+
- **None yields to containers in either order**, including empty dictionaries,
|
|
35
|
+
lists, and multimaps. Compatible empty inputs yield rather than clear
|
|
36
|
+
populated collections. Other noncombining kinds take the higher whole value. Use explicit
|
|
37
|
+
field replacement to force None or an empty collection over earlier data.
|
|
38
|
+
- **Copies and calls merge by eventual value kind**, not parser-node class.
|
|
39
|
+
A deferred copy/call returning a dictionary now merges by key rather than
|
|
40
|
+
replacing an earlier dictionary wholesale; returned lists/multimaps use the
|
|
41
|
+
same collection operation as literals. Unknown kinds wait for resolution
|
|
42
|
+
without executing during merge or source saving.
|
|
43
|
+
|
|
44
|
+
### Added
|
|
45
|
+
|
|
46
|
+
- **Field replacement:** `key:= value` discards that field's earlier value,
|
|
47
|
+
including pending computation, and uses the complete incoming RHS. It is
|
|
48
|
+
not deletion or protection from later overrides. Colon and equals are
|
|
49
|
+
separate tokens, so `key : = value` is also valid; flow newlines may separate
|
|
50
|
+
them. An annotation alone does not raise the tier of otherwise literal data,
|
|
51
|
+
and direct record normalization preserves it. Same-contribution dictionary
|
|
52
|
+
duplicates remain akan; matched dictionary keys retain earlier spelling,
|
|
53
|
+
position, and name/non-name kind, without promotion.
|
|
54
|
+
- **Explicit value composition (§16.5):** `|` is the lowest-precedence value
|
|
55
|
+
operator, below logical `or`, and associates left to right across mixed block
|
|
56
|
+
and flow operands. Right grouping remains meaningful; merge is not generally
|
|
57
|
+
associative. A pipe requires at least a ledger even with literal operands.
|
|
58
|
+
The hole/call-argument reference grammar is unchanged.
|
|
59
|
+
- **Faithful unfinished-source layers (§15.8):** `Tree.to_source()` retains
|
|
60
|
+
computed-key dictionaries, comprehensions with nonempty contributions,
|
|
61
|
+
collection programs, replacement intent, lexical scopes, and meaningful
|
|
62
|
+
grouping as one parseable document. It does no lookup, environment access,
|
|
63
|
+
call, cast, serialization, comprehension iteration, template rendering,
|
|
64
|
+
or runtime duplicate comparison, and leaves the source tree unchanged.
|
|
65
|
+
- **Slot composition preserves sequential operations.** A labeled field's
|
|
66
|
+
complete dictionary RHS is one override contribution, not a sequence to
|
|
67
|
+
apply separately to a future filler. Saving may lift sequential slot
|
|
68
|
+
operations into surrounding dictionary layers. Literal empty overrides
|
|
69
|
+
mean no operation on any filler kind; a new replacement slot still fills
|
|
70
|
+
normally. Kind-dependent named-slot contributions retain a discoverable,
|
|
71
|
+
fillable slot rather than guessing its eventual kind or final collection
|
|
72
|
+
position.
|
|
73
|
+
- The former computed-key, pending replacement-boundary, and merged-dictionary-
|
|
74
|
+
comprehension save refusals are lifted where explicit layers faithfully
|
|
75
|
+
represent their state. **A completed fill's undecided historical abstract-slot
|
|
76
|
+
obligation and an unattached slot remain save-time refusals.** A later edit
|
|
77
|
+
is not retroactive fulfillment of a prior fill's own obligation. Source
|
|
78
|
+
saving remains distinct from record emission and finished-data serializers.
|
|
79
|
+
|
|
80
|
+
### Documentation
|
|
81
|
+
|
|
82
|
+
- Correct README quote-reuse guidance: a hole may use the enclosing string's
|
|
83
|
+
quote mark. Correct stale identifier-only-key and bare-call reservations
|
|
84
|
+
while retaining the narrower hole-interior postfix grammar. Extend the guide
|
|
85
|
+
and tutorial with typed merging, field replacement, meaningful grouping,
|
|
86
|
+
and save/reload continuations.
|
|
87
|
+
|
|
88
|
+
## 0.5.3 — 2026-10-25
|
|
89
|
+
|
|
90
|
+
Built to specification **v0.5**, amended with collection construction and data
|
|
91
|
+
expressions. The operator-word compatibility change is noted below.
|
|
92
|
+
|
|
93
|
+
### Compatibility
|
|
94
|
+
|
|
95
|
+
- Lowercase operator words have their expression meaning in the new value
|
|
96
|
+
grammar. In particular, `not(None)` is logical negation, not a call to a
|
|
97
|
+
declared function named `not`, as it could be in 0.5.2. Use a non-operator
|
|
98
|
+
declared name (the existing uppercase naming convention avoids collisions).
|
|
99
|
+
Ordinary keys/path segments keep these words as names; hole references
|
|
100
|
+
retain their separate §5.1 grammar.
|
|
101
|
+
|
|
102
|
+
### Added
|
|
103
|
+
|
|
104
|
+
- **Collection comprehensions (§16)** for lists, dictionaries, and multimaps,
|
|
105
|
+
in inline and block forms. One `for` clause and one optional `if`; list
|
|
106
|
+
inputs bind one item, dictionary/multimap inputs bind each key/value pair.
|
|
107
|
+
Sources and result kinds are independent. Bindings are lexical and local;
|
|
108
|
+
output is fresh typed data. Computed result keys retain exact text, dictionary
|
|
109
|
+
duplicates are akan, and multimap repeats/order are retained.
|
|
110
|
+
- **Data expressions:** comparisons, membership, `is None`/`is not None`, and
|
|
111
|
+
short-circuit boolean `and`/`or`/`not`. Conditions accept True, False, and
|
|
112
|
+
None only; None counts as false. Boolean operators return booleans, not
|
|
113
|
+
arbitrary operands. Explicit `__bool__` casting is unchanged.
|
|
114
|
+
- **Postfix operations on constructed values and call results**, including
|
|
115
|
+
`[dialect for dialect in choices if condition][0]` and `.__get__(0)` for an
|
|
116
|
+
optional first result. Evaluation remains eager; selecting the first item
|
|
117
|
+
does not hide later comprehension errors. Safe receiver chains retain
|
|
118
|
+
their boundary through postfix selection and explicit grouping.
|
|
119
|
+
- **Nonempty inline multimaps:** `{+ key: value, key: value}` uses one leading
|
|
120
|
+
marker and ordinary comma-separated pairs. Empty remains `{+}`; block
|
|
121
|
+
entries retain their individual markers. Literal inline multimaps are records.
|
|
122
|
+
- Unfinished source saving preserves comprehensions and predicates without
|
|
123
|
+
evaluating inputs, environment references, or functions. A deferred dictionary
|
|
124
|
+
comprehension merged with another nonempty dictionary contribution is refused
|
|
125
|
+
at save time because source cannot retain both layers; empty literal layers
|
|
126
|
+
remain safe. In-memory dictionaries merge normally, before retained generated
|
|
127
|
+
value bodies resolve; lists/multimaps retain whole replacement.
|
|
128
|
+
- Portable conformance cases and a complete `examples/comprehensions.yap`.
|
|
129
|
+
|
|
130
|
+
### Fixed
|
|
131
|
+
|
|
132
|
+
- A safe call on None skips its remaining arguments before evaluating them,
|
|
133
|
+
using the existing shared call path.
|
|
134
|
+
|
|
12
135
|
## 0.5.2 — 2026-10-24
|
|
13
136
|
|
|
14
137
|
Built to specification **v0.5**, amended. **No breaking changes.** Adds
|
|
@@ -7,6 +7,8 @@ include CHANGELOG.md
|
|
|
7
7
|
# specification travels for the same reason, and more so: the suite says
|
|
8
8
|
# whether an implementation agrees, docs/ say what it is meant to agree with.
|
|
9
9
|
recursive-include tests *.py
|
|
10
|
+
# Merge/source continuation acceptance uses these four unfinished documents.
|
|
11
|
+
recursive-include tests/fixtures/deferred-layer-case *.tmpl *.yap
|
|
10
12
|
recursive-include examples *.yap
|
|
11
13
|
recursive-include docs *.md
|
|
12
14
|
# The conformance cases are .yap inputs and .json sidecars, not prose, and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: yapyon
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0.dev0
|
|
4
4
|
Summary: Python-style typed literals with YAML-like block structure
|
|
5
5
|
Author-email: Jei Blanchard <jjb@bmail.club>
|
|
6
6
|
License-Expression: GPL-3.0-or-later
|
|
@@ -86,6 +86,8 @@ $ python -m yapyon expand examples/bridge.yap # a ledger in, a record out
|
|
|
86
86
|
- [Details](https://github.com/doctorjei/yapyon/blob/main/docs/DETAILS.md) — the long-form guide: every feature, the API, and the CLI
|
|
87
87
|
- [Specification](https://github.com/doctorjei/yapyon/blob/main/docs/SPEC.md) — what yapyon bytes mean (normative)
|
|
88
88
|
- [Grammar](https://github.com/doctorjei/yapyon/blob/main/docs/GRAMMAR.md) — which bytes are well-formed yapyon (normative)
|
|
89
|
+
- [Collection comprehensions](docs/DETAILS.md#collection-comprehensions) — typed list, dictionary, and multimap construction
|
|
90
|
+
- [Merging values](docs/DETAILS.md#merging-values) — composition, field replacement, and unfinished-source persistence
|
|
89
91
|
- [Conformance corpus](https://github.com/doctorjei/yapyon/tree/main/docs/conformance) — portable test cases for a second implementation
|
|
90
92
|
- [Changelog](https://github.com/doctorjei/yapyon/blob/main/CHANGELOG.md)
|
|
91
93
|
|
|
@@ -98,12 +100,49 @@ Verbose success prints `ええやん`.
|
|
|
98
100
|
|
|
99
101
|
A document is one of four kinds (discoverable via `yapyon.tier_of()`):
|
|
100
102
|
- **record**: literals only (no resolver / resolution process)
|
|
101
|
-
- **ledger**: splices
|
|
102
|
-
- **template**:
|
|
103
|
+
- **ledger**: splices, constructs and composes values, and calls built-ins; resolves internally
|
|
104
|
+
- **template**: holds slots or `yt` strings, or reads the loading process's environment
|
|
103
105
|
- **assembly**: calls functions that a **contract** declares; can be assembled from multiple files
|
|
104
106
|
|
|
105
107
|
Yapyon has no ambient scope nor includes and is built to be completely auditable / verifiable.
|
|
106
108
|
|
|
109
|
+
## Value composition and unfinished source
|
|
110
|
+
|
|
111
|
+
The **`0.6.0.dev0` development line** adds explicit composition and faithful
|
|
112
|
+
saving of unfinished layers. `|` combines complete values; `:` uses ordinary
|
|
113
|
+
combination at a field, while `:=` replaces that field's complete value:
|
|
114
|
+
|
|
115
|
+
```yapyon
|
|
116
|
+
settings:
|
|
117
|
+
paths: ["base", "shared"]
|
|
118
|
+
reset: ["old"]
|
|
119
|
+
|
|
|
120
|
+
paths: ["shared", "new", "shared"]
|
|
121
|
+
reset:= []
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Here `paths` becomes `["base", "shared", "new", "shared"]`, and `reset`
|
|
125
|
+
becomes `[]`. Dictionaries match unique keys recursively. Lists match whole
|
|
126
|
+
typed elements, and multimaps match whole key/value pairs: each equal item
|
|
127
|
+
keeps the larger count from either input, not the sum. Earlier positions
|
|
128
|
+
stay; unmatched incoming occurrences append, and matches take the complete
|
|
129
|
+
higher representation. `True`, `1`, and `1.0` are distinct for this comparison.
|
|
130
|
+
`None` yields to containers in either order; explicit `:= None` forces it.
|
|
131
|
+
Quoted/computed keys never become names through merging.
|
|
132
|
+
|
|
133
|
+
A pipe has the lowest value-operator precedence and associates left to right.
|
|
134
|
+
Grouping matters: `a | (b | c)` need not mean `a | b | c`. Block and flow
|
|
135
|
+
operands may mix. Pipes require at least a ledger, even with literal operands;
|
|
136
|
+
a replacement annotation alone can remain a record. Holes retain their
|
|
137
|
+
existing reference/call grammar, without pipes.
|
|
138
|
+
|
|
139
|
+
`Tree.to_source()` preserves unfinished expressions, contribution order,
|
|
140
|
+
replacement intent, and meaningful grouping without resolving anything.
|
|
141
|
+
Save the text and parse it again to continue filling slots and composing.
|
|
142
|
+
Historical fill obligations that still need computed-key comparisons and
|
|
143
|
+
unattached slots remain save-time refusals; see the
|
|
144
|
+
[details](docs/DETAILS.md#save-now-finish-later).
|
|
145
|
+
|
|
107
146
|
## Element References
|
|
108
147
|
|
|
109
148
|
A hole names a value. `a.b` selects a **name key**; `a["b"]` can also select a quoted or computed key. Quoted keys never become names, even when their text looks like an identifier.
|
|
@@ -128,9 +167,11 @@ mind:
|
|
|
128
167
|
| `{d[p]}` | the key *stored in* `p`, resolved in the y-string's own scope |
|
|
129
168
|
| `{mm.k}` | every value filed under `k` in a multimap, in order, as a list |
|
|
130
169
|
|
|
131
|
-
`{a["bar"]}` where a dot would do is
|
|
132
|
-
|
|
133
|
-
|
|
170
|
+
`{a["bar"]}` where a dot would do is shiran — legal, but say `{a.bar}`.
|
|
171
|
+
Either quote mark works inside a hole, including the enclosing string's own:
|
|
172
|
+
`y"{a["b"]}"` and `y"{a['b']}"` are both valid. A hole is scanned before the
|
|
173
|
+
string's closing delimiter is sought, following modern Python's quote-reuse
|
|
174
|
+
rule.
|
|
134
175
|
|
|
135
176
|
## Relative References
|
|
136
177
|
|
|
@@ -59,6 +59,8 @@ $ python -m yapyon expand examples/bridge.yap # a ledger in, a record out
|
|
|
59
59
|
- [Details](https://github.com/doctorjei/yapyon/blob/main/docs/DETAILS.md) — the long-form guide: every feature, the API, and the CLI
|
|
60
60
|
- [Specification](https://github.com/doctorjei/yapyon/blob/main/docs/SPEC.md) — what yapyon bytes mean (normative)
|
|
61
61
|
- [Grammar](https://github.com/doctorjei/yapyon/blob/main/docs/GRAMMAR.md) — which bytes are well-formed yapyon (normative)
|
|
62
|
+
- [Collection comprehensions](docs/DETAILS.md#collection-comprehensions) — typed list, dictionary, and multimap construction
|
|
63
|
+
- [Merging values](docs/DETAILS.md#merging-values) — composition, field replacement, and unfinished-source persistence
|
|
62
64
|
- [Conformance corpus](https://github.com/doctorjei/yapyon/tree/main/docs/conformance) — portable test cases for a second implementation
|
|
63
65
|
- [Changelog](https://github.com/doctorjei/yapyon/blob/main/CHANGELOG.md)
|
|
64
66
|
|
|
@@ -71,12 +73,49 @@ Verbose success prints `ええやん`.
|
|
|
71
73
|
|
|
72
74
|
A document is one of four kinds (discoverable via `yapyon.tier_of()`):
|
|
73
75
|
- **record**: literals only (no resolver / resolution process)
|
|
74
|
-
- **ledger**: splices
|
|
75
|
-
- **template**:
|
|
76
|
+
- **ledger**: splices, constructs and composes values, and calls built-ins; resolves internally
|
|
77
|
+
- **template**: holds slots or `yt` strings, or reads the loading process's environment
|
|
76
78
|
- **assembly**: calls functions that a **contract** declares; can be assembled from multiple files
|
|
77
79
|
|
|
78
80
|
Yapyon has no ambient scope nor includes and is built to be completely auditable / verifiable.
|
|
79
81
|
|
|
82
|
+
## Value composition and unfinished source
|
|
83
|
+
|
|
84
|
+
The **`0.6.0.dev0` development line** adds explicit composition and faithful
|
|
85
|
+
saving of unfinished layers. `|` combines complete values; `:` uses ordinary
|
|
86
|
+
combination at a field, while `:=` replaces that field's complete value:
|
|
87
|
+
|
|
88
|
+
```yapyon
|
|
89
|
+
settings:
|
|
90
|
+
paths: ["base", "shared"]
|
|
91
|
+
reset: ["old"]
|
|
92
|
+
|
|
|
93
|
+
paths: ["shared", "new", "shared"]
|
|
94
|
+
reset:= []
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Here `paths` becomes `["base", "shared", "new", "shared"]`, and `reset`
|
|
98
|
+
becomes `[]`. Dictionaries match unique keys recursively. Lists match whole
|
|
99
|
+
typed elements, and multimaps match whole key/value pairs: each equal item
|
|
100
|
+
keeps the larger count from either input, not the sum. Earlier positions
|
|
101
|
+
stay; unmatched incoming occurrences append, and matches take the complete
|
|
102
|
+
higher representation. `True`, `1`, and `1.0` are distinct for this comparison.
|
|
103
|
+
`None` yields to containers in either order; explicit `:= None` forces it.
|
|
104
|
+
Quoted/computed keys never become names through merging.
|
|
105
|
+
|
|
106
|
+
A pipe has the lowest value-operator precedence and associates left to right.
|
|
107
|
+
Grouping matters: `a | (b | c)` need not mean `a | b | c`. Block and flow
|
|
108
|
+
operands may mix. Pipes require at least a ledger, even with literal operands;
|
|
109
|
+
a replacement annotation alone can remain a record. Holes retain their
|
|
110
|
+
existing reference/call grammar, without pipes.
|
|
111
|
+
|
|
112
|
+
`Tree.to_source()` preserves unfinished expressions, contribution order,
|
|
113
|
+
replacement intent, and meaningful grouping without resolving anything.
|
|
114
|
+
Save the text and parse it again to continue filling slots and composing.
|
|
115
|
+
Historical fill obligations that still need computed-key comparisons and
|
|
116
|
+
unattached slots remain save-time refusals; see the
|
|
117
|
+
[details](docs/DETAILS.md#save-now-finish-later).
|
|
118
|
+
|
|
80
119
|
## Element References
|
|
81
120
|
|
|
82
121
|
A hole names a value. `a.b` selects a **name key**; `a["b"]` can also select a quoted or computed key. Quoted keys never become names, even when their text looks like an identifier.
|
|
@@ -101,9 +140,11 @@ mind:
|
|
|
101
140
|
| `{d[p]}` | the key *stored in* `p`, resolved in the y-string's own scope |
|
|
102
141
|
| `{mm.k}` | every value filed under `k` in a multimap, in order, as a list |
|
|
103
142
|
|
|
104
|
-
`{a["bar"]}` where a dot would do is
|
|
105
|
-
|
|
106
|
-
|
|
143
|
+
`{a["bar"]}` where a dot would do is shiran — legal, but say `{a.bar}`.
|
|
144
|
+
Either quote mark works inside a hole, including the enclosing string's own:
|
|
145
|
+
`y"{a["b"]}"` and `y"{a['b']}"` are both valid. A hole is scanned before the
|
|
146
|
+
string's closing delimiter is sought, following modern Python's quote-reuse
|
|
147
|
+
rule.
|
|
107
148
|
|
|
108
149
|
## Relative References
|
|
109
150
|
|