Metadata-Version: 2.4
Name: plipio
Version: 0.1.1.dev202608091325
Summary: Publish, schedule and analyse content across social platforms.
Project-URL: Homepage, https://docs.plipio.com
Project-URL: Documentation, https://docs.plipio.com/sdk
Project-URL: Repository, https://github.com/Vld135/plipio
Project-URL: Issues, https://github.com/Vld135/plipio/issues
Author: Plipio
License-Expression: MIT
License-File: LICENSE
Keywords: api,plipio,publishing,scheduling,sdk,social
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: httpx>=0.27
Description-Content-Type: text/markdown

# plipio

The Python client. Same behaviour as `@plipio/sdk`, asserted by the same files.

```bash
uv sync
uv run pytest -q
```

The types come from `apps/api/openapi.json`; everything around them is written
by hand, because it is what a generator cannot know. `conformance/` at the
repository root holds the fixtures both clients run — see its README before
changing any behaviour here.

## The generated half

`scripts/generate-models.mjs` produces the response shapes from
`apps/docs/openapi.json` — models only, no transport. It is verified to run
(182 files, ~16 000 lines from the current contract) but its output is not
committed yet: the facade here is one resource deep and speaks in dictionaries,
so committing sixteen thousand lines of pydantic nothing imports would be weight
without a reader. Run it, and add `packages/sdk-python/src/plipio/_generated` to
the "Contract is fresh" step in `.github/workflows/ci.yml`, when the facade
starts consuming the models.

Only the models, deliberately. A full generator was measured against this
contract and rejected on three counts, each of them fatal for a client meant to
last: in Go it puts `DisallowUnknownFields()` in 133 of 145 models, so any new
field in any response breaks every deployed client that was not regenerated; in
Python it implements enums as a validator that *raises*, so a new post status
breaks deserialisation for every old client; and it offers no point at which a
transport can be injected — without which the conformance runners here could not
exist at all.
