# greff
I wanted an animal name, but most of them already used in pypi :(, the name pronounced `greph`
## what is it
`greff` creates python classes from `graphql` response.
## what is it not
* doesn't check for typing, you have `pydantic` for it
* dataclass, although you can use the `dataclasses` syntax to create classes `greff` is for graphql and it adds graphql attributes behind the sence
## current stage
in the current stage its not ready for release, it is only possible
(for now) to query data
## vision / example
```py
import requests
import greff
@greff.define_type(queryname="authors")
class ParentAuthor(greff.Model):
name: str
age: int = 0
@greff.define_type()
class Author(ParentAuthor):
extra_field: str
@greff.define_type()
class SimpleAuthor(ParentAuthor):
pass
class MyGraphqlClient(greff.HTTPClient):
# we implement the graphql posting function ourself
# since it can very from diffrent implementations
def request(self, query: str) -> dict:
response = requests.post("http://localhost:8000/graphql", json={"query": query}, verify=False)
response.raise_for_status()
return response.json()
# create our charryplate graphql client
graphql = MyGraphqlClient()
# graphql equivelent
# query {
# authors {
# ... frag
# }
# }
# fragment frag on Author {
# name
# }
#
query = graphql.query((
(ParentAuthor, (
ParentAuthor.query.name,
)),
),
)
# graphql response
# {
# "data": {
# "authors": [
# {
# "name": "Michael Crichton",
# "__typename": "Author"
# }
# ]
# }
# }
for author in query:
print(type(author), author.name)
```
output
```sh
<class '__main__.Author'> Michael Crichton
```
### why did it return `Author` instance and not `ParentAuthor` instance?
if you look closely at the response
```gql
{
"data": {
"authors": [
{
"name": "Michael Crichton",
"__typename": "Author"
}
]
}
}
```
`ParentAuthor` is implementor for `Author` and `SmallAuthor` and in our query the `__typename`
returned `Author`, so greff automatically created the correct python instace
Raw data
{
"_id": null,
"home_page": "https://github.com/dsal3389/greff",
"name": "greff",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.10,<4.0",
"maintainer_email": "",
"keywords": "graphql",
"author": "daniel sonbolian",
"author_email": "dsal3389@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/bf/26/561f0de2438566571d9ec73d19585cea508f2675964e894055d564dddf18/greff-0.0.6a0.tar.gz",
"platform": null,
"description": "# greff\nI wanted an animal name, but most of them already used in pypi :(, the name pronounced `greph`\n\n## what is it\n`greff` creates python classes from `graphql` response.\n\n## what is it not\n * doesn't check for typing, you have `pydantic` for it\n * dataclass, although you can use the `dataclasses` syntax to create classes `greff` is for graphql and it adds graphql attributes behind the sence\n\n## current stage\nin the current stage its not ready for release, it is only possible\n(for now) to query data\n\n## vision / example\n```py\nimport requests\nimport greff\n\n\n@greff.define_type(queryname=\"authors\")\nclass ParentAuthor(greff.Model):\n name: str\n age: int = 0\n\n\n@greff.define_type()\nclass Author(ParentAuthor):\n extra_field: str\n\n\n@greff.define_type()\nclass SimpleAuthor(ParentAuthor):\n pass\n\n\nclass MyGraphqlClient(greff.HTTPClient):\n\n # we implement the graphql posting function ourself\n # since it can very from diffrent implementations\n def request(self, query: str) -> dict:\n response = requests.post(\"http://localhost:8000/graphql\", json={\"query\": query}, verify=False)\n response.raise_for_status()\n return response.json()\n\n\n# create our charryplate graphql client\ngraphql = MyGraphqlClient()\n\n# graphql equivelent\n# query {\n# authors {\n# ... frag\n# }\n# }\n# fragment frag on Author {\n# name\n# }\n#\nquery = graphql.query((\n (ParentAuthor, (\n ParentAuthor.query.name,\n )),\n ),\n)\n\n# graphql response\n# {\n# \"data\": {\n# \"authors\": [\n# {\n# \"name\": \"Michael Crichton\",\n# \"__typename\": \"Author\"\n# }\n# ]\n# }\n# }\nfor author in query:\n print(type(author), author.name)\n```\n\noutput\n```sh\n<class '__main__.Author'> Michael Crichton\n```\n\n### why did it return `Author` instance and not `ParentAuthor` instance?\n\nif you look closely at the response\n```gql\n{\n \"data\": {\n \"authors\": [\n {\n \"name\": \"Michael Crichton\",\n \"__typename\": \"Author\"\n }\n ]\n }\n}\n```\n\n`ParentAuthor` is implementor for `Author` and `SmallAuthor` and in our query the `__typename`\nreturned `Author`, so greff automatically created the correct python instace\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "rich graphql client in python",
"version": "0.0.6a0",
"project_urls": {
"Homepage": "https://github.com/dsal3389/greff",
"Repository": "https://github.com/dsal3389/greff"
},
"split_keywords": [
"graphql"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "45f6001582256dd4b299d518e8bd173efe5f8b3210d43e7a9f10880397e85c90",
"md5": "5150518566a9dd6424d7283f74be0c4f",
"sha256": "4dfa82cbbddb9b106ef730d4eb807f0964516167cee34b788bbf0851441bc604"
},
"downloads": -1,
"filename": "greff-0.0.6a0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "5150518566a9dd6424d7283f74be0c4f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10,<4.0",
"size": 7412,
"upload_time": "2024-01-05T21:04:37",
"upload_time_iso_8601": "2024-01-05T21:04:37.427974Z",
"url": "https://files.pythonhosted.org/packages/45/f6/001582256dd4b299d518e8bd173efe5f8b3210d43e7a9f10880397e85c90/greff-0.0.6a0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bf26561f0de2438566571d9ec73d19585cea508f2675964e894055d564dddf18",
"md5": "e806a0dde0c8801a37f115d273d407a8",
"sha256": "9bf1b5020b1929ff6d91d9f9281cdfed2da61b2b0d6fa2135a83ec1913f36337"
},
"downloads": -1,
"filename": "greff-0.0.6a0.tar.gz",
"has_sig": false,
"md5_digest": "e806a0dde0c8801a37f115d273d407a8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10,<4.0",
"size": 6048,
"upload_time": "2024-01-05T21:04:38",
"upload_time_iso_8601": "2024-01-05T21:04:38.663469Z",
"url": "https://files.pythonhosted.org/packages/bf/26/561f0de2438566571d9ec73d19585cea508f2675964e894055d564dddf18/greff-0.0.6a0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-05 21:04:38",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "dsal3389",
"github_project": "greff",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "greff"
}