Skip to content

Commit

Permalink
refactor so we can add future versions more easily
Browse files Browse the repository at this point in the history
  • Loading branch information
nogates committed Feb 14, 2024
1 parent e86b43a commit 5756af1
Show file tree
Hide file tree
Showing 11 changed files with 114 additions and 31 deletions.
46 changes: 18 additions & 28 deletions ariadne/contrib/federation/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,37 +76,27 @@ def make_federated_schema(
r"(?<=@link).*?url:.*?\"(.*?)\".?[^)]+?", sdl, re.MULTILINE | re.DOTALL
) # use regex to parse if it's fed 1 or fed 2; adds dedicated typedefs per spec
dirname = os.path.dirname(__file__)
if link and link.group(1) == "https://specs.apollo.dev/federation/v2.0":
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed2_0.graphql")
)
elif link and link.group(1) == "https://specs.apollo.dev/federation/v2.1":
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed2_1.graphql")
)
elif link and link.group(1) == "https://specs.apollo.dev/federation/v2.2":
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed2_2.graphql")
)
elif link and link.group(1) == "https://specs.apollo.dev/federation/v2.3":
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed2_3.graphql")
)
elif link and link.group(1) == "https://specs.apollo.dev/federation/v2.4":
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed2_4.graphql")
)
elif link and link.group(1) == "https://specs.apollo.dev/federation/v2.5":
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed2_5.graphql")
)
elif link and link.group(1) == "https://specs.apollo.dev/federation/v2.6":
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed2_6.graphql")
definitions_folder = os.path.join(dirname, "definitions")
definition_files = os.listdir(definitions_folder)
definition_files.sort()
last_version_file = definition_files[-1]

if link:
# extract version
fed_version = link.group(1).split("/")[-1]
versioned_schema_file = os.path.join(
definitions_folder, f"fed_{fed_version}.graphql"
)

if os.path.isfile(versioned_schema_file):
definitions = load_schema_from_path(versioned_schema_file)
else:
definitions = load_schema_from_path(
os.path.join(definitions_folder, last_version_file)
)
else:
definitions = load_schema_from_path(
os.path.join(dirname, "./definitions/fed1_0.graphql")
os.path.join(dirname, "./definitions/fed_v1.0.graphql")
)

tdl.append(definitions)
Expand Down
1 change: 0 additions & 1 deletion ariadne/contrib/federation/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@
"authenticated", # Federation 2.5 directive.
"requiresScopes", # Federation 2.5 directive.
"policy", # Federation 2.6 directive.

]


Expand Down
98 changes: 96 additions & 2 deletions tests/federation/test_schema_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ def test_federated_schema_query_service_interface_object_federation_directive():
"""
)


def test_federation_2_4_version_is_detected_in_schema():
type_defs = """
extend schema
Expand Down Expand Up @@ -230,6 +231,7 @@ def test_federation_2_4_version_is_detected_in_schema():
"""
)


def test_federation_2_5_version_is_detected_in_schema():
type_defs = """
extend schema
Expand All @@ -254,7 +256,11 @@ def test_federation_2_5_version_is_detected_in_schema():
rootField: Review
}
type Review @interfaceObject @key(fields: "id") @authenticated @requiresScopes(scopes: [["read:review"]]) {
type Review
@interfaceObject
@key(fields: "id")
@authenticated
@requiresScopes(scopes: [["read:review"]]) {
id: ID!
}
"""
Expand Down Expand Up @@ -296,12 +302,16 @@ def test_federation_2_5_version_is_detected_in_schema():
rootField: Review
}
type Review @interfaceObject @key(fields: "id") @authenticated @requiresScopes(scopes: [["read:review"]]) {
type Review
@interfaceObject @key(fields: "id")
@authenticated
@requiresScopes(scopes: [["read:review"]]) {
id: ID!
}
"""
)


def test_federation_2_6_version_is_detected_in_schema():
type_defs = """
extend schema
Expand Down Expand Up @@ -386,3 +396,87 @@ def test_federation_2_6_version_is_detected_in_schema():
"""
)


def test_federation_version_not_supported_is_detected_in_schema():
type_defs = """
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.25",
import: [
"@key",
"@shareable",
"@provides",
"@external",
"@tag",
"@extends",
"@override",
"@interfaceObject",
"@authenticated",
"@requiresScopes",
]
)
type Query {
rootField: Review
}
type Review
@interfaceObject
@key(fields: "id")
@authenticated
@requiresScopes(scopes: [["read:review"]])
@policy(policies: [["role:admin"]])
{
id: ID!
}
"""

schema = make_federated_schema(type_defs)

result = graphql_sync(
schema,
"""
query GetServiceDetails {
_service {
sdl
}
}
""",
)

assert result.errors is None
assert sic(result.data["_service"]["sdl"]) == sic(
"""
extend schema
@link(
url: "https://specs.apollo.dev/federation/v2.25",
import: [
"@key",
"@shareable",
"@provides",
"@external",
"@tag",
"@extends",
"@override",
"@interfaceObject"
"@authenticated",
"@requiresScopes",
]
)
type Query {
rootField: Review
}
type Review
@interfaceObject
@key(fields: "id")
@authenticated
@requiresScopes(scopes: [["read:review"]])
@policy(policies: [["role:admin"]])
{
id: ID!
}
"""
)

0 comments on commit 5756af1

Please sign in to comment.