From 3f35b1f043a33780ba16c907e849dbd8f09bc5cd Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Thu, 30 May 2019 14:13:19 -0700 Subject: [PATCH 01/12] cover enum case where choice begins with a number --- graphene_django/tests/models.py | 2 +- graphene_django/tests/test_types.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 4fe546deb..2d9b79433 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -3,7 +3,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -CHOICES = ((1, "this"), (2, _("that"))) +CHOICES = ((1, "1: this"), (2, _("2: that"))) class Pet(models.Model): diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 8a8643b9b..c8fb33bd1 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -172,8 +172,8 @@ def test_schema_representation(): } enum ReporterAChoice { - A_1 - A_2 + A_1_THIS + A_2_THAT } enum ReporterReporterType { From 8d42c7c23eb245c54eafe0926f4342f785f5d1e4 Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Fri, 31 May 2019 10:57:18 -0700 Subject: [PATCH 02/12] chomp out non-ascii characters from enum name generation --- graphene_django/converter.py | 3 ++- graphene_django/tests/models.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index c40313df0..ffd4aebe0 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -29,7 +29,8 @@ def convert_choice_name(name): - name = to_const(force_text(name)) + name = force_text(name).encode('utf8').decode('ascii', 'ignore') + name = to_const(name) try: assert_valid_name(name) except AssertionError: diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 2d9b79433..1d456b24b 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -3,7 +3,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -CHOICES = ((1, "1: this"), (2, _("2: that"))) +CHOICES = ((1, "1: this漢"), (2, _("2: that漢"))) class Pet(models.Model): From 1bcc1ef3288becdf7def4b1e2b596276ee164975 Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Fri, 31 May 2019 11:03:26 -0700 Subject: [PATCH 03/12] fix python 2 test regression --- graphene_django/tests/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 1d456b24b..957d3564f 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -3,7 +3,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -CHOICES = ((1, "1: this漢"), (2, _("2: that漢"))) +CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢"))) class Pet(models.Model): From 5b45c5ddf6f3540113c68339b0de96d59a468009 Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Fri, 31 May 2019 11:39:11 -0700 Subject: [PATCH 04/12] fix python 2 test regression: set source file encoding to utf8 --- graphene_django/tests/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 957d3564f..f54575f28 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import absolute_import from django.db import models From e3017b5e623d7d8529941e06e4972e0509d7e7b1 Mon Sep 17 00:00:00 2001 From: mvanlonden Date: Fri, 31 May 2019 14:38:34 -0700 Subject: [PATCH 05/12] increment version to match release tag --- graphene_django/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene_django/__init__.py b/graphene_django/__init__.py index 4538cb343..51acfd222 100644 --- a/graphene_django/__init__.py +++ b/graphene_django/__init__.py @@ -1,6 +1,6 @@ from .types import DjangoObjectType from .fields import DjangoConnectionField -__version__ = "2.2.0" +__version__ = "2.3.0" __all__ = ["__version__", "DjangoObjectType", "DjangoConnectionField"] From 9275163fa0918466b42b3a71af414623a920508e Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Wed, 5 Jun 2019 09:52:50 -0700 Subject: [PATCH 06/12] test and handle choices that start with an underscore, issue #141 --- graphene_django/converter.py | 2 ++ graphene_django/tests/models.py | 2 +- graphene_django/tests/test_converter.py | 18 ++++++++++++++++++ graphene_django/tests/test_types.py | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index ffd4aebe0..2d1f15923 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -31,6 +31,8 @@ def convert_choice_name(name): name = force_text(name).encode('utf8').decode('ascii', 'ignore') name = to_const(name) + if name.startswith('_'): + name = "A%s" % name try: assert_valid_name(name) except AssertionError: diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index f54575f28..39e626bd8 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -4,7 +4,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢"))) +CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢")), (3, "__amount__")) class Pet(models.Model): diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index bb176b343..e30209147 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -196,6 +196,24 @@ class Meta: convert_django_field_with_choices(field) +def test_field_with_choices_underscore(): + field = models.CharField( + choices=( + ("__amount__", "Amount"), + ("__percentage__", "Percentage"), + ), + ) + + class UnderscoreChoicesModel(models.Model): + ourfield = field + + class Meta: + app_label = "test" + + graphene_type = convert_django_field_with_choices(field) + assert len(graphene_type._meta.enum.__members__) == 2 + + def test_should_float_convert_float(): assert_conversion(models.FloatField, graphene.Float) diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index c8fb33bd1..464d5f715 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -174,6 +174,7 @@ def test_schema_representation(): enum ReporterAChoice { A_1_THIS A_2_THAT + A__AMOUNT__ } enum ReporterReporterType { From 6008e4d089be0af4f257180a51b0e2ef19f5a23b Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Mon, 10 Jun 2019 09:42:52 -0700 Subject: [PATCH 07/12] fix unit tests --- graphene_django/tests/models.py | 2 +- graphene_django/tests/test_types.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 2dca0156c..6e552e974 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -4,7 +4,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢")), (3, "__amount__")) +CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢")), (u'_3漢', "__amount__")) class Pet(models.Model): diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 464d5f715..7b32edda7 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -172,9 +172,9 @@ def test_schema_representation(): } enum ReporterAChoice { - A_1_THIS - A_2_THAT - A__AMOUNT__ + A_1 + A_2 + A_3 } enum ReporterReporterType { From 43233d7d9d9ab143e69521bcebe7e7844b0df585 Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Mon, 10 Jun 2019 11:47:52 -0700 Subject: [PATCH 08/12] expand test assertions so that test enum conversion with underscores is more interpretable --- graphene_django/tests/test_converter.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index e30209147..82e7f6bee 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -212,6 +212,10 @@ class Meta: graphene_type = convert_django_field_with_choices(field) assert len(graphene_type._meta.enum.__members__) == 2 + assert graphene_type._meta.enum.__members__["A__AMOUNT__"].value == "__amount__" + assert graphene_type._meta.enum.__members__["A__AMOUNT__"].description == "Amount" + assert graphene_type._meta.enum.__members__["A__PERCENTAGE__"].value == "__percentage__" + assert graphene_type._meta.enum.__members__["A__PERCENTAGE__"].description == "Percentage" def test_should_float_convert_float(): From 59184a117d0fcc073bb238754f37f09207b32e7d Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Mon, 10 Jun 2019 17:16:10 -0700 Subject: [PATCH 09/12] prefix underscore choice name only if it is dunder, otherwise underscores like sunder are allowed --- graphene_django/converter.py | 10 +++++++++- graphene_django/tests/test_converter.py | 6 +++--- graphene_django/tests/test_types.py | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index 8b00dd92a..8d1844636 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -28,10 +28,18 @@ singledispatch = import_single_dispatch() +def _is_dunder(name): + """Returns True if a __dunder__ name, False otherwise.""" + return (len(name) > 4 and + name[:2] == name[-2:] == '__' and + name[2:3] != '_' and + name[-3:-2] != '_') + + def convert_choice_name(name): name = force_text(name).encode('utf8').decode('ascii', 'ignore') name = to_const(name) - if name.startswith('_'): + if _is_dunder(name): name = "A%s" % name try: assert_valid_name(name) diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index 82e7f6bee..f79504aef 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -199,7 +199,7 @@ class Meta: def test_field_with_choices_underscore(): field = models.CharField( choices=( - ("__amount__", "Amount"), + ("_amount__", "Amount"), ("__percentage__", "Percentage"), ), ) @@ -212,8 +212,8 @@ class Meta: graphene_type = convert_django_field_with_choices(field) assert len(graphene_type._meta.enum.__members__) == 2 - assert graphene_type._meta.enum.__members__["A__AMOUNT__"].value == "__amount__" - assert graphene_type._meta.enum.__members__["A__AMOUNT__"].description == "Amount" + assert graphene_type._meta.enum.__members__["_AMOUNT__"].value == "_amount__" + assert graphene_type._meta.enum.__members__["_AMOUNT__"].description == "Amount" assert graphene_type._meta.enum.__members__["A__PERCENTAGE__"].value == "__percentage__" assert graphene_type._meta.enum.__members__["A__PERCENTAGE__"].description == "Percentage" diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 7b32edda7..8896f6ed9 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -174,7 +174,7 @@ def test_schema_representation(): enum ReporterAChoice { A_1 A_2 - A_3 + _3 } enum ReporterReporterType { From de7edaae76b6a1aff7e907b3748d2da4ca5764a1 Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Tue, 11 Jun 2019 10:29:49 -0700 Subject: [PATCH 10/12] expand test case to cover underscores that are sunder, dunder, and general underscore --- graphene_django/converter.py | 10 +++++++++- graphene_django/tests/test_converter.py | 15 ++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index 8d1844636..99c1ac082 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -36,10 +36,18 @@ def _is_dunder(name): name[-3:-2] != '_') +def _is_sunder(name): + """Returns True if a _sunder_ name, False otherwise.""" + return (len(name) > 2 and + name[0] == name[-1] == '_' and + name[1:2] != '_' and + name[-2:-1] != '_') + + def convert_choice_name(name): name = force_text(name).encode('utf8').decode('ascii', 'ignore') name = to_const(name) - if _is_dunder(name): + if _is_sunder(name) or _is_dunder(name): name = "A%s" % name try: assert_valid_name(name) diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index f79504aef..d45d7fbef 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -199,8 +199,10 @@ class Meta: def test_field_with_choices_underscore(): field = models.CharField( choices=( - ("_amount__", "Amount"), + ("_amount_", "Amount"), ("__percentage__", "Percentage"), + ("_not_sunder__", "Not Single Underscore"), + ("__not_dunder", "Not Double Underscore"), ), ) @@ -211,12 +213,11 @@ class Meta: app_label = "test" graphene_type = convert_django_field_with_choices(field) - assert len(graphene_type._meta.enum.__members__) == 2 - assert graphene_type._meta.enum.__members__["_AMOUNT__"].value == "_amount__" - assert graphene_type._meta.enum.__members__["_AMOUNT__"].description == "Amount" - assert graphene_type._meta.enum.__members__["A__PERCENTAGE__"].value == "__percentage__" - assert graphene_type._meta.enum.__members__["A__PERCENTAGE__"].description == "Percentage" - + assert len(graphene_type._meta.enum.__members__) == 4 + assert "A_AMOUNT_" in graphene_type._meta.enum.__members__ + assert "A__PERCENTAGE__" in graphene_type._meta.enum.__members__ + assert "_NOT_SUNDER__" in graphene_type._meta.enum.__members__ + assert "__NOT_DUNDER" in graphene_type._meta.enum.__members__ def test_should_float_convert_float(): assert_conversion(models.FloatField, graphene.Float) From 6d5cfee94ffe5bf17b68706381a7ad14e68849d2 Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Mon, 17 Jun 2019 11:39:21 -0700 Subject: [PATCH 11/12] apply black formatting --- graphene_django/converter.py | 22 +++++++++++++--------- graphene_django/tests/models.py | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index c40dd12da..191a2c3d4 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -30,22 +30,26 @@ def _is_dunder(name): """Returns True if a __dunder__ name, False otherwise.""" - return (len(name) > 4 and - name[:2] == name[-2:] == '__' and - name[2:3] != '_' and - name[-3:-2] != '_') + return ( + len(name) > 4 + and name[:2] == name[-2:] == "__" + and name[2:3] != "_" + and name[-3:-2] != "_" + ) def _is_sunder(name): """Returns True if a _sunder_ name, False otherwise.""" - return (len(name) > 2 and - name[0] == name[-1] == '_' and - name[1:2] != '_' and - name[-2:-1] != '_') + return ( + len(name) > 2 + and name[0] == name[-1] == "_" + and name[1:2] != "_" + and name[-2:-1] != "_" + ) def convert_choice_name(name): - name = force_text(name).encode('utf8').decode('ascii', 'ignore') + name = force_text(name).encode("utf8").decode("ascii", "ignore") name = to_const(name) if _is_sunder(name) or _is_dunder(name): name = "A%s" % name diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 6e552e974..a33d586b0 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -4,7 +4,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢")), (u'_3漢', "__amount__")) +CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢")), (u"_3漢", "__amount__")) class Pet(models.Model): From 8f354ee8904d9e5f2872db338d57a8f19d7ebc6b Mon Sep 17 00:00:00 2001 From: Jason Kraus Date: Tue, 9 Jul 2019 10:48:20 -0700 Subject: [PATCH 12/12] cleanup test choices --- graphene_django/tests/models.py | 8 +++++++- graphene_django/tests/test_types.py | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index a33d586b0..f7a4cf0f3 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -4,7 +4,13 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -CHOICES = ((1, u"1: this漢"), (2, _(u"2: that漢")), (u"_3漢", "__amount__")) +CHOICES = ( + (1, u"this"), + ("2", _(u"that")), + (u"_3漢", "nonascii"), + ("__dunder__", "dunder"), + ("_sunder_", "sunder"), +) class Pet(models.Model): diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 424ed96a1..3dd0c618b 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -180,6 +180,8 @@ def test_schema_representation(): A_1 A_2 _3 + A__DUNDER__ + A_SUNDER_ } enum ReporterReporterType {