strawberry-graphql 0.229.2.dev1715881453__tar.gz → 0.230.0.dev1716318708__tar.gz

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.
Files changed (251) hide show
  1. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/PKG-INFO +1 -1
  2. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/pyproject.toml +1 -1
  3. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/object_type.py +9 -0
  4. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/object_type.py +8 -0
  5. strawberry_graphql-0.230.0.dev1716318708/strawberry/permission.py +187 -0
  6. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/execute.py +5 -0
  7. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/schema.py +11 -0
  8. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/schema_converter.py +23 -0
  9. strawberry_graphql-0.230.0.dev1716318708/strawberry/schema/validation_rules/one_of.py +80 -0
  10. strawberry_graphql-0.230.0.dev1716318708/strawberry/schema_directives.py +8 -0
  11. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/type.py +4 -0
  12. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/types.py +9 -0
  13. strawberry_graphql-0.230.0.dev1716318708/strawberry/utils/__init__.py +0 -0
  14. strawberry_graphql-0.229.2.dev1715881453/strawberry/permission.py +0 -343
  15. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/LICENSE +0 -0
  16. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/README.md +0 -0
  17. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/__init__.py +0 -0
  18. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/__main__.py +0 -0
  19. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/aiohttp/__init__.py +0 -0
  20. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/aiohttp/handlers/__init__.py +0 -0
  21. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/aiohttp/handlers/graphql_transport_ws_handler.py +0 -0
  22. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/aiohttp/handlers/graphql_ws_handler.py +0 -0
  23. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/aiohttp/test/__init__.py +0 -0
  24. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/aiohttp/test/client.py +0 -0
  25. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/aiohttp/views.py +0 -0
  26. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/annotation.py +0 -0
  27. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/arguments.py +0 -0
  28. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/asgi/__init__.py +0 -0
  29. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/asgi/handlers/__init__.py +0 -0
  30. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/asgi/handlers/graphql_transport_ws_handler.py +0 -0
  31. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/asgi/handlers/graphql_ws_handler.py +0 -0
  32. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/asgi/test/__init__.py +0 -0
  33. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/asgi/test/client.py +0 -0
  34. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/auto.py +0 -0
  35. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/chalice/__init__.py +0 -0
  36. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/chalice/views.py +0 -0
  37. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/__init__.py +0 -0
  38. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/handlers/base.py +0 -0
  39. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/handlers/graphql_transport_ws_handler.py +0 -0
  40. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/handlers/graphql_ws_handler.py +0 -0
  41. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/handlers/http_handler.py +0 -0
  42. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/handlers/ws_handler.py +0 -0
  43. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/router.py +0 -0
  44. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/channels/testing.py +0 -0
  45. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/__init__.py +0 -0
  46. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/app.py +0 -0
  47. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/__init__.py +0 -0
  48. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/codegen.py +0 -0
  49. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/export_schema.py +0 -0
  50. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/schema_codegen.py +0 -0
  51. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/server.py +0 -0
  52. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/upgrade/__init__.py +0 -0
  53. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/upgrade/_fake_progress.py +0 -0
  54. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/commands/upgrade/_run_codemod.py +0 -0
  55. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/constants.py +0 -0
  56. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/debug_server.py +0 -0
  57. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/utils/__init__.py +0 -0
  58. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/cli/utils/load_schema.py +0 -0
  59. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/__init__.py +0 -0
  60. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/exceptions.py +0 -0
  61. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/plugins/__init__.py +0 -0
  62. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/plugins/print_operation.py +0 -0
  63. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/plugins/python.py +0 -0
  64. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/plugins/typescript.py +0 -0
  65. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/query_codegen.py +0 -0
  66. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codegen/types.py +0 -0
  67. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codemods/__init__.py +0 -0
  68. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/codemods/annotated_unions.py +0 -0
  69. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/custom_scalar.py +0 -0
  70. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/dataloader.py +0 -0
  71. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/directive.py +0 -0
  72. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/django/__init__.py +0 -0
  73. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/django/apps.py +0 -0
  74. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/django/context.py +0 -0
  75. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/django/test/__init__.py +0 -0
  76. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/django/test/client.py +0 -0
  77. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/django/views.py +0 -0
  78. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/enum.py +0 -0
  79. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/__init__.py +0 -0
  80. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/conflicting_arguments.py +0 -0
  81. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/duplicated_type_name.py +0 -0
  82. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/exception.py +0 -0
  83. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/exception_source.py +0 -0
  84. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/handler.py +0 -0
  85. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/invalid_argument_type.py +0 -0
  86. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/invalid_union_type.py +0 -0
  87. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/missing_arguments_annotations.py +0 -0
  88. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/missing_field_annotation.py +0 -0
  89. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/missing_return_annotation.py +0 -0
  90. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/not_a_strawberry_enum.py +0 -0
  91. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/object_is_not_a_class.py +0 -0
  92. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/object_is_not_an_enum.py +0 -0
  93. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/permission_fail_silently_requires_optional.py +0 -0
  94. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/private_strawberry_field.py +0 -0
  95. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/scalar_already_registered.py +0 -0
  96. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/syntax.py +0 -0
  97. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/unresolved_field_type.py +0 -0
  98. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/utils/__init__.py +0 -0
  99. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/exceptions/utils/source_finder.py +0 -0
  100. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/__init__.py +0 -0
  101. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/__init__.py +0 -0
  102. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/_compat.py +0 -0
  103. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/conversion.py +0 -0
  104. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/conversion_types.py +0 -0
  105. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/error_type.py +0 -0
  106. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/exceptions.py +0 -0
  107. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/fields.py +0 -0
  108. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/object_type.py +0 -0
  109. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/experimental/pydantic/utils.py +0 -0
  110. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/ext/LICENSE +0 -0
  111. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/ext/__init__.py +0 -0
  112. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/ext/dataclasses/LICENSE +0 -0
  113. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/ext/dataclasses/__init__.py +0 -0
  114. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/ext/dataclasses/dataclasses.py +0 -0
  115. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/ext/mypy_plugin.py +0 -0
  116. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/__init__.py +0 -0
  117. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/add_validation_rules.py +0 -0
  118. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/base_extension.py +0 -0
  119. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/context.py +0 -0
  120. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/directives.py +0 -0
  121. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/disable_validation.py +0 -0
  122. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/field_extension.py +0 -0
  123. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/mask_errors.py +0 -0
  124. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/max_aliases.py +0 -0
  125. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/max_tokens.py +0 -0
  126. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/parser_cache.py +0 -0
  127. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/pyinstrument.py +0 -0
  128. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/query_depth_limiter.py +0 -0
  129. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/runner.py +0 -0
  130. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/tracing/__init__.py +0 -0
  131. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/tracing/apollo.py +0 -0
  132. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/tracing/datadog.py +0 -0
  133. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/tracing/opentelemetry.py +0 -0
  134. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/tracing/sentry.py +0 -0
  135. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/tracing/utils.py +0 -0
  136. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/utils.py +0 -0
  137. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/extensions/validation_cache.py +0 -0
  138. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/fastapi/__init__.py +0 -0
  139. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/fastapi/context.py +0 -0
  140. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/fastapi/handlers/__init__.py +0 -0
  141. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/fastapi/handlers/graphql_transport_ws_handler.py +0 -0
  142. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/fastapi/handlers/graphql_ws_handler.py +0 -0
  143. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/fastapi/router.py +0 -0
  144. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/__init__.py +0 -0
  145. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/argument.py +0 -0
  146. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/enum.py +0 -0
  147. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/field.py +0 -0
  148. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/mutation.py +0 -0
  149. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/scalar.py +0 -0
  150. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/schema.py +0 -0
  151. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/schema_directive.py +0 -0
  152. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/schema_directives.py +0 -0
  153. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/types.py +0 -0
  154. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/federation/union.py +0 -0
  155. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/field.py +0 -0
  156. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/field_extensions/__init__.py +0 -0
  157. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/field_extensions/input_mutation.py +0 -0
  158. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/file_uploads/__init__.py +0 -0
  159. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/file_uploads/scalars.py +0 -0
  160. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/file_uploads/utils.py +0 -0
  161. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/flask/__init__.py +0 -0
  162. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/flask/views.py +0 -0
  163. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/__init__.py +0 -0
  164. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/async_base_view.py +0 -0
  165. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/base.py +0 -0
  166. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/exceptions.py +0 -0
  167. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/ides.py +0 -0
  168. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/sync_base_view.py +0 -0
  169. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/temporal_response.py +0 -0
  170. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/types.py +0 -0
  171. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/http/typevars.py +0 -0
  172. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/lazy_type.py +0 -0
  173. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/litestar/__init__.py +0 -0
  174. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/litestar/controller.py +0 -0
  175. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/litestar/handlers/graphql_transport_ws_handler.py +0 -0
  176. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/litestar/handlers/graphql_ws_handler.py +0 -0
  177. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/mutation.py +0 -0
  178. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/parent.py +0 -0
  179. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/printer/__init__.py +0 -0
  180. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/printer/ast_from_value.py +0 -0
  181. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/printer/printer.py +0 -0
  182. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/private.py +0 -0
  183. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/py.typed +0 -0
  184. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/quart/__init__.py +0 -0
  185. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/quart/views.py +0 -0
  186. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/relay/__init__.py +0 -0
  187. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/relay/exceptions.py +0 -0
  188. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/relay/fields.py +0 -0
  189. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/relay/types.py +0 -0
  190. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/relay/utils.py +0 -0
  191. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/resolvers.py +0 -0
  192. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/sanic/__init__.py +0 -0
  193. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/sanic/context.py +0 -0
  194. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/sanic/utils.py +0 -0
  195. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/sanic/views.py +0 -0
  196. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/scalars.py +0 -0
  197. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/__init__.py +0 -0
  198. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/base.py +0 -0
  199. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/compat.py +0 -0
  200. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/config.py +0 -0
  201. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/exceptions.py +0 -0
  202. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/name_converter.py +0 -0
  203. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/types/__init__.py +0 -0
  204. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/types/base_scalars.py +0 -0
  205. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/types/concrete_type.py +0 -0
  206. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema/types/scalar.py +0 -0
  207. {strawberry_graphql-0.229.2.dev1715881453/strawberry/subscriptions/protocols → strawberry_graphql-0.230.0.dev1716318708/strawberry/schema/validation_rules}/__init__.py +0 -0
  208. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema_codegen/__init__.py +0 -0
  209. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/schema_directive.py +0 -0
  210. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/starlite/__init__.py +0 -0
  211. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/starlite/controller.py +0 -0
  212. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/starlite/handlers/graphql_transport_ws_handler.py +0 -0
  213. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/starlite/handlers/graphql_ws_handler.py +0 -0
  214. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/static/apollo-sandbox.html +0 -0
  215. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/static/graphiql.html +0 -0
  216. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/static/pathfinder.html +0 -0
  217. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/subscriptions/__init__.py +0 -0
  218. {strawberry_graphql-0.229.2.dev1715881453/strawberry/types/fields → strawberry_graphql-0.230.0.dev1716318708/strawberry/subscriptions/protocols}/__init__.py +0 -0
  219. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/subscriptions/protocols/graphql_transport_ws/__init__.py +0 -0
  220. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/subscriptions/protocols/graphql_transport_ws/handlers.py +0 -0
  221. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/subscriptions/protocols/graphql_transport_ws/types.py +0 -0
  222. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/subscriptions/protocols/graphql_ws/__init__.py +0 -0
  223. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/subscriptions/protocols/graphql_ws/handlers.py +0 -0
  224. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/subscriptions/protocols/graphql_ws/types.py +0 -0
  225. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/test/__init__.py +0 -0
  226. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/test/client.py +0 -0
  227. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/tools/__init__.py +0 -0
  228. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/tools/create_type.py +0 -0
  229. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/tools/merge_types.py +0 -0
  230. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/__init__.py +0 -0
  231. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/execution.py +0 -0
  232. {strawberry_graphql-0.229.2.dev1715881453/strawberry/utils → strawberry_graphql-0.230.0.dev1716318708/strawberry/types/fields}/__init__.py +0 -0
  233. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/fields/resolver.py +0 -0
  234. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/graphql.py +0 -0
  235. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/info.py +0 -0
  236. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/nodes.py +0 -0
  237. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/types/type_resolver.py +0 -0
  238. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/union.py +0 -0
  239. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/unset.py +0 -0
  240. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/aio.py +0 -0
  241. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/await_maybe.py +0 -0
  242. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/dataclasses.py +0 -0
  243. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/debug.py +0 -0
  244. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/deprecations.py +0 -0
  245. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/graphql_lexer.py +0 -0
  246. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/importer.py +0 -0
  247. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/inspect.py +0 -0
  248. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/logging.py +0 -0
  249. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/operation.py +0 -0
  250. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/str_converters.py +0 -0
  251. {strawberry_graphql-0.229.2.dev1715881453 → strawberry_graphql-0.230.0.dev1716318708}/strawberry/utils/typing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: strawberry-graphql
3
- Version: 0.229.2.dev1715881453
3
+ Version: 0.230.0.dev1716318708
4
4
  Summary: A library for creating GraphQL APIs
5
5
  Home-page: https://strawberry.rocks/
6
6
  License: MIT
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
  name = "strawberry-graphql"
3
3
  packages = [ { include = "strawberry" } ]
4
- version = "0.229.2.dev.1715881453"
4
+ version = "0.230.0.dev.1716318708"
5
5
  description = "A library for creating GraphQL APIs"
6
6
  authors = ["Patrick Arminio <patrick.arminio@gmail.com>"]
7
7
  license = "MIT"
@@ -31,6 +31,7 @@ def _impl_type(
31
31
  *,
32
32
  name: Optional[str] = None,
33
33
  description: Optional[str] = None,
34
+ one_of: Optional[bool] = None,
34
35
  directives: Iterable[object] = (),
35
36
  authenticated: bool = False,
36
37
  keys: Iterable[Union["Key", str]] = (),
@@ -54,6 +55,7 @@ def _impl_type(
54
55
  Shareable,
55
56
  Tag,
56
57
  )
58
+ from strawberry.schema_directives import OneOf
57
59
 
58
60
  directives = list(directives)
59
61
 
@@ -83,6 +85,9 @@ def _impl_type(
83
85
  if is_interface_object:
84
86
  directives.append(InterfaceObject())
85
87
 
88
+ if one_of:
89
+ directives.append(OneOf())
90
+
86
91
  return base_type( # type: ignore
87
92
  cls,
88
93
  name=name,
@@ -180,6 +185,7 @@ def input(
180
185
  cls: T,
181
186
  *,
182
187
  name: Optional[str] = None,
188
+ one_of: Optional[bool] = None,
183
189
  description: Optional[str] = None,
184
190
  directives: Sequence[object] = (),
185
191
  inaccessible: bool = UNSET,
@@ -197,6 +203,7 @@ def input(
197
203
  *,
198
204
  name: Optional[str] = None,
199
205
  description: Optional[str] = None,
206
+ one_of: Optional[bool] = None,
200
207
  directives: Sequence[object] = (),
201
208
  inaccessible: bool = UNSET,
202
209
  tags: Iterable[str] = (),
@@ -207,6 +214,7 @@ def input(
207
214
  cls: Optional[T] = None,
208
215
  *,
209
216
  name: Optional[str] = None,
217
+ one_of: Optional[bool] = None,
210
218
  description: Optional[str] = None,
211
219
  directives: Sequence[object] = (),
212
220
  inaccessible: bool = UNSET,
@@ -219,6 +227,7 @@ def input(
219
227
  directives=directives,
220
228
  inaccessible=inaccessible,
221
229
  is_input=True,
230
+ one_of=one_of,
222
231
  tags=tags,
223
232
  )
224
233
 
@@ -293,6 +293,7 @@ def input(
293
293
  cls: T,
294
294
  *,
295
295
  name: Optional[str] = None,
296
+ one_of: Optional[bool] = None,
296
297
  description: Optional[str] = None,
297
298
  directives: Optional[Sequence[object]] = (),
298
299
  ) -> T: ...
@@ -305,6 +306,7 @@ def input(
305
306
  def input(
306
307
  *,
307
308
  name: Optional[str] = None,
309
+ one_of: Optional[bool] = None,
308
310
  description: Optional[str] = None,
309
311
  directives: Optional[Sequence[object]] = (),
310
312
  ) -> Callable[[T], T]: ...
@@ -314,6 +316,7 @@ def input(
314
316
  cls: Optional[T] = None,
315
317
  *,
316
318
  name: Optional[str] = None,
319
+ one_of: Optional[bool] = None,
317
320
  description: Optional[str] = None,
318
321
  directives: Optional[Sequence[object]] = (),
319
322
  ):
@@ -324,6 +327,11 @@ def input(
324
327
  >>> field_abc: str = "ABC"
325
328
  """
326
329
 
330
+ from strawberry.schema_directives import OneOf
331
+
332
+ if one_of:
333
+ directives = (*(directives or ()), OneOf())
334
+
327
335
  return type( # type: ignore # not sure why mypy complains here
328
336
  cls,
329
337
  name=name,
@@ -0,0 +1,187 @@
1
+ from __future__ import annotations
2
+
3
+ import abc
4
+ import inspect
5
+ from functools import cached_property
6
+ from inspect import iscoroutinefunction
7
+ from typing import (
8
+ TYPE_CHECKING,
9
+ Any,
10
+ Awaitable,
11
+ Dict,
12
+ List,
13
+ Optional,
14
+ Type,
15
+ Union,
16
+ )
17
+
18
+ from strawberry.exceptions import StrawberryGraphQLError
19
+ from strawberry.exceptions.permission_fail_silently_requires_optional import (
20
+ PermissionFailSilentlyRequiresOptionalError,
21
+ )
22
+ from strawberry.extensions import FieldExtension
23
+ from strawberry.schema_directive import Location, StrawberrySchemaDirective
24
+ from strawberry.type import StrawberryList, StrawberryOptional
25
+ from strawberry.utils.await_maybe import await_maybe
26
+
27
+ if TYPE_CHECKING:
28
+ from graphql import GraphQLError, GraphQLErrorExtensions
29
+
30
+ from strawberry.extensions.field_extension import (
31
+ AsyncExtensionResolver,
32
+ SyncExtensionResolver,
33
+ )
34
+ from strawberry.field import StrawberryField
35
+ from strawberry.types import Info
36
+
37
+
38
+ class BasePermission(abc.ABC):
39
+ """
40
+ Base class for creating permissions
41
+ """
42
+
43
+ message: Optional[str] = None
44
+
45
+ error_extensions: Optional[GraphQLErrorExtensions] = None
46
+
47
+ error_class: Type[GraphQLError] = StrawberryGraphQLError
48
+
49
+ _schema_directive: Optional[object] = None
50
+
51
+ @abc.abstractmethod
52
+ def has_permission(
53
+ self, source: Any, info: Info, **kwargs: Any
54
+ ) -> Union[bool, Awaitable[bool]]:
55
+ raise NotImplementedError(
56
+ "Permission classes should override has_permission method"
57
+ )
58
+
59
+ def on_unauthorized(self) -> None:
60
+ """
61
+ Default error raising for permissions.
62
+ This can be overridden to customize the behavior.
63
+ """
64
+
65
+ # Instantiate error class
66
+ error = self.error_class(self.message or "")
67
+
68
+ if self.error_extensions:
69
+ # Add our extensions to the error
70
+ if not error.extensions:
71
+ error.extensions = dict()
72
+ error.extensions.update(self.error_extensions)
73
+
74
+ raise error
75
+
76
+ @property
77
+ def schema_directive(self) -> object:
78
+ if not self._schema_directive:
79
+
80
+ class AutoDirective:
81
+ __strawberry_directive__ = StrawberrySchemaDirective(
82
+ self.__class__.__name__,
83
+ self.__class__.__name__,
84
+ [Location.FIELD_DEFINITION],
85
+ [],
86
+ )
87
+
88
+ self._schema_directive = AutoDirective()
89
+
90
+ return self._schema_directive
91
+
92
+
93
+ class PermissionExtension(FieldExtension):
94
+ """
95
+ Handles permissions for a field
96
+ Instantiate this as a field extension with all of the permissions you want to apply
97
+
98
+ fail_silently: bool = False will return None or [] if the permission fails
99
+ instead of raising an exception. This is only valid for optional or list fields.
100
+
101
+ NOTE:
102
+ Currently, this is automatically added to the field, when using
103
+ field.permission_classes
104
+ This is deprecated behavior, please manually add the extension to field.extensions
105
+ """
106
+
107
+ def __init__(
108
+ self,
109
+ permissions: List[BasePermission],
110
+ use_directives: bool = True,
111
+ fail_silently: bool = False,
112
+ ) -> None:
113
+ self.permissions = permissions
114
+ self.fail_silently = fail_silently
115
+ self.return_empty_list = False
116
+ self.use_directives = use_directives
117
+
118
+ def apply(self, field: StrawberryField) -> None:
119
+ """
120
+ Applies all of the permission directives to the schema
121
+ and sets up silent permissions
122
+ """
123
+ if self.use_directives:
124
+ field.directives.extend(
125
+ p.schema_directive for p in self.permissions if p.schema_directive
126
+ )
127
+ # We can only fail silently if the field is optional or a list
128
+ if self.fail_silently:
129
+ if isinstance(field.type, StrawberryOptional):
130
+ if isinstance(field.type.of_type, StrawberryList):
131
+ self.return_empty_list = True
132
+ elif isinstance(field.type, StrawberryList):
133
+ self.return_empty_list = True
134
+ else:
135
+ errror = PermissionFailSilentlyRequiresOptionalError(field)
136
+ raise errror
137
+
138
+ def _on_unauthorized(self, permission: BasePermission) -> Any:
139
+ if self.fail_silently:
140
+ return [] if self.return_empty_list else None
141
+ return permission.on_unauthorized()
142
+
143
+ def resolve(
144
+ self,
145
+ next_: SyncExtensionResolver,
146
+ source: Any,
147
+ info: Info,
148
+ **kwargs: Dict[str, Any],
149
+ ) -> Any:
150
+ """
151
+ Checks if the permission should be accepted and
152
+ raises an exception if not
153
+ """
154
+ for permission in self.permissions:
155
+ if not permission.has_permission(source, info, **kwargs):
156
+ return self._on_unauthorized(permission)
157
+ return next_(source, info, **kwargs)
158
+
159
+ async def resolve_async(
160
+ self,
161
+ next_: AsyncExtensionResolver,
162
+ source: Any,
163
+ info: Info,
164
+ **kwargs: Dict[str, Any],
165
+ ) -> Any:
166
+ for permission in self.permissions:
167
+ has_permission = await await_maybe(
168
+ permission.has_permission(source, info, **kwargs)
169
+ )
170
+
171
+ if not has_permission:
172
+ return self._on_unauthorized(permission)
173
+ next = next_(source, info, **kwargs)
174
+ if inspect.isasyncgen(next):
175
+ return next
176
+ return await next
177
+
178
+ @cached_property
179
+ def supports_sync(self) -> bool:
180
+ """The Permission extension always supports async checking using await_maybe,
181
+ but only supports sync checking if there are no async permissions"""
182
+ async_permissions = [
183
+ True
184
+ for permission in self.permissions
185
+ if iscoroutinefunction(permission.has_permission)
186
+ ]
187
+ return len(async_permissions) == 0
@@ -23,6 +23,7 @@ from graphql.validation import validate
23
23
 
24
24
  from strawberry.exceptions import MissingQueryError
25
25
  from strawberry.extensions.runner import SchemaExtensionsRunner
26
+ from strawberry.schema.validation_rules.one_of import OneOfInputValidationRule
26
27
  from strawberry.types import ExecutionResult
27
28
 
28
29
  from .exceptions import InvalidOperationTypeError
@@ -55,6 +56,10 @@ def validate_document(
55
56
  document: DocumentNode,
56
57
  validation_rules: Tuple[Type[ASTValidationRule], ...],
57
58
  ) -> List[GraphQLError]:
59
+ validation_rules = (
60
+ *validation_rules,
61
+ OneOfInputValidationRule,
62
+ )
58
63
  return validate(
59
64
  schema,
60
65
  document,
@@ -16,6 +16,8 @@ from typing import (
16
16
  )
17
17
 
18
18
  from graphql import (
19
+ GraphQLBoolean,
20
+ GraphQLField,
19
21
  GraphQLNamedType,
20
22
  GraphQLNonNull,
21
23
  GraphQLSchema,
@@ -168,6 +170,7 @@ class Schema(BaseSchema):
168
170
 
169
171
  self._warn_for_federation_directives()
170
172
  self._resolve_node_ids()
173
+ self._extend_introspection()
171
174
 
172
175
  # Validate schema early because we want developers to know about
173
176
  # possible issues as soon as possible
@@ -375,6 +378,14 @@ class Schema(BaseSchema):
375
378
  stacklevel=3,
376
379
  )
377
380
 
381
+ def _extend_introspection(self):
382
+ def _resolve_is_one_of(obj: Any, info: Any) -> bool:
383
+ return obj.extensions["strawberry-definition"].is_one_of
384
+
385
+ instrospection_type = self._schema.type_map["__Type"]
386
+ instrospection_type.fields["isOneOf"] = GraphQLField(GraphQLBoolean) # type: ignore[attr-defined]
387
+ instrospection_type.fields["isOneOf"].resolve = _resolve_is_one_of # type: ignore[attr-defined]
388
+
378
389
  def as_str(self) -> str:
379
390
  return print_schema(self)
380
391
 
@@ -26,6 +26,7 @@ from graphql import (
26
26
  GraphQLDirective,
27
27
  GraphQLEnumType,
28
28
  GraphQLEnumValue,
29
+ GraphQLError,
29
30
  GraphQLField,
30
31
  GraphQLInputField,
31
32
  GraphQLInputObjectType,
@@ -411,6 +412,27 @@ class GraphQLCoreConverter:
411
412
  assert isinstance(graphql_object_type, GraphQLInputObjectType) # For mypy
412
413
  return graphql_object_type
413
414
 
415
+ def check_one_of(value: dict[str, Any]) -> dict[str, Any]:
416
+ if len(value) != 1:
417
+ raise GraphQLError(
418
+ f"OneOf Input Object '{type_name}' must specify exactly one key."
419
+ )
420
+
421
+ first_key, first_value = next(iter(value.items()))
422
+
423
+ if first_value is None or first_value is UNSET:
424
+ raise GraphQLError(
425
+ f"Value for member field '{first_key}' must be non-null"
426
+ )
427
+
428
+ return value
429
+
430
+ out_type = (
431
+ check_one_of
432
+ if type_definition.is_input and type_definition.is_one_of
433
+ else None
434
+ )
435
+
414
436
  graphql_object_type = GraphQLInputObjectType(
415
437
  name=type_name,
416
438
  fields=lambda: self.get_graphql_input_fields(type_definition),
@@ -418,6 +440,7 @@ class GraphQLCoreConverter:
418
440
  extensions={
419
441
  GraphQLCoreConverter.DEFINITION_BACKREF: type_definition,
420
442
  },
443
+ out_type=out_type,
421
444
  )
422
445
 
423
446
  self.type_map[type_name] = ConcreteType(
@@ -0,0 +1,80 @@
1
+ from typing import Any
2
+
3
+ from graphql import (
4
+ ExecutableDefinitionNode,
5
+ GraphQLError,
6
+ GraphQLNamedType,
7
+ ObjectValueNode,
8
+ ValidationContext,
9
+ ValidationRule,
10
+ VariableDefinitionNode,
11
+ get_named_type,
12
+ )
13
+
14
+
15
+ class OneOfInputValidationRule(ValidationRule):
16
+ def __init__(self, validation_context: ValidationContext) -> None:
17
+ super().__init__(validation_context)
18
+
19
+ def enter_operation_definition(
20
+ self, node: ExecutableDefinitionNode, *_args: Any
21
+ ) -> None:
22
+ self.variable_definitions: dict[str, VariableDefinitionNode] = {}
23
+
24
+ def enter_variable_definition(
25
+ self, node: VariableDefinitionNode, *_args: Any
26
+ ) -> None:
27
+ self.variable_definitions[node.variable.name.value] = node
28
+
29
+ def enter_object_value(self, node: ObjectValueNode, *_args: Any) -> None:
30
+ type_ = get_named_type(self.context.get_input_type())
31
+
32
+ if not type_:
33
+ return
34
+
35
+ strawberry_type = type_.extensions.get("strawberry-definition")
36
+
37
+ if strawberry_type and strawberry_type.is_one_of:
38
+ self.validate_one_of(node, type_)
39
+
40
+ def validate_one_of(self, node: ObjectValueNode, type: GraphQLNamedType) -> None:
41
+ field_node_map = {field.name.value: field for field in node.fields}
42
+ keys = list(field_node_map.keys())
43
+ is_not_exactly_one_field = len(keys) != 1
44
+
45
+ if is_not_exactly_one_field:
46
+ self.report_error(
47
+ GraphQLError(
48
+ f"OneOf Input Object '{type.name}' must specify exactly one key.",
49
+ nodes=[node],
50
+ )
51
+ )
52
+
53
+ return
54
+
55
+ value = field_node_map[keys[0]].value
56
+ is_null_literal = not value or value.kind == "null_value"
57
+ is_variable = value.kind == "variable"
58
+
59
+ if is_null_literal:
60
+ self.report_error(
61
+ GraphQLError(
62
+ f"Field '{type.name}.{keys[0]}' must be non-null.",
63
+ nodes=[node],
64
+ )
65
+ )
66
+
67
+ return
68
+
69
+ if is_variable:
70
+ variable_name = value.name.value # type: ignore
71
+ definition = self.variable_definitions[variable_name]
72
+ is_nullable_variable = definition.type.kind != "non_null_type"
73
+
74
+ if is_nullable_variable:
75
+ self.report_error(
76
+ GraphQLError(
77
+ f"Variable '{variable_name}' must be non-nullable to be used for OneOf Input Object '{type.name}'.",
78
+ nodes=[node],
79
+ )
80
+ )
@@ -0,0 +1,8 @@
1
+ from strawberry.schema_directive import Location, schema_directive
2
+
3
+
4
+ @schema_directive(locations=[Location.INPUT_OBJECT], name="oneOf")
5
+ class OneOf: ...
6
+
7
+
8
+ __all__ = ["OneOf"]
@@ -37,6 +37,10 @@ class StrawberryType(ABC):
37
37
  def type_params(self) -> List[TypeVar]:
38
38
  return []
39
39
 
40
+ @property
41
+ def is_one_of(self) -> bool:
42
+ return False
43
+
40
44
  @abstractmethod
41
45
  def copy_with(
42
46
  self,
@@ -225,6 +225,15 @@ class StrawberryObjectDefinition(StrawberryType):
225
225
  # All field mappings succeeded. This is a match
226
226
  return True
227
227
 
228
+ @property
229
+ def is_one_of(self) -> bool:
230
+ from strawberry.schema_directives import OneOf
231
+
232
+ if not self.is_input or not self.directives:
233
+ return False
234
+
235
+ return any(isinstance(directive, OneOf) for directive in self.directives)
236
+
228
237
 
229
238
  # TODO: remove when deprecating _type_definition
230
239
  if TYPE_CHECKING: