{"id":51082991,"url":"https://github.com/kanutocd/pgoutput-source-adapter","last_synced_at":"2026-06-23T20:00:54.957Z","repository":{"id":365206191,"uuid":"1262926454","full_name":"kanutocd/pgoutput-source-adapter","owner":"kanutocd","description":"Normalize decoded pgoutput events into downstream change-event platforms.","archived":false,"fork":false,"pushed_at":"2026-06-16T09:57:45.000Z","size":38,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T11:19:02.475Z","etag":null,"topics":["cdc","change-data-capture","event-driven","event-model","logical-replication","pgoutput","postgres","postgresql","rbs","ruby","source-adapter","source-adaptor","steep","yard"],"latest_commit_sha":null,"homepage":"https://kanutocd.github.io/pgoutput-source-adapter/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kanutocd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-08T13:02:29.000Z","updated_at":"2026-06-16T10:02:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kanutocd/pgoutput-source-adapter","commit_stats":null,"previous_names":["kanutocd/pgoutput-source-adapter"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/kanutocd/pgoutput-source-adapter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fpgoutput-source-adapter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fpgoutput-source-adapter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fpgoutput-source-adapter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fpgoutput-source-adapter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kanutocd","download_url":"https://codeload.github.com/kanutocd/pgoutput-source-adapter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fpgoutput-source-adapter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34704748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cdc","change-data-capture","event-driven","event-model","logical-replication","pgoutput","postgres","postgresql","rbs","ruby","source-adapter","source-adaptor","steep","yard"],"created_at":"2026-06-23T20:00:52.644Z","updated_at":"2026-06-23T20:00:54.934Z","avatar_url":"https://github.com/kanutocd.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pgoutput-source-adapter\n\n[![Gem Version](https://badge.fury.io/rb/pgoutput-source-adapter.svg)](https://badge.fury.io/rb/pgoutput-source-adapter)\n[![CI](https://github.com/kanutocd/pgoutput-source-adapter/workflows/CI/badge.svg)](https://github.com/kanutocd/pgoutput-source-adapter/actions)\n[![Ruby Version](https://img.shields.io/badge/ruby-%3E%3D%203.4-ruby.svg)](https://www.ruby-lang.org/en/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n`pgoutput-source-adapter` adapts decoded pgoutput events into downstream change-event platform primitives.\n\nThe first supported target is the CDC Ecosystem:\n\n```ruby\nPgoutput::SourceAdapter::Cdc\n```\n\nIt normalizes `Pgoutput::Decoder::Events` into `CDC::Core::ChangeEvent` and `CDC::Core::TransactionEnvelope` objects.\n\n## Boundary\n\nThe pgoutput family remains standalone:\n\n```text\npgoutput-client   -\u003e PostgreSQL logical replication transport\npgoutput-parser   -\u003e pgoutput protocol messages\npgoutput-decoder  -\u003e typed Ruby row-change events\n```\n\nThis gem is the adapter layer:\n\n```text\nPgoutput::Decoder::Events\n        |\n        v\nPgoutput::SourceAdapter::Cdc\n        |\n        v\nCDC::Core::ChangeEvent / TransactionEnvelope\n```\n\nThat keeps the lower-level pgoutput gems usable outside the CDC Ecosystem while still providing a clean bridge into `cdc-core` for users building CDC platforms.\n\n## Installation\n\n```ruby\ngem \"pgoutput-source-adapter\"\n```\n\n```ruby\nrequire \"pgoutput/source_adapter\"\n```\n\nThe generated `bundle gem` require path also works:\n\n```ruby\nrequire \"pgoutput/source/adapter\"\n```\n\n## Usage\n\nNormalize a decoded insert event:\n\n```ruby\nadapter = Pgoutput::SourceAdapter::Cdc.new\nchange_event = adapter.normalize(decoded_insert)\n\nchange_event.operation\n# =\u003e :insert\n\nchange_event.schema\nchange_event.table\nchange_event.new_values\n```\n\nNormalize a transaction-shaped batch:\n\n```ruby\nresults = adapter.normalize_many([\n  decoded_begin,\n  decoded_insert,\n  decoded_update,\n  decoded_commit\n])\n\nenvelope = results.first\n# =\u003e CDC::Core::TransactionEnvelope\n```\n\n## Primary keys\n\nFor update and delete events, pgoutput may provide an old-key tuple. When it does, that tuple is used as the `CDC::Core::ChangeEvent#primary_key`.\n\nFor insert events, or for sources without old-key tuples, the adapter defaults to `id` / `\"id\"` when present.\n\nYou can provide your own resolver:\n\n```ruby\nadapter = Pgoutput::SourceAdapter::Cdc.new(\n  primary_key_resolver: -\u003e(_event, values) { { \"uuid\" =\u003e values.fetch(\"uuid\") } }\n)\n```\n\n## Metadata\n\nEach normalized event includes pgoutput metadata:\n\n```ruby\n{\n  \"source\" =\u003e \"pgoutput\",\n  \"relation_id\" =\u003e 123,\n  \"pgoutput_event\" =\u003e \"Insert\"\n}\n```\n\nAdditional metadata can be injected:\n\n```ruby\nadapter = Pgoutput::SourceAdapter::Cdc.new(\n  metadata_builder: -\u003e(_event) { { pipeline: \"default\" } }\n)\n```\n\n## Public namespace\n\n```ruby\nPgoutput::SourceAdapter\nPgoutput::SourceAdapter::Cdc\n```\n\nA compatibility alias is also provided for the generated gem path:\n\n```ruby\nPgoutput::Source::Adapter\n```\n\n## Non-goals\n\nThis gem does not:\n\n- connect to PostgreSQL\n- parse pgoutput protocol messages\n- decode PostgreSQL values\n- run processors\n- manage replication slots\n- persist sink data\n\nThose responsibilities belong to `pgoutput-client`, `pgoutput-parser`, `pgoutput-decoder`, runtime gems, or application code.\n\n## Development\n\n```bash\nbundle exec rake\n```\n\n## License\n\n[MIT](./LICENSE.txt).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanutocd%2Fpgoutput-source-adapter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkanutocd%2Fpgoutput-source-adapter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanutocd%2Fpgoutput-source-adapter/lists"}