{ "info": { "author": "Ales Zoulek", "author_email": "ales.zoulek@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# Ariadne Extensions\n\n[![Build Status](https://travis-ci.org/pantheon-systems/ariadne-extensions.svg?branch=master)](https://travis-ci.org/pantheon-systems/ariadne-extensions)\n[![Coverage Status](https://coveralls.io/repos/github/pantheon-systems/ariadne-extensions/badge.svg?branch=master)](https://coveralls.io/github/pantheon-systems/ariadne-extensions?branch=master)\n\nSet of scripts and helper utilities to extend [Ariadne GraphQL library](https://github.com/mirumee/ariadne)\n\n## Install\n\n`pip install ariadne-extensions`\n\n## Features\n\n\n### Federation support\n\nSupport for [Federation Specification](https://www.apollographql.com/docs/apollo-server/federation/federation-spec/)\n\n#### Features\n\n1. Generate federation schema types and directives (`_Any`, `_FieldSet`, ...)\n1. Implements `{_service{sdl}}` query\n1. Detects boundary types and generates `_Entities` union\n1. Implements resolve reference helpers for boundary types queried over `{_entities}` query (`resolve_reference` and `resolve_references` decorators)\n\n\n#### Documentation\n\n##### `ariadne_extensions.federation.FederatedManager`\n\n`FederatedManager` is a class responsible for creating and executable schema that complies with Federation Specification. Similar to what `make_executable_schema` does with ordinary schema file.\n\nCreate a FederatedManager instance passing in path to your schema file and QueryType instance. Manager needs to query_type to register `_entities` and `_service` resolvers.\n\n``` python\nquery_type = QueryType()\nmanager = federation.FederatedManager(\n schema_sdl_file='/some/path/schema.graphql',\n query=query_type,\n)\n```\n\nRegister any other `ObjectType`s and resolvers by either calling and `add_types` method, or by extending `manager.types` list.\n\n``` python\nphoto_type = ObjectType('Photo')\nthumbnail_type = ObjectType('Thumbnail')\n\nmanager.add_types(photo_type, thumbnail_type)\nmanager.types.append(snake_case_fallback_resolvers)\n```\n\nFinally, get a combiled schema. This compiled schema will extend types defined in '/some/path/schema.graphql' with directives, types and queries, that required by Federation Specification protocol.\n\n``` python\nschema = manager.get_schema()\n```\n\n\n##### `ariadne_extensions.federation.FederatedObjectType`\n\nIf you are using GraphQL Federation, your service schema probably implements some so called \"boundary objects\". That's where `FederatedObjectType` is useful.\n\n`FederatedObjectType` implements `resolve_reference` and `resolve_references` decorator. Those are used to register functions, that will be called when a federation gateway calls `{_entities{}}` query.\n\nLet's say `User` is a boundary type, with a single `id` key. You need to implement a function, that will accept a dictionary of keys (`{'id': ...} in our example`) and return a `User` instance.\nFederatedManager will call this function for every `_entities([{__typename: 'User', id: ...}])` query.\n\n``` python\nuser_type = federation.FederatedObjectType('User')\n\n@user_type.resolve_reference\ndef resolve_user_reference(representation):\n user_id = representation.get('id')\n return get_user_by_id(user_id)\n```\n\n`FederatedObjectType` extends Ariadne's `ObjectType`. You can still use the `field` decorator, `set_alias` method and others as in regular `ObjectType`, and others.\n\n``` python\n@user_type.field('name')\ndef resolve_billing_account(obj, *_, id):\n return f'{obj.first_name} {obj_last_name}'\n```\n\nDon't forget to add `user_type` to our manager.\n\n``` python\nmanager.add_types(user_type)\n```\n\n\n#### Example\n\n```\ntype User @key(fields: \"id\") @extends {\n id: ID! @external\n photos: [Photo]!\n}\n\ntype Photo {\n id: ID!\n url: String!\n description: String\n}\n```\n\n``` python\nfrom os.path import dirname, join\nfrom ariadne import QueryType, ObjectType, snake_case_fallback_resolvers\n\nfrom ariadne_extensions import federation\n\nquery_type = QueryType()\nmanager = federation.FederatedManager(\n schema_sdl_file=join(dirname(__file__), 'schema.graphql'),\n query=query_type,\n)\n\nuser_type = federation.FederatedObjectType('User')\nphoto_type = ObjectType('Photo')\n\n@user_type.resolve_reference\ndef resolve_user_reference(representation):\n user_id = representation.get('id')\n return get_user_by_id(user_id)\n\n@user_type.field('name')\ndef resolve_billing_account(obj, *_, id):\n return f'{obj.first_name} {obj_last_name}'\n\nmanager.add_types(user_type, photo_type)\nmanager.add_types(snake_case_fallback_resolvers)\n\nschema = manager.get_schema()\n\n```", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/aleszoulek/ariadne-extensions", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "ariadne-extensions", "package_url": "https://pypi.org/project/ariadne-extensions/", "platform": "", "project_url": "https://pypi.org/project/ariadne-extensions/", "project_urls": { "Homepage": "https://github.com/aleszoulek/ariadne-extensions" }, "release_url": "https://pypi.org/project/ariadne-extensions/0.1.5/", "requires_dist": null, "requires_python": "", "summary": "Set of scripts and helper utilities to extend Ariadne GraphQL library", "version": "0.1.5" }, "last_serial": 5836069, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "bfda7d6c0ed68ee7fd9e6eb8e5773fb8", "sha256": "9ecc60200cecb1888910344710b4649165bbb0b365ee5521556c4da36e6c657d" }, "downloads": -1, "filename": "ariadne-extensions-0.1.1.tar.gz", "has_sig": false, "md5_digest": "bfda7d6c0ed68ee7fd9e6eb8e5773fb8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2774, "upload_time": "2019-08-20T10:45:56", "url": "https://files.pythonhosted.org/packages/8e/7f/ac8467a2b469c033416b73f619abb95c448e23a0a82b9aa2c0f92dd7e9c6/ariadne-extensions-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "d7e6fcc0e0c5d8548b8513e2fe608b98", "sha256": "ec552abd607b462d0da8a865340069e246bd1700cd4a55855710e2e440526279" }, "downloads": -1, "filename": "ariadne-extensions-0.1.2.tar.gz", "has_sig": false, "md5_digest": "d7e6fcc0e0c5d8548b8513e2fe608b98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3081, "upload_time": "2019-08-20T11:04:52", "url": "https://files.pythonhosted.org/packages/d2/70/939292c417ed5d1cee56acb8772211305e776540ba7e02881cfa79bca8fc/ariadne-extensions-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "0d76037564244a3b13088936a8697ea1", "sha256": "e7df2ef6b83b252942a0e3e4aed31d52d1aaf51358cc4f680095596a06f03232" }, "downloads": -1, "filename": "ariadne-extensions-0.1.3.tar.gz", "has_sig": false, "md5_digest": "0d76037564244a3b13088936a8697ea1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3092, "upload_time": "2019-08-20T11:06:55", "url": "https://files.pythonhosted.org/packages/f8/cf/6bca7fafd4fea4298d236fb972aa865279e073a6fd6cc80f35c937477aca/ariadne-extensions-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "9f1b46c77b8f1a39adae48531a94ac0e", "sha256": "64bb4810d638717ee07b2ad96ef1571201351f27a53d0fd62b276847edf270b7" }, "downloads": -1, "filename": "ariadne-extensions-0.1.4.tar.gz", "has_sig": false, "md5_digest": "9f1b46c77b8f1a39adae48531a94ac0e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4553, "upload_time": "2019-09-16T10:29:55", "url": "https://files.pythonhosted.org/packages/62/72/e922c642d7bc21f346601125434a45fe8b7181741d317f3e805d9dbcf9c9/ariadne-extensions-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "4b8de5fc3e8fe61f75b2d396117129ca", "sha256": "5cbd2132f14f53de989ff051334180c20afbbc295df76c0032ba0cf41be72a89" }, "downloads": -1, "filename": "ariadne-extensions-0.1.5.tar.gz", "has_sig": false, "md5_digest": "4b8de5fc3e8fe61f75b2d396117129ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4580, "upload_time": "2019-09-16T13:01:00", "url": "https://files.pythonhosted.org/packages/ca/29/f265372b753c262230a1fdc9519671146900ad6c4b0e39abcbd614bcf96f/ariadne-extensions-0.1.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4b8de5fc3e8fe61f75b2d396117129ca", "sha256": "5cbd2132f14f53de989ff051334180c20afbbc295df76c0032ba0cf41be72a89" }, "downloads": -1, "filename": "ariadne-extensions-0.1.5.tar.gz", "has_sig": false, "md5_digest": "4b8de5fc3e8fe61f75b2d396117129ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4580, "upload_time": "2019-09-16T13:01:00", "url": "https://files.pythonhosted.org/packages/ca/29/f265372b753c262230a1fdc9519671146900ad6c4b0e39abcbd614bcf96f/ariadne-extensions-0.1.5.tar.gz" } ] }