Skip to main content

Typed protobuf + pydantic models and converters for NLM PubMed XML.

Project description

pubmed-proto

Generates pubmed_proto — a typed Python package for parsing NLM PubMed XML into protobuf and pydantic models — from the PubMed DTD.

This repository is the generator, not the package. It holds the inputs (pubmed.dtd, pubmed_transforms.yaml) and drives xsd-former (the xsdformer CLI) to emit the pubmed_proto source tree, which is then built into a wheel and published to PyPI. The generated tree (generated/) and build outputs (dist/) are gitignored — only the inputs are version-controlled.

Consuming pubmed_proto

Depend on the published wheel, not this repo:

pip install pubmed_proto      # or: uv add pubmed_proto
from lxml import etree
from pubmed_proto import xml_converter, pydantic_converter, models

tree = etree.parse("efetch_output.xml")
article_el = tree.getroot().find("PubmedArticle")

proto = xml_converter.PubmedArticle(article_el)     # XML  -> protobuf
model = pydantic_converter.PubmedArticle_from_proto(proto)  # protobuf -> pydantic
json_str = model.model_dump_json()                  # pydantic -> JSON

The package exposes four modules (all typed; ships py.typed):

module purpose
pubmed_pb2 compiled protobuf messages (Article, Author, …)
models pydantic models mirroring the protobuf schema
xml_converter PubMed XML → protobuf (per-message factory funcs)
pydantic_converter protobuf ↔ pydantic (X_from_proto / X_to_proto)

Developing the generator

Requires uv.

make generate   # DTD + transforms -> generated/pubmed_proto/
make build      # generate, then build the wheel into dist/
make clean      # remove generated/ and dist/
uv run --group test pytest   # round-trip gate over real PubMed records

Shaping the output is done in pubmed_transforms.yaml — dropping book/admin types, flattening list wrappers, coercing booleans/timestamps, and serializing rich-text fields to markdown. See the xsd-former docs for the transform reference.

Provenance & attribution

pubmed.dtd is derived from the U.S. National Library of Medicine PubMed DTD, version pubmed_250101 (dated 2024-08-28):

https://dtd.nlm.nih.gov/ncbi/pubmed/out/pubmed_250101.dtd

NLM DTDs are U.S. Government works and public domain in the United States; the MIT LICENSE in this repo covers CPG's own files (transforms, generator wiring, tests), not the NLM DTD.

Local modification: the external MathML module include (<!ENTITY % mathml-in-pubmed SYSTEM "mathml-in-pubmed.mod"> and its reference) was removed so the DTD is self-contained for schema generation — MathML markup in titles/abstracts is not modelled. With that one include removed, the file is byte-identical to upstream pubmed_250101.

The DTD is vendored deliberately, not fetched at build time: it's a modified derivative (so a fetch wouldn't reproduce it), and pinning the exact bytes keeps the generated schema reproducible. The full provenance also lives in a comment at the top of pubmed.dtd.

Releasing

The published version is build.version in pubmed_transforms.yaml (what xsdformer stamps into the wheel). To release:

  1. Bump build.version in pubmed_transforms.yaml.
  2. Publish a GitHub Release tagged vX.Y.Z matching that version.

The release workflow generates, builds, and publishes to PyPI via Trusted Publishing (OIDC). It fails if the tag and build.version disagree.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pubmed_proto-0.2.0.tar.gz (30.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pubmed_proto-0.2.0-py3-none-any.whl (34.4 kB view details)

Uploaded Python 3

File details

Details for the file pubmed_proto-0.2.0.tar.gz.

File metadata

  • Download URL: pubmed_proto-0.2.0.tar.gz
  • Upload date:
  • Size: 30.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pubmed_proto-0.2.0.tar.gz
Algorithm Hash digest
SHA256 3a88173e3a4bbe2738d6341040d8bc66709536f30d4595188157c936b1fbec18
MD5 cd588fe60ab15e7ce5715a1bf81867d9
BLAKE2b-256 f42eef0b69dc5a5ca34a1f67007ec6081eb2f37af1e3c1e85b72ee37823f2f51

See more details on using hashes here.

Provenance

The following attestation bundles were made for pubmed_proto-0.2.0.tar.gz:

Publisher: release.yml on populationgenomics/pubmed-proto

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pubmed_proto-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: pubmed_proto-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 34.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pubmed_proto-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b1e7abc43e34ae1a3b4c6356d7ed49e74c4ee94b10e39138c99bdd13bec459e8
MD5 c75adcf7918281f8c9454b515fa00925
BLAKE2b-256 1288b3d2dd8a2dc0067ad47ba48b6ee321f35dc53fedd4bd7048fd4092cc0e25

See more details on using hashes here.

Provenance

The following attestation bundles were made for pubmed_proto-0.2.0-py3-none-any.whl:

Publisher: release.yml on populationgenomics/pubmed-proto

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page