Skip to content

Commit 3428725

Browse files
committed
First phase of middlewares
1 parent 8421b59 commit 3428725

File tree

9 files changed

+96
-102
lines changed

9 files changed

+96
-102
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .plugin import DjangoDebugPlugin
1+
from .middleware import DjangoDebugMiddleware
22
from .types import DjangoDebug
33

4-
__all__ = ['DjangoDebugPlugin', 'DjangoDebug']
4+
__all__ = ['DjangoDebugMiddleware', 'DjangoDebug']
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from promise import Promise
2+
from django.db import connections
3+
4+
from ....core.schema import GraphQLSchema
5+
from ....core.types import Field
6+
from .sql.tracking import unwrap_cursor, wrap_cursor
7+
from .types import DjangoDebug
8+
9+
10+
class DjangoDebugContext(object):
11+
12+
def __init__(self):
13+
self.debug_promise = None
14+
self.promises = []
15+
self.enable_instrumentation()
16+
self.object = DjangoDebug(sql=[])
17+
18+
def get_debug_promise(self):
19+
if not self.debug_promise:
20+
self.debug_promise = Promise.all(self.promises)
21+
return self.debug_promise.then(self.on_resolve_all_promises)
22+
23+
def on_resolve_all_promises(self, values):
24+
self.disable_instrumentation()
25+
return self.object
26+
27+
def add_promise(self, promise):
28+
if self.debug_promise and not self.debug_promise.is_fulfilled:
29+
self.promises.append(promise)
30+
31+
def enable_instrumentation(self):
32+
# This is thread-safe because database connections are thread-local.
33+
for connection in connections.all():
34+
wrap_cursor(connection, self)
35+
36+
def disable_instrumentation(self):
37+
for connection in connections.all():
38+
unwrap_cursor(connection)
39+
40+
41+
class DjangoDebugMiddleware(object):
42+
43+
def resolve(self, next, root, args, context, info):
44+
django_debug = getattr(context, 'django_debug', None)
45+
if not django_debug:
46+
if context is None:
47+
raise Exception('DjangoDebug cannot be executed in None contexts')
48+
try:
49+
context.django_debug = DjangoDebugContext()
50+
except Exception, e:
51+
raise Exception('DjangoDebug need the context to be writable, context received: {}.'.format(context.__class__.__name__))
52+
if info.schema.graphene_schema.T(DjangoDebug) == info.return_type:
53+
return context.django_debug.get_debug_promise()
54+
promise = next(root, args, context, info)
55+
context.django_debug.add_promise(promise)
56+
return promise

graphene/contrib/django/debug/plugin.py

Lines changed: 0 additions & 77 deletions
This file was deleted.

graphene/contrib/django/debug/sql/tracking.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from django.utils import six
99
from django.utils.encoding import force_text
1010

11+
from .types import DjangoDebugSQL, DjangoDebugPostgreSQL
1112

1213
class SQLQueryTriggered(Exception):
1314
"""Thrown when template panel triggers a query"""
@@ -139,9 +140,11 @@ def _record(self, method, sql, params):
139140
'iso_level': iso_level,
140141
'encoding': conn.encoding,
141142
})
142-
143+
_sql = DjangoDebugPostgreSQL(**params)
144+
else:
145+
_sql = DjangoDebugSQL(**params)
143146
# We keep `sql` to maintain backwards compatibility
144-
self.logger.record(**params)
147+
self.logger.object.sql.append(_sql)
145148

146149
def callproc(self, procname, params=()):
147150
return self._record(self.cursor.callproc, procname, params)

graphene/contrib/django/debug/sql/types.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from .....core import Boolean, Float, ObjectType, String
22

33

4-
class DjangoDebugSQL(ObjectType):
4+
class DjangoDebugBaseSQL(ObjectType):
55
vendor = String()
66
alias = String()
77
sql = String()
@@ -13,6 +13,12 @@ class DjangoDebugSQL(ObjectType):
1313
is_slow = Boolean()
1414
is_select = Boolean()
1515

16+
17+
class DjangoDebugSQL(DjangoDebugBaseSQL):
18+
pass
19+
20+
21+
class DjangoDebugPostgreSQL(DjangoDebugBaseSQL):
1622
trans_id = String()
1723
trans_status = String()
1824
iso_level = String()

graphene/contrib/django/debug/tests/test_query.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
from graphene.contrib.django.utils import DJANGO_FILTER_INSTALLED
66

77
from ...tests.models import Reporter
8-
from ..plugin import DjangoDebugPlugin
8+
from ..middleware import DjangoDebugMiddleware
9+
from ..types import DjangoDebug
10+
11+
class context(object):
12+
pass
913

1014
# from examples.starwars_django.models import Character
1115

@@ -25,6 +29,7 @@ class Meta:
2529

2630
class Query(graphene.ObjectType):
2731
reporter = graphene.Field(ReporterType)
32+
debug = graphene.Field(DjangoDebug, name='__debug')
2833

2934
def resolve_reporter(self, *args, **kwargs):
3035
return Reporter.objects.first()
@@ -51,8 +56,8 @@ def resolve_reporter(self, *args, **kwargs):
5156
}]
5257
}
5358
}
54-
schema = graphene.Schema(query=Query, plugins=[DjangoDebugPlugin()])
55-
result = schema.execute(query)
59+
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
60+
result = schema.execute(query, context_value=context())
5661
assert not result.errors
5762
assert result.data == expected
5863

@@ -70,6 +75,7 @@ class Meta:
7075

7176
class Query(graphene.ObjectType):
7277
all_reporters = ReporterType.List()
78+
debug = graphene.Field(DjangoDebug, name='__debug')
7379

7480
def resolve_all_reporters(self, *args, **kwargs):
7581
return Reporter.objects.all()
@@ -98,8 +104,8 @@ def resolve_all_reporters(self, *args, **kwargs):
98104
}]
99105
}
100106
}
101-
schema = graphene.Schema(query=Query, plugins=[DjangoDebugPlugin()])
102-
result = schema.execute(query)
107+
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
108+
result = schema.execute(query, context_value=context())
103109
assert not result.errors
104110
assert result.data == expected
105111

@@ -117,6 +123,7 @@ class Meta:
117123

118124
class Query(graphene.ObjectType):
119125
all_reporters = DjangoConnectionField(ReporterType)
126+
debug = graphene.Field(DjangoDebug, name='__debug')
120127

121128
def resolve_all_reporters(self, *args, **kwargs):
122129
return Reporter.objects.all()
@@ -146,8 +153,8 @@ def resolve_all_reporters(self, *args, **kwargs):
146153
}]
147154
},
148155
}
149-
schema = graphene.Schema(query=Query, plugins=[DjangoDebugPlugin()])
150-
result = schema.execute(query)
156+
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
157+
result = schema.execute(query, context_value=context())
151158
assert not result.errors
152159
assert result.data['allReporters'] == expected['allReporters']
153160
assert 'COUNT' in result.data['__debug']['sql'][0]['rawSql']
@@ -172,6 +179,7 @@ class Meta:
172179

173180
class Query(graphene.ObjectType):
174181
all_reporters = DjangoFilterConnectionField(ReporterType)
182+
debug = graphene.Field(DjangoDebug, name='__debug')
175183

176184
def resolve_all_reporters(self, *args, **kwargs):
177185
return Reporter.objects.all()
@@ -201,8 +209,8 @@ def resolve_all_reporters(self, *args, **kwargs):
201209
}]
202210
},
203211
}
204-
schema = graphene.Schema(query=Query, plugins=[DjangoDebugPlugin()])
205-
result = schema.execute(query)
212+
schema = graphene.Schema(query=Query, plugins=[DjangoDebugMiddleware()])
213+
result = schema.execute(query, context_value=context())
206214
assert not result.errors
207215
assert result.data['allReporters'] == expected['allReporters']
208216
assert 'COUNT' in result.data['__debug']['sql'][0]['rawSql']
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from ....core.classtypes.objecttype import ObjectType
22
from ....core.types import Field
3-
from .sql.types import DjangoDebugSQL
3+
from .sql.types import DjangoDebugBaseSQL
44

55

66
class DjangoDebug(ObjectType):
7-
sql = Field(DjangoDebugSQL.List())
7+
sql = Field(DjangoDebugBaseSQL.List())

graphene/core/schema.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,14 @@ def __init__(self, query=None, mutation=None, subscription=None,
3535
plugins = plugins or []
3636
if auto_camelcase:
3737
plugins.append(CamelCase())
38+
self.auto_camelcase = auto_camelcase
3839
self.plugins = PluginManager(self, plugins)
3940
self.options = options
4041
signals.init_schema.send(self)
4142

4243
def __repr__(self):
4344
return '<Schema: %s (%s)>' % (str(self.name), hash(self))
4445

45-
def __getattr__(self, name):
46-
if name in self.plugins:
47-
return getattr(self.plugins, name)
48-
return super(Schema, self).__getattr__(name)
49-
5046
def T(self, _type):
5147
if not _type:
5248
return
@@ -122,7 +118,7 @@ def types(self):
122118

123119
def execute(self, request_string='', root_value=None, variable_values=None,
124120
context_value=None, operation_name=None, executor=None):
125-
kwargs = dict(
121+
return graphql(
126122
schema=self.schema,
127123
request_string=request_string,
128124
root_value=root_value,
@@ -131,8 +127,6 @@ def execute(self, request_string='', root_value=None, variable_values=None,
131127
operation_name=operation_name,
132128
executor=executor or self._executor
133129
)
134-
with self.plugins.context_execution(**kwargs) as execute_kwargs:
135-
return graphql(**execute_kwargs)
136130

137131
def introspect(self):
138132
return graphql(self.schema, introspection_query).data

graphene/core/types/base.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import six
55

6+
from ...utils import to_camel_case
7+
68

79
class InstanceType(object):
810

@@ -142,7 +144,9 @@ def __init__(self, *types):
142144
self.types = types
143145

144146
def get_named_type(self, schema, type):
145-
name = type.name or schema.get_default_namedtype_name(type.default_name)
147+
name = type.name
148+
if not name and schema.auto_camelcase:
149+
name = to_camel_case(type.default_name)
146150
return name, schema.T(type)
147151

148152
def iter_types(self, schema):

0 commit comments

Comments
 (0)