Skip to content

Releases: graphql-python/graphene

v3.4.3

09 Nov 20:43
8290326
Compare
Choose a tag to compare

What's Changed

A proper error will now be raised when invalid UUIDs are passed as input variables.

  • Do not raise AttributeError when parsing non-string UUIDs by @phihag in #1582

New Contributors

Full Changelog: v3.4.2...v3.4.3

v3.4.2

09 Nov 17:19
b3db1c0
Compare
Choose a tag to compare

What's Changed

Graphene now supports overriding the Union options!

New Contributors

Full Changelog: v3.4.1...v3.4.2

v3.4.1 - Regression Fix

27 Oct 20:19
ccae736
Compare
Choose a tag to compare

What's Changed

This release brings a regression fix for DateTime parsing in python versions before 3.11, caused by the removal of aniso8601. The issue was introduced in 3.4.0.
If you are using the DateTime scalar together with a Python <= 3.10, please update Graphene to this version.

Full Changelog: v3.4.0...v3.4.1

v3.4.0

18 Oct 11:45
dca31dc
Compare
Choose a tag to compare

What's Changed

This release brings housekeeping changes and support for Python 3.13. Thanks to all contributors who made this release happen, and special thanks to @dulmandakh for bringing our CI up to modern standards.

Full PR Changelist

New Contributors

Full Changelog: v3.3.0...v3.4.0

v3.3.0

26 Jul 06:47
f5aba2c
Compare
Choose a tag to compare

This release brings two new features and several fixes and semantic upgrades due to new Python features. Thanks to everyone that contributed! 😊

Default value for InputObjectTypes

⚠️⚠️ACTION REQUIRED⚠️⚠️
In GraphQL, inputs can have fields which are optional. Currently, if those fields are not specified in the query, they are passed to the python inputs as None. This renders them indistinguishable from fields that are actually passed to the query with a value of null. While the alternative would be to check the definition via "key" in input, it is more accessible to mark these fields as explicitly UNDEFINED.
This PR adds a new global override, which allows unspecified fields to be set to graphql.UNDEFINED. In the future, the default Value will be set to UNDEFINED, making this a soft migration and deprecation of the previous situation.

This is a soft migration. Long-Term, the Input Objects will ALWAYS contain the value UNDEFINED Make sure your code supports these cases in None checks. After the default has been set to UNDEFINED, you will still be able to switch back to None for the foreseeable future.

Strict connection types support in Relay

Custom Relay connection classes can now be made NonNull using the strict_types option on the connection meta.

Using this example

  class MyObjectConnection(Connection):
      class Meta:
          node = MyObject
          strict_types = True

will change from

type MyObjectConnection {
   edges: [MyObjectEdge]
}

to

type MyObjectConnection {
   edges: [MyObjectEdge!]!
}

Caveats

We want to make sure you're informed about using NonNull relay connections. While they are a great way to get rid of some null checks in typed frontends, it's important to be mindful of error handling with these connections. When working with NonNull connections, it's crucial to remember that if a requested field or edge is not available or the resolver throws an error, the error will bubble up to the next nullable parent field, which is oftentimes the root node. That way, you cannot handle partial results in case of partial errors anymore. In a nullable connection, only the nullable fields will be set to null and the error will not bubble up.

To address this, we recommend considering waiting for the future release of client-controlled nullability for cases where certain connections might be nullable. By opting for client-controlled nullability, you gain more control over error handling, enabling you to handle potential null values more gracefully and enhance the overall user experience. Read more about client controlled nullability here: graphql/graphql-spec#867

What's Changed

  • Default enum description to "An enumeration." by @firaskafri in #1502
  • Allow the user to change InputObjectType's default value on non-specified inputs to a sentinel value by @flipbit03 in #1506
  • 881: Corrected enum metaclass to fix pickle.dumps() by @senseysensor in #1495
  • chore: Use typing.TYPE_CHECKING instead of MYPY by @rapsealk in #1503
  • test: print schema with InputObjectType with DateTime field with default_value (#1293) by @ransomw in #1513
  • docs: add get_human function by @conao3 in #1380
  • CI: drop python 3.6 by @dulmandakh in #1507
  • types: add option for strict connection types by @shrouxm in #1504

New Contributors

Full Changelog: v3.2.2...v3.3.0

v3.2.2

13 Mar 20:25
57cbef6
Compare
Choose a tag to compare

This release provides some internal refactoring to the relay types to improve support for adding custom fields to them.

v3.2.1

11 Dec 20:07
340d5ed
Compare
Choose a tag to compare

What's Changed

Non-required InputFields and Arguments can now be marked as deprecated by passing the deprecation_reason keyword argument to the constructor.

  • Complete deprecated fields and arguments support by @vhutov in #1472

New Contributors

Full Changelog: v3.2.0...v3.2.1

v3.2.0

09 Dec 10:20
d5dadb7
Compare
Choose a tag to compare

What's Changed

Support for custom global IDs in relay.Node

The global ID type of a Node can now be customized:

class CustomNode(Node):
    class Meta:
        global_id_type = CustomGlobalIDType


class User(ObjectType):
    class Meta:
        interfaces = [CustomNode]

    name = String()

    @classmethod
    def get_node(cls, _type, _id):
        return self.users[_id]
Available Types

Currently, the following types are available:

  • DefaultGlobalIDType: Default global ID type: base64 encoded version of ": ". (Previously the only option) Scalar: ID
  • SimpleGlobalIDType : Simple global ID type: simply the id of the object. Scalar: ID
  • UUIDGlobalIDType : UUID global ID type. Scalar: UUID
Customization

To create a custom global type, BaseGlobalIDType must be extended:

class CustomGlobalIDType(BaseGlobalIDType):

    graphene_type = CustomScalar

    @classmethod
    def resolve_global_id(cls, info, global_id):
        _type = custom_get_type_from_global_id(global_id)
        return _type, global_id

    @classmethod
    def to_global_id(cls, _type, _id):
        return _id

graphene_type specifies the type of scalar to be used in the schema. Remember, that if you're using ID as a scalar, you might need to deserialize your custom global ID first!

Relevant PR:

Fixes & Improvements:

All Changes

New Contributors

Full Changelog: v3.1.1...v3.2.0

v3.1.1

08 Sep 09:26
b20bbdc
Compare
Choose a tag to compare

What's changed

Dataloader

Graphene now includes an updated version of aiodataloader by Syrus Akbary under graphene.utils.dataloader due to inactivity of the old repository. The update fixes an issue some users experienced when trying to use dataloader in conjunction with pytest (syrusakbary/aiodataloader#13). Further contributions and updates to dataloader in this repo are welcome!

Enums

A custom typename can now be added when using from_enum:

    from enum import Enum as PyEnum

    class Color(PyEnum):
        RED = 1
        YELLOW = 2
        BLUE = 3

    GColor = Enum.from_enum(Color, description="original colors")
    UniqueGColor = Enum.from_enum(
        Color, name="UniqueColor", description="unique colors"
    )
type Query {
    color: Color!
    uniqueColor: UniqueColor!
}
"""original colors"""
enum Color {
    RED
    YELLOW
    BLUE
}
"""unique colors"""
enum UniqueColor {
    RED
    YELLOW
    BLUE
}
  • feat: add ability to provide a type name to enum when using from_enum by @tcleonard in #1430

Interfaces

Interfaces extending interfaces is now supported!

    class FooInterface(Interface):
        foo = String()

    class BarInterface(Interface):
        class Meta:
            interfaces = [FooInterface]

        foo = String()
        bar = String()
interface FooInterface {
  foo: String
}

interface BarInterface implements FooInterface {
  foo: String
  bar: String
}

Thank you to everyone that contributed to this release!

Other Changes

New Contributors

Full Changelog: v3.1.0...v3.1.1

v3.1.0

30 May 12:58
5475a7a
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v3.0.0...v3.1.0