A simplified GraphQL-esque library
Project description
NewQL
A simplified GraphQL-esque library
Notable features:
- Schema defined using pythonic classes
- Introspection for support with the GraphiQL interface
- Field / type / argument docstrings
- Nested types
- Aliases
- Query variables
- Enums (can simply use pure python enums)
- Flexible type system (unlike GraphQL which coerces and validates more strictly)
What NewQL
does not support:
- Fragments
- Directives
- Subscriptions
Installation
Requires python 3.7+
pip install newql
Usage
from newql import ExecutionContext, Schema, field
class Product:
"""Represents a product in stock"""
product_id = field(type=int)
product_name = field(type=str)
price = field(type=float)
class ProductQuery:
# pass 'type' here since the function returns a dictionary,
# but we want to actually resolve to a Product
@field(type=Product)
def product(_, context: ExecutionContext, product_id: int) -> dict:
# The "Args" section of the docstring is parsed out to add
# docs to the arguments (can be seen in GraphiQL)
"""Find a specific product by id
Args:
product_id: The ID of the product to find
"""
products = {1: ("Product1", 49.99), 2: ("Product2", 94.49)}
if product_id in products:
name, price = products[product_id]
return {"product_id": product_id, "product_name": name, "price": price}
else:
raise ValueError(f"Product not found: {product_id}")
schema = Schema(ProductQuery)
Explore the above example using python -m newql.dev_server --schema newql.example.product_schema
:
{
product(product_id: 1) {
price
product_name
}
}
Or execute a query through code:
QUERY = """
{
product(product_id: 1) {
price
product_name
}
}
"""
from newql.example import product_schema
product_schema.execute(QUERY)
# => {"data": {"product": {"price": 49.99, "product_name": "Product1"}}}
A mutation class can be defined in exactly the same way as a query class,
and can be passed to Schema
as a second positional argument or by the
mutation
keyword argument.
class Mutation:
...
schema = Schema(mutation=Mutation)
To start a dev server serving a GraphiQL interface:
python -m newql.dev_server # uses the schema in newql.example
# can specify a custom schema
python -m newql.dev_server --schema <full import name of your schema>
# for example:
python -m newql.dev_server --schema my_module.nested_module.my_schema
Development
Clone the repo, then from the project directory:
python3 -m venv .venv
. .venv/bin/activate
make install-dev
To run tests (and show coverage):
make test
Before making changes, fix formatting and check changes (isort, black, flake8, mypy):
make format check
0.1.0 TBD
- Initial release
Project details
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
File details
Details for the file newql-0.1.0.tar.gz
.
File metadata
- Download URL: newql-0.1.0.tar.gz
- Upload date:
- Size: 14.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.7.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a733a77f7ffbef53f5cbbd868f2da0b8b44f692f1ad70d98c2333f6a55da1ed3 |
|
MD5 | 9d289e2aebe6fe5e20a9917ec3e086e7 |
|
BLAKE2b-256 | a40bd8f7005725428204f435467ed477a5303778a2cc851a316d3b0e3b35c2c2 |
File details
Details for the file newql-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: newql-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.7.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 685748d4cae258c12358920255cc166fa025fe556b788570a673a1ccbb81dab3 |
|
MD5 | 8a16fcaae66e2b4a25cf99485e6f3f10 |
|
BLAKE2b-256 | cdf52d8325ebc650507f011e9d4bce1d6e502e02ecce0043e500837b37854a72 |