From b632311f73b73f0026889ed1a0865afe822098bf Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Thu, 12 Feb 2026 13:19:21 -0600 Subject: [PATCH 1/9] pyproject: Add MkDocs and related dependencies for documentation generation - Added `mkdocs`, `mkdocs-material`, and `mkdocstrings[python]` to dependencies to enable documentation generation. - Updated `uv.lock` to include all new dependency versions and metadata. Assisted-by: Codex --- pyproject.toml | 3 + uv.lock | 319 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 322 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index b09c8c05..b14d546e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,9 @@ dev = [ "python-dotenv>=1.0.1", "diff-cover>=10.2.0", "rich>=14.1.0", + "mkdocs>=1.6.1", + "mkdocs-material>=9.7.1", + "mkdocstrings[python]>=1.0.3", ] [tool.pytest.ini_options] diff --git a/uv.lock b/uv.lock index 402cabeb..83176688 100644 --- a/uv.lock +++ b/uv.lock @@ -44,6 +44,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + [[package]] name = "backports-asyncio-runner" version = "1.2.0" @@ -53,6 +62,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" }, ] +[[package]] +name = "backrefs" +version = "6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/e3/bb3a439d5cb255c4774724810ad8073830fac9c9dee123555820c1bcc806/backrefs-6.1.tar.gz", hash = "sha256:3bba1749aafe1db9b915f00e0dd166cba613b6f788ffd63060ac3485dc9be231", size = 7011962, upload-time = "2025-11-15T14:52:08.323Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ee/c216d52f58ea75b5e1841022bbae24438b19834a29b163cb32aa3a2a7c6e/backrefs-6.1-py310-none-any.whl", hash = "sha256:2a2ccb96302337ce61ee4717ceacfbf26ba4efb1d55af86564b8bbaeda39cac1", size = 381059, upload-time = "2025-11-15T14:51:59.758Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9a/8da246d988ded941da96c7ed945d63e94a445637eaad985a0ed88787cb89/backrefs-6.1-py311-none-any.whl", hash = "sha256:e82bba3875ee4430f4de4b6db19429a27275d95a5f3773c57e9e18abc23fd2b7", size = 392854, upload-time = "2025-11-15T14:52:01.194Z" }, + { url = "https://files.pythonhosted.org/packages/37/c9/fd117a6f9300c62bbc33bc337fd2b3c6bfe28b6e9701de336b52d7a797ad/backrefs-6.1-py312-none-any.whl", hash = "sha256:c64698c8d2269343d88947c0735cb4b78745bd3ba590e10313fbf3f78c34da5a", size = 398770, upload-time = "2025-11-15T14:52:02.584Z" }, + { url = "https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl", hash = "sha256:4c9d3dc1e2e558965202c012304f33d4e0e477e1c103663fd2c3cc9bb18b0d05", size = 400726, upload-time = "2025-11-15T14:52:04.093Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/6296bad135bfafd3254ae3648cd152980a424bd6fed64a101af00cc7ba31/backrefs-6.1-py314-none-any.whl", hash = "sha256:13eafbc9ccd5222e9c1f0bec563e6d2a6d21514962f11e7fc79872fd56cbc853", size = 412584, upload-time = "2025-11-15T14:52:05.233Z" }, + { url = "https://files.pythonhosted.org/packages/02/e3/a4fa1946722c4c7b063cc25043a12d9ce9b4323777f89643be74cef2993c/backrefs-6.1-py39-none-any.whl", hash = "sha256:a9e99b8a4867852cad177a6430e31b0f6e495d65f8c6c134b68c14c3c95bf4b0", size = 381058, upload-time = "2025-11-15T14:52:06.698Z" }, +] + [[package]] name = "basedpyright" version = "1.36.2" @@ -183,6 +206,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -399,6 +434,50 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, ] +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "griffe" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffecli" }, + { name = "griffelib" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/94/ee21d41e7eb4f823b94603b9d40f86d3c7fde80eacc2c3c71845476dddaa/griffe-2.0.0-py3-none-any.whl", hash = "sha256:5418081135a391c3e6e757a7f3f156f1a1a746cc7b4023868ff7d5e2f9a980aa", size = 5214, upload-time = "2026-02-09T19:09:44.105Z" }, +] + +[[package]] +name = "griffecli" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, + { name = "griffelib" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ed/d93f7a447bbf7a935d8868e9617cbe1cadf9ee9ee6bd275d3040fbf93d60/griffecli-2.0.0-py3-none-any.whl", hash = "sha256:9f7cd9ee9b21d55e91689358978d2385ae65c22f307a63fb3269acf3f21e643d", size = 9345, upload-time = "2026-02-09T19:09:42.554Z" }, +] + +[[package]] +name = "griffelib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl", hash = "sha256:01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f", size = 142004, upload-time = "2026-02-09T19:09:40.561Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -496,6 +575,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload-time = "2025-07-22T11:13:31.217Z" }, ] +[[package]] +name = "markdown" +version = "3.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, +] + [[package]] name = "markdown-it-py" version = "4.0.0" @@ -602,6 +690,135 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-autorefs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/e2/2ffc356cd72f1473d07c7719d82a8f2cbd261666828614ecb95b12169f41/mkdocs_material-9.7.1.tar.gz", hash = "sha256:89601b8f2c3e6c6ee0a918cc3566cb201d40bf37c3cd3c2067e26fadb8cce2b8", size = 4094392, upload-time = "2025-12-18T09:49:00.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/32/ed071cb721aca8c227718cffcf7bd539620e9799bbf2619e90c757bfd030/mkdocs_material-9.7.1-py3-none-any.whl", hash = "sha256:3f6100937d7d731f87f1e3e3b021c97f7239666b9ba1151ab476cabb96c60d5c", size = 9297166, upload-time = "2025-12-18T09:48:56.664Z" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "mkdocstrings" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, + { name = "pymdown-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/62/0dfc5719514115bf1781f44b1d7f2a0923fcc01e9c5d7990e48a05c9ae5d/mkdocstrings-1.0.3.tar.gz", hash = "sha256:ab670f55040722b49bb45865b2e93b824450fb4aef638b00d7acb493a9020434", size = 100946, upload-time = "2026-02-07T14:31:40.973Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl", hash = "sha256:0d66d18430c2201dc7fe85134277382baaa15e6b30979f3f3bdbabd6dbdb6046", size = 35523, upload-time = "2026-02-07T14:31:39.27Z" }, +] + +[package.optional-dependencies] +python = [ + { name = "mkdocstrings-python" }, +] + +[[package]] +name = "mkdocstrings-python" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffe" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocstrings" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/84/78243847ad9d5c21d30a2842720425b17e880d99dfe824dee11d6b2149b4/mkdocstrings_python-2.0.2.tar.gz", hash = "sha256:4a32ccfc4b8d29639864698e81cfeb04137bce76bb9f3c251040f55d4b6e1ad8", size = 199124, upload-time = "2026-02-09T15:12:01.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/31/7ee938abbde2322e553a2cb5f604cdd1e4728e08bba39c7ee6fae9af840b/mkdocstrings_python-2.0.2-py3-none-any.whl", hash = "sha256:31241c0f43d85a69306d704d5725786015510ea3f3c4bdfdb5a5731d83cdc2b0", size = 104900, upload-time = "2026-02-09T15:12:00.166Z" }, +] + [[package]] name = "msgpack" version = "1.1.2" @@ -724,6 +941,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + [[package]] name = "pdfrest" version = "0.1.0" @@ -739,6 +974,9 @@ dependencies = [ dev = [ { name = "basedpyright" }, { name = "diff-cover" }, + { name = "mkdocs" }, + { name = "mkdocs-material" }, + { name = "mkdocstrings", extra = ["python"] }, { name = "nox" }, { name = "pip-audit" }, { name = "pre-commit" }, @@ -767,6 +1005,9 @@ requires-dist = [ dev = [ { name = "basedpyright", specifier = ">=1.34.0" }, { name = "diff-cover", specifier = ">=10.2.0" }, + { name = "mkdocs", specifier = ">=1.6.1" }, + { name = "mkdocs-material", specifier = ">=9.7.1" }, + { name = "mkdocstrings", extras = ["python"], specifier = ">=1.0.3" }, { name = "nox", specifier = ">=2025.5.1" }, { name = "pip-audit", specifier = ">=2.7.3" }, { name = "pre-commit", specifier = ">=3.7.0" }, @@ -1017,6 +1258,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pymdown-extensions" +version = "10.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1e/6c/9e370934bfa30e889d12e61d0dae009991294f40055c238980066a7fbd83/pymdown_extensions-10.20.1.tar.gz", hash = "sha256:e7e39c865727338d434b55f1dd8da51febcffcaebd6e1a0b9c836243f660740a", size = 852860, upload-time = "2026-01-24T05:56:56.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/6d/b6ee155462a0156b94312bdd82d2b92ea56e909740045a87ccb98bf52405/pymdown_extensions-10.20.1-py3-none-any.whl", hash = "sha256:24af7feacbca56504b313b7b418c4f5e1317bb5fea60f03d57be7fcc40912aa0", size = 268768, upload-time = "2026-01-24T05:56:54.537Z" }, +] + [[package]] name = "pyparsing" version = "3.2.5" @@ -1135,6 +1389,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, ] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + [[package]] name = "python-dotenv" version = "1.1.1" @@ -1208,6 +1474,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + [[package]] name = "requests" version = "2.32.5" @@ -1262,6 +1540,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c3/12/28fa2f597a605884deb0f65c1b1ae05111051b2a7030f5d8a4ff7f4599ba/ruff-0.13.2-py3-none-win_arm64.whl", hash = "sha256:da711b14c530412c827219312b7d7fbb4877fb31150083add7e8c5336549cea7", size = 12484437, upload-time = "2025-09-25T14:54:08.022Z" }, ] +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + [[package]] name = "sniffio" version = "1.3.1" @@ -1372,3 +1659,35 @@ sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615 wheels = [ { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" }, ] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, + { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] From 266e419e8e93b3a266f9d53fb41bb488a5fd16fc Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Thu, 12 Feb 2026 13:20:56 -0600 Subject: [PATCH 2/9] docs: Add initial MkDocs setup and documentation structure - Created `mkdocs.yml` to configure MkDocs with Material theme and `mkdocstrings[python]` for API documentation generation. - Added `docs/` directory with the following content: - `index.md`: Home page for the documentation. - `getting-started.md`: Instructions for setup and local development. - `api-reference.md`: API reference generated from Python docstrings. - Updated `README.md` with instructions for running and building the docs site. Assisted-by: Codex --- README.md | 14 ++++++++++++++ docs/api-reference.md | 5 +++++ docs/getting-started.md | 21 +++++++++++++++++++++ docs/index.md | 13 +++++++++++++ mkdocs.yml | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 docs/api-reference.md create mode 100644 docs/getting-started.md create mode 100644 docs/index.md create mode 100644 mkdocs.yml diff --git a/README.md b/README.md index bd910104..e838a4db 100644 --- a/README.md +++ b/README.md @@ -45,3 +45,17 @@ uvx nox -s class-coverage To reuse an existing `coverage/py/coverage.json` without rerunning tests, add `-- --no-tests` (and optional `--coverage-json path`). + +## Documentation + +Run the docs site locally: + +```bash +uv run mkdocs serve +``` + +Build the static documentation site: + +```bash +uv run mkdocs build --strict +``` diff --git a/docs/api-reference.md b/docs/api-reference.md new file mode 100644 index 00000000..2a5b4ddd --- /dev/null +++ b/docs/api-reference.md @@ -0,0 +1,5 @@ +# API reference + +## Package + +::: pdfrest diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 00000000..499ae123 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,21 @@ +# Getting started + +## Install dependencies + +```bash +uv sync --group dev +``` + +## Run docs locally + +```bash +uv run mkdocs serve +``` + +Then open . + +## Build static docs + +```bash +uv run mkdocs build --strict +``` diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..0129a69d --- /dev/null +++ b/docs/index.md @@ -0,0 +1,13 @@ +# pdfrest documentation + +Welcome to the docs for `pdfrest`, a Python client for the PDFRest API. + +Use this site for: + +- Project setup and local development guidance. +- API reference generated from source docstrings. + +## Documentation style + +- Pages are written in Markdown. +- API docs are generated from Google-style Python docstrings. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..9033c8bc --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,32 @@ +site_name: pdfrest +site_description: Python client library for interacting with the PDFRest API +repo_url: https://github.com/pdfrest/pdfrest-python +docs_dir: docs +site_dir: site +strict: true + +theme: + name: material + +plugins: + - search + - mkdocstrings: + handlers: + python: + paths: [src] + options: + docstring_style: google + heading_level: 2 + members_order: source + show_source: false + show_root_heading: true + +markdown_extensions: + - admonition + - pymdownx.details + - pymdownx.superfences + +nav: + - Home: index.md + - Getting Started: getting-started.md + - API Reference: api-reference.md From 794a644eb6b085ac5e1832f35b7ec51ede097e14 Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Thu, 12 Feb 2026 13:21:41 -0600 Subject: [PATCH 3/9] github: Add workflow for documentation deployment - Introduced `.github/workflows/docs.yml` to automate documentation deployment to GitHub Pages. - Configured workflow to trigger on `push` to `main` and manual dispatch. - Added build and deploy steps: - Installed dependencies with `uv` and built documentation using MkDocs. - Uploaded built files as an artifact and deployed to GitHub Pages. Assisted-by: Codex --- .github/workflows/docs.yml | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/docs.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..50c88c8a --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,51 @@ +name: Docs + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Install uv + uses: astral-sh/setup-uv@v6 + with: + version: 0.9.18 + python-version: "3.11" + enable-cache: true + cache-suffix: docs + cache-dependency-glob: uv.lock + - name: Synchronize project dependencies + run: uv sync --group dev + - name: Build documentation + run: uv run mkdocs build --strict + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: site + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + steps: + - id: deployment + name: Deploy to GitHub Pages + uses: actions/deploy-pages@v4 From bbeea0cb8a9dc54706d119d1f72c352132df888d Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Thu, 12 Feb 2026 13:21:57 -0600 Subject: [PATCH 4/9] idea: Configure PyCharm to use Google-style docstrings - Added `PyDocumentationSettings` configuration in `.idea/pdfrest-python.iml`. - Set default docstring format to Google style for improved consistency with Python documentation standards. Assisted-by: Codex --- .idea/pdfrest-python.iml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.idea/pdfrest-python.iml b/.idea/pdfrest-python.iml index 4e4b5a76..7a1d22c3 100644 --- a/.idea/pdfrest-python.iml +++ b/.idea/pdfrest-python.iml @@ -19,4 +19,8 @@ + + \ No newline at end of file From 49456461dd20dd8192df3db8d18d684639f47898 Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Thu, 12 Feb 2026 13:26:16 -0600 Subject: [PATCH 5/9] github: Add docs-check job to test-and-publish workflow - Added a new `docs-check` job to `.github/workflows/test-and-publish.yml`: - Configures dependency management with `uv` and caches dev dependencies. - Synchronizes project dependencies using `uv sync`. - Builds documentation using MkDocs with strict mode. - Updated `publish` job to depend on `docs-check`. Assisted-by: Codex --- .github/workflows/test-and-publish.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/test-and-publish.yml b/.github/workflows/test-and-publish.yml index 5278f259..b90aa0ca 100644 --- a/.github/workflows/test-and-publish.yml +++ b/.github/workflows/test-and-publish.yml @@ -12,6 +12,29 @@ on: - published jobs: + docs-check: + name: Docs Check + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + packages: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v6 + with: + version: 0.9.18 + python-version: "3.11" + enable-cache: true + cache-suffix: test-and-publish + cache-dependency-glob: uv.lock + - name: Synchronize project dependencies + run: uv sync --group dev + - name: Build docs with MkDocs + run: uv run mkdocs build --strict + tests: name: Tests (Python ${{ matrix.python-version }}) runs-on: ubuntu-latest @@ -100,6 +123,7 @@ jobs: publish: name: Publish to CodeArtifact needs: + - docs-check - tests - examples if: github.event_name == 'release' From e4858ce40c79978fb728f6e946d6adb9fb65c523 Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Fri, 13 Feb 2026 11:19:10 -0600 Subject: [PATCH 6/9] docs: Enhance MkDocs with code copy button and tabbed styling - Enabled `content.code.copy` feature in the Material theme to add a copy button for code snippets. - Added `pymdownx.tabbed` Markdown extension with alternate styling for a more interactive and polished tabbed interface. Assisted-by: Codex --- mkdocs.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mkdocs.yml b/mkdocs.yml index 9033c8bc..abbd1008 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,6 +7,8 @@ strict: true theme: name: material + features: + - content.code.copy plugins: - search @@ -24,6 +26,8 @@ plugins: markdown_extensions: - admonition - pymdownx.details + - pymdownx.tabbed: + alternate_style: true - pymdownx.superfences nav: From 8b19c8c2d577356af66cf4a3482da13038945d9d Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Fri, 13 Feb 2026 11:21:41 -0600 Subject: [PATCH 7/9] docs: Revamp getting-started guide with Cloud-first setup - Replaced the basic dependency installation instructions with a step-by-step Cloud-first onboarding guide for `pdfrest`. - Introduced examples for using `uv`, `pip`, and `Poetry` to set up the SDK. - Added API key export instructions and a `quickstart.py` sample program for testing the text extraction feature. - Enhanced reference sections with links to the official Cloud onboarding flow, API lab, and Python API reference. - Updated the `index.md` to provide a clearer overview of `pdfRest` and its relationship to the Python SDK. - Adjusted `.pre-commit-config.yaml` to exclude `docs/` from the `mdformat` hook. Assisted-by: Codex --- .pre-commit-config.yaml | 2 +- docs/getting-started.md | 129 ++++++++++++++++++++++++++++++++++++---- docs/index.md | 59 +++++++++++++++--- 3 files changed, 170 insertions(+), 20 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 942e5c65..298133b7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,7 +36,7 @@ repos: hooks: - id: mdformat name: mdformat on non-.github files - exclude: ^.github/ + exclude: ^(.github/|docs/) args: ["--wrap", "80", "--number"] additional_dependencies: - mdformat-gfm diff --git a/docs/getting-started.md b/docs/getting-started.md index 499ae123..f5e053ea 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,21 +1,126 @@ # Getting started -## Install dependencies +This guide walks through a Cloud-first setup for `pdfrest` (the Python package +published on PyPI) so you can make your first API call quickly. -```bash -uv sync --group dev -``` +## Before you begin -## Run docs locally +- A Python runtime (3.10+ recommended for this SDK). +- A local PDF file to test with. +- A pdfRest Cloud account and API key. -```bash -uv run mkdocs serve -``` +For the official Cloud onboarding flow, see: + +- [pdfRest API Toolkit Cloud: Getting Started](https://docs.pdfrest.com/pdfrest-api-toolkit-cloud/getting-started/) +- [Python API reference](api-reference.md) +- [API Lab](https://pdfrest.com/apilab/) + +## 1. Create a project and install `pdfrest` + +### Recommended: uv + +=== "uv (Recommended)" + ```bash + mkdir pdfrest-quickstart + cd pdfrest-quickstart + uv init + uv add pdfrest + ``` + +=== "pip + venv" + ```bash + mkdir pdfrest-quickstart + cd pdfrest-quickstart + python -m venv .venv + source .venv/bin/activate + pip install pdfrest + ``` + +=== "Poetry" + ```bash + mkdir pdfrest-quickstart + cd pdfrest-quickstart + poetry init --no-interaction + poetry add pdfrest + ``` + +## 2. Get your pdfRest Cloud API key + +1. Create or sign in to your account at [pdfRest.com](https://pdfrest.com/). +2. Follow the Cloud onboarding steps in + [Getting Started](https://docs.pdfrest.com/pdfrest-api-toolkit-cloud/getting-started/). +3. Copy your API key and export it as `PDFREST_API_KEY` in your shell. + +=== "macOS / Linux (bash/zsh)" + ```bash + export PDFREST_API_KEY="your-api-key-here" + ``` + +=== "Windows PowerShell" + ```powershell + $env:PDFREST_API_KEY="your-api-key-here" + ``` + +!!! tip + The [API Lab](https://pdfrest.com/apilab/) is useful for testing endpoints + interactively and generating starter code samples before integrating them + into your project. + +## 3. Add a short example program -Then open . +Create `quickstart.py`: -## Build static docs +```python +from pathlib import Path -```bash -uv run mkdocs build --strict +from pdfrest import PdfRestClient + +input_pdf = Path("input.pdf") + +if not input_pdf.exists(): + raise FileNotFoundError( + "Place a test PDF at ./input.pdf before running this script." + ) + +with PdfRestClient() as client: + uploaded = client.files.create_from_paths([input_pdf])[0] + document = client.extract_pdf_text(uploaded, full_text="document") + +full_text = "" +if document.full_text is not None and document.full_text.document_text is not None: + full_text = document.full_text.document_text + +print(f"Input file id: {uploaded.id}") +print("Extracted text preview:") +print(full_text[:500] if full_text else "(no text returned)") ``` + +What this script does: + +- Uploads `input.pdf` to pdfRest Cloud. +- Calls `extract_pdf_text`. +- Prints a short text preview from the response. + +## 4. Run the example + +=== "uv" + ```bash + uv run python quickstart.py + ``` + +=== "pip + venv" + ```bash + python quickstart.py + ``` + +=== "Poetry" + ```bash + poetry run python quickstart.py + ``` + +## 5. Next steps + +- Browse endpoint options in the + [Python API reference](api-reference.md). +- Explore additional endpoint behavior and payload examples in + [API Lab](https://pdfrest.com/apilab/). diff --git a/docs/index.md b/docs/index.md index 0129a69d..9befddd3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,13 +1,58 @@ # pdfrest documentation -Welcome to the docs for `pdfrest`, a Python client for the PDFRest API. +Welcome to the docs for `pdfrest`, a Python client for +[pdfRest](https://pdfrest.com/). -Use this site for: +## What is pdfRest? -- Project setup and local development guidance. -- API reference generated from source docstrings. +[pdfRest](https://pdfrest.com/) is a cloud PDF processing platform that +provides REST APIs for common document workflows such as conversion, +compression, OCR, merge/split, and redaction. You send API requests to the +pdfRest service, and pdfRest returns structured responses and processed file +outputs. -## Documentation style +Useful references: -- Pages are written in Markdown. -- API docs are generated from Google-style Python docstrings. +- [pdfRest homepage](https://pdfrest.com/) +- [API reference](https://pdfrest.com/apidocs/) +- [API Lab (interactive testing)](https://pdfrest.com/apilab/) + +## How this Python API relates to pdfRest + +This repository provides the official Python SDK layer for calling pdfRest +endpoints from Python applications. + +The SDK: + +- Targets the pdfRest API host (`https://api.pdfrest.com`) by default. +- Exposes both sync and async clients (`PdfRestClient` and + `AsyncPdfRestClient`). +- Provides typed request/response models and validation to make integrations + safer and easier to maintain. +- Includes endpoint helpers that map Python method calls to pdfRest API routes. + +In short: pdfRest is the hosted API service, and this package is the Python +developer interface for using that service in your code. + +## Ways to run pdfRest + +The pdfRest docs describe three deployment options: + +- [Cloud](https://docs.pdfrest.com/pdfrest-api-toolkit-cloud/getting-started/): + fastest path with pdfRest-managed infrastructure at `api.pdfrest.com`. +- [On AWS](https://docs.pdfrest.com/pdfrest-api-toolkit-on-aws/getting-started/): + self-hosted deployment in your AWS environment (AMI or CloudFormation). +- [Container](https://docs.pdfrest.com/pdfrest-api-toolkit-container/getting-started/): + self-hosted Docker/Kubernetes deployment for private cloud or on-prem. + +For this SDK, the integration surface stays consistent across all three: + +- Use the default client settings for Cloud. +- Point the client `base_url` at your deployed endpoint for AWS or Container. +- Keep using the same Python methods and payload models; only deployment + configuration changes. + +Reference: + +- [pdfRest documentation overview](https://docs.pdfrest.com/overview/) +- [API reference guide directory](https://docs.pdfrest.com/api-reference-guides/directory/) From a6b02c562ef1abc4964569f715ca38afe10a4c98 Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Fri, 13 Feb 2026 14:57:19 -0600 Subject: [PATCH 8/9] github: Remove unused permissions from docs-check job - Eliminated unnecessary `id-token`, `contents`, `packages`, and `pull-requests` permissions from the `docs-check` job in `.github/workflows/test-and-publish.yml`. - Simplified the workflow configuration by retaining only required steps. Assisted-by: Codex --- .github/workflows/test-and-publish.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/test-and-publish.yml b/.github/workflows/test-and-publish.yml index b90aa0ca..48c73f1f 100644 --- a/.github/workflows/test-and-publish.yml +++ b/.github/workflows/test-and-publish.yml @@ -15,11 +15,6 @@ jobs: docs-check: name: Docs Check runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - packages: write - pull-requests: write steps: - uses: actions/checkout@v4 - name: Install uv From 9a9504a98cc3979ad50a2c6da99ede8dda670ddf Mon Sep 17 00:00:00 2001 From: "Kevin A. Mitchell" Date: Fri, 13 Feb 2026 14:57:44 -0600 Subject: [PATCH 9/9] agents: Update contributor notes and CI workflow details - Clarified the distinction between contributor notes in the root directory (`README.md`, `AGENTS.md`) and site documentation in the `docs/` folder. - Documented the addition of the `Docs` CI workflow for building and deploying the documentation site via GitHub Pages. - Updated workflow descriptions to reflect current CI processes. Assisted-by: Codex --- AGENTS.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 632e009a..51685033 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,9 +8,9 @@ `tests/test_client.py`). - Workflow definitions are in `.github/workflows/`; adjust only when CI requirements change. -- Documentation and contributor notes reside at the repo root (`README.md`, - `AGENTS.md`). Automation sessions live in `noxfile.py`; keep shared task logic - there. +- Contributor notes reside at the repo root (`README.md`, `AGENTS.md`), while + the documentation site content lives in `docs/`. Automation sessions live in + `noxfile.py`; keep shared task logic there. ## Build, Test, and Development Commands @@ -285,8 +285,9 @@ ## CI & Publishing Notes -- GitHub Actions run two workflows: `pre-commit` (no AWS credentials) and - `Test and Publish` (Python 3.10–3.14 matrix). +- GitHub Actions run three workflows: `pre-commit` (no AWS credentials), + `Test and Publish` (Python 3.10–3.14 matrix), and `Docs` (GitHub Pages build + and deploy on `main` push/manual dispatch). - Only the release job assumes the AWS OIDC role to `uv build` and publish with `uv publish`. - Keep CodeArtifact credentials out of source control; day-to-day development