strawberry-graphql 0.229.2__tar.gz → 0.229.2.dev1715881453__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 (248) hide show
  1. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/PKG-INFO +1 -1
  2. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/pyproject.toml +1 -1
  3. strawberry_graphql-0.229.2.dev1715881453/strawberry/permission.py +343 -0
  4. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/typing.py +1 -1
  5. strawberry_graphql-0.229.2/strawberry/permission.py +0 -187
  6. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/LICENSE +0 -0
  7. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/README.md +0 -0
  8. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/__init__.py +0 -0
  9. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/__main__.py +0 -0
  10. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/aiohttp/__init__.py +0 -0
  11. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/aiohttp/handlers/__init__.py +0 -0
  12. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/aiohttp/handlers/graphql_transport_ws_handler.py +0 -0
  13. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/aiohttp/handlers/graphql_ws_handler.py +0 -0
  14. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/aiohttp/test/__init__.py +0 -0
  15. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/aiohttp/test/client.py +0 -0
  16. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/aiohttp/views.py +0 -0
  17. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/annotation.py +0 -0
  18. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/arguments.py +0 -0
  19. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/asgi/__init__.py +0 -0
  20. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/asgi/handlers/__init__.py +0 -0
  21. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/asgi/handlers/graphql_transport_ws_handler.py +0 -0
  22. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/asgi/handlers/graphql_ws_handler.py +0 -0
  23. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/asgi/test/__init__.py +0 -0
  24. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/asgi/test/client.py +0 -0
  25. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/auto.py +0 -0
  26. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/chalice/__init__.py +0 -0
  27. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/chalice/views.py +0 -0
  28. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/__init__.py +0 -0
  29. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/handlers/base.py +0 -0
  30. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/handlers/graphql_transport_ws_handler.py +0 -0
  31. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/handlers/graphql_ws_handler.py +0 -0
  32. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/handlers/http_handler.py +0 -0
  33. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/handlers/ws_handler.py +0 -0
  34. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/router.py +0 -0
  35. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/channels/testing.py +0 -0
  36. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/__init__.py +0 -0
  37. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/app.py +0 -0
  38. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/__init__.py +0 -0
  39. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/codegen.py +0 -0
  40. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/export_schema.py +0 -0
  41. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/schema_codegen.py +0 -0
  42. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/server.py +0 -0
  43. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/upgrade/__init__.py +0 -0
  44. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/upgrade/_fake_progress.py +0 -0
  45. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/commands/upgrade/_run_codemod.py +0 -0
  46. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/constants.py +0 -0
  47. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/debug_server.py +0 -0
  48. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/utils/__init__.py +0 -0
  49. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/cli/utils/load_schema.py +0 -0
  50. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/__init__.py +0 -0
  51. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/exceptions.py +0 -0
  52. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/plugins/__init__.py +0 -0
  53. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/plugins/print_operation.py +0 -0
  54. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/plugins/python.py +0 -0
  55. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/plugins/typescript.py +0 -0
  56. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/query_codegen.py +0 -0
  57. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codegen/types.py +0 -0
  58. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codemods/__init__.py +0 -0
  59. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/codemods/annotated_unions.py +0 -0
  60. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/custom_scalar.py +0 -0
  61. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/dataloader.py +0 -0
  62. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/directive.py +0 -0
  63. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/django/__init__.py +0 -0
  64. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/django/apps.py +0 -0
  65. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/django/context.py +0 -0
  66. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/django/test/__init__.py +0 -0
  67. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/django/test/client.py +0 -0
  68. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/django/views.py +0 -0
  69. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/enum.py +0 -0
  70. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/__init__.py +0 -0
  71. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/conflicting_arguments.py +0 -0
  72. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/duplicated_type_name.py +0 -0
  73. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/exception.py +0 -0
  74. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/exception_source.py +0 -0
  75. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/handler.py +0 -0
  76. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/invalid_argument_type.py +0 -0
  77. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/invalid_union_type.py +0 -0
  78. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/missing_arguments_annotations.py +0 -0
  79. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/missing_field_annotation.py +0 -0
  80. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/missing_return_annotation.py +0 -0
  81. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/not_a_strawberry_enum.py +0 -0
  82. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/object_is_not_a_class.py +0 -0
  83. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/object_is_not_an_enum.py +0 -0
  84. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/permission_fail_silently_requires_optional.py +0 -0
  85. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/private_strawberry_field.py +0 -0
  86. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/scalar_already_registered.py +0 -0
  87. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/syntax.py +0 -0
  88. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/unresolved_field_type.py +0 -0
  89. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/utils/__init__.py +0 -0
  90. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/exceptions/utils/source_finder.py +0 -0
  91. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/__init__.py +0 -0
  92. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/__init__.py +0 -0
  93. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/_compat.py +0 -0
  94. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/conversion.py +0 -0
  95. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/conversion_types.py +0 -0
  96. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/error_type.py +0 -0
  97. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/exceptions.py +0 -0
  98. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/fields.py +0 -0
  99. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/object_type.py +0 -0
  100. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/experimental/pydantic/utils.py +0 -0
  101. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/ext/LICENSE +0 -0
  102. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/ext/__init__.py +0 -0
  103. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/ext/dataclasses/LICENSE +0 -0
  104. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/ext/dataclasses/__init__.py +0 -0
  105. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/ext/dataclasses/dataclasses.py +0 -0
  106. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/ext/mypy_plugin.py +0 -0
  107. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/__init__.py +0 -0
  108. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/add_validation_rules.py +0 -0
  109. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/base_extension.py +0 -0
  110. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/context.py +0 -0
  111. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/directives.py +0 -0
  112. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/disable_validation.py +0 -0
  113. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/field_extension.py +0 -0
  114. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/mask_errors.py +0 -0
  115. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/max_aliases.py +0 -0
  116. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/max_tokens.py +0 -0
  117. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/parser_cache.py +0 -0
  118. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/pyinstrument.py +0 -0
  119. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/query_depth_limiter.py +0 -0
  120. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/runner.py +0 -0
  121. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/tracing/__init__.py +0 -0
  122. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/tracing/apollo.py +0 -0
  123. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/tracing/datadog.py +0 -0
  124. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/tracing/opentelemetry.py +0 -0
  125. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/tracing/sentry.py +0 -0
  126. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/tracing/utils.py +0 -0
  127. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/utils.py +0 -0
  128. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/extensions/validation_cache.py +0 -0
  129. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/fastapi/__init__.py +0 -0
  130. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/fastapi/context.py +0 -0
  131. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/fastapi/handlers/__init__.py +0 -0
  132. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/fastapi/handlers/graphql_transport_ws_handler.py +0 -0
  133. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/fastapi/handlers/graphql_ws_handler.py +0 -0
  134. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/fastapi/router.py +0 -0
  135. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/__init__.py +0 -0
  136. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/argument.py +0 -0
  137. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/enum.py +0 -0
  138. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/field.py +0 -0
  139. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/mutation.py +0 -0
  140. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/object_type.py +0 -0
  141. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/scalar.py +0 -0
  142. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/schema.py +0 -0
  143. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/schema_directive.py +0 -0
  144. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/schema_directives.py +0 -0
  145. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/types.py +0 -0
  146. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/federation/union.py +0 -0
  147. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/field.py +0 -0
  148. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/field_extensions/__init__.py +0 -0
  149. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/field_extensions/input_mutation.py +0 -0
  150. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/file_uploads/__init__.py +0 -0
  151. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/file_uploads/scalars.py +0 -0
  152. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/file_uploads/utils.py +0 -0
  153. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/flask/__init__.py +0 -0
  154. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/flask/views.py +0 -0
  155. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/__init__.py +0 -0
  156. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/async_base_view.py +0 -0
  157. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/base.py +0 -0
  158. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/exceptions.py +0 -0
  159. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/ides.py +0 -0
  160. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/sync_base_view.py +0 -0
  161. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/temporal_response.py +0 -0
  162. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/types.py +0 -0
  163. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/http/typevars.py +0 -0
  164. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/lazy_type.py +0 -0
  165. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/litestar/__init__.py +0 -0
  166. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/litestar/controller.py +0 -0
  167. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/litestar/handlers/graphql_transport_ws_handler.py +0 -0
  168. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/litestar/handlers/graphql_ws_handler.py +0 -0
  169. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/mutation.py +0 -0
  170. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/object_type.py +0 -0
  171. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/parent.py +0 -0
  172. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/printer/__init__.py +0 -0
  173. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/printer/ast_from_value.py +0 -0
  174. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/printer/printer.py +0 -0
  175. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/private.py +0 -0
  176. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/py.typed +0 -0
  177. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/quart/__init__.py +0 -0
  178. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/quart/views.py +0 -0
  179. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/relay/__init__.py +0 -0
  180. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/relay/exceptions.py +0 -0
  181. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/relay/fields.py +0 -0
  182. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/relay/types.py +0 -0
  183. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/relay/utils.py +0 -0
  184. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/resolvers.py +0 -0
  185. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/sanic/__init__.py +0 -0
  186. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/sanic/context.py +0 -0
  187. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/sanic/utils.py +0 -0
  188. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/sanic/views.py +0 -0
  189. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/scalars.py +0 -0
  190. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/__init__.py +0 -0
  191. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/base.py +0 -0
  192. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/compat.py +0 -0
  193. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/config.py +0 -0
  194. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/exceptions.py +0 -0
  195. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/execute.py +0 -0
  196. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/name_converter.py +0 -0
  197. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/schema.py +0 -0
  198. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/schema_converter.py +0 -0
  199. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/types/__init__.py +0 -0
  200. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/types/base_scalars.py +0 -0
  201. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/types/concrete_type.py +0 -0
  202. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema/types/scalar.py +0 -0
  203. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema_codegen/__init__.py +0 -0
  204. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/schema_directive.py +0 -0
  205. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/starlite/__init__.py +0 -0
  206. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/starlite/controller.py +0 -0
  207. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/starlite/handlers/graphql_transport_ws_handler.py +0 -0
  208. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/starlite/handlers/graphql_ws_handler.py +0 -0
  209. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/static/apollo-sandbox.html +0 -0
  210. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/static/graphiql.html +0 -0
  211. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/static/pathfinder.html +0 -0
  212. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/__init__.py +0 -0
  213. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/protocols/__init__.py +0 -0
  214. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/protocols/graphql_transport_ws/__init__.py +0 -0
  215. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/protocols/graphql_transport_ws/handlers.py +0 -0
  216. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/protocols/graphql_transport_ws/types.py +0 -0
  217. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/protocols/graphql_ws/__init__.py +0 -0
  218. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/protocols/graphql_ws/handlers.py +0 -0
  219. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/subscriptions/protocols/graphql_ws/types.py +0 -0
  220. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/test/__init__.py +0 -0
  221. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/test/client.py +0 -0
  222. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/tools/__init__.py +0 -0
  223. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/tools/create_type.py +0 -0
  224. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/tools/merge_types.py +0 -0
  225. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/type.py +0 -0
  226. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/__init__.py +0 -0
  227. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/execution.py +0 -0
  228. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/fields/__init__.py +0 -0
  229. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/fields/resolver.py +0 -0
  230. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/graphql.py +0 -0
  231. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/info.py +0 -0
  232. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/nodes.py +0 -0
  233. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/type_resolver.py +0 -0
  234. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/types/types.py +0 -0
  235. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/union.py +0 -0
  236. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/unset.py +0 -0
  237. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/__init__.py +0 -0
  238. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/aio.py +0 -0
  239. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/await_maybe.py +0 -0
  240. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/dataclasses.py +0 -0
  241. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/debug.py +0 -0
  242. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/deprecations.py +0 -0
  243. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/graphql_lexer.py +0 -0
  244. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/importer.py +0 -0
  245. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/inspect.py +0 -0
  246. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/logging.py +0 -0
  247. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/operation.py +0 -0
  248. {strawberry_graphql-0.229.2 → strawberry_graphql-0.229.2.dev1715881453}/strawberry/utils/str_converters.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: strawberry-graphql
3
- Version: 0.229.2
3
+ Version: 0.229.2.dev1715881453
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"
4
+ version = "0.229.2.dev.1715881453"
5
5
  description = "A library for creating GraphQL APIs"
6
6
  authors = ["Patrick Arminio <patrick.arminio@gmail.com>"]
7
7
  license = "MIT"
@@ -0,0 +1,343 @@
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
+ List,
12
+ Literal,
13
+ Optional,
14
+ Tuple,
15
+ Type,
16
+ TypedDict,
17
+ Union,
18
+ )
19
+ from typing_extensions import deprecated
20
+
21
+ from strawberry.exceptions import StrawberryGraphQLError
22
+ from strawberry.exceptions.permission_fail_silently_requires_optional import (
23
+ PermissionFailSilentlyRequiresOptionalError,
24
+ )
25
+ from strawberry.extensions import FieldExtension
26
+ from strawberry.schema_directive import Location, StrawberrySchemaDirective
27
+ from strawberry.type import StrawberryList, StrawberryOptional
28
+ from strawberry.utils.await_maybe import await_maybe
29
+
30
+ if TYPE_CHECKING:
31
+ from graphql import GraphQLError, GraphQLErrorExtensions
32
+
33
+ from strawberry.extensions.field_extension import (
34
+ AsyncExtensionResolver,
35
+ SyncExtensionResolver,
36
+ )
37
+ from strawberry.field import StrawberryField
38
+ from strawberry.types import Info
39
+
40
+
41
+ def unpack_maybe(
42
+ value: Union[object, Tuple[bool, object]], default: object = None
43
+ ) -> Tuple[object, object]:
44
+ if isinstance(value, tuple) and len(value) == 2:
45
+ return value
46
+ else:
47
+ return value, default
48
+
49
+
50
+ class BasePermission(abc.ABC):
51
+ """
52
+ Base class for creating permissions
53
+ """
54
+
55
+ message: Optional[str] = None
56
+
57
+ error_extensions: Optional[GraphQLErrorExtensions] = None
58
+
59
+ error_class: Type[GraphQLError] = StrawberryGraphQLError
60
+
61
+ _schema_directive: Optional[object] = None
62
+
63
+ @abc.abstractmethod
64
+ def has_permission(
65
+ self, source: Any, info: Info, **kwargs: object
66
+ ) -> Union[
67
+ bool,
68
+ Awaitable[bool],
69
+ Tuple[Literal[False], dict],
70
+ Awaitable[Tuple[Literal[False], dict]],
71
+ ]:
72
+ """
73
+ This method is a required override in the permission class. It checks if the user has the necessary permissions to access a specific field.
74
+
75
+ The method should return a boolean value:
76
+ - True: The user has the necessary permissions.
77
+ - False: The user does not have the necessary permissions. In this case, the `on_unauthorized` method will be invoked.
78
+
79
+ Avoid raising exceptions in this method. Instead, use the `on_unauthorized` method to handle errors and customize the error response.
80
+
81
+ If there's a need to pass additional information to the `on_unauthorized` method, return a tuple. The first element should be False, and the second element should be a dictionary containing the additional information.
82
+
83
+ Args:
84
+ source (Any): The source field that the permission check is being performed on.
85
+ info (Info): The GraphQL resolve info associated with the field.
86
+ **kwargs (Any): Additional arguments that are typically passed to the field resolver.
87
+
88
+ Returns:
89
+ bool or tuple: Returns True if the user has the necessary permissions. Returns False or a tuple (False, additional_info) if the user does not have the necessary permissions. In the latter case, the `on_unauthorized` method will be invoked.
90
+ """
91
+ raise NotImplementedError(
92
+ "Permission classes should override has_permission method"
93
+ )
94
+
95
+ def on_unauthorized(self, **kwargs: object) -> None:
96
+ """
97
+ Default error raising for permissions.
98
+ This can be overridden to customize the behavior.
99
+ """
100
+ # Instantiate error class
101
+ error = self.error_class(self.message or "")
102
+
103
+ if self.error_extensions:
104
+ # Add our extensions to the error
105
+ if not error.extensions:
106
+ error.extensions = dict()
107
+ error.extensions.update(self.error_extensions)
108
+
109
+ raise error
110
+
111
+ @property
112
+ @deprecated(
113
+ "@schema_directive is deprecated and will be disabled by default on 31.12.2024 with future removal planned. Use the new @permissions directive instead."
114
+ )
115
+ def schema_directive(self) -> object:
116
+ if not self._schema_directive:
117
+
118
+ class AutoDirective:
119
+ __strawberry_directive__ = StrawberrySchemaDirective(
120
+ self.__class__.__name__,
121
+ self.__class__.__name__,
122
+ [Location.FIELD_DEFINITION],
123
+ [],
124
+ )
125
+
126
+ self._schema_directive = AutoDirective()
127
+
128
+ return self._schema_directive
129
+
130
+ @cached_property
131
+ def is_async(self) -> bool:
132
+ return iscoroutinefunction(self.has_permission)
133
+
134
+ def __and__(self, other: BasePermission):
135
+ return AndPermission([self, other])
136
+
137
+ def __or__(self, other: BasePermission):
138
+ return OrPermission([self, other])
139
+
140
+
141
+ class CompositePermissionContext(TypedDict):
142
+ failed_permissions: List[Tuple[BasePermission, dict]]
143
+
144
+
145
+ class CompositePermission(BasePermission, abc.ABC):
146
+ def __init__(self, child_permissions: List[BasePermission]):
147
+ self.child_permissions = child_permissions
148
+
149
+ def on_unauthorized(self, **kwargs: object) -> Any:
150
+ failed_permissions = kwargs.get("failed_permissions", [])
151
+ for permission, context in failed_permissions:
152
+ permission.on_unauthorized(**context)
153
+
154
+ @cached_property
155
+ def is_async(self) -> bool:
156
+ return any(x.is_async for x in self.child_permissions)
157
+
158
+
159
+ class AndPermission(CompositePermission):
160
+ def has_permission(
161
+ self, source: Any, info: Info, **kwargs: object
162
+ ) -> Union[
163
+ bool,
164
+ Awaitable[bool],
165
+ Tuple[Literal[False], CompositePermissionContext],
166
+ Awaitable[Tuple[Literal[False], CompositePermissionContext]],
167
+ ]:
168
+ if self.is_async:
169
+ return self._has_permission_async(source, info, **kwargs)
170
+
171
+ for permission in self.child_permissions:
172
+ has_permission, context = unpack_maybe(
173
+ permission.has_permission(source, info, **kwargs), {}
174
+ )
175
+ if not has_permission:
176
+ return False, {"failed_permissions": [(permission, context)]}
177
+ return True
178
+
179
+ async def _has_permission_async(
180
+ self, source: Any, info: Info, **kwargs: object
181
+ ) -> Union[bool, Tuple[Literal[False], CompositePermissionContext]]:
182
+ for permission in self.child_permissions:
183
+ permission_response = await await_maybe(
184
+ permission.has_permission(source, info, **kwargs)
185
+ )
186
+ has_permission, context = unpack_maybe(permission_response, {})
187
+ if not has_permission:
188
+ return False, {"failed_permissions": [(permission, context)]}
189
+ return True
190
+
191
+ def __and__(self, other: BasePermission):
192
+ return AndPermission([*self.child_permissions, other])
193
+
194
+
195
+ class OrPermission(CompositePermission):
196
+ def has_permission(
197
+ self, source: Any, info: Info, **kwargs: object
198
+ ) -> Union[
199
+ bool,
200
+ Awaitable[bool],
201
+ Tuple[Literal[False], dict],
202
+ Awaitable[Tuple[Literal[False], dict]],
203
+ ]:
204
+ if self.is_async:
205
+ return self._has_permission_async(source, info, **kwargs)
206
+ failed_permissions = []
207
+ for permission in self.child_permissions:
208
+ has_permission, context = unpack_maybe(
209
+ permission.has_permission(source, info, **kwargs), {}
210
+ )
211
+ if has_permission:
212
+ return True
213
+ failed_permissions.append((permission, context))
214
+
215
+ return False, {"failed_permissions": failed_permissions}
216
+
217
+ async def _has_permission_async(
218
+ self, source: Any, info: Info, **kwargs: object
219
+ ) -> Union[bool, Tuple[Literal[False], dict]]:
220
+ failed_permissions = []
221
+ for permission in self.child_permissions:
222
+ permission_response = await await_maybe(
223
+ permission.has_permission(source, info, **kwargs)
224
+ )
225
+ has_permission, context = unpack_maybe(permission_response, {})
226
+ if has_permission:
227
+ return True
228
+ failed_permissions.append((permission, context))
229
+
230
+ return False, {"failed_permissions": failed_permissions}
231
+
232
+ def __or__(self, other: BasePermission):
233
+ return OrPermission([*self.child_permissions, other])
234
+
235
+
236
+ class PermissionExtension(FieldExtension):
237
+ """
238
+ Handles permissions for a field
239
+ Instantiate this as a field extension with all of the permissions you want to apply
240
+
241
+ fail_silently: bool = False will return None or [] if the permission fails
242
+ instead of raising an exception. This is only valid for optional or list fields.
243
+
244
+ NOTE:
245
+ Currently, this is automatically added to the field, when using
246
+ field.permission_classes. You are free to use whichever method you prefer.
247
+ Use PermissionExtension if you want additional customization.
248
+ """
249
+
250
+ def __init__(
251
+ self,
252
+ permissions: List[BasePermission],
253
+ use_directives: bool = True,
254
+ fail_silently: bool = False,
255
+ ) -> None:
256
+ self.permissions = permissions
257
+ self.fail_silently = fail_silently
258
+ self.return_empty_list = False
259
+ self.use_directives = use_directives
260
+
261
+ def apply(self, field: StrawberryField) -> None:
262
+ """
263
+ Applies all the permission directives to the schema
264
+ and sets up silent permissions
265
+ """
266
+ if self.use_directives:
267
+ field.directives.extend(
268
+ [
269
+ p.schema_directive
270
+ for p in self.permissions
271
+ if not isinstance(p, CompositePermission)
272
+ ]
273
+ )
274
+ # We can only fail silently if the field is optional or a list
275
+ if self.fail_silently:
276
+ if isinstance(field.type, StrawberryOptional):
277
+ if isinstance(field.type.of_type, StrawberryList):
278
+ self.return_empty_list = True
279
+ elif isinstance(field.type, StrawberryList):
280
+ self.return_empty_list = True
281
+ else:
282
+ raise PermissionFailSilentlyRequiresOptionalError(field)
283
+
284
+ def _on_unauthorized(self, permission: BasePermission, **kwargs: object) -> Any:
285
+ if self.fail_silently:
286
+ return [] if self.return_empty_list else None
287
+
288
+ if kwargs in (None, {}):
289
+ return permission.on_unauthorized()
290
+ return permission.on_unauthorized(**kwargs)
291
+
292
+ def resolve(
293
+ self,
294
+ next_: SyncExtensionResolver,
295
+ source: Any,
296
+ info: Info,
297
+ **kwargs: object[str, Any],
298
+ ) -> Any:
299
+ """
300
+ Checks if the permission should be accepted and
301
+ raises an exception if not
302
+ """
303
+
304
+ for permission in self.permissions:
305
+ has_permission, context = unpack_maybe(
306
+ permission.has_permission(source, info, **kwargs), {}
307
+ )
308
+
309
+ if not has_permission:
310
+ return self._on_unauthorized(permission, **context)
311
+
312
+ return next_(source, info, **kwargs)
313
+
314
+ async def resolve_async(
315
+ self,
316
+ next_: AsyncExtensionResolver,
317
+ source: Any,
318
+ info: Info,
319
+ **kwargs: object[str, Any],
320
+ ) -> Any:
321
+ for permission in self.permissions:
322
+ permission_response = await await_maybe(
323
+ permission.has_permission(source, info, **kwargs)
324
+ )
325
+
326
+ context = {}
327
+ if isinstance(permission_response, tuple):
328
+ has_permission, context = permission_response
329
+ else:
330
+ has_permission = permission_response
331
+
332
+ if not has_permission:
333
+ return self._on_unauthorized(permission, **context)
334
+ next = next_(source, info, **kwargs)
335
+ if inspect.isasyncgen(next):
336
+ return next
337
+ return await next
338
+
339
+ @cached_property
340
+ def supports_sync(self) -> bool:
341
+ """The Permission extension always supports async checking using await_maybe,
342
+ but only supports sync checking if there are no async permissions"""
343
+ return all(not permission.is_async for permission in self.permissions)
@@ -302,7 +302,7 @@ def _get_namespace_from_ast(
302
302
  # here to resolve lazy types by execing the annotated args, resolving the
303
303
  # type directly and then adding it to extra namespace, so that _eval_type
304
304
  # can properly resolve it later
305
- type_name = args[0].strip(" '\"\n")
305
+ type_name = args[0].strip()
306
306
  for arg in args[1:]:
307
307
  evaled_arg = eval(arg, globalns, localns) # noqa: PGH001, S307
308
308
  if isinstance(evaled_arg, StrawberryLazyReference):
@@ -1,187 +0,0 @@
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