Automate JSON:API management in Flask. No manual mapping, just clean code.
Project description
japyd
"JSON:API, Pydantically simple."
Automate JSON:API relationships with Pydantic. No manual mapping, just clean code.
Japyd: Core Value Propositions
Japyd is a Python toolkit designed to simplify the interaction with JSON:API, a specification for building APIs in JSON. It provides a set of utilities to facilitate the creation, manipulation, and validation of JSON:API resources and requests.
Build JSON:API Relational Structures from Pydantic Models
Native Pydantic Integration: Automatically generates JSON:API-compliant resources and relationships from Pydantic models, eliminating boilerplate.
Relationship Management: Supports to-one, to-many, and included resources, fully compliant with the JSON:API specification.
Smart Serialization: Converts Pydantic objects into valid JSON:API documents, handling attributes, relationships, and metadata seamlessly.
Parse JSON:API Query Parameters (Dotnet-style Syntax)
Advanced Query Parsing: Supports JSON:API.NET-style query parameters, including filtering, sorting, pagination, sparse fieldsets, and inclusion.
Built-in Validation: Ensures query parameters are syntactically correct and consistent.
- Filtering: filter[name]=Guillaume
- Sorting: sort=-created,title
- Pagination: page[number]=1&page[size]=10
- Sparse Fieldsets: fields[articles]=title,author
- Inclusion: include=author,comments
Flask Extension for JSON:API Response Formatting
Ready-to-use Flask Integration: Provides a Flask extension to automatically encapsulate responses in JSON:API format, including:
- Resources (data, relationships, attributes)
- Pagination (links, page metadata)
- Errors (standardized JSON:API error objects)
Simplified Endpoints: Reduces manual response formatting, ensuring compliance with JSON:API standards.
Relationship decomposition
To automate and standardize the definition of relationships in our JSON:API implementation, we leveraged Pydantic’s
data model.
This approach allowed us to dynamically infer relationships between resources without manually declaring them for each
object type.
The principle is as follows:
- A Pydantic model represents a resource (e.g., JSON:API Resource Object).
- If an attribute of this model is itself a Pydantic object (or a list of Pydantic objects), it is automatically
- interpreted as a
relationshipin the JSON:API response. - If the attribute is a primitive type (string, integer, boolean, or event dict etc.), it is treated as a standard
attribute.
Usage
Serialization
Define your data models in Pydantic, let japyd automatically handle serialization—including relationships and included resources—and expose a standard-compliant JSON:API with Flask in just a few lines of code.
import typing as t
import pytest
from flask import Flask
from flask_pydantic import validate
from japyd import JsonApiBaseModel
from japyd import JsonApiQueryModel
from japyd import TopLevel
class Product(JsonApiBaseModel):
jsonapi_type: t.ClassVar[str] = "product"
id: str
price: float
class Order(JsonApiBaseModel):
jsonapi_type: t.ClassVar[str] = "order"
id: str
customer_id: str
items: list[Product] # This field will be 'relationship' in JSON:API
status: str # This field will be classical 'attribute'
app = Flask(__name__)
@app.route("/orders/<order_id>")
@validate(exclude_none=True)
def get_order(order_id, query: JsonApiQueryModel):
order = Order(id=order_id, customer_id="123", items=[Product(id="1", price=100.0)], status="open")
return query.one_or_none(order)
@pytest.fixture()
def client():
return app.test_client()
def test_request(client):
response = client.get("/orders/3?include=items")
top = TopLevel.model_validate(response.json)
assert top.data.id == "3"
assert top.data.attributes['status'] == 'open'
assert len(top.data.relationships['items'].data) == 1
assert top.included[0].type == "product"
You can bypass this behavior by annotationg the field as follow:
items: Annotated[list[Product], 'as_attribute'] # This field will be now an 'attribute' in JSON:API
Filtering
The complete filtering syntax of JsonApiDotNetCore is supported
References
japyd (JsonApi PYDantic) is a coherent and powerful composition of :
- Pydantic and its Flask extension Flask-Pydantic
- Filtering syntax defined in the dotnet implementation JsonApiDotNetCore.
- Simple relationship extraction and other structure manipulations.
🚀 Looking for Contributors
We’re actively seeking developers, testers, and open-source enthusiasts to help us build and improve japyd. Whether you’re passionate about data validation, API design, or just want to contribute to an innovative open-source project, your help is welcome! Check out our contribution guidelines and open issues to get started. Let’s shape the future of Python APIs together! 💻✨
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file japyd-1.0.3.tar.gz.
File metadata
- Download URL: japyd-1.0.3.tar.gz
- Upload date:
- Size: 14.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: pdm/2.26.7 CPython/3.12.13 Linux/6.17.0-1010-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed896bf0e3b380a6973782abec6f7a16f334d7d921b7056d4b522a477e749ecd
|
|
| MD5 |
6236d62886ddd28260eba3b9407c68dd
|
|
| BLAKE2b-256 |
c6af4ad5c7252303ae9dfafd4b85295fa5e997c38e8ba6ff2fb3c2623add12b5
|
File details
Details for the file japyd-1.0.3-py3-none-any.whl.
File metadata
- Download URL: japyd-1.0.3-py3-none-any.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: pdm/2.26.7 CPython/3.12.13 Linux/6.17.0-1010-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
481b5c6cda832396d6f4747fca1684712f500f7d3236731320eaf7c38adeff30
|
|
| MD5 |
138203009af830384c0ab6549b1471a4
|
|
| BLAKE2b-256 |
97a1c85139d525dd2dd95becae6a6a20b6a0cd89d51a5f20b8513aa768bd2f54
|