nimbus-dev-sdk 0.1.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.
- nimbus_dev_sdk-0.1.0/.gitignore +28 -0
- nimbus_dev_sdk-0.1.0/CHANGELOG.md +10 -0
- nimbus_dev_sdk-0.1.0/LICENSE +21 -0
- nimbus_dev_sdk-0.1.0/PKG-INFO +54 -0
- nimbus_dev_sdk-0.1.0/README.md +32 -0
- nimbus_dev_sdk-0.1.0/hatch_build.py +40 -0
- nimbus_dev_sdk-0.1.0/pyproject.toml +64 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/__init__.py +46 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/case.schema.json +160 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/blank-frames-dropped-mid-stream.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/blank-remainder-dropped-at-eof.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/bom-at-stream-start-ignored.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/cr-inside-frame-preserved.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/emoji-split-1-3.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/emoji-split-2-2.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/emoji-split-3-1.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/empty-stream.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-exactly-at-limit.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-one-octet-over-limit.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-split-across-three-chunks.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/frame-split-across-two-chunks.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/incomplete-sequence-at-eof.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/invalid-utf8-becomes-replacement.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/limit-counts-octets-not-characters.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/limit-violation-latches.json +17 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/lone-continuation-byte.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/pending-over-limit-without-newline.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/several-frames-in-one-chunk.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/single-frame-crlf.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/single-frame-lf.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/two-byte-sequence-split.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/unterminated-final-frame.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/cases/whitespace-only-frame-delivered.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/index.json +125 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/framing/index.schema.json +37 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/index.json +298 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/index.schema.json +82 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/invalid-missing-name.json +5 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/invalid-size-bytes-type.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-maximal.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-minimal.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-unknown-extra-key.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/item/valid-unknown-item-type.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-duplicate.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-empty.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-entry.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-contract-versions-not-array.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-hitl-required-not-array.json +14 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-hitl-required.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-many-violations.json +4 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-author.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-description.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-display-name.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-entrypoint.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-id.json +11 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-min-version.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-missing-version.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-nel-only-id.json +14 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-non-ascii-min-version.json +14 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-permission.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-permissions-not-array.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-runtime.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-short-min-version.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-two-permissions.json +16 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/invalid-whitespace-id.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/schema-only-bad-sync-interval.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-contract-versions.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-leading-space-min-version.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-maximal.json +24 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-minimal.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-prerelease-min-version.json +12 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-unknown-extra-key.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/manifest/valid-zero-width-space-id.json +14 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/case.schema.json +93 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-absent-default.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-absent-superset.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-manifest-not-array.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-match.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-order.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/declaration-superset.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-array.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-canonical.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-duplicate.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-empty-versions.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-leading-zero.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-missing-versions.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-non-ascii-digit.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-not-json.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-null.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-padded.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-reversed-members.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-unknown-member.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-versions-not-array.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/hello-wrong-message.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-disjoint.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-duplicate-member.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-empty-local.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-empty-remote.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-largest-common.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-leading-zero.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-long-major.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-non-ascii-digit.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-non-string.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-order-a.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-order-b.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-ten-beats-nine.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/cases/negotiate-v1-both.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/index.json +170 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/negotiation/index.schema.json +37 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/case.schema.json +76 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-action-id-non-string-rejected.json +9 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-array-rejected.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-diff-non-string-rejected.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-diff-null-rejected.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-diff-present-accepted.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-empty-action-id-rejected.json +9 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-empty-object-rejected.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-empty-summary-rejected.json +9 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-minimal-accepted.json +9 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-missing-action-id-rejected.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-missing-summary-rejected.json +8 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-null-rejected.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-number-rejected.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-string-rejected.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-unknown-member-accepted.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-whitespace-action-id-accepted.json +9 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/hitl-whitespace-summary-accepted.json +9 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-ascii-fold-uppercase.json +15 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-blank-names-skipped.json +22 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-description-never-inspected.json +11 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-digits-are-segment-characters.json +15 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-dotted-capital-i-is-a-separator.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-empty-surface-clean.json +6 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-every-published-segment.json +169 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-first-match-in-name-order.json +15 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-input-order-preserved.json +25 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-kelvin-sign-is-a-separator.json +15 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-metadata-surface-clean.json +16 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-non-ascii-name-clean.json +10 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-non-string-name-skipped.json +22 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-offender-attributed-to-segment.json +15 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-one-violation-per-tool.json +15 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/cases/row-data-segment-not-substring.json +13 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/index.json +170 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/predicates/index.schema.json +37 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/case.schema.json +116 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-eacces.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-ebusy.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-econnrefused-is-not-a-denial.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-eisdir-is-not-a-denial.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-enoent-is-not-a-denial.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-eperm.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-fs-no-code.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-eacces-is-not-a-block.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-econnrefused.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-econnreset-is-not-a-block.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-ehostunreach.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-enetunreach.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-eperm.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-etimedout-is-not-a-block.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/classify-network-no-code.json +7 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-empty-network-array-skips.json +20 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-empty-string-host-is-a-host.json +32 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-fs-failure-throws.json +19 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-fs-pass-is-a-failure.json +19 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-hosts-darwin-all-three.json +32 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-hosts-posix-all-three.json +32 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-hosts-win32-skips-unlisted.json +27 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-listed-blocked-is-a-failure.json +23 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-listed-failure-stops-immediately.json +23 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-no-hosts-posix-skips-both-network.json +18 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-no-hosts-win32-only-fs.json +18 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-only-first-host-probed.json +34 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-permissions-absent.json +17 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-permissions-legacy-array.json +21 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-permissions-null.json +18 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/cases/harness-unlisted-failure-stops-before-fs.json +28 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/index.json +160 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/conformance/v1/sandbox/index.schema.json +37 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/negotiation/hello.schema.json +21 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/predicates/v1/row-data-segments.json +39 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/predicates/v1/row-data-segments.schema.json +60 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/probe/v1/probe-protocol.json +72 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/probe/v1/probe-protocol.schema.json +90 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/rules/v1/manifest-rules.json +116 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/rules/v1/manifest-rules.schema.json +65 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/schemas/v1/extension-manifest.schema.json +72 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/schemas/v1/hitl-request.schema.json +24 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/_data/spec/schemas/v1/nimbus-item.schema.json +29 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/contract.py +138 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/py.typed +0 -0
- nimbus_dev_sdk-0.1.0/src/nimbus_sdk/spec.py +72 -0
- nimbus_dev_sdk-0.1.0/tests/test_contract.py +145 -0
- nimbus_dev_sdk-0.1.0/tests/test_negotiation_corpus.py +76 -0
- nimbus_dev_sdk-0.1.0/tests/test_spec.py +123 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
node_modules/
|
|
2
|
+
dist/
|
|
3
|
+
coverage/
|
|
4
|
+
sdks/python/dist/
|
|
5
|
+
*.tsbuildinfo
|
|
6
|
+
.DS_Store
|
|
7
|
+
.docs-snippets/
|
|
8
|
+
|
|
9
|
+
# Git worktrees live inside the repo tree, so without these an entire worktree
|
|
10
|
+
# shows up as untracked content and `git add -A` will happily commit it.
|
|
11
|
+
.claude/worktrees/
|
|
12
|
+
.worktrees/
|
|
13
|
+
|
|
14
|
+
# Subagent-driven-development scratch (ledger, briefs, review packages).
|
|
15
|
+
.superpowers/
|
|
16
|
+
|
|
17
|
+
# Python build and tool artefacts. Without these a plain `pytest`/`mypy`/`ruff` run
|
|
18
|
+
# leaves untracked caches behind, and `git add -A` sweeps them into a commit.
|
|
19
|
+
__pycache__/
|
|
20
|
+
*.py[cod]
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.mypy_cache/
|
|
23
|
+
.ruff_cache/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.venv/
|
|
26
|
+
|
|
27
|
+
# Copied from docs/spec/ at build time by sdks/python/hatch_build.py.
|
|
28
|
+
sdks/python/src/nimbus_sdk/_data/
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 (2026-07-30)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* publish the Python SDK to PyPI tokenlessly ([#73](https://github.com/nimbus-agent/nimbus-sdk/issues/73)) ([1b4ddce](https://github.com/nimbus-agent/nimbus-sdk/commit/1b4ddcec13fbff788be6f917b34feb80aead78d6))
|
|
9
|
+
|
|
10
|
+
## nimbus-dev-sdk — Changelog
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nimbus Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nimbus-dev-sdk
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: The MIT-licensed, dependency-free authoring contract for Nimbus connectors and extensions — Python binding.
|
|
5
|
+
Project-URL: Homepage, https://github.com/nimbus-agent/nimbus-sdk
|
|
6
|
+
Project-URL: Repository, https://github.com/nimbus-agent/nimbus-sdk
|
|
7
|
+
Project-URL: Changelog, https://github.com/nimbus-agent/nimbus-sdk/blob/main/sdks/python/CHANGELOG.md
|
|
8
|
+
Author: Nimbus
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: connector,contract,mcp,nimbus,sdk
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Typing :: Typed
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
# nimbus-dev-sdk
|
|
24
|
+
|
|
25
|
+
The MIT-licensed, dependency-free authoring contract for
|
|
26
|
+
[Nimbus](https://github.com/nimbus-agent/Nimbus) connectors and extensions — Python binding.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install nimbus-dev-sdk # note: nimbus-dev-sdk, NOT nimbus-sdk
|
|
30
|
+
```
|
|
31
|
+
```python
|
|
32
|
+
import nimbus_sdk # the import name differs from the distribution name
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
PyPI has a flat namespace and `nimbus-sdk` belongs to an unrelated project, so the
|
|
36
|
+
distribution is published as `nimbus-dev-sdk`.
|
|
37
|
+
|
|
38
|
+
## What this is
|
|
39
|
+
|
|
40
|
+
The contract is defined once, language-neutrally, in
|
|
41
|
+
[`docs/spec/`](https://github.com/nimbus-agent/nimbus-sdk/tree/main/docs/spec). This
|
|
42
|
+
package carries that specification data and binds it to Python. The
|
|
43
|
+
[TypeScript SDK](https://www.npmjs.com/package/@nimbus-dev/sdk) is the reference
|
|
44
|
+
implementation; both are held to the same conformance corpus.
|
|
45
|
+
|
|
46
|
+
## Status
|
|
47
|
+
|
|
48
|
+
Early. This release carries the contract-version constants, the negotiation algorithm,
|
|
49
|
+
and the published JSON Schemas. It is not yet the full connector-authoring surface —
|
|
50
|
+
see the [roadmap](https://github.com/nimbus-agent/nimbus-sdk/blob/main/docs/ROADMAP.md).
|
|
51
|
+
|
|
52
|
+
## License
|
|
53
|
+
|
|
54
|
+
MIT — see [LICENSE](https://github.com/nimbus-agent/nimbus-sdk/blob/main/LICENSE).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# nimbus-dev-sdk
|
|
2
|
+
|
|
3
|
+
The MIT-licensed, dependency-free authoring contract for
|
|
4
|
+
[Nimbus](https://github.com/nimbus-agent/Nimbus) connectors and extensions — Python binding.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
pip install nimbus-dev-sdk # note: nimbus-dev-sdk, NOT nimbus-sdk
|
|
8
|
+
```
|
|
9
|
+
```python
|
|
10
|
+
import nimbus_sdk # the import name differs from the distribution name
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
PyPI has a flat namespace and `nimbus-sdk` belongs to an unrelated project, so the
|
|
14
|
+
distribution is published as `nimbus-dev-sdk`.
|
|
15
|
+
|
|
16
|
+
## What this is
|
|
17
|
+
|
|
18
|
+
The contract is defined once, language-neutrally, in
|
|
19
|
+
[`docs/spec/`](https://github.com/nimbus-agent/nimbus-sdk/tree/main/docs/spec). This
|
|
20
|
+
package carries that specification data and binds it to Python. The
|
|
21
|
+
[TypeScript SDK](https://www.npmjs.com/package/@nimbus-dev/sdk) is the reference
|
|
22
|
+
implementation; both are held to the same conformance corpus.
|
|
23
|
+
|
|
24
|
+
## Status
|
|
25
|
+
|
|
26
|
+
Early. This release carries the contract-version constants, the negotiation algorithm,
|
|
27
|
+
and the published JSON Schemas. It is not yet the full connector-authoring surface —
|
|
28
|
+
see the [roadmap](https://github.com/nimbus-agent/nimbus-sdk/blob/main/docs/ROADMAP.md).
|
|
29
|
+
|
|
30
|
+
## License
|
|
31
|
+
|
|
32
|
+
MIT — see [LICENSE](https://github.com/nimbus-agent/nimbus-sdk/blob/main/LICENSE).
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Copy the language-neutral spec into the distribution at build time.
|
|
2
|
+
|
|
3
|
+
The spec lives at the repository root, outside this project directory, because it is
|
|
4
|
+
not Python's to own. Both the sdist and the wheel need it: a hook that populates only
|
|
5
|
+
the wheel produces an sdist that cannot be built from, which nobody notices until a
|
|
6
|
+
downstream packager tries.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import shutil
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
|
16
|
+
|
|
17
|
+
DATA_DIR = Path("src") / "nimbus_sdk" / "_data" / "spec"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SpecDataHook(BuildHookInterface): # type: ignore[type-arg]
|
|
21
|
+
"""Populates ``nimbus_sdk/_data/spec`` before every build target."""
|
|
22
|
+
|
|
23
|
+
PLUGIN_NAME = "spec-data"
|
|
24
|
+
|
|
25
|
+
def initialize(self, version: str, build_data: dict[str, Any]) -> None:
|
|
26
|
+
project = Path(self.root)
|
|
27
|
+
source = project.parent.parent / "docs" / "spec"
|
|
28
|
+
if not source.is_dir():
|
|
29
|
+
# An sdist already carries its own copy under src/, so a rebuild from an
|
|
30
|
+
# unpacked sdist has no repository above it and nothing to do.
|
|
31
|
+
if (project / DATA_DIR).is_dir():
|
|
32
|
+
return
|
|
33
|
+
raise RuntimeError(
|
|
34
|
+
f"spec source not found at {source} and no bundled copy present"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
target = project / DATA_DIR
|
|
38
|
+
if target.exists():
|
|
39
|
+
shutil.rmtree(target)
|
|
40
|
+
shutil.copytree(source, target, ignore=shutil.ignore_patterns("*.md"))
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling>=1.27"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "nimbus-dev-sdk"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "The MIT-licensed, dependency-free authoring contract for Nimbus connectors and extensions — Python binding."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
authors = [{ name = "Nimbus" }]
|
|
13
|
+
keywords = ["nimbus", "mcp", "connector", "sdk", "contract"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 3 - Alpha",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"License :: OSI Approved :: MIT License",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Programming Language :: Python :: 3.14",
|
|
22
|
+
"Typing :: Typed",
|
|
23
|
+
]
|
|
24
|
+
dependencies = []
|
|
25
|
+
|
|
26
|
+
[project.urls]
|
|
27
|
+
Homepage = "https://github.com/nimbus-agent/nimbus-sdk"
|
|
28
|
+
Repository = "https://github.com/nimbus-agent/nimbus-sdk"
|
|
29
|
+
Changelog = "https://github.com/nimbus-agent/nimbus-sdk/blob/main/sdks/python/CHANGELOG.md"
|
|
30
|
+
|
|
31
|
+
[tool.hatch.build.targets.wheel]
|
|
32
|
+
packages = ["src/nimbus_sdk"]
|
|
33
|
+
# Hatchling selects files by VCS: anything git ignores is excluded, and `packages`
|
|
34
|
+
# only narrows within that tracked set. `_data/` is generated at build time AND
|
|
35
|
+
# gitignored, so without this it is silently absent from the built distribution —
|
|
36
|
+
# producing a package that installs cleanly, imports fine, and carries no contract
|
|
37
|
+
# data at all. `artifacts` is the escape hatch for exactly this case.
|
|
38
|
+
artifacts = ["src/nimbus_sdk/_data/**"]
|
|
39
|
+
|
|
40
|
+
[tool.hatch.build.targets.wheel.hooks.custom]
|
|
41
|
+
path = "hatch_build.py"
|
|
42
|
+
|
|
43
|
+
[tool.hatch.build.targets.sdist]
|
|
44
|
+
include = ["src/", "tests/", "README.md", "CHANGELOG.md", "pyproject.toml", "hatch_build.py"]
|
|
45
|
+
artifacts = ["src/nimbus_sdk/_data/**"]
|
|
46
|
+
|
|
47
|
+
[tool.hatch.build.targets.sdist.hooks.custom]
|
|
48
|
+
path = "hatch_build.py"
|
|
49
|
+
|
|
50
|
+
[tool.ruff]
|
|
51
|
+
line-length = 88
|
|
52
|
+
target-version = "py311"
|
|
53
|
+
|
|
54
|
+
[tool.ruff.lint]
|
|
55
|
+
select = ["E", "F", "I", "N", "UP", "B", "A", "C4", "PT", "RUF"]
|
|
56
|
+
|
|
57
|
+
[tool.mypy]
|
|
58
|
+
python_version = "3.11"
|
|
59
|
+
strict = true
|
|
60
|
+
files = ["src", "tests", "hatch_build.py"]
|
|
61
|
+
|
|
62
|
+
[tool.pytest.ini_options]
|
|
63
|
+
testpaths = ["tests"]
|
|
64
|
+
markers = ["slow: builds a distribution and installs it into a throwaway venv"]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Nimbus SDK — the Python binding of the Nimbus authoring contract.
|
|
2
|
+
|
|
3
|
+
The contract itself is language-neutral and published under ``docs/spec/`` in the
|
|
4
|
+
`nimbus-sdk repository <https://github.com/nimbus-agent/nimbus-sdk>`_. This package
|
|
5
|
+
carries that data and binds it to Python.
|
|
6
|
+
|
|
7
|
+
Installed as ``nimbus-dev-sdk``; imported as ``nimbus_sdk``.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
13
|
+
|
|
14
|
+
from nimbus_sdk.contract import (
|
|
15
|
+
CONTRACT_HANDSHAKE_EXIT,
|
|
16
|
+
CONTRACT_VERSION_PATTERN,
|
|
17
|
+
CONTRACT_VERSIONS,
|
|
18
|
+
NegotiationOk,
|
|
19
|
+
NegotiationRefused,
|
|
20
|
+
NegotiationResult,
|
|
21
|
+
declared_versions_match,
|
|
22
|
+
manifest_contract_versions,
|
|
23
|
+
negotiate_contract_version,
|
|
24
|
+
)
|
|
25
|
+
from nimbus_sdk.spec import load_corpus, load_schema, spec_root
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
__version__ = version("nimbus-dev-sdk")
|
|
29
|
+
except PackageNotFoundError: # running from an uninstalled source tree
|
|
30
|
+
__version__ = "0.0.0+unknown"
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"CONTRACT_HANDSHAKE_EXIT",
|
|
34
|
+
"CONTRACT_VERSIONS",
|
|
35
|
+
"CONTRACT_VERSION_PATTERN",
|
|
36
|
+
"NegotiationOk",
|
|
37
|
+
"NegotiationRefused",
|
|
38
|
+
"NegotiationResult",
|
|
39
|
+
"__version__",
|
|
40
|
+
"declared_versions_match",
|
|
41
|
+
"load_corpus",
|
|
42
|
+
"load_schema",
|
|
43
|
+
"manifest_contract_versions",
|
|
44
|
+
"negotiate_contract_version",
|
|
45
|
+
"spec_root",
|
|
46
|
+
]
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/nimbus-agent/nimbus-sdk/main/docs/spec/conformance/v1/framing/case.schema.json",
|
|
4
|
+
"title": "Framing conformance case",
|
|
5
|
+
"description": "One behavioral case: a sequence of chunks pushed into a reader, and what the reader must produce for each. Unlike the document fixtures alongside this corpus, a case is a stream, not a value.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["description", "chunks", "expect"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"description": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "\\S",
|
|
13
|
+
"description": "What behavior this case pins, in one sentence."
|
|
14
|
+
},
|
|
15
|
+
"chunks": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"description": "Chunks to push, in order. May be empty, for the end-of-stream-with-nothing-buffered case.",
|
|
18
|
+
"items": { "$ref": "#/definitions/chunk" }
|
|
19
|
+
},
|
|
20
|
+
"expect": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"required": ["push"],
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"properties": {
|
|
25
|
+
"push": {
|
|
26
|
+
"type": "array",
|
|
27
|
+
"description": "Positionally parallel to chunks: element i is what push(chunks[i]) must produce. Length MUST equal the length of chunks.",
|
|
28
|
+
"items": {
|
|
29
|
+
"oneOf": [
|
|
30
|
+
{
|
|
31
|
+
"type": "array",
|
|
32
|
+
"description": "The frames this push emits, in order. Empty when the chunk completed no frame.",
|
|
33
|
+
"items": { "$ref": "#/definitions/frame" }
|
|
34
|
+
},
|
|
35
|
+
{ "$ref": "#/definitions/error" }
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"flush": {
|
|
40
|
+
"description": "What draining at end-of-stream must produce. Omit when the case ends in an error and flush is therefore unreachable.",
|
|
41
|
+
"oneOf": [
|
|
42
|
+
{
|
|
43
|
+
"type": "object",
|
|
44
|
+
"required": ["frames", "truncated"],
|
|
45
|
+
"additionalProperties": false,
|
|
46
|
+
"properties": {
|
|
47
|
+
"frames": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"maxItems": 1,
|
|
50
|
+
"items": { "$ref": "#/definitions/frame" }
|
|
51
|
+
},
|
|
52
|
+
"truncated": {
|
|
53
|
+
"type": "boolean",
|
|
54
|
+
"description": "True when a frame is delivered that no LF terminated."
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{ "$ref": "#/definitions/error" }
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"definitions": {
|
|
65
|
+
"error": {
|
|
66
|
+
"type": "object",
|
|
67
|
+
"required": ["error"],
|
|
68
|
+
"additionalProperties": false,
|
|
69
|
+
"properties": {
|
|
70
|
+
"error": {
|
|
71
|
+
"enum": ["frame-too-long"],
|
|
72
|
+
"description": "Named symbolically so a binding maps it onto its own error type rather than matching a message."
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"description": "The reader must fail this call. How the failure is expressed is a binding's business."
|
|
76
|
+
},
|
|
77
|
+
"frame": {
|
|
78
|
+
"oneOf": [
|
|
79
|
+
{ "type": "string" },
|
|
80
|
+
{ "$ref": "#/definitions/repeat" }
|
|
81
|
+
],
|
|
82
|
+
"description": "An expected frame: a literal string, or a repeat descriptor when the frame is too large to inline."
|
|
83
|
+
},
|
|
84
|
+
"chunk": {
|
|
85
|
+
"oneOf": [
|
|
86
|
+
{
|
|
87
|
+
"type": "object",
|
|
88
|
+
"required": ["utf8"],
|
|
89
|
+
"additionalProperties": false,
|
|
90
|
+
"properties": { "utf8": { "type": "string" } },
|
|
91
|
+
"description": "Octets are this string encoded as UTF-8. The readable common case."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"type": "object",
|
|
95
|
+
"required": ["base64"],
|
|
96
|
+
"additionalProperties": false,
|
|
97
|
+
"properties": {
|
|
98
|
+
"base64": { "type": "string", "pattern": "^[A-Za-z0-9+/]*={0,2}$" }
|
|
99
|
+
},
|
|
100
|
+
"description": "Exact octets. Required for ill-formed UTF-8 and for sequences deliberately split across a boundary."
|
|
101
|
+
},
|
|
102
|
+
{ "$ref": "#/definitions/repeat" },
|
|
103
|
+
{
|
|
104
|
+
"type": "object",
|
|
105
|
+
"required": ["concat"],
|
|
106
|
+
"additionalProperties": false,
|
|
107
|
+
"properties": {
|
|
108
|
+
"concat": {
|
|
109
|
+
"type": "array",
|
|
110
|
+
"minItems": 1,
|
|
111
|
+
"items": { "$ref": "#/definitions/chunk" }
|
|
112
|
+
},
|
|
113
|
+
"description": { "type": "string" }
|
|
114
|
+
},
|
|
115
|
+
"description": "One chunk built from several descriptors, for a single push that must contain both a large frame and its delimiter."
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"repeat": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"required": ["repeat"],
|
|
122
|
+
"additionalProperties": false,
|
|
123
|
+
"properties": {
|
|
124
|
+
"repeat": {
|
|
125
|
+
"type": "object",
|
|
126
|
+
"oneOf": [
|
|
127
|
+
{
|
|
128
|
+
"type": "object",
|
|
129
|
+
"required": ["byte", "count"],
|
|
130
|
+
"additionalProperties": false,
|
|
131
|
+
"properties": {
|
|
132
|
+
"byte": {
|
|
133
|
+
"type": "integer",
|
|
134
|
+
"minimum": 0,
|
|
135
|
+
"maximum": 255,
|
|
136
|
+
"description": "Repeat this octet."
|
|
137
|
+
},
|
|
138
|
+
"count": { "type": "integer", "minimum": 0 }
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"type": "object",
|
|
143
|
+
"required": ["utf8", "count"],
|
|
144
|
+
"additionalProperties": false,
|
|
145
|
+
"properties": {
|
|
146
|
+
"utf8": {
|
|
147
|
+
"type": "string",
|
|
148
|
+
"minLength": 1,
|
|
149
|
+
"description": "Repeat this string's UTF-8 encoding. Use when the case must distinguish octets from characters."
|
|
150
|
+
},
|
|
151
|
+
"count": { "type": "integer", "minimum": 0 }
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"description": "Generated content, so a case at the 1 MiB limit costs a few lines rather than megabytes of base64."
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "a BOM at the very start of the stream is not part of the first frame",
|
|
3
|
+
"chunks": [{ "concat": [{ "base64": "77u/" }, { "utf8": "{\"a\":1}\n" }] }],
|
|
4
|
+
"expect": {
|
|
5
|
+
"push": [["{\"a\":1}"]],
|
|
6
|
+
"flush": { "frames": [], "truncated": false }
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "a frame of exactly 1048576 octets is conformant — the limit is inclusive",
|
|
3
|
+
"chunks": [
|
|
4
|
+
{ "concat": [{ "repeat": { "byte": 97, "count": 1048576 } }, { "utf8": "\n" }] }
|
|
5
|
+
],
|
|
6
|
+
"expect": {
|
|
7
|
+
"push": [[{ "repeat": { "byte": 97, "count": 1048576 } }]],
|
|
8
|
+
"flush": { "frames": [], "truncated": false }
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "a complete frame of 1048577 octets is rejected, and the rejection is terminal",
|
|
3
|
+
"chunks": [
|
|
4
|
+
{ "concat": [{ "repeat": { "byte": 97, "count": 1048577 } }, { "utf8": "\n" }] }
|
|
5
|
+
],
|
|
6
|
+
"expect": {
|
|
7
|
+
"push": [{ "error": "frame-too-long" }],
|
|
8
|
+
"flush": { "error": "frame-too-long" }
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "524289 two-octet characters are 1048578 octets and are rejected, though a reader counting characters would accept them",
|
|
3
|
+
"chunks": [{ "repeat": { "utf8": "é", "count": 524289 } }],
|
|
4
|
+
"expect": {
|
|
5
|
+
"push": [{ "error": "frame-too-long" }],
|
|
6
|
+
"flush": { "error": "frame-too-long" }
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "a violation is terminal: the frame parsed ahead of the oversized one is not delivered, and a later push fails rather than resuming",
|
|
3
|
+
"chunks": [
|
|
4
|
+
{
|
|
5
|
+
"concat": [
|
|
6
|
+
{ "utf8": "good\n" },
|
|
7
|
+
{ "repeat": { "byte": 97, "count": 1048577 } },
|
|
8
|
+
{ "utf8": "\n" }
|
|
9
|
+
]
|
|
10
|
+
},
|
|
11
|
+
{ "utf8": "after\n" }
|
|
12
|
+
],
|
|
13
|
+
"expect": {
|
|
14
|
+
"push": [{ "error": "frame-too-long" }, { "error": "frame-too-long" }],
|
|
15
|
+
"flush": { "error": "frame-too-long" }
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "the limit applies to the unterminated buffer, so a peer that never sends a newline cannot exhaust memory",
|
|
3
|
+
"chunks": [{ "repeat": { "byte": 97, "count": 1048577 } }],
|
|
4
|
+
"expect": {
|
|
5
|
+
"push": [{ "error": "frame-too-long" }],
|
|
6
|
+
"flush": { "error": "frame-too-long" }
|
|
7
|
+
}
|
|
8
|
+
}
|