Cliente Delphi de la API REST de GitHub vía sgcOpenAPI

GitHub mantiene la mayor descripción OpenAPI disponible públicamente — más de 1.000 endpoints repartidos entre repositorios, issues, pull requests, actions, checks, packages y el gateway GraphQL. Aliméntala a sgcOpenAPI y emite una unit Delphi tipada que tu aplicación puede usar para automatizar cualquier flujo de GitHub que exponga la API REST.

GitHub + sgcOpenAPI

GitHub distribuye una descripción OpenAPI 3 totalmente mantenida bajo licencia MIT. sgcOpenAPI la parsea y emite una sola unit Pascal que compila desde Delphi 7 hasta RAD Studio 13.

Autenticación

Personal access token, JWT de GitHub App, OAuth

Unit generada

sgcOpenAPI_GitHub

Plataformas

Windows, macOS, Linux, iOS, Android

Genera el cliente

GitHub publica dos variantes de la spec — api.github.com.json para el servicio público alojado y ghes-3.x.json para GitHub Enterprise Server. Apunta el parser a la que tengas como objetivo.

uses
  sgcOpenAPI_Parser, sgcOpenAPI_Generator;

var
  vParser: TsgcOpenAPIParser;
  vGen: TsgcOpenAPIGenerator;
begin
  vParser := TsgcOpenAPIParser.Create(nil);
  try
    vParser.LoadFromFile('C:\specs\github\api.github.com.json');
    Memo1.Lines.Add(Format('GitHub spec: %d paths, %d schemas',
      [vParser.Paths.Count, vParser.Schemas.Count]));

    vGen := TsgcOpenAPIGenerator.Create(nil);
    try
      vGen.Parser := vParser;
      vGen.OutputUnit := 'sgcOpenAPI_GitHub';
      vGen.OutputFolder := 'C:\Generated\GitHub';
      vGen.GroupBy := gbTag;        // one class per tag
      vGen.Generate;
    finally
      vGen.Free;
    end;
  finally
    vParser.Free;
  end;
end;

El generador emite una clase por cada tag de GitHub — TsgcGitHub_Repos, TsgcGitHub_Issues, TsgcGitHub_Pulls, TsgcGitHub_Actions, TsgcGitHub_Checks, TsgcGitHub_Packages, TsgcGitHub_OrgsAdmin y demás — todas en propiedad de una fachada de alto nivel TsgcGitHub.

Lista repositorios

Autentícate con un personal access token y enumera los repositorios del usuario actual. La paginación la maneja el envoltorio enumerable generado — sólo recorre el resultado con for...in y el cliente solicita páginas adicionales bajo demanda.

uses sgcOpenAPI_GitHub;

var
  vGH: TsgcGitHub;
  vRepo: TsgcGitHubRepository;
begin
  vGH := TsgcGitHub.Create(nil);
  try
    vGH.Token := 'ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
    vGH.UserAgent := 'sgcDelphi/1.0';

    for vRepo in vGH.Repos.ListForAuthenticatedUser(
      Visibility := 'private', PerPage := 100) do
    begin
      Memo1.Lines.Add(Format('%s — %s',
        [vRepo.FullName, vRepo.Description]));
    end;
  finally
    vGH.Free;
  end;
end;

Crea un issue y revisa un pull request

Dos llamadas cortas — una mutadora, una de lectura. Ambas rutas devuelven los mismos objetos fuertemente tipados que la spec describe.

// Create an issue in repo "octocat/Hello-World"
var
  vIssue: TsgcGitHubIssue;
begin
  vIssue := vGH.Issues.Create(
    Owner := 'octocat',
    Repo  := 'Hello-World',
    Title := 'Memory leak in HTTP/2 reader',
    Body  := 'Repro steps: ...',
    Labels := ['bug', 'http2']);
  ShowMessage('Filed issue #' + IntToStr(vIssue.Number));

  // List open PRs and inspect the head ref
  for vPR in vGH.Pulls.List(
    Owner := 'octocat', Repo := 'Hello-World',
    State := 'open', Sort := 'updated') do
  begin
    Memo1.Lines.Add(Format('PR #%d %s — %s',
      [vPR.Number, vPR.Title, vPR.Head.Ref]));
  end;
end;

Lo que te da la unit generada

Cada tag en la descripción OpenAPI oficial se convierte en una clase tipada. Cada parámetro documentado se convierte en un argumento tipado.

Repositorios y contenido

Repos, Git, Contents, Branches, Tags, Releases, Forks. Lee, escribe y borra archivos. Crea ramas, gestiona reglas de protección, redacta y publica releases.

Issues y pull requests

Issues, Pulls, Reviews, Comments, Reactions, Labels, Milestones, Assignees. Toda la superficie de colaboración.

Actions y checks

Actions, WorkflowRuns, WorkflowJobs, Artifacts, Secrets, Variables, Checks, CheckRuns, CheckSuites — construye dashboards o lanza automatización a partir de los datos de GitHub Actions.

Packages y container registry

Packages, PackageVersions — gestiona paquetes npm, NuGet, Maven, RubyGems y de contenedores desde Delphi.

Organizaciones y equipos

Orgs, Teams, Members, Memberships, OrgsAdmin para operaciones reservadas a owners como aprovisionamiento SCIM.

GitHub Apps

Apps, Installations, AppManifests — instala GitHub Apps programáticamente y acuña installation tokens de corta duración.

Tres cosas a vigilar

Límites de tasa y peticiones condicionales

GitHub aplica un límite horario (5.000 peticiones/hora con token, 60 sin autenticar). El cliente generado almacena el último ETag para cada respuesta GET — reutilízalos estableciendo IfNoneMatch en la siguiente llamada para obtener una respuesta 304 gratuita.

Las GitHub Apps necesitan tokens de corta duración

Para instalaciones de GitHub Apps intercambias un JWT (firmado con la clave privada de tu app) por un installation token de 1 hora. Usa el método Apps.CreateInstallationAccessToken y refresca el token antes de que caduque.

Eventos de timeline polimórficos

El endpoint Issues.ListEventsForTimeline devuelve una unión discriminada de docenas de tipos de evento. La unit generada emite una clase base y un descendiente por variante — haz downcast basado en la propiedad Event.

Desde el blog

Parser OpenAPI Delphi

Cómo el parser subyacente maneja especificaciones OpenAPI 3.x del mundo real.

Leer post →

Cliente OpenAPI + parser

Post complementario que presenta tanto el wrapper de cliente como los internos del parser.

Leer post →

sgcOpenAPI 2026.6

Últimas notas de versión — nuevas opciones del generador y correcciones del parser.

Leer post →

Construye tu automatización de GitHub hoy

sgcOpenAPI incluye el parser, generador de código, servidor OpenAPI y los bundles SDK de Amazon, Google, Microsoft y Azure — un producto, tres niveles.