Astroport.ONE/venv/lib/python3.11/site-packages/graphql/validation/rules/custom/no_deprecated.py
2024-03-01 16:15:45 +01:00

102 lines
4.3 KiB
Python

from typing import Any, cast
from ....error import GraphQLError
from ....language import ArgumentNode, EnumValueNode, FieldNode, ObjectFieldNode
from ....type import GraphQLInputObjectType, get_named_type, is_input_object_type
from .. import ValidationRule
__all__ = ["NoDeprecatedCustomRule"]
class NoDeprecatedCustomRule(ValidationRule):
"""No deprecated
A GraphQL document is only valid if all selected fields and all used enum values
have not been deprecated.
Note: This rule is optional and is not part of the Validation section of the GraphQL
Specification. The main purpose of this rule is detection of deprecated usages and
not necessarily to forbid their use when querying a service.
"""
def enter_field(self, node: FieldNode, *_args: Any) -> None:
context = self.context
field_def = context.get_field_def()
if field_def:
deprecation_reason = field_def.deprecation_reason
if deprecation_reason is not None:
parent_type = context.get_parent_type()
parent_name = parent_type.name # type: ignore
self.report_error(
GraphQLError(
f"The field {parent_name}.{node.name.value}"
f" is deprecated. {deprecation_reason}",
node,
)
)
def enter_argument(self, node: ArgumentNode, *_args: Any) -> None:
context = self.context
arg_def = context.get_argument()
if arg_def:
deprecation_reason = arg_def.deprecation_reason
if deprecation_reason is not None:
directive_def = context.get_directive()
arg_name = node.name.value
if directive_def is None:
parent_type = context.get_parent_type()
parent_name = parent_type.name # type: ignore
field_def = context.get_field_def()
field_name = field_def.ast_node.name.value # type: ignore
self.report_error(
GraphQLError(
f"Field '{parent_name}.{field_name}' argument"
f" '{arg_name}' is deprecated. {deprecation_reason}",
node,
)
)
else:
self.report_error(
GraphQLError(
f"Directive '@{directive_def.name}' argument"
f" '{arg_name}' is deprecated. {deprecation_reason}",
node,
)
)
def enter_object_field(self, node: ObjectFieldNode, *_args: Any) -> None:
context = self.context
input_object_def = get_named_type(context.get_parent_input_type())
if is_input_object_type(input_object_def):
input_field_def = cast(GraphQLInputObjectType, input_object_def).fields.get(
node.name.value
)
if input_field_def:
deprecation_reason = input_field_def.deprecation_reason
if deprecation_reason is not None:
field_name = node.name.value
input_object_name = input_object_def.name # type: ignore
self.report_error(
GraphQLError(
f"The input field {input_object_name}.{field_name}"
f" is deprecated. {deprecation_reason}",
node,
)
)
def enter_enum_value(self, node: EnumValueNode, *_args: Any) -> None:
context = self.context
enum_value_def = context.get_enum_value()
if enum_value_def:
deprecation_reason = enum_value_def.deprecation_reason
if deprecation_reason is not None: # pragma: no cover else
enum_type_def = get_named_type(context.get_input_type())
enum_type_name = enum_type_def.name # type: ignore
self.report_error(
GraphQLError(
f"The enum value '{enum_type_name}.{node.value}'"
f" is deprecated. {deprecation_reason}",
node,
)
)