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 935fe27
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 29 deletions.
44 changes: 15 additions & 29 deletions ariadne/contrib/federation/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,37 +76,23 @@ 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")
definitions = os.listdir(definitions_folder)
definitions.sort()
last_version_file = definitions[-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
83 changes: 83 additions & 0 deletions tests/federation/test_schema_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,3 +386,86 @@ 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 935fe27

Please sign in to comment.