7. Conformidade e leitores¶
English | Português (Brasil)
Tradução do original em inglês; quando os dois divergirem, vale o inglês.
← Adoção e CI · Índice · Receitas →
O contrato vale para todo leitor de .kg.yaml: um visualizador, um extrator, um port em JavaScript, um
validador em Go. Um leitor prova que segue o contrato passando na suíte, não lendo a especificação e achando que
entendeu. A referência completa é spec/conformance/README.pt-BR.md.
Como a suíte é feita¶
- Cada grupo é uma pasta com um
manifest.jsone um.kg.yaml(ou.kg.json) real por caso. O arquivo é real para que qualquer CLI o leia como leria um grafo de verdade. - Cada caso declara
valid, oscodes(MUST) e oswarnings(SHOULD) esperados.warningsé opcional, e a lista ausente vale[]. - Um caso, um defeito. O leitor passa num caso quando o conjunto de códigos que emite é igual ao esperado. Igualdade, não inclusão: um leitor que acusa tudo não passa. Ordem e repetição não contam.
- A suíte valida a si mesma: o
manifest.schema.jsonconfere todo manifesto, emetaschema-tests/tem manifestos que o schema tem de aceitar e outros que tem de recusar.
{
"description": "Os enums do nó.",
"layer": "form",
"pending_on": [],
"cases": [
{
"file": "bad-node-type-enum.kg.yaml",
"description": "node_type fora do enum",
"valid": false,
"codes": [
"form.enum.node.node_type"
]
}
]
}
| Pasta | O que vale |
|---|---|
fixtures/latest/ |
O contrato vigente. Todo leitor tem de passar |
fixtures/optional/ |
Comportamento que um leitor pode implementar. Reporta e não reprova |
fixtures/proposals/ |
Casos que dependem de decisão aberta. Hoje está vazia |
Escrever um leitor¶
- Parse. Leia YAML com os booleanos do YAML 1.2, um documento só e um mapa na raiz. Chave duplicada reprova
(
1e"1"colidem)..nane.infreprovam. Um arquivo.kg.jsonpassa por um parser JSON no perfil JSON do contrato. - Forma. Converta para o JSON canônico (datas como texto ISO, chaves como texto) e valide contra
kg-contract-v4.schema.json, comformatcomo asserção. Os avisos vêm dokg-contract-v4.should.schema.json. - Integridade. Confira ids únicos, pontas existentes (
from,to,trigger), nenhum nó de grau 0, as pontas dasexternal_edgese os avisosintegrity.*que cruzam campos ou arestas. - Códigos. Mapeie cada erro para o seu código estável. A tabela de códigos e as regras de nomeação estão no capítulo 4 e na referência da suíte.
O leitor de referência, tools/kg_validate.py, é o molde. Os comentários dele
explicam cada regra, para você o ler ao lado da suíte.
Três armadilhas que a suíte pega¶
- Tamanho de texto em code points. O limite de 280 caracteres do
labelconta code points, como omaxLengthdo JSON Schema. Um emoji vale 1. Ostr.lengthdo JavaScript conta 2. format: datecomo anotação. Muitos validadores pulam a checagem de formato por padrão. Aqui a data ruim reprova.$antes de quebra de linha. Ospatternseguem a semântica do ECMA-262:$não casa antes de uma quebra de linha final, ao contrário doredo Python.
Rodar a suíte com o seu leitor¶
O kg_conformance.py roda só o leitor de referência, e o kit não traz uma ferramenta que rode um leitor de fora
sobre a suíte. O seu leitor roda a suíte com o próprio código: itera os manifest.json de fixtures/latest/, julga cada caso (com a
raiz do repositório em <pasta do manifesto>/<corpus> quando o caso declara corpus) e compara os conjuntos de
codes e de warnings por igualdade. Um leitor que não expõe códigos compara só o veredito: valid: true quer
dizer aceitar, e valid: false quer dizer reprovar.
O contrato de runner¶
Para o mantenedor medir o seu leitor ao lado do leitor de referência, caso a caso, o seu leitor expõe um
runner: runner <caso> imprime um objeto JSON na última linha do stdout e sai com rc 0.
verdict:accept,rejectouerror. É o nível 1, e todo leitor o tem.codesewarnings: as listas de códigos, ounullse o leitor não diz o porquê. É o nível 2.- Um caso que declara
corpusno manifesto chega comorunner <caso> --corpus <dir>. - Saída que não é JSON, um
verdictdesconhecido, rc diferente de 0 ou tempo estourado contam comoerror.
Um leitor que só dá o veredito já é comparável no nível 1. Expor os códigos é o nível 2, e é o que permite diagnosticar uma divergência.