Skip to main content

A simplified GraphQL-esque library

Project description

NewQL

CI codecov pypi license

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

newql-0.1.0.tar.gz (14.2 kB view details)

Uploaded Source

Built Distribution

newql-0.1.0-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

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

Hashes for newql-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a733a77f7ffbef53f5cbbd868f2da0b8b44f692f1ad70d98c2333f6a55da1ed3
MD5 9d289e2aebe6fe5e20a9917ec3e086e7
BLAKE2b-256 a40bd8f7005725428204f435467ed477a5303778a2cc851a316d3b0e3b35c2c2

See more details on using hashes here.

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

Hashes for newql-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 685748d4cae258c12358920255cc166fa025fe556b788570a673a1ccbb81dab3
MD5 8a16fcaae66e2b4a25cf99485e6f3f10
BLAKE2b-256 cdf52d8325ebc650507f011e9d4bce1d6e502e02ecce0043e500837b37854a72

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page