Package: apischema
apischemaJSON (de)serialization, GraphQL and JSON schema generation using Python typing.apischemamakes your life easier when dealing with API data.Documentationhttps://wyfo.github.io/apischema/InstallpipinstallapischemaIt requires only Python 3.7+.PyPy3is also fully supported.Why another library?(If you wonder how this differs from thepydanticlibrary, see thededicated section of the documentation— there are many differences.)This library fulfills the following goals:stay as close as possible to the standard library (dataclasses, typing, etc.) — as a consequence we do not need plugins for editors/linters/etc.;avoid object-oriented limitations — do not require a base class — thus handle easily every type (Foo,list[Bar],NewType(Id, int), etc.) the same way.be adaptable, provide tools to support any types (ORM, etc.);avoid dynamic things like using raw strings for attributes name - play nicely with your IDE.No known alternative achieves all of this, and apischema is also(a lot) fasterthan all of them.On top of that, because APIs are not only JSON,apischemais also a complete GraphQL libraryActually,apischemais even adaptable enough to enable support of competitor libraries in a few dozens of line of code (pydantic support exampleusingconversions feature)Examplefromcollections.abcimportCollectionfromdataclassesimportdataclass,fieldfromuuidimportUUID,uuid4importpytestfromgraphqlimportprint_schemafromapischemaimportValidationError,deserialize,serializefromapischema.graphqlimportgraphql_schemafromapischema.json_schemaimportdeserialization_schema# Define a schema with standard dataclasses@dataclassclassResource:id:UUIDname:strtags:set[str]=field(default_factory=set)# Get some datauuid=uuid4()data={"id":str(uuid),"name":"wyfo","tags":["some_tag"]}# Deserialize dataresource=deserialize(Resource,data)assertresource==Resource(uuid,"wyfo",{"some_tag"})# Serialize objectsassertserialize(Resource,resource)==data# Validate during deserializationwithpytest.raises(ValidationError)aserr:# pytest checks exception is raiseddeserialize(Resource,{"id":"42","name":"wyfo"})asserterr.value.errors==[{"loc":["id"],"err":"badly formed hexadecimal UUID string"}]# Generate JSON Schemaassertdeserialization_schema(Resource)=={"$schema":"http://json-schema.org/draft/2020-12/schema#","type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"},"uniqueItems":True,"default":[],},},"required":["id","name"],"additionalProperties":False,}# Define GraphQL operationsdefresources(tags:Collection[str]|None=None)->Collection[Resource]|None:...# Generate GraphQL schemaschema=graphql_schema(query=[resources],id_types={UUID})schema_str="""\type Query {resources(tags: [String!]): [Resource!]}type Resource {id: ID!name: String!tags: [String!]!}"""assertprint_schema(schema)==schema_strapischemaworks out of the box with your data model.This example and further ones are usingpytestAPI because they are in fact run as tests in the library CIRun the documentation examplesAll documentation examples are written using the last Python minor version — currently 3.10 — in order to provide up-to-date documentation. Because Python 3.10 specificities (likePEP 585) are used, this version is "mandatory" to execute the examples as-is.In addition topytest, some examples use third-party libraries likeSQLAlchemyorattrs. All of this dependencies can be downloaded using theexamplesextra withpipinstallapischema[examples]Once dependencies are installed, you can simply copy-paste examples and execute them, using the proper Python version.