strawberry-graphql 0.266.0.dev1744797470__py3-none-any.whl → 0.267.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- strawberry/__init__.py +3 -2
- strawberry/annotation.py +8 -5
- strawberry/federation/enum.py +7 -1
- strawberry/http/__init__.py +9 -14
- strawberry/http/async_base_view.py +5 -81
- strawberry/parent.py +21 -2
- strawberry/printer/printer.py +2 -2
- strawberry/schema/config.py +0 -1
- strawberry/schema/schema.py +7 -47
- strawberry/schema/schema_converter.py +8 -3
- strawberry/static/graphiql.html +5 -5
- strawberry/types/arguments.py +13 -4
- strawberry/types/base.py +10 -1
- strawberry/types/enum.py +11 -3
- strawberry/types/fields/resolver.py +12 -5
- strawberry/types/maybe.py +47 -0
- strawberry/types/object_type.py +12 -1
- strawberry/utils/typing.py +18 -0
- {strawberry_graphql-0.266.0.dev1744797470.dist-info → strawberry_graphql-0.267.0.dist-info}/METADATA +1 -1
- {strawberry_graphql-0.266.0.dev1744797470.dist-info → strawberry_graphql-0.267.0.dist-info}/RECORD +23 -24
- {strawberry_graphql-0.266.0.dev1744797470.dist-info → strawberry_graphql-0.267.0.dist-info}/WHEEL +1 -1
- strawberry/schema/_graphql_core.py +0 -46
- strawberry/streamable.py +0 -36
- {strawberry_graphql-0.266.0.dev1744797470.dist-info → strawberry_graphql-0.267.0.dist-info}/LICENSE +0 -0
- {strawberry_graphql-0.266.0.dev1744797470.dist-info → strawberry_graphql-0.267.0.dist-info}/entry_points.txt +0 -0
strawberry/__init__.py
CHANGED
@@ -11,7 +11,6 @@ from .permission import BasePermission
|
|
11
11
|
from .scalars import ID
|
12
12
|
from .schema import Schema
|
13
13
|
from .schema_directive import schema_directive
|
14
|
-
from .streamable import Streamable
|
15
14
|
from .types.arguments import argument
|
16
15
|
from .types.auto import auto
|
17
16
|
from .types.cast import cast
|
@@ -19,6 +18,7 @@ from .types.enum import enum, enum_value
|
|
19
18
|
from .types.field import field
|
20
19
|
from .types.info import Info
|
21
20
|
from .types.lazy_type import LazyType, lazy
|
21
|
+
from .types.maybe import Maybe, Some
|
22
22
|
from .types.mutation import mutation, subscription
|
23
23
|
from .types.object_type import asdict, input, interface, type # noqa: A004
|
24
24
|
from .types.private import Private
|
@@ -32,10 +32,11 @@ __all__ = [
|
|
32
32
|
"BasePermission",
|
33
33
|
"Info",
|
34
34
|
"LazyType",
|
35
|
+
"Maybe",
|
35
36
|
"Parent",
|
36
37
|
"Private",
|
37
38
|
"Schema",
|
38
|
-
"
|
39
|
+
"Some",
|
39
40
|
"argument",
|
40
41
|
"asdict",
|
41
42
|
"auto",
|
strawberry/annotation.py
CHANGED
@@ -17,9 +17,9 @@ from typing import (
|
|
17
17
|
)
|
18
18
|
from typing_extensions import Self, get_args, get_origin
|
19
19
|
|
20
|
-
from strawberry.streamable import StrawberryStreamable
|
21
20
|
from strawberry.types.base import (
|
22
21
|
StrawberryList,
|
22
|
+
StrawberryMaybe,
|
23
23
|
StrawberryObjectDefinition,
|
24
24
|
StrawberryOptional,
|
25
25
|
StrawberryTypeVar,
|
@@ -29,6 +29,7 @@ from strawberry.types.base import (
|
|
29
29
|
from strawberry.types.enum import EnumDefinition
|
30
30
|
from strawberry.types.enum import enum as strawberry_enum
|
31
31
|
from strawberry.types.lazy_type import LazyType
|
32
|
+
from strawberry.types.maybe import _annotation_is_maybe
|
32
33
|
from strawberry.types.private import is_private
|
33
34
|
from strawberry.types.scalar import ScalarDefinition
|
34
35
|
from strawberry.types.unset import UNSET
|
@@ -142,10 +143,12 @@ class StrawberryAnnotation:
|
|
142
143
|
|
143
144
|
if self._is_lazy_type(evaled_type):
|
144
145
|
return evaled_type
|
145
|
-
if self._is_streamable(evaled_type, args):
|
146
|
-
return self.create_list(list[evaled_type])
|
147
146
|
if self._is_list(evaled_type):
|
148
147
|
return self.create_list(evaled_type)
|
148
|
+
if type_of := self._get_maybe_type(evaled_type):
|
149
|
+
return StrawberryMaybe(
|
150
|
+
of_type=type_of,
|
151
|
+
)
|
149
152
|
|
150
153
|
if self._is_graphql_generic(evaled_type):
|
151
154
|
if any(is_type_var(type_) for type_ in get_args(evaled_type)):
|
@@ -317,8 +320,8 @@ class StrawberryAnnotation:
|
|
317
320
|
)
|
318
321
|
|
319
322
|
@classmethod
|
320
|
-
def
|
321
|
-
return
|
323
|
+
def _get_maybe_type(cls, annotation: Any) -> type | None:
|
324
|
+
return get_args(annotation)[0] if _annotation_is_maybe(annotation) else None
|
322
325
|
|
323
326
|
@classmethod
|
324
327
|
def _is_strawberry_type(cls, evaled_type: Any) -> bool:
|
strawberry/federation/enum.py
CHANGED
@@ -20,6 +20,7 @@ if TYPE_CHECKING:
|
|
20
20
|
|
21
21
|
def enum_value(
|
22
22
|
value: Any,
|
23
|
+
name: Optional[str] = None,
|
23
24
|
deprecation_reason: Optional[str] = None,
|
24
25
|
directives: Iterable[object] = (),
|
25
26
|
inaccessible: bool = False,
|
@@ -35,7 +36,12 @@ def enum_value(
|
|
35
36
|
if tags:
|
36
37
|
directives.extend(Tag(name=tag) for tag in tags)
|
37
38
|
|
38
|
-
return base_enum_value(
|
39
|
+
return base_enum_value(
|
40
|
+
value=value,
|
41
|
+
name=name,
|
42
|
+
deprecation_reason=deprecation_reason,
|
43
|
+
directives=directives,
|
44
|
+
)
|
39
45
|
|
40
46
|
|
41
47
|
@overload
|
strawberry/http/__init__.py
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
from dataclasses import dataclass
|
4
|
-
from typing import Any, Optional
|
4
|
+
from typing import TYPE_CHECKING, Any, Optional
|
5
5
|
from typing_extensions import Literal, TypedDict
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
ResultType,
|
10
|
-
)
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from strawberry.types import ExecutionResult
|
11
9
|
|
12
10
|
|
13
11
|
class GraphQLHTTPResponse(TypedDict, total=False):
|
@@ -16,16 +14,13 @@ class GraphQLHTTPResponse(TypedDict, total=False):
|
|
16
14
|
extensions: Optional[dict[str, object]]
|
17
15
|
|
18
16
|
|
19
|
-
def process_result(result:
|
20
|
-
|
21
|
-
return result
|
17
|
+
def process_result(result: ExecutionResult) -> GraphQLHTTPResponse:
|
18
|
+
data: GraphQLHTTPResponse = {"data": result.data}
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
**({"extensions": extensions} if extensions else {}),
|
28
|
-
}
|
20
|
+
if result.errors:
|
21
|
+
data["errors"] = [err.formatted for err in result.errors]
|
22
|
+
if result.extensions:
|
23
|
+
data["extensions"] = result.extensions
|
29
24
|
|
30
25
|
return data
|
31
26
|
|
@@ -25,9 +25,6 @@ from strawberry.http import (
|
|
25
25
|
process_result,
|
26
26
|
)
|
27
27
|
from strawberry.http.ides import GraphQL_IDE
|
28
|
-
from strawberry.schema._graphql_core import (
|
29
|
-
GraphQLIncrementalExecutionResults,
|
30
|
-
)
|
31
28
|
from strawberry.schema.base import BaseSchema
|
32
29
|
from strawberry.schema.exceptions import InvalidOperationTypeError
|
33
30
|
from strawberry.subscriptions import GRAPHQL_TRANSPORT_WS_PROTOCOL, GRAPHQL_WS_PROTOCOL
|
@@ -261,7 +258,7 @@ class AsyncBaseHTTPView(
|
|
261
258
|
root_value: Optional[RootValue] = UNSET,
|
262
259
|
) -> WebSocketResponse: ...
|
263
260
|
|
264
|
-
async def run(
|
261
|
+
async def run(
|
265
262
|
self,
|
266
263
|
request: Union[Request, WebSocketRequest],
|
267
264
|
context: Optional[Context] = UNSET,
|
@@ -352,75 +349,6 @@ class AsyncBaseHTTPView(
|
|
352
349
|
"Content-Type": "multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json",
|
353
350
|
},
|
354
351
|
)
|
355
|
-
if isinstance(result, GraphQLIncrementalExecutionResults):
|
356
|
-
|
357
|
-
async def stream() -> AsyncGenerator[str, None]:
|
358
|
-
yield "---"
|
359
|
-
|
360
|
-
response = await self.process_result(request, result.initial_result)
|
361
|
-
|
362
|
-
response["hasNext"] = result.initial_result.has_next
|
363
|
-
response["pending"] = [
|
364
|
-
p.formatted for p in result.initial_result.pending
|
365
|
-
]
|
366
|
-
response["extensions"] = result.initial_result.extensions
|
367
|
-
|
368
|
-
yield self.encode_multipart_data(response, "-")
|
369
|
-
|
370
|
-
all_pending = result.initial_result.pending
|
371
|
-
|
372
|
-
async for value in result.subsequent_results:
|
373
|
-
response = {
|
374
|
-
"hasNext": value.has_next,
|
375
|
-
"extensions": value.extensions,
|
376
|
-
}
|
377
|
-
|
378
|
-
if value.pending:
|
379
|
-
response["pending"] = [p.formatted for p in value.pending]
|
380
|
-
|
381
|
-
if value.completed:
|
382
|
-
response["completed"] = [p.formatted for p in value.completed]
|
383
|
-
|
384
|
-
if value.incremental:
|
385
|
-
incremental = []
|
386
|
-
|
387
|
-
all_pending.extend(value.pending)
|
388
|
-
|
389
|
-
for incremental_value in value.incremental:
|
390
|
-
pending_value = next(
|
391
|
-
(
|
392
|
-
v
|
393
|
-
for v in all_pending
|
394
|
-
if v.id == incremental_value.id
|
395
|
-
),
|
396
|
-
None,
|
397
|
-
)
|
398
|
-
|
399
|
-
assert pending_value
|
400
|
-
|
401
|
-
incremental.append(
|
402
|
-
{
|
403
|
-
**incremental_value.formatted,
|
404
|
-
"path": pending_value.path,
|
405
|
-
"label": pending_value.label,
|
406
|
-
}
|
407
|
-
)
|
408
|
-
|
409
|
-
response["incremental"] = incremental
|
410
|
-
|
411
|
-
yield self.encode_multipart_data(response, "-")
|
412
|
-
|
413
|
-
yield "--\r\n"
|
414
|
-
|
415
|
-
return await self.create_streaming_response(
|
416
|
-
request,
|
417
|
-
stream,
|
418
|
-
sub_response,
|
419
|
-
headers={
|
420
|
-
"Transfer-Encoding": "chunked",
|
421
|
-
"Content-Type": 'multipart/mixed; boundary="-"',
|
422
|
-
},
|
423
|
-
)
|
424
352
|
|
425
353
|
response_data = await self.process_result(request=request, result=result)
|
426
354
|
|
@@ -432,16 +360,12 @@ class AsyncBaseHTTPView(
|
|
432
360
|
)
|
433
361
|
|
434
362
|
def encode_multipart_data(self, data: Any, separator: str) -> str:
|
435
|
-
encoded_data = self.encode_json(data)
|
436
|
-
|
437
363
|
return "".join(
|
438
364
|
[
|
439
|
-
"\r\n",
|
440
|
-
"Content-Type: application/json
|
441
|
-
|
442
|
-
"\
|
443
|
-
encoded_data,
|
444
|
-
f"\r\n--{separator}",
|
365
|
+
f"\r\n--{separator}\r\n",
|
366
|
+
"Content-Type: application/json\r\n\r\n",
|
367
|
+
self.encode_json(data),
|
368
|
+
"\n",
|
445
369
|
]
|
446
370
|
)
|
447
371
|
|
strawberry/parent.py
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
import re
|
2
|
+
from typing import Annotated, Any, ForwardRef, TypeVar
|
3
|
+
|
4
|
+
_parent_re = re.compile(r"^(?:strawberry\.)?Parent\[(.*)\]$")
|
2
5
|
|
3
6
|
|
4
7
|
class StrawberryParent: ...
|
@@ -40,4 +43,20 @@ class Query:
|
|
40
43
|
```
|
41
44
|
"""
|
42
45
|
|
43
|
-
|
46
|
+
|
47
|
+
def resolve_parent_forward_arg(annotation: Any) -> Any:
|
48
|
+
if isinstance(annotation, str):
|
49
|
+
str_annotation = annotation
|
50
|
+
elif isinstance(annotation, ForwardRef):
|
51
|
+
str_annotation = annotation.__forward_arg__
|
52
|
+
else:
|
53
|
+
# If neither, return the annotation as is
|
54
|
+
return annotation
|
55
|
+
|
56
|
+
if parent_match := _parent_re.match(str_annotation):
|
57
|
+
annotation = Parent[ForwardRef(parent_match.group(1))] # type: ignore[misc]
|
58
|
+
|
59
|
+
return annotation
|
60
|
+
|
61
|
+
|
62
|
+
__all__ = ["Parent", "StrawberryParent", "resolve_parent_forward_arg"]
|
strawberry/printer/printer.py
CHANGED
@@ -561,9 +561,9 @@ def print_schema_definition(
|
|
561
561
|
def print_directive(
|
562
562
|
directive: GraphQLDirective, *, schema: BaseSchema
|
563
563
|
) -> Optional[str]:
|
564
|
-
strawberry_directive = directive.extensions
|
564
|
+
strawberry_directive = directive.extensions["strawberry-definition"]
|
565
565
|
|
566
|
-
if
|
566
|
+
if (
|
567
567
|
isinstance(strawberry_directive, StrawberrySchemaDirective)
|
568
568
|
and not strawberry_directive.print_definition
|
569
569
|
):
|
strawberry/schema/config.py
CHANGED
strawberry/schema/schema.py
CHANGED
@@ -29,6 +29,8 @@ from graphql import (
|
|
29
29
|
parse,
|
30
30
|
validate_schema,
|
31
31
|
)
|
32
|
+
from graphql.execution import ExecutionContext as GraphQLExecutionContext
|
33
|
+
from graphql.execution import execute, subscribe
|
32
34
|
from graphql.execution.middleware import MiddlewareManager
|
33
35
|
from graphql.type.directives import specified_directives
|
34
36
|
from graphql.validation import validate
|
@@ -62,15 +64,6 @@ from strawberry.utils.aio import aclosing
|
|
62
64
|
from strawberry.utils.await_maybe import await_maybe
|
63
65
|
|
64
66
|
from . import compat
|
65
|
-
from ._graphql_core import (
|
66
|
-
GraphQLExecutionContext,
|
67
|
-
GraphQLIncrementalExecutionResults,
|
68
|
-
ResultType,
|
69
|
-
execute,
|
70
|
-
experimental_execute_incrementally,
|
71
|
-
incremental_execution_directives,
|
72
|
-
subscribe,
|
73
|
-
)
|
74
67
|
from .base import BaseSchema
|
75
68
|
from .config import StrawberryConfig
|
76
69
|
from .exceptions import InvalidOperationTypeError
|
@@ -99,7 +92,6 @@ OriginSubscriptionResult = Union[
|
|
99
92
|
AsyncIterator[OriginalExecutionResult],
|
100
93
|
]
|
101
94
|
|
102
|
-
|
103
95
|
DEFAULT_ALLOWED_OPERATION_TYPES = {
|
104
96
|
OperationType.QUERY,
|
105
97
|
OperationType.MUTATION,
|
@@ -270,16 +262,11 @@ class Schema(BaseSchema):
|
|
270
262
|
graphql_types.append(graphql_type)
|
271
263
|
|
272
264
|
try:
|
273
|
-
directives = specified_directives + tuple(graphql_directives)
|
274
|
-
|
275
|
-
if self.config.enable_experimental_incremental_execution:
|
276
|
-
directives = tuple(directives) + tuple(incremental_execution_directives)
|
277
|
-
|
278
265
|
self._schema = GraphQLSchema(
|
279
266
|
query=query_type,
|
280
267
|
mutation=mutation_type,
|
281
268
|
subscription=subscription_type if subscription else None,
|
282
|
-
directives=
|
269
|
+
directives=specified_directives + tuple(graphql_directives),
|
283
270
|
types=graphql_types,
|
284
271
|
extensions={
|
285
272
|
GraphQLCoreConverter.DEFINITION_BACKREF: self,
|
@@ -457,16 +444,12 @@ class Schema(BaseSchema):
|
|
457
444
|
async def _handle_execution_result(
|
458
445
|
self,
|
459
446
|
context: ExecutionContext,
|
460
|
-
result:
|
447
|
+
result: Union[GraphQLExecutionResult, ExecutionResult],
|
461
448
|
extensions_runner: SchemaExtensionsRunner,
|
462
449
|
*,
|
463
450
|
# TODO: can we remove this somehow, see comment in execute
|
464
451
|
skip_process_errors: bool = False,
|
465
452
|
) -> ExecutionResult:
|
466
|
-
# TODO: handle this, also, why do we have both GraphQLExecutionResult and ExecutionResult?
|
467
|
-
if isinstance(result, GraphQLIncrementalExecutionResults):
|
468
|
-
return result
|
469
|
-
|
470
453
|
# Set errors on the context so that it's easier
|
471
454
|
# to access in extensions
|
472
455
|
if result.errors:
|
@@ -507,17 +490,6 @@ class Schema(BaseSchema):
|
|
507
490
|
extensions_runner = self.create_extensions_runner(execution_context, extensions)
|
508
491
|
middleware_manager = self._get_middleware_manager(extensions)
|
509
492
|
|
510
|
-
execute_function = execute
|
511
|
-
|
512
|
-
if self.config.enable_experimental_incremental_execution:
|
513
|
-
execute_function = experimental_execute_incrementally
|
514
|
-
|
515
|
-
if execute_function is None:
|
516
|
-
raise RuntimeError(
|
517
|
-
"Incremental execution is enabled but experimental_execute_incrementally is not available, "
|
518
|
-
"please install graphql-core>=3.3.0"
|
519
|
-
)
|
520
|
-
|
521
493
|
try:
|
522
494
|
async with extensions_runner.operation():
|
523
495
|
# Note: In graphql-core the schema would be validated here but in
|
@@ -536,7 +508,7 @@ class Schema(BaseSchema):
|
|
536
508
|
async with extensions_runner.executing():
|
537
509
|
if not execution_context.result:
|
538
510
|
result = await await_maybe(
|
539
|
-
|
511
|
+
execute(
|
540
512
|
self._schema,
|
541
513
|
execution_context.graphql_document,
|
542
514
|
root_value=execution_context.root_value,
|
@@ -552,9 +524,7 @@ class Schema(BaseSchema):
|
|
552
524
|
result = execution_context.result
|
553
525
|
# Also set errors on the execution_context so that it's easier
|
554
526
|
# to access in extensions
|
555
|
-
|
556
|
-
# TODO: maybe here use the first result from incremental execution if it exists
|
557
|
-
if isinstance(result, GraphQLExecutionResult) and result.errors:
|
527
|
+
if result.errors:
|
558
528
|
execution_context.errors = result.errors
|
559
529
|
|
560
530
|
# Run the `Schema.process_errors` function here before
|
@@ -604,16 +574,6 @@ class Schema(BaseSchema):
|
|
604
574
|
extensions_runner = self.create_extensions_runner(execution_context, extensions)
|
605
575
|
middleware_manager = self._get_middleware_manager(extensions)
|
606
576
|
|
607
|
-
execute_function = execute
|
608
|
-
|
609
|
-
if self.config.enable_experimental_incremental_execution:
|
610
|
-
execute_function = experimental_execute_incrementally
|
611
|
-
|
612
|
-
if execute_function is None:
|
613
|
-
raise RuntimeError(
|
614
|
-
"Incremental execution is enabled but experimental_execute_incrementally is not available, "
|
615
|
-
"please install graphql-core>=3.3.0"
|
616
|
-
)
|
617
577
|
try:
|
618
578
|
with extensions_runner.operation():
|
619
579
|
# Note: In graphql-core the schema would be validated here but in
|
@@ -655,7 +615,7 @@ class Schema(BaseSchema):
|
|
655
615
|
|
656
616
|
with extensions_runner.executing():
|
657
617
|
if not execution_context.result:
|
658
|
-
result =
|
618
|
+
result = execute(
|
659
619
|
self._schema,
|
660
620
|
execution_context.graphql_document,
|
661
621
|
root_value=execution_context.root_value,
|
@@ -52,6 +52,7 @@ from strawberry.schema.types.scalar import _make_scalar_type
|
|
52
52
|
from strawberry.types.arguments import StrawberryArgument, convert_arguments
|
53
53
|
from strawberry.types.base import (
|
54
54
|
StrawberryList,
|
55
|
+
StrawberryMaybe,
|
55
56
|
StrawberryObjectDefinition,
|
56
57
|
StrawberryOptional,
|
57
58
|
StrawberryType,
|
@@ -254,7 +255,10 @@ class GraphQLCoreConverter:
|
|
254
255
|
argument_type = cast(
|
255
256
|
"GraphQLInputType", self.from_maybe_optional(argument.type)
|
256
257
|
)
|
257
|
-
|
258
|
+
if argument.is_maybe:
|
259
|
+
default_value: Any = Undefined
|
260
|
+
else:
|
261
|
+
default_value = Undefined if argument.default is UNSET else argument.default
|
258
262
|
|
259
263
|
return GraphQLArgument(
|
260
264
|
type_=argument_type,
|
@@ -419,8 +423,9 @@ class GraphQLCoreConverter:
|
|
419
423
|
),
|
420
424
|
)
|
421
425
|
default_value: object
|
422
|
-
|
423
|
-
|
426
|
+
if isinstance(field.type, StrawberryMaybe):
|
427
|
+
default_value = Undefined
|
428
|
+
elif field.default_value is UNSET or field.default_value is dataclasses.MISSING:
|
424
429
|
default_value = Undefined
|
425
430
|
else:
|
426
431
|
default_value = field.default_value
|
strawberry/static/graphiql.html
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
<!
|
1
|
+
<!DOCTYPE html>
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>Strawberry GraphiQL</title>
|
@@ -61,8 +61,8 @@
|
|
61
61
|
<link
|
62
62
|
crossorigin
|
63
63
|
rel="stylesheet"
|
64
|
-
href="https://unpkg.com/graphiql@3.
|
65
|
-
integrity="sha384-
|
64
|
+
href="https://unpkg.com/graphiql@3.0.9/graphiql.min.css"
|
65
|
+
integrity="sha384-yz3/sqpuplkA7msMo0FE4ekg0xdwdvZ8JX9MVZREsxipqjU4h8IRfmAMRcb1QpUy"
|
66
66
|
/>
|
67
67
|
|
68
68
|
<link
|
@@ -77,8 +77,8 @@
|
|
77
77
|
<div id="graphiql" class="graphiql-container">Loading...</div>
|
78
78
|
<script
|
79
79
|
crossorigin
|
80
|
-
src="https://unpkg.com/graphiql@3.
|
81
|
-
integrity="sha384-
|
80
|
+
src="https://unpkg.com/graphiql@3.0.9/graphiql.min.js"
|
81
|
+
integrity="sha384-Mjte+vxCWz1ZYCzszGHiJqJa5eAxiqI4mc3BErq7eDXnt+UGLXSEW7+i0wmfPiji"
|
82
82
|
></script>
|
83
83
|
<script
|
84
84
|
crossorigin
|
strawberry/types/arguments.py
CHANGED
@@ -17,13 +17,17 @@ from strawberry.exceptions import MultipleStrawberryArgumentsError, UnsupportedT
|
|
17
17
|
from strawberry.scalars import is_scalar
|
18
18
|
from strawberry.types.base import (
|
19
19
|
StrawberryList,
|
20
|
+
StrawberryMaybe,
|
20
21
|
StrawberryOptional,
|
21
22
|
has_object_definition,
|
22
23
|
)
|
23
24
|
from strawberry.types.enum import EnumDefinition
|
24
25
|
from strawberry.types.lazy_type import LazyType, StrawberryLazyReference
|
26
|
+
from strawberry.types.maybe import Some
|
25
27
|
from strawberry.types.unset import UNSET as _deprecated_UNSET # noqa: N811
|
26
|
-
from strawberry.types.unset import
|
28
|
+
from strawberry.types.unset import (
|
29
|
+
_deprecated_is_unset, # noqa: F401
|
30
|
+
)
|
27
31
|
|
28
32
|
if TYPE_CHECKING:
|
29
33
|
from collections.abc import Iterable, Mapping
|
@@ -135,6 +139,10 @@ class StrawberryArgument:
|
|
135
139
|
|
136
140
|
return is_graphql_generic(self.type)
|
137
141
|
|
142
|
+
@property
|
143
|
+
def is_maybe(self) -> bool:
|
144
|
+
return isinstance(self.type, StrawberryMaybe)
|
145
|
+
|
138
146
|
|
139
147
|
def convert_argument(
|
140
148
|
value: object,
|
@@ -143,6 +151,10 @@ def convert_argument(
|
|
143
151
|
config: StrawberryConfig,
|
144
152
|
) -> object:
|
145
153
|
# TODO: move this somewhere else and make it first class
|
154
|
+
if isinstance(type_, StrawberryOptional):
|
155
|
+
res = convert_argument(value, type_.of_type, scalar_registry, config)
|
156
|
+
|
157
|
+
return Some(res) if isinstance(type_, StrawberryMaybe) else res
|
146
158
|
|
147
159
|
if value is None:
|
148
160
|
return None
|
@@ -150,9 +162,6 @@ def convert_argument(
|
|
150
162
|
if value is _deprecated_UNSET:
|
151
163
|
return _deprecated_UNSET
|
152
164
|
|
153
|
-
if isinstance(type_, StrawberryOptional):
|
154
|
-
return convert_argument(value, type_.of_type, scalar_registry, config)
|
155
|
-
|
156
165
|
if isinstance(type_, StrawberryList):
|
157
166
|
value_list = cast("Iterable", value)
|
158
167
|
return [
|
strawberry/types/base.py
CHANGED
@@ -152,7 +152,16 @@ class StrawberryContainer(StrawberryType):
|
|
152
152
|
class StrawberryList(StrawberryContainer): ...
|
153
153
|
|
154
154
|
|
155
|
-
class StrawberryOptional(StrawberryContainer):
|
155
|
+
class StrawberryOptional(StrawberryContainer):
|
156
|
+
def __init__(
|
157
|
+
self,
|
158
|
+
of_type: Union[StrawberryType, type[WithStrawberryObjectDefinition], type],
|
159
|
+
) -> None:
|
160
|
+
super().__init__(of_type)
|
161
|
+
|
162
|
+
|
163
|
+
class StrawberryMaybe(StrawberryOptional):
|
164
|
+
pass
|
156
165
|
|
157
166
|
|
158
167
|
class StrawberryTypeVar(StrawberryType):
|
strawberry/types/enum.py
CHANGED
@@ -50,6 +50,7 @@ class EnumDefinition(StrawberryType):
|
|
50
50
|
@dataclasses.dataclass
|
51
51
|
class EnumValueDefinition:
|
52
52
|
value: Any
|
53
|
+
graphql_name: Optional[str] = None
|
53
54
|
deprecation_reason: Optional[str] = None
|
54
55
|
directives: Iterable[object] = ()
|
55
56
|
description: Optional[str] = None
|
@@ -60,6 +61,7 @@ class EnumValueDefinition:
|
|
60
61
|
|
61
62
|
def enum_value(
|
62
63
|
value: Any,
|
64
|
+
name: Optional[str] = None,
|
63
65
|
deprecation_reason: Optional[str] = None,
|
64
66
|
directives: Iterable[object] = (),
|
65
67
|
description: Optional[str] = None,
|
@@ -68,6 +70,7 @@ def enum_value(
|
|
68
70
|
|
69
71
|
Args:
|
70
72
|
value: The value of the enum member.
|
73
|
+
name: The GraphQL name of the enum member.
|
71
74
|
deprecation_reason: The deprecation reason of the enum member,
|
72
75
|
setting this will mark the enum member as deprecated.
|
73
76
|
directives: The directives to attach to the enum member.
|
@@ -90,6 +93,7 @@ def enum_value(
|
|
90
93
|
"""
|
91
94
|
return EnumValueDefinition(
|
92
95
|
value=value,
|
96
|
+
graphql_name=name,
|
93
97
|
deprecation_reason=deprecation_reason,
|
94
98
|
directives=directives,
|
95
99
|
description=description,
|
@@ -123,12 +127,16 @@ def _process_enum(
|
|
123
127
|
item_directives = item_value.directives
|
124
128
|
enum_value_description = item_value.description
|
125
129
|
deprecation_reason = item_value.deprecation_reason
|
126
|
-
item_value = item_value.value
|
127
130
|
|
128
131
|
# update _value2member_map_ so that doing `MyEnum.MY_VALUE` and
|
129
132
|
# `MyEnum['MY_VALUE']` both work
|
130
|
-
cls._value2member_map_[item_value] = item
|
131
|
-
cls._member_map_[item_name]._value_ = item_value
|
133
|
+
cls._value2member_map_[item_value.value] = item
|
134
|
+
cls._member_map_[item_name]._value_ = item_value.value
|
135
|
+
|
136
|
+
if item_value.graphql_name:
|
137
|
+
item_name = item_value.graphql_name
|
138
|
+
|
139
|
+
item_value = item_value.value
|
132
140
|
|
133
141
|
value = EnumValue(
|
134
142
|
item_name,
|
@@ -25,7 +25,7 @@ from strawberry.exceptions import (
|
|
25
25
|
ConflictingArgumentsError,
|
26
26
|
MissingArgumentsAnnotationsError,
|
27
27
|
)
|
28
|
-
from strawberry.parent import StrawberryParent
|
28
|
+
from strawberry.parent import StrawberryParent, resolve_parent_forward_arg
|
29
29
|
from strawberry.types.arguments import StrawberryArgument
|
30
30
|
from strawberry.types.base import StrawberryType, has_object_definition
|
31
31
|
from strawberry.types.info import Info
|
@@ -118,10 +118,17 @@ class ReservedType(NamedTuple):
|
|
118
118
|
try:
|
119
119
|
evaled_annotation = annotation.evaluate()
|
120
120
|
except NameError:
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
121
|
+
# If this is a strawberry.Parent using ForwardRef, we will fail to
|
122
|
+
# evaluate at this moment, but at least knowing that it is a reserved
|
123
|
+
# type is enough for now
|
124
|
+
# We might want to revisit this in the future, maybe by postponing
|
125
|
+
# this check to when the schema is actually being created
|
126
|
+
evaled_annotation = resolve_parent_forward_arg(
|
127
|
+
annotation.annotation
|
128
|
+
)
|
129
|
+
|
130
|
+
if self.is_reserved_type(evaled_annotation):
|
131
|
+
type_parameters.append(parameter)
|
125
132
|
|
126
133
|
if len(type_parameters) > 1:
|
127
134
|
raise ConflictingArgumentsError(
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import typing
|
2
|
+
from typing import TYPE_CHECKING, Any, Generic, TypeVar, Union
|
3
|
+
from typing_extensions import TypeAlias
|
4
|
+
|
5
|
+
T = TypeVar("T")
|
6
|
+
|
7
|
+
|
8
|
+
class Some(Generic[T]):
|
9
|
+
"""A special value that can be used to represent an unset value in a field or argument.
|
10
|
+
|
11
|
+
Similar to `undefined` in JavaScript, this value can be used to differentiate between
|
12
|
+
a field that was not set and a field that was set to `None` or `null`.
|
13
|
+
"""
|
14
|
+
|
15
|
+
__slots__ = ("value",)
|
16
|
+
|
17
|
+
def __init__(self, value: T) -> None:
|
18
|
+
self.value = value
|
19
|
+
|
20
|
+
def __repr__(self) -> str:
|
21
|
+
return f"Some({self.value!r})"
|
22
|
+
|
23
|
+
def __eq__(self, other: object) -> bool:
|
24
|
+
return self.value == other.value if isinstance(other, Some) else False
|
25
|
+
|
26
|
+
def __hash__(self) -> int:
|
27
|
+
return hash(self.value)
|
28
|
+
|
29
|
+
def __bool__(self) -> bool:
|
30
|
+
return True
|
31
|
+
|
32
|
+
|
33
|
+
if TYPE_CHECKING:
|
34
|
+
Maybe: TypeAlias = Union[Some[Union[T, None]], None]
|
35
|
+
else:
|
36
|
+
# we do this trick so we can inspect that at runtime
|
37
|
+
class Maybe(Generic[T]): ...
|
38
|
+
|
39
|
+
|
40
|
+
def _annotation_is_maybe(annotation: Any) -> bool:
|
41
|
+
return (orig := typing.get_origin(annotation)) and orig is Maybe
|
42
|
+
|
43
|
+
|
44
|
+
__all__ = [
|
45
|
+
"Maybe",
|
46
|
+
"Some",
|
47
|
+
]
|
strawberry/types/object_type.py
CHANGED
@@ -20,6 +20,7 @@ from strawberry.exceptions import (
|
|
20
20
|
ObjectIsNotClassError,
|
21
21
|
)
|
22
22
|
from strawberry.types.base import get_object_definition
|
23
|
+
from strawberry.types.maybe import _annotation_is_maybe
|
23
24
|
from strawberry.utils.deprecations import DEPRECATION_MESSAGES, DeprecatedDescriptor
|
24
25
|
from strawberry.utils.str_converters import to_camel_case
|
25
26
|
|
@@ -122,6 +123,15 @@ def _wrap_dataclass(cls: builtins.type[T]) -> builtins.type[T]:
|
|
122
123
|
return dclass
|
123
124
|
|
124
125
|
|
126
|
+
def _inject_default_for_maybe_annotations(
|
127
|
+
cls: builtins.type[T], annotations: dict[str, Any]
|
128
|
+
) -> None:
|
129
|
+
"""Inject `= None` for fields with `Maybe` annotations and no default value."""
|
130
|
+
for name, annotation in annotations.copy().items():
|
131
|
+
if _annotation_is_maybe(annotation) and not hasattr(cls, name):
|
132
|
+
setattr(cls, name, None)
|
133
|
+
|
134
|
+
|
125
135
|
def _process_type(
|
126
136
|
cls: T,
|
127
137
|
*,
|
@@ -286,7 +296,8 @@ def type(
|
|
286
296
|
|
287
297
|
if field and isinstance(field, StrawberryField) and field.type_annotation:
|
288
298
|
original_type_annotations[field_name] = field.type_annotation.annotation
|
289
|
-
|
299
|
+
if is_input:
|
300
|
+
_inject_default_for_maybe_annotations(cls, annotations)
|
290
301
|
wrapped = _wrap_dataclass(cls)
|
291
302
|
|
292
303
|
return _process_type( # type: ignore
|
strawberry/utils/typing.py
CHANGED
@@ -304,11 +304,13 @@ def eval_type(
|
|
304
304
|
localns: Optional[dict] = None,
|
305
305
|
) -> type:
|
306
306
|
"""Evaluates a type, resolving forward references."""
|
307
|
+
from strawberry.parent import StrawberryParent
|
307
308
|
from strawberry.types.auto import StrawberryAuto
|
308
309
|
from strawberry.types.lazy_type import StrawberryLazyReference
|
309
310
|
from strawberry.types.private import StrawberryPrivate
|
310
311
|
|
311
312
|
globalns = globalns or {}
|
313
|
+
|
312
314
|
# If this is not a string, maybe its args are (e.g. list["Foo"])
|
313
315
|
if isinstance(type_, ForwardRef):
|
314
316
|
ast_obj = cast("ast.Expr", ast.parse(type_.__forward_arg__).body[0])
|
@@ -355,6 +357,7 @@ def eval_type(
|
|
355
357
|
)
|
356
358
|
args = (type_arg, *remaining_args)
|
357
359
|
break
|
360
|
+
|
358
361
|
if isinstance(arg, StrawberryAuto):
|
359
362
|
remaining_args = [
|
360
363
|
a for a in args[1:] if not isinstance(a, StrawberryAuto)
|
@@ -362,6 +365,21 @@ def eval_type(
|
|
362
365
|
args = (args[0], arg, *remaining_args)
|
363
366
|
break
|
364
367
|
|
368
|
+
if isinstance(arg, StrawberryParent):
|
369
|
+
remaining_args = [
|
370
|
+
a for a in args[1:] if not isinstance(a, StrawberryParent)
|
371
|
+
]
|
372
|
+
try:
|
373
|
+
type_arg = (
|
374
|
+
eval_type(args[0], globalns, localns)
|
375
|
+
if isinstance(args[0], ForwardRef)
|
376
|
+
else args[0]
|
377
|
+
)
|
378
|
+
except (NameError, TypeError):
|
379
|
+
type_arg = args[0]
|
380
|
+
args = (type_arg, arg, *remaining_args)
|
381
|
+
break
|
382
|
+
|
365
383
|
# If we have only a StrawberryLazyReference and no more annotations,
|
366
384
|
# we need to return the argument directly because Annotated
|
367
385
|
# will raise an error if trying to instantiate it with only
|
{strawberry_graphql-0.266.0.dev1744797470.dist-info → strawberry_graphql-0.267.0.dist-info}/RECORD
RENAMED
@@ -1,10 +1,10 @@
|
|
1
|
-
strawberry/__init__.py,sha256
|
1
|
+
strawberry/__init__.py,sha256=-K---AYIgHvBVYF_9oovgEPNBbymXH673bntlV9sOeU,1491
|
2
2
|
strawberry/__main__.py,sha256=3U77Eu21mJ-LY27RG-JEnpbh6Z63wGOom4i-EoLtUcY,59
|
3
3
|
strawberry/aiohttp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
strawberry/aiohttp/test/__init__.py,sha256=4xxdUZtIISSOwjrcnmox7AvT4WWjowCm5bUuPdQneMg,71
|
5
5
|
strawberry/aiohttp/test/client.py,sha256=8FKZTnvawxYpgEICOri-34O3wHRHLhRpjH_Ktp2EupQ,1801
|
6
6
|
strawberry/aiohttp/views.py,sha256=AQVBbZTBa127TbQRwoBelTHrVdZnJeGdMYcTfNmoaSc,7887
|
7
|
-
strawberry/annotation.py,sha256=
|
7
|
+
strawberry/annotation.py,sha256=iqSXtJ4pTTLDZRPyil0f-yzpcCm8UYRiwvFWkD5LgpQ,13498
|
8
8
|
strawberry/asgi/__init__.py,sha256=psdKl_52LGkxKKbzZlmwNGZ9jz2FLyLSC7fUhys4FqY,8169
|
9
9
|
strawberry/asgi/test/__init__.py,sha256=4xxdUZtIISSOwjrcnmox7AvT4WWjowCm5bUuPdQneMg,71
|
10
10
|
strawberry/asgi/test/client.py,sha256=kp2O5znHWuAB5VVYO8p4XPSTEDDXBSjNz5WHqW0r6GM,1473
|
@@ -113,7 +113,7 @@ strawberry/fastapi/context.py,sha256=O_cDNppfUJJecM0ZU_RJ-dhdF0o1x39JfYvYg-7uob4
|
|
113
113
|
strawberry/fastapi/router.py,sha256=cfRGP1SL_QaSNjCk3Zi7YDQte1EsIljvqTDB1J0O4fQ,12018
|
114
114
|
strawberry/federation/__init__.py,sha256=Pw01N0rG9o0NaUxXLMNGeW5oLENeWVx_d8Kuef1ES4s,549
|
115
115
|
strawberry/federation/argument.py,sha256=rs71S1utiNUd4XOLRa9KVtSMA3yqvKJnR_qdJqX6PPM,860
|
116
|
-
strawberry/federation/enum.py,sha256=
|
116
|
+
strawberry/federation/enum.py,sha256=geyNA00IjUBroBc6EFrTK0n6DGIVyKOeSE_3aqiwUaQ,3151
|
117
117
|
strawberry/federation/field.py,sha256=pcFgl33xgJcunb6TxfOPuzsAQTGbbzjKi41SUUSV3w4,8914
|
118
118
|
strawberry/federation/mutation.py,sha256=5t2E419m4K2W6LoWEOzWgMdL2J0PwHnsffYkpChqqDQ,67
|
119
119
|
strawberry/federation/object_type.py,sha256=tuUn_YqtOcvivVSHrXESSFr2kae79xW_SLUV3oNINdE,9381
|
@@ -130,8 +130,8 @@ strawberry/file_uploads/scalars.py,sha256=NRDeB7j8aotqIkz9r62ISTf4DrxQxEZYUuHsX5
|
|
130
130
|
strawberry/file_uploads/utils.py,sha256=-c6TbqUI-Dkb96hWCrZabh6TL2OabBuQNkCarOqgDm4,1181
|
131
131
|
strawberry/flask/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
132
132
|
strawberry/flask/views.py,sha256=MCvAsNgTZLU8RvTYKWfnLU2w7Wv1ZZpxW9W3TyTZuPY,6355
|
133
|
-
strawberry/http/__init__.py,sha256=
|
134
|
-
strawberry/http/async_base_view.py,sha256=
|
133
|
+
strawberry/http/__init__.py,sha256=BV_JpUwNongW38UzFstM72hDXNUjSxdJm_M96pDFU1c,1122
|
134
|
+
strawberry/http/async_base_view.py,sha256=9micSD_KpoB8oBHAPlcTpt44bVABDYScvyfHa3NP4rE,16352
|
135
135
|
strawberry/http/base.py,sha256=Lz-u5SWg2uQp3l5GMKZDPQuJOR42LXHgjV1PZHwiapE,2373
|
136
136
|
strawberry/http/exceptions.py,sha256=9E2dreS1crRoJVUEPuHyx23NcDELDHNzkAOa-rGv-8I,348
|
137
137
|
strawberry/http/ides.py,sha256=WjU0nsMDgr3Bd1ebWkUEkO2d1hk0dI16mLqXyCHqklA,613
|
@@ -142,11 +142,11 @@ strawberry/http/types.py,sha256=H0wGOdCO-5tNKZM_6cAtNRwZAjoEXnAC5N0Q7b70AtU,398
|
|
142
142
|
strawberry/http/typevars.py,sha256=Uu6NkKe3h7o29ZWwldq6sJy4ioSSeXODTCDRvY2hUpE,489
|
143
143
|
strawberry/litestar/__init__.py,sha256=zsXzg-mglCGUVO9iNXLm-yadoDSCK7k-zuyRqyvAh1w,237
|
144
144
|
strawberry/litestar/controller.py,sha256=DSbjl7QGCY_TX77EomqDvtH8-ZK6wfhL81IUEFa-JJs,14124
|
145
|
-
strawberry/parent.py,sha256=
|
145
|
+
strawberry/parent.py,sha256=JYFp-HGCgwbH2oB4uLSiIO4cVsoPaxX6lfYmxOKPkSg,1362
|
146
146
|
strawberry/permission.py,sha256=dSRJMjSCmTlXfvfC24kCSrAk0txTjYKTJ5ZVU5IW91Y,7537
|
147
147
|
strawberry/printer/__init__.py,sha256=DmepjmgtkdF5RxK_7yC6qUyRWn56U-9qeZMbkztYB9w,62
|
148
148
|
strawberry/printer/ast_from_value.py,sha256=Tkme60qlykbN2m3dNPNMOe65X-wj6EmcDQwgQv7gUkc,4987
|
149
|
-
strawberry/printer/printer.py,sha256=
|
149
|
+
strawberry/printer/printer.py,sha256=49u3QwttTGvh13HXZtbTnkZzBwL1k5SLf8rXQLiTpl4,18814
|
150
150
|
strawberry/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
151
151
|
strawberry/quart/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
152
152
|
strawberry/quart/views.py,sha256=Hjm93A9j9fy--DQVhsPQ_PakqYtajyWeuH7wUnSLYoA,4449
|
@@ -162,14 +162,13 @@ strawberry/sanic/utils.py,sha256=XjUVBFuBWfECBCZbx_YtrjQnFTUyIGTo7aISIeB22Gc,100
|
|
162
162
|
strawberry/sanic/views.py,sha256=F5ZrKt-R3135evKLfhQuPd1isOexI0Lrzevm_6Te4Eg,7069
|
163
163
|
strawberry/scalars.py,sha256=FcFTbu-yKbBfPCuAfXNa6DbTbEzF3eiQHs5nlt6GJdM,2234
|
164
164
|
strawberry/schema/__init__.py,sha256=u1QCyDVQExUVDA20kyosKPz3TS5HMCN2NrXclhiFAL4,92
|
165
|
-
strawberry/schema/_graphql_core.py,sha256=XHsNZLkCyiH55jANK4XJIjq6VCMhN_MgZBEFWEYj5Jc,1237
|
166
165
|
strawberry/schema/base.py,sha256=q5UAw6do4Ele5Cf8dNAouiPjNmZoCBNFqh5Vl05caCI,3864
|
167
166
|
strawberry/schema/compat.py,sha256=9qJ0lhYJeaN43ayFgVz708ZMvedBhofiTSw9kpFqmjU,1830
|
168
|
-
strawberry/schema/config.py,sha256=
|
167
|
+
strawberry/schema/config.py,sha256=6BpCbNNCuekGgiKEPt2mliMqLH_wIjJmSW0tLbnJwk4,924
|
169
168
|
strawberry/schema/exceptions.py,sha256=rqVNb_oYrKM0dHPgvAemqCG6Um282LPPu4zwQ5cZqs4,584
|
170
169
|
strawberry/schema/name_converter.py,sha256=xFOXEgqldFkxXRkIQvsJN1dPkWbEUaIrTYNOMYSEVwQ,6945
|
171
|
-
strawberry/schema/schema.py,sha256=
|
172
|
-
strawberry/schema/schema_converter.py,sha256=
|
170
|
+
strawberry/schema/schema.py,sha256=qthZttzb9a0GEcwh7trqBKHmuPXOgQlnceqiCRPj4_s,34566
|
171
|
+
strawberry/schema/schema_converter.py,sha256=ZNgpE-cTt0Hqw21yoT-3Fu2xk8SVC3uDq85V9JeKI7Q,37724
|
173
172
|
strawberry/schema/types/__init__.py,sha256=oHO3COWhL3L1KLYCJNY1XFf5xt2GGtHiMC-UaYbFfnA,68
|
174
173
|
strawberry/schema/types/base_scalars.py,sha256=JRUq0WjEkR9dFewstZnqnZKp0uOEipo4UXNF5dzRf4M,1971
|
175
174
|
strawberry/schema/types/concrete_type.py,sha256=axIyFZgdwNv-XYkiqX67464wuFX6Vp0jYATwnBZSUvM,750
|
@@ -180,9 +179,8 @@ strawberry/schema_codegen/__init__.py,sha256=mN4Qmu5Iakht6nHpRpt9hCs8e--oTPlVtDJ
|
|
180
179
|
strawberry/schema_directive.py,sha256=CbjdX54EIeWGkJu4SgiLR8mph5_8wyNsgJk2oLoQK_0,2023
|
181
180
|
strawberry/schema_directives.py,sha256=KGKFWCODjm1Ah9qNV_bBwbic7Mld4qLWnWQkev-PG8A,175
|
182
181
|
strawberry/static/apollo-sandbox.html,sha256=2XzkbE0dqsFHqehE-jul9_J9TFOpwA6Ylrlo0Kdx_9w,973
|
183
|
-
strawberry/static/graphiql.html,sha256=
|
182
|
+
strawberry/static/graphiql.html,sha256=BkiqZlC63f1sHBDs_UpMzcibcNrHKh7K41Sp23yttfo,4257
|
184
183
|
strawberry/static/pathfinder.html,sha256=0DPx9AmJ2C_sJstFXnWOz9k5tVQHeHaK7qdVY4lAlmk,1547
|
185
|
-
strawberry/streamable.py,sha256=ylfMt5lfX7RRKGi86wWokvIgYQk5jZCvQVc3shK0epk,645
|
186
184
|
strawberry/subscriptions/__init__.py,sha256=1VGmiCzFepqRFyCikagkUoHHdoTG3XYlFu9GafoQMws,170
|
187
185
|
strawberry/subscriptions/protocols/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
188
186
|
strawberry/subscriptions/protocols/graphql_transport_ws/__init__.py,sha256=wN6dkMu6WiaIZTE19PGoN9xXpIN_RdDE_q7F7ZgjCxk,138
|
@@ -197,21 +195,22 @@ strawberry/tools/__init__.py,sha256=pdGpZx8wpq03VfUZJyF9JtYxZhGqzzxCiipsalWxJX4,
|
|
197
195
|
strawberry/tools/create_type.py,sha256=--DgfZOmXJBKGcVxehNISyvpw1HzwFvRtUUPc0634MA,2056
|
198
196
|
strawberry/tools/merge_types.py,sha256=hUMRRNM28FyPp70jRA3d4svv9WoEBjaNpihBt3DaY0I,1023
|
199
197
|
strawberry/types/__init__.py,sha256=baWEdDkkmCcITOhkg2hNUOenrNV1OYdxGE5qgvIRwwU,351
|
200
|
-
strawberry/types/arguments.py,sha256=
|
198
|
+
strawberry/types/arguments.py,sha256=y-1yQBZ8ua4lcrlas9PKNZE02seHn95TjGAoTCRc5e8,9700
|
201
199
|
strawberry/types/auto.py,sha256=WZ2cQAI8nREUigBzpzFqIKGjJ_C2VqpAPNe8vPjTciM,3007
|
202
|
-
strawberry/types/base.py,sha256=
|
200
|
+
strawberry/types/base.py,sha256=tZSqxtrxXa1Y964HS2uakCbCgLyGO9A4WpODiegWzF8,15122
|
203
201
|
strawberry/types/cast.py,sha256=fx86MkLW77GIximBAwUk5vZxSGwDqUA6XicXvz8EXwQ,916
|
204
|
-
strawberry/types/enum.py,sha256=
|
202
|
+
strawberry/types/enum.py,sha256=IcCz0FLswJtDC_bU8aG1cjreawcqHywAzzVRBZUSAqs,6229
|
205
203
|
strawberry/types/execution.py,sha256=Ylc0lH0nyHyQW509mVqBh2sIN5qpf4cJtt8QhVmWGgI,3749
|
206
204
|
strawberry/types/field.py,sha256=vxb7JvkHfRmDCYsjhDmVnO2lMbtSOteQm3jQUeSFu6g,21605
|
207
205
|
strawberry/types/fields/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
208
|
-
strawberry/types/fields/resolver.py,sha256=
|
206
|
+
strawberry/types/fields/resolver.py,sha256=b6lxfw6AMOUFWm7vs7a9KzNkpR8b_S110DoIosrrWDQ,14679
|
209
207
|
strawberry/types/graphql.py,sha256=gXKzawwKiow7hvoJhq5ApNJOMUCnKmvTiHaKY5CK1Lw,867
|
210
208
|
strawberry/types/info.py,sha256=bPP7XTQQScmskJcmVv36iqLAWpdGmF2nhYjI1pJ-csI,4709
|
211
209
|
strawberry/types/lazy_type.py,sha256=dlP9VcMjZc9sdgriiQGzOZa0TToB6Ee7zpIP8h7TLC0,5079
|
210
|
+
strawberry/types/maybe.py,sha256=Zdv4pAJwgUmaFNU8WKlwjk50qwgYEzT90WteURZBzAo,1174
|
212
211
|
strawberry/types/mutation.py,sha256=cg-_O2WWnZ-GSwOIv0toSdxlGeY2lhBBxZ24AifJuSM,11978
|
213
212
|
strawberry/types/nodes.py,sha256=RwZB43OT9BS3Cqjgq4AazqOfyq_y0GD2ysC86EDBv5U,5134
|
214
|
-
strawberry/types/object_type.py,sha256=
|
213
|
+
strawberry/types/object_type.py,sha256=SZOzxaS318079G-pr-1PM5iMoTddxdw8KD4cI67IhzI,15579
|
215
214
|
strawberry/types/private.py,sha256=DhJs50XVGtOXlxWZFkRpMxQ5_6oki0-x_WQsV1bGUxk,518
|
216
215
|
strawberry/types/scalar.py,sha256=CM24Ixg4DKxxI1C6hTNGYVitohJibs8BpGtntRZvMXw,6284
|
217
216
|
strawberry/types/type_resolver.py,sha256=fH2ZOK4dAGgu8AMPi-JAXe_kEAbvvw2MCYXqbpx-kTc,6529
|
@@ -229,9 +228,9 @@ strawberry/utils/inspect.py,sha256=-aFT65PkQ9KXo5w8Q2uveBJ8jEpi40sTqRipRQVdYR8,3
|
|
229
228
|
strawberry/utils/logging.py,sha256=U1cseHGquN09YFhFmRkiphfASKCyK0HUZREImPgVb0c,746
|
230
229
|
strawberry/utils/operation.py,sha256=s7ajvLg_q6v2mg47kEMQPjO_J-XluMKTCwo4d47mGvE,1195
|
231
230
|
strawberry/utils/str_converters.py,sha256=-eH1Cl16IO_wrBlsGM-km4IY0IKsjhjnSNGRGOwQjVM,897
|
232
|
-
strawberry/utils/typing.py,sha256=
|
233
|
-
strawberry_graphql-0.
|
234
|
-
strawberry_graphql-0.
|
235
|
-
strawberry_graphql-0.
|
236
|
-
strawberry_graphql-0.
|
237
|
-
strawberry_graphql-0.
|
231
|
+
strawberry/utils/typing.py,sha256=SDvX-Du-9HAV3-XXjqi7Q5f5qPDDFd_gASIITiwBQT4,14073
|
232
|
+
strawberry_graphql-0.267.0.dist-info/LICENSE,sha256=m-XnIVUKqlG_AWnfi9NReh9JfKhYOB-gJfKE45WM1W8,1072
|
233
|
+
strawberry_graphql-0.267.0.dist-info/METADATA,sha256=U6UycYRIH28R4jOQQO9BfGiciKuLEBUl_Doas8LahO0,7679
|
234
|
+
strawberry_graphql-0.267.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
235
|
+
strawberry_graphql-0.267.0.dist-info/entry_points.txt,sha256=Nk7-aT3_uEwCgyqtHESV9H6Mc31cK-VAvhnQNTzTb4k,49
|
236
|
+
strawberry_graphql-0.267.0.dist-info/RECORD,,
|
@@ -1,46 +0,0 @@
|
|
1
|
-
from typing import Union
|
2
|
-
|
3
|
-
from graphql.execution import ExecutionContext as GraphQLExecutionContext
|
4
|
-
from graphql.execution import ExecutionResult as GraphQLExecutionResult
|
5
|
-
from graphql.execution import execute, subscribe
|
6
|
-
|
7
|
-
from strawberry.types import ExecutionResult
|
8
|
-
|
9
|
-
try:
|
10
|
-
from graphql import (
|
11
|
-
ExperimentalIncrementalExecutionResults as GraphQLIncrementalExecutionResults,
|
12
|
-
)
|
13
|
-
from graphql.execution import experimental_execute_incrementally
|
14
|
-
from graphql.type.directives import (
|
15
|
-
GraphQLDeferDirective,
|
16
|
-
GraphQLStreamDirective,
|
17
|
-
)
|
18
|
-
|
19
|
-
incremental_execution_directives = (
|
20
|
-
GraphQLDeferDirective,
|
21
|
-
GraphQLStreamDirective,
|
22
|
-
)
|
23
|
-
|
24
|
-
except ImportError:
|
25
|
-
GraphQLIncrementalExecutionResults = type(None)
|
26
|
-
|
27
|
-
incremental_execution_directives = []
|
28
|
-
experimental_execute_incrementally = None
|
29
|
-
|
30
|
-
|
31
|
-
# TODO: give this a better name, maybe also a better place
|
32
|
-
ResultType = Union[
|
33
|
-
GraphQLExecutionResult,
|
34
|
-
GraphQLIncrementalExecutionResults,
|
35
|
-
ExecutionResult,
|
36
|
-
]
|
37
|
-
|
38
|
-
__all__ = [
|
39
|
-
"GraphQLExecutionContext",
|
40
|
-
"GraphQLIncrementalExecutionResults",
|
41
|
-
"ResultType",
|
42
|
-
"execute",
|
43
|
-
"experimental_execute_incrementally",
|
44
|
-
"incremental_execution_directives",
|
45
|
-
"subscribe",
|
46
|
-
]
|
strawberry/streamable.py
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
from collections.abc import AsyncGenerator
|
2
|
-
from typing import Annotated, TypeVar
|
3
|
-
|
4
|
-
|
5
|
-
class StrawberryStreamable: ...
|
6
|
-
|
7
|
-
|
8
|
-
T = TypeVar("T")
|
9
|
-
|
10
|
-
Streamable = Annotated[AsyncGenerator[T, None], StrawberryStreamable()]
|
11
|
-
"""Represents a list that can be streamed using @stream.
|
12
|
-
|
13
|
-
Example:
|
14
|
-
|
15
|
-
```python
|
16
|
-
import strawberry
|
17
|
-
from dataclasses import dataclass
|
18
|
-
|
19
|
-
|
20
|
-
@strawberry.type
|
21
|
-
class Comment:
|
22
|
-
id: strawberry.ID
|
23
|
-
content: str
|
24
|
-
|
25
|
-
|
26
|
-
@strawberry.type
|
27
|
-
class Article:
|
28
|
-
@strawberry.field
|
29
|
-
@staticmethod
|
30
|
-
async def comments() -> strawberry.Streamable[Comment]:
|
31
|
-
for comment in fetch_comments():
|
32
|
-
yield comment
|
33
|
-
```
|
34
|
-
"""
|
35
|
-
|
36
|
-
__all__ = ["Streamable"]
|
{strawberry_graphql-0.266.0.dev1744797470.dist-info → strawberry_graphql-0.267.0.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|