shade-plugins-notion
Consulta uma base, cria uma página (sem duplicar) e atualiza uma página no
Notion, de dentro de um robô do
shade-sdk, com o token OAuth da conexão do Notion na
plataforma. Só a biblioteca padrão do Python: nenhuma dependência além do shade-sdk.
No shade.toml do robô, o host da API vai em [hosts] permitidos e a conexão em [conexoes]:
[hosts]
permitidos = ["api.notion.com"]
[conexoes]
nomes = ["notion"]
[plugins]
notion = "0.1.1"
import shade_plugins_notion as notion
BASE = "0f1e2d3c4b5a69788796a5b4c3d2e1f0" # o id, da URL da base
# Leitura: roda inclusive no ensaio.
novos = notion.consultar_base(BASE, filtro={"property": "Status", "select": {"equals": "Novo"}})
nomes = [notion.texto_de(p["propriedades"]["Nome"]) for p in novos]
# Escrita: só dentro de item.efetivar() (no ensaio não roda).
with item.efetivar("registrar o pedido"):
nova = notion.criar_pagina(
BASE,
{"Nome": notion.titulo(f"Pedido {item['numero']}"), "Valor": {"number": item["valor"]}},
)
notion.atualizar_pagina(nova["id"], {"Observação": notion.texto(item["detalhe"])})
Antes de usar
- Crie na base a coluna de texto
Chave Shade. É o que fazcriar_paginanão duplicar. Sem ela, a operação recusa comColunaAusente(umErroDeNegocio) antes de qualquer escrita. A coluna é do plugin: não a edite, e o robô não pode passá-la empropriedades. - Compartilhe a base com a conexão. O Notion não tem escopos: a conexão só vê o que a pessoa
escolheu ao conectar ou adicionou depois no menu da página. O que não foi compartilhado responde
404, igual ao que não existe.
A conta
- Conexão: o robô nunca vê a senha nem o refresh token. O token de acesso chega sob demanda da
conexão
notionda plataforma e é renovado por ela. Fora da plataforma (no laptop), ponha um token emSHADE_TOKEN_NOTION. - Fonte de dados: uma base do Notion pode ter mais de uma. O plugin lê as da base a cada chamada;
com mais de uma, passe
fonte=(o nome ou o id); sem ele, o erro éFonteNaoEscolhida(umErroDeNegocio) e a mensagem lista os nomes. - Versão da API:
Notion-Version: 2026-03-11, fixa. Versão nova da API é versão nova do plugin.
O que o plugin garante
- Página sem duplicar.
criar_paginagrava a chave do item na colunaChave Shadee, antes de criar, consulta a base por ela; achando, devolve a página (reaproveitada=True). Depois de despachado, o pedido de criação nunca é repetido: se a resposta se perde, o plugin consulta de novo e, sem achar, o erro éNotionIncerto(a página pode existir: confira no Notion antes de refazer). - Atualização idempotente por natureza.
atualizar_paginagrava os valores pedidos, e refazer grava os mesmos. Ela também não se repete sozinha depois do envio: o Notion avisa que a escrita que respondeu503pode ter gravado. Sem confirmação, éNotionIncerto, e refazer é seguro. - Só dentro de
item.efetivar(). Fora dele, a operação é um erro de contrato antes de qualquer byte; no ensaio, o bloco é pulado e nada é enviado. - Valores literais. As propriedades são objetos serializados por
json.dumps, etitulo()etexto()põem o dado emtext.content: um**ou um link do dado vai como texto. Os ids são validados antes de qualquer pedido. - Host e prazo: só
api.notion.com, com o certificado verificado, sem seguir redirecionamento; toda chamada aceitatimeout=(30 s por padrão), que vale para a chamada inteira. - Sem conteúdo em evento nem em erro: cada chamada emite um evento com a operação, o host, a duração e o status. Nunca as propriedades, o token nem o corpo da resposta.
Operações
| Operação | Efeito | O que faz |
|---|---|---|
consultar_base(base, filtro=None, *, limite=100, fonte=None) |
não | Páginas da base: id, url e propriedades. filtro é o da API do Notion. Segue o next_cursor. |
criar_pagina(base, propriedades, *, fonte=None) |
sim | Cria a página na base. Devolve id, url e reaproveitada. |
atualizar_pagina(pagina, propriedades) |
sim | Grava as propriedades pedidas. Devolve id e url. |
propriedades vão no formato da API do Notion, pelo nome da coluna: {"Valor": {"number": 1}},
{"Status": {"select": {"name": "Feito"}}}. Para as de texto, notion.titulo("x") e
notion.texto("x") montam o valor e dividem o texto longo nas partes que o Notion aceita. Na leitura,
notion.texto_de(propriedade) devolve o texto.
Limites
- Se alguém mover para a lixeira ou arquivar a página antes de um refazer, a consulta não a enxerga, e o refazer cria outra.
- A consulta pode demorar a enxergar a página recém-criada. Por isso, a dúvida depois de uma resposta
perdida pode ficar
NotionIncerto. consultar_basedevolve até 5.000 páginas por chamada.- Conteúdo da página (blocos), arquivo e criação de base ficam fora do plugin.
Testes
A suíte de contrato do shade_sdk.testing.plugins e um servidor falso da API (TLS de uma CA de
teste, que recusa propriedade desconhecida, de outro tipo ou acima dos limites de texto, como a de
verdade) acompanham o código-fonte em tests/.
Metadata
Release files for shade-plugins-notion 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| shade_plugins_notion-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for shade_plugins_notion-0.1.1-py3-none-any.whl |
Release files / shade_plugins_notion-0.1.1-py3-none-any.whl
| Download URL | shade_plugins_notion-0.1.1-py3-none-any.whl |
|---|---|
| Size | 20.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2cd7862cdc5b7fc9d5f44d66c9998ad94989c049b4f7f09fcee125dbe567b20b
|
|
BLAKE2b-256 checksum How to use checksums |
5efef6302630949b9886ff20d06aa2d579e04b57834a25e09bb3af254e1ddfce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for shade-plugins-notion 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.