cbf_calendario
Gem Ruby para consultar a API pública da CBF e retornar dados prontos para uso.
O que a gem faz
- Lista todos os jogos do dia (calendário da API).
- Busca a partida completa por
id_jogo. - Gera estatísticas agregadas da súmula.
- Monta URLs públicas da CBF (partida e times).
- Retorna hashes Ruby para facilitar integração.
Instalação
# Gemfile
gem 'cbf_calendario', '~> 0.2'
bundle install
Ou em script Ruby:
gem install cbf_calendario
require 'cbf_calendario'
Uso rápido
require 'cbf_calendario'
jogos = CbfCalendario.jogos_do_dia('10/05/2026')
partida = CbfCalendario.partida_completa('832031')
jogo = CbfCalendario.jogo_partida('832031')
stats = CbfCalendario.estatisticas_agregadas(jogo)
partida_completa e jogo_partida
Os dois consultam o mesmo endpoint da CBF: GET /api/cbf/jogos/:id. A diferença é o que é devolvido:
partida_completa(id_jogo)— retorna o payload inteiro da API (hash com chaves string), em geral no formato{ "jogo" => { ... } }. Use quando precisar do JSON completo da resposta (incluindo o envelope com"jogo"e qualquer outra chave de topo que a API enviar).jogo_partida(id_jogo)— retorna apenas o hash interno"jogo"(mandante, visitante,registros, etc.). É o equivalente apartida_completa(id_jogo)['jogo'], útil quando você só trabalha com os dados da partida.
| Método | Retorno típico |
|---|---|
partida_completa |
{ "jogo" => { ... } } |
jogo_partida |
{ "id_jogo" => ..., "mandante" => {...}, ... } |
Se você já chamou partida = CbfCalendario.partida_completa(id), prefira partida['jogo'] em vez de chamar jogo_partida(id) de novo na mesma rotina (evita uma segunda requisição HTTP idêntica).
Funcionalidades principais
1) Jogos do dia
Retorna todas as partidas previstas ou já disputadas naquela data, conforme o calendário da CBF. Quando a API já trouxer placar, o campo placar vem preenchido (ex.: "2 x 1"); caso contrário, placar fica nil e horario reflete o horário previsto, se existir.
2) Partida completa por ID
Consulta GET /api/cbf/jogos/:id e devolve o payload completo da API.
3) Estatísticas da súmula
Agrega eventos como gols, penalidades/cartões e substituições.
4) URLs públicas da CBF
Monta links da página da partida e das páginas de times.
Referência completa de funções públicas
Módulo CbfCalendario (atalhos)
CbfCalendario.parse_data_br!(str)CbfCalendario.jogos_do_dia(data, **opts)CbfCalendario.partida_completa(id_jogo, **opts)CbfCalendario.jogo_partida(id_jogo, **opts)CbfCalendario.estatisticas_agregadas(jogo)
Classe CbfCalendario::Client
CbfCalendario::Client.new(base_url: ..., read_timeout: ..., open_timeout: ...)client.jogos_do_dia(data)client.calendario_json(data)client.partida_completa(id_jogo)client.jogo_partida(id_jogo)CbfCalendario::Client.parse_data_br!(str)CbfCalendario::Client.coerce_date!(data)CbfCalendario::Client.normalize_id_jogo!(id_jogo)
Módulo CbfCalendario::PartidaStats
CbfCalendario::PartidaStats.agregadas(jogo)
Módulo CbfCalendario::Urls
CbfCalendario::Urls.slug_segment(str)CbfCalendario::Urls.segmento_campeonato(nome)CbfCalendario::Urls.segmento_categoria(nome_serie)CbfCalendario::Urls.path_pagina_jogo(jogo)CbfCalendario::Urls.url_time(campeonato_nome, categoria_nome, ano, clube_id, base: ...)CbfCalendario::Urls.url_pagina_partida(jogo, base: ...)
Constante
CbfCalendario::VERSION
Exemplos de respostas (retornos)
CbfCalendario.parse_data_br!('25/12/2026')
# => #<Date: 2026-12-25 ...>
CbfCalendario.jogos_do_dia('10/05/2026')
# => [
# {
# campeonato: "Campeonato Brasileiro",
# serie: "Série A",
# mandante: "Flamengo",
# visitante: "Bahia",
# horario: "16:00",
# placar: nil,
# data: "10/05/2026",
# data_iso: "2026-05-10",
# local: "Maracanã",
# rodada: "6",
# id_jogo: "832031"
# },
# {
# campeonato: "Campeonato Brasileiro",
# serie: "Série A",
# mandante: "Palmeiras",
# visitante: "São Paulo",
# horario: "",
# placar: "1 x 0",
# data: "10/05/2026",
# data_iso: "2026-05-10",
# local: "Allianz Parque",
# rodada: "6",
# id_jogo: "832032"
# }
# ]
client.calendario_json(Date.today)
# => {
# "jogos" => {
# "Campeonato Brasileiro" => {
# "Série A" => [
# { "id_jogo" => 832031, "mandante" => {...}, "visitante" => {...}, ... }
# ]
# }
# }
# }
CbfCalendario.partida_completa('832031')
# => {
# "jogo" => {
# "id_jogo" => 832031,
# "mandante" => { "id" => 1, "nome" => "Flamengo", "gols" => 2, ... },
# "visitante" => { "id" => 2, "nome" => "Bahia", "gols" => 1, ... },
# "registros" => [ ... ],
# ...
# }
# }
CbfCalendario.jogo_partida('832031')
# => {
# "id_jogo" => 832031,
# "campeonato" => { "nome" => "Campeonato Brasileiro", "nome_categoria" => "Série A", "ano" => 2026 },
# "mandante" => { "id" => 1, "nome" => "Flamengo", ... },
# "visitante" => { "id" => 2, "nome" => "Bahia", ... },
# "registros" => [ ... ]
# }
CbfCalendario.estatisticas_agregadas(jogo)
# => {
# por_tipo_evento: { "GOL" => 3, "PENALIDADE" => 5 },
# gols_por_classificacao_sumula: { "NORMAL" => 2, "CONTRA" => 1 },
# gols_mandante_em_eventos: 2,
# gols_visitante_em_eventos: 1,
# cartoes_por_resultado: { "AMARELO" => 4, "VERMELHO" => 1 },
# total_substituicoes_mandante: 5,
# total_substituicoes_visitante: 4
# }
CbfCalendario::Urls.url_pagina_partida(jogo)
# => "https://www.cbf.com.br/futebol-brasileiro/jogos/campeonato-brasileiro/serie-a/2026/flamengo-x-bahia/832031"
CbfCalendario::Urls.url_time(...)
# => "https://www.cbf.com.br/futebol-brasileiro/times/campeonato-brasileiro/serie-a/2026/1"
Tratamento de erros
CbfCalendario::InvalidDateError: data inválida (formato esperado:dd/mm/aaaa).CbfCalendario::InvalidGameIdError:id_jogoinválido (somente dígitos).CbfCalendario::HttpError: erro HTTP ou payload inválido da API.CbfCalendario::Error: classe base.
Uso em Rails (recomendado)
Para produção, use em background com Active Job (ex.: Solid Queue), evitando bloquear requests web:
class CbfCalendarioSyncJob < ApplicationJob
queue_as :default
def perform(data_iso: nil)
data = data_iso ? Date.iso8601(data_iso) : Date.current
CbfCalendario.jogos_do_dia(data)
end
end
Requisitos
- Ruby >= 3.0
Licença
MIT. Veja LICENSE.txt.