pydantic-resolve


Namepydantic-resolve JSON
Version 1.10.3 PyPI version JSON
download
home_pagehttps://github.com/allmonday/pydantic_resolve
Summarycreate nested data structure easily
upload_time2024-04-08 12:08:57
maintainerNone
docs_urlNone
authortangkikodo
requires_python<4.0,>=3.7
licenseMIT
keywords pydantic fastapi
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            [![pypi](https://img.shields.io/pypi/v/pydantic-resolve.svg)](https://pypi.python.org/pypi/pydantic-resolve)
[![Downloads](https://static.pepy.tech/personalized-badge/pydantic-resolve?period=month&units=abbreviation&left_color=grey&right_color=orange&left_text=Downloads)](https://pepy.tech/project/pydantic-resolve)
![Python Versions](https://img.shields.io/pypi/pyversions/pydantic-resolve)
![Test Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/allmonday/6f1661c6310e1b31c9a10b0d09d52d11/raw/covbadge.json)
[![CI](https://github.com/allmonday/pydantic_resolve/actions/workflows/ci.yml/badge.svg)](https://github.com/allmonday/pydantic_resolve/actions/workflows/ci.yml)

Pydantic-resolve is a schema based, hierarchical solution for fetching and crafting data.

It combines the advantages of restful and graphql.


![img](docs/images/intro.jpeg)


Advantages:
1. use declaretive way to define view data, easy to maintain and develop
2. enhance the traditional restful response, to support gql-like style data structure.
3. provide post_method and other tools to craft resolved data.


[Discord](https://discord.com/channels/1197929379951558797/1197929379951558800)

## Install

> If you are using pydantic v2, please use [pydantic2-resolve](https://github.com/allmonday/pydantic2-resolve) instead.


```shell
pip install pydantic-resolve
```

## Concepts from GraphQL to Pydantic-resolve

This is how we do queries in GraphQL

`comment_count` is a extra field calculated from length of comment, which is usally process by client after fetching the data because the this kind of calculation is flexible.

cliend side so need to iterate over the blogs to get the length and the sum, which is boring.

```gql
query {
    MyBlogSite {
        name
        blogs {
            id
            title
            comments {
                id
                content
            }
            # comment_count
        }
        # comment_count
    }
}
```

In pydantic-resolve, we can process comment_count at server side, by transforming the query into pydantic schemas.

schemas , query functions and loader functions are provided by each service module, so we can declare our customrized schema by simpily **INHERIT** and **EXTEND** from base schemas.

> This just sounds like columns of values (inherit) and columns of foreign keys (extend).

After transforming GraphQL query into pydantic schemas, post calculation become dead easy.

```python
import blog_service as bs
import comment_service as cs

class MySite(BaseModel):
    blogs: list[MySiteBlog] = []
    async def resolve_blogs(self):
        return await bs.get_blogs()

    comment_count: int = 0
    def post_comment_count(self):
        return sum([b.comment_count for b in self.blogs])

# -------- inherit and extend ----------
class MySiteBlog(bs.Blog):  
    comments: list[cs.Comment] = []
    def resolve_comments(self, loader=LoaderDepend(cs.blog_to_comments_loader)):
        return loader.load(self.id)

    comment_count: int = 0
    def post_comment_count(self):
        return len(self.comments)
        
async def main():
    my_blog_site = MyBlogSite(name: "tangkikodo's blog")
    my_blog_site = await Resolver().resolve(my_blog_site)
```


## API Reference
https://allmonday.github.io/pydantic-resolve/reference_api/

## Composition oriented development-pattern (wip)
https://github.com/allmonday/composition-oriented-development-pattern


## Unittest

```shell
poetry run python -m unittest  # or
poetry run pytest  # or
poetry run tox
```

## Coverage

```shell
poetry run coverage run -m pytest
poetry run coverage report -m
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/allmonday/pydantic_resolve",
    "name": "pydantic-resolve",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.7",
    "maintainer_email": null,
    "keywords": "pydantic, fastapi",
    "author": "tangkikodo",
    "author_email": "allmonday@126.com",
    "download_url": "https://files.pythonhosted.org/packages/7e/ad/8a1654d2ee1580cb6325ca491a123b9b9b18e1a52cb15b180e7528d2a213/pydantic_resolve-1.10.3.tar.gz",
    "platform": null,
    "description": "[![pypi](https://img.shields.io/pypi/v/pydantic-resolve.svg)](https://pypi.python.org/pypi/pydantic-resolve)\n[![Downloads](https://static.pepy.tech/personalized-badge/pydantic-resolve?period=month&units=abbreviation&left_color=grey&right_color=orange&left_text=Downloads)](https://pepy.tech/project/pydantic-resolve)\n![Python Versions](https://img.shields.io/pypi/pyversions/pydantic-resolve)\n![Test Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/allmonday/6f1661c6310e1b31c9a10b0d09d52d11/raw/covbadge.json)\n[![CI](https://github.com/allmonday/pydantic_resolve/actions/workflows/ci.yml/badge.svg)](https://github.com/allmonday/pydantic_resolve/actions/workflows/ci.yml)\n\nPydantic-resolve is a schema based, hierarchical solution for fetching and crafting data.\n\nIt combines the advantages of restful and graphql.\n\n\n![img](docs/images/intro.jpeg)\n\n\nAdvantages:\n1. use declaretive way to define view data, easy to maintain and develop\n2. enhance the traditional restful response, to support gql-like style data structure.\n3. provide post_method and other tools to craft resolved data.\n\n\n[Discord](https://discord.com/channels/1197929379951558797/1197929379951558800)\n\n## Install\n\n> If you are using pydantic v2, please use [pydantic2-resolve](https://github.com/allmonday/pydantic2-resolve) instead.\n\n\n```shell\npip install pydantic-resolve\n```\n\n## Concepts from GraphQL to Pydantic-resolve\n\nThis is how we do queries in GraphQL\n\n`comment_count` is a extra field calculated from length of comment, which is usally process by client after fetching the data because the this kind of calculation is flexible.\n\ncliend side so need to iterate over the blogs to get the length and the sum, which is boring.\n\n```gql\nquery {\n    MyBlogSite {\n        name\n        blogs {\n            id\n            title\n            comments {\n                id\n                content\n            }\n            # comment_count\n        }\n        # comment_count\n    }\n}\n```\n\nIn pydantic-resolve, we can process comment_count at server side, by transforming the query into pydantic schemas.\n\nschemas , query functions and loader functions are provided by each service module, so we can declare our customrized schema by simpily **INHERIT** and **EXTEND** from base schemas.\n\n> This just sounds like columns of values (inherit) and columns of foreign keys (extend).\n\nAfter transforming GraphQL query into pydantic schemas, post calculation become dead easy.\n\n```python\nimport blog_service as bs\nimport comment_service as cs\n\nclass MySite(BaseModel):\n    blogs: list[MySiteBlog] = []\n    async def resolve_blogs(self):\n        return await bs.get_blogs()\n\n    comment_count: int = 0\n    def post_comment_count(self):\n        return sum([b.comment_count for b in self.blogs])\n\n# -------- inherit and extend ----------\nclass MySiteBlog(bs.Blog):  \n    comments: list[cs.Comment] = []\n    def resolve_comments(self, loader=LoaderDepend(cs.blog_to_comments_loader)):\n        return loader.load(self.id)\n\n    comment_count: int = 0\n    def post_comment_count(self):\n        return len(self.comments)\n        \nasync def main():\n    my_blog_site = MyBlogSite(name: \"tangkikodo's blog\")\n    my_blog_site = await Resolver().resolve(my_blog_site)\n```\n\n\n## API Reference\nhttps://allmonday.github.io/pydantic-resolve/reference_api/\n\n## Composition oriented development-pattern (wip)\nhttps://github.com/allmonday/composition-oriented-development-pattern\n\n\n## Unittest\n\n```shell\npoetry run python -m unittest  # or\npoetry run pytest  # or\npoetry run tox\n```\n\n## Coverage\n\n```shell\npoetry run coverage run -m pytest\npoetry run coverage report -m\n```\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "create nested data structure easily",
    "version": "1.10.3",
    "project_urls": {
        "Homepage": "https://github.com/allmonday/pydantic_resolve",
        "Repository": "https://github.com/allmonday/pydantic_resolve"
    },
    "split_keywords": [
        "pydantic",
        " fastapi"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "88a98ecd345571d6ee8a822b0add5e83fe7ec467922dce4750daeef5b205ad78",
                "md5": "1d4b34d38a292af247e7e4acda9975ad",
                "sha256": "7a89a7718553bba5df989bb432308a7dabe9650523b4ac129509581c8aa6706c"
            },
            "downloads": -1,
            "filename": "pydantic_resolve-1.10.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1d4b34d38a292af247e7e4acda9975ad",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.7",
            "size": 14637,
            "upload_time": "2024-04-08T12:08:54",
            "upload_time_iso_8601": "2024-04-08T12:08:54.957468Z",
            "url": "https://files.pythonhosted.org/packages/88/a9/8ecd345571d6ee8a822b0add5e83fe7ec467922dce4750daeef5b205ad78/pydantic_resolve-1.10.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7ead8a1654d2ee1580cb6325ca491a123b9b9b18e1a52cb15b180e7528d2a213",
                "md5": "e245ed54f839dfaa6362def02da5d3f9",
                "sha256": "c5706a194008831d4b8eab3001ab3a7601b7fda12a378d3bdf58e44419bbb86b"
            },
            "downloads": -1,
            "filename": "pydantic_resolve-1.10.3.tar.gz",
            "has_sig": false,
            "md5_digest": "e245ed54f839dfaa6362def02da5d3f9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.7",
            "size": 13855,
            "upload_time": "2024-04-08T12:08:57",
            "upload_time_iso_8601": "2024-04-08T12:08:57.406115Z",
            "url": "https://files.pythonhosted.org/packages/7e/ad/8a1654d2ee1580cb6325ca491a123b9b9b18e1a52cb15b180e7528d2a213/pydantic_resolve-1.10.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-08 12:08:57",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "allmonday",
    "github_project": "pydantic_resolve",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "tox": true,
    "lcname": "pydantic-resolve"
}
        
Elapsed time: 0.58214s