Skip to main content

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.0"
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 faz criar_pagina não duplicar. Sem ela, a operação recusa com ColunaAusente (um ErroDeNegocio) antes de qualquer escrita. A coluna é do plugin: não a edite, e o robô não pode passá-la em propriedades.
  • 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 notion da plataforma e é renovado por ela. Fora da plataforma (no laptop), ponha um token em SHADE_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 (um ErroDeNegocio) 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_pagina grava a chave do item na coluna Chave Shade e, 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_pagina grava 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 respondeu 503 pode 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, e titulo() e texto() põem o dado em text.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 aceita timeout= (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_base devolve 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.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for shade-plugins-notion 0.1.0
File Interpreter ABI Platform Actions
shade_plugins_notion-0.1.0-py3-none-any.whl Python 3 none any Details for shade_plugins_notion-0.1.0-py3-none-any.whl

Release files / shade_plugins_notion-0.1.0-py3-none-any.whl

Download URL shade_plugins_notion-0.1.0-py3-none-any.whl
Size 19.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
37195b124982b4b53bd640e99abd7443231d6f0ce62502e47288e94cca80450c
BLAKE2b-256 checksum
How to use checksums
18def390ded72c0402e0ecb2438cfcc9693dee0fe3381b74bf8e7b10bd69ded5
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.0

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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

1 release file No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page