Arquivos de uso
Como uma biblioteca publica seus exemplos neste site. Arquivos de uso, uma página de referência que já existe e guias com exemplos interativos.
Cada página de utilitário mostra a spec, a assinatura e os casos de teste do contrato no docs. Os exemplos de código nas abas vêm das bibliotecas. Cada biblioteca escreve os próprios exemplos, no próprio repositório. Quem muda a API atualiza os exemplos no mesmo pull request. Este site só lê.
Uma biblioteca pode publicar os exemplos de três formas, que podem ser combinadas:
| Opção | Use para | Onde |
|---|---|---|
| Arquivos de uso | um exemplo curto para cada função | docs/usage/<util>.md |
| Página de referência | uma página que a biblioteca já tem, com um título para cada função | qualquer arquivo, declarado em libs/<lib>.json |
| Guias | exemplos maiores, como um campo de formulário, com abas por framework e exemplo interativo | uma pasta, declarada em libs/<lib>.json |
Arquivos de uso
python/
└── docs/
└── usage/
├── cpf.md
├── cnpj.md
├── license-plate.md
└── …Escreva um arquivo para cada utilitário. Dê ao arquivo o nome da página, em kebab-case (cpf.md, license-plate.md). No arquivo, escreva um título ## para cada função. O título é o nome da função no contrato, que é uma chave de functions em contract/<domínio>/contract.json:
## isValid
```python
from brutils import is_valid_cpf
is_valid_cpf('82178537464') # True
is_valid_cpf('00011122233') # False
```
## format
```python
from brutils import format_cpf
format_cpf('82178537464') # '821.785.374-64'
```Regras:
- O título é o nome da função:
isValid,format,parse,generate,getInfo. O site também aceitaget-info, o título padrão (Validate) e o nome antigovalidate. Odocs usageaponta um título que não corresponde a nenhuma função, e o build o ignora. - Cada seção mostra a chamada. Mostre o import, a chamada e o resultado. Uma linha de texto pode ajudar, por exemplo "Esta função chama o ViaCEP". Não explique a regra. A spec na mesma página explica.
- O exemplo chama a função da biblioteca. O validador sabe o nome nativo de cada função. O validador aponta uma seção que não usa esse nome.
- Escreva código e comentários em inglês. Para texto em português, adicione
cpf.pt-br.mdao lado decpf.md. As páginas em português usam esse arquivo. sinceé opcional. Coloquesince: 2.1.0no front matter para mostrar a primeira versão com o utilitário.- Uma função sem seção tem a aba vazia. A aba então diz que a biblioteca não tem a função, ou que tem a função mas não tem exemplo.
Página de referência
Muitas bibliotecas já documentam todas as funções numa página só, com um título para cada função. Essa página serve do jeito que está. Declare a página em libs/<lib>.json:
"usage": {
"ref": "main",
"reference": { "en": "docs/utilities.md", "pt-BR": "docs/pt-br/utilities.md" }
}O site encontra cada título que é um nome de função da biblioteca, como ### isValidCpf. O site liga esse título à função do contrato que o validador associou ao nome. Uma seção é todo o texto até o próximo título: texto, opções, casos de borda e exemplos. O site ignora outros títulos, como ## Conventions ou ## CPF. O texto antes da primeira função vai para a página da biblioteca, como convenções da API.
Se uma biblioteca tem os dois, os arquivos de uso têm prioridade nas funções que eles documentam. docs usage --lib <lib> --materialize converte uma página de referência em arquivos de uso. Use o comando para passar uma biblioteca para arquivos de uso, ou para atualizar a cópia offline do site.
Guias com exemplos interativos
Algumas tarefas precisam de mais de uma chamada: um campo que aplica máscara e valida enquanto você digita, um formulário de endereço que o CEP preenche, uma lista de estados e cidades. Quem faz front-end precisa ver isso funcionando. Uma biblioteca pode publicar guias, que são páginas Markdown com exemplos em abas. Existe uma aba para cada framework, uma segunda fileira de abas para cada variante, e uma aba para cada arquivo. Cada exemplo pode ter uma versão interativa.
"usage": {
"guides": { "en": "docs/guides", "pt-BR": "docs/pt-br/guides" },
"root": "docs",
"assets": ["docs/snippets"],
"prepare": ["node", "scripts/examples.ts"]
}O front matter de um guia dá o title e a description dele. Os guias de uma biblioteca seguem a ordem dos nomes de arquivo. Um guia com order: 1 no front matter vai depois dos outros, e um com order: -1 vai antes deles.
Num guia, marque cada exemplo com estas tags. Coloque cada tag numa linha própria. O docsify também entende essa marcação, então uma biblioteca pode usar os mesmos arquivos no próprio site.
<div class="example" data-name="React">
Texto sobre a versão React.
<div class="variant" data-variant="CPF" data-demo="/snippets/live/?dir=cpf/react&example=cpf-field.tsx">
<div class="file" data-file="cpf-field.tsx">
[cpf-field.tsx](../snippets/cpf/react/cpf-field.tsx ':include :type=code tsx')
</div>
</div>
</div>exampleé uma aba de framework (React, Angular, Vue, Vanilla) ou de biblioteca (Zod, Valibot). O leitor escolhe uma aba uma vez, e todo guia abre nessa aba.varianté uma segunda fileira de abas, opcional, por exemplo CPF, CNPJ, CEP e Telefone.fileé um arquivo do exemplo. Use um link:includepara o arquivo no repositório, ou um bloco de código.data-demoé uma página da biblioteca que roda o exemplo. O caminho começa emroot. O site mostra a versão interativa acima dos arquivos. O site copia as pastas deassetssem mudanças, então a versão interativa roda o mesmo código que a página mostra. A página envia a própria altura comparent.postMessage({ type: 'example-height', height }, location.origin).prepareé um comando que o site roda nos arquivos da biblioteca antes de ler esses arquivos. Use quando a biblioteca gera os próprios exemplos. O comando roda sem shell e sem segredos.
Links entre guias ficam neste site. Um link para a página de referência com âncora de função, como utilities.md#formatcpf, vai para aquela função neste site. O site encontra as funções do contrato que cada guia chama, e lista o guia nas páginas desses utilitários.
Teste com JavaScript
Cada função da biblioteca JavaScript ganha uma caixa Teste com JavaScript. O site gera essa caixa a partir do contrato. Ela tem uma entrada para cada parâmetro do contrato, com o primeiro caso de teste compartilhado como valor inicial. Ela roda o pacote JavaScript publicado no navegador. Se as entradas forem as de um caso de teste compartilhado, a caixa diz se o resultado é o que o contrato espera.
Gere os primeiros exemplos
Você não precisa escrever os primeiros exemplos à mão. O validador sabe quais funções a biblioteca implementa e em quais casos de teste compartilhados ela passa. A partir desses casos, ele escreve uma seção para cada função sem exemplo, na linguagem da biblioteca:
# no repositório da biblioteca, depois do `check --tests` gerar o relatório
npx tsx <docs>/src/cli.ts check --lib python --path . --tests
npx tsx <docs>/src/cli.ts usage --lib python --path . --scaffoldO comando não muda seções que existem e adiciona as seções novas no fim do arquivo. O resultado em cada comentário é o valor que o contrato espera, tirado de um caso que já passa na biblioteca. Os exemplos estão corretos quando o comando os escreve. Você pode editar depois.
Sem --scaffold, o docs usage mostra o que está documentado, o que falta e o que está errado. Com --strict, o comando falha quando falta algo ou algo está errado. Uma biblioteca pode usar isso na CI.
A versão no site
O site lê os arquivos em usage.ref. O padrão é a última release no GitHub da biblioteca, então o site bate com o pacote que o leitor instala. Um repositório sem release usa a branch padrão. Se a documentação da própria biblioteca segue a branch principal, use "ref": "main".
Uma biblioteca sem docs/usage/ usa as cópias em site/fixtures/usage/<lib>/ do repositório docs. Essas cópias têm o mesmo formato, então você pode copiá-las para a biblioteca do jeito que estão.
Atualize o site a cada release
Adicione este passo ao workflow de release da biblioteca. O site então é gerado de novo com a versão nova:
- name: Notify the docs site
if: success()
run: gh api repos/brazilian-utils/docs/dispatches -f event_type=lib-released -f 'client_payload[lib]=python'
env:
GH_TOKEN: ${{ secrets.DOCS_DISPATCH_TOKEN }}Sem esse passo, o site é gerado de novo todo dia e depois de cada mudança no contrato.
Adicione arquivos de uso a uma biblioteca
-
Copie
site/fixtures/usage/<lib>/do repositório docs paradocs/usage/na biblioteca, ou rode o comando de Gere os primeiros exemplos. -
Leia os exemplos e adicione texto onde ajudar.
-
Deixe o README menor: mantenha a instalação, um ou dois exemplos e um link para este site.
-
Faça o merge e publique uma release. O próximo build do site lê os arquivos da biblioteca.
O site não roda os exemplos. Mas os resultados dos exemplos gerados vêm de casos que os próprios testes da biblioteca rodam. Se você escrever um exemplo à mão, use entradas dos casos de teste do contrato. O exemplo então continua correto pelo mesmo motivo.
Atualizado em
