Beispiel #1
0
def process_file(
    filename: str,
    schema: GraphQLSchema,
    parser: QueryParser,
    renderer: DataclassesRenderer,
    fragment_library: Dict[str, str],
    verify: bool = False,
) -> None:
    full_fragments = "".join(
        [
            fragment_code
            for fragment_filename, fragment_code in fragment_library.items()
            if fragment_filename != filename
        ]
    )
    root, _s = os.path.splitext(filename)
    target_filename = "".join([root, ".py"])
    base_dir_path, dir_name = os.path.split(os.path.dirname(target_filename))

    try:
        with open(filename, "r") as fin:
            query = fin.read()
        parsed_query = parse(query)
        usages = find_deprecated_usages(schema, parsed_query)
        assert (
            len(usages) == 0
        ), f"Graphql file name {filename} uses deprecated fields {usages}"
        is_fragment = dir_name == FRAGMENT_DIRNAME
        parsed = parser.parse(query, full_fragments, is_fragment=is_fragment)
        rendered = renderer.render(parsed)
        verify_or_write_rendered(target_filename, rendered, verify)

        enums = renderer.render_enums(parsed)
        path_to_enum_dir = os.path.join(base_dir_path, ENUM_DIRNAME)
        make_python_package(pkg_name=path_to_enum_dir)
        for enum_name, code in enums.items():
            target_enum_filename = os.path.join(
                path_to_enum_dir, "".join([get_enum_filename(enum_name), ".py"])
            )
            verify_or_write_rendered(target_enum_filename, code, verify)

        input_objects = renderer.render_input_objects(parsed)
        path_to_input_dir = os.path.join(base_dir_path, INPUT_DIRNAME)
        make_python_package(pkg_name=path_to_input_dir)
        for input_object_name, code in input_objects.items():
            target_input_object_filename = os.path.join(
                path_to_input_dir,
                "".join([get_input_filename(input_object_name), ".py"]),
            )
            verify_or_write_rendered(target_input_object_filename, code, verify)
    except (AnonymousQueryError, InvalidQueryError, AssertionError):
        if verify:
            print(f"Failed to verify graphql file {filename}")
        else:
            print(f"Failed to process graphql file {filename}")
        safe_remove(target_filename)
        raise
Beispiel #2
0
 def validate(self, document):
     if not self.schema:
         raise Exception(
             "Cannot validate locally the document, you need to pass a schema."
         )
     validation_errors = validate(self.schema, document)
     if validation_errors:
         raise validation_errors[0]
     usages = find_deprecated_usages(self.schema, document)
     for usage in usages:
         message = (f"Query of deprecated grapqhl field in {usage}"
                    "Consider upgrading to newer API version.")
         warnings.warn(message, GraphqlDeprecationWarning)
Beispiel #3
0
    def test_graphql_compilation(self, mock_popen, mock_path_exists):
        graphql_library = pkg_resources.resource_filename(__name__, "graphql")
        schema_filepath = pkg_resources.resource_filename(
            __name__, "schema/symphony.graphql")

        schema = build_ast_schema(parse((open(schema_filepath).read())))
        filenames = glob.glob(os.path.join(graphql_library, "**/*.graphql"),
                              recursive=True)
        query_parser = QueryParser(schema)
        query_renderer = DataclassesRenderer(schema)

        for filename in filenames:
            with open(filename) as f:
                query = parse(f.read())
                usages = find_deprecated_usages(schema, query)
                assert len(usages) == 0, (f"Graphql file name {filename} uses "
                                          f"deprecated fields {usages}")
            self.verify_file(filename, query_parser, query_renderer)
Beispiel #4
0
def run(schema_library: str, graphql_library: str):
    schema = compile_schema_library(schema_library)
    filenames = glob.glob(os.path.join(graphql_library, "**/*.graphql"), recursive=True)

    query_parser = QueryParser(schema)
    query_renderer = DataclassesRenderer(schema)

    py_filenames = glob.glob(os.path.join(graphql_library, "**/*.py"), recursive=True)
    for py_filename in py_filenames:
        if os.path.basename(py_filename) != "__init__.py":
            os.unlink(py_filename)

    for filename in filenames:
        with open(filename) as f:
            query = parse(f.read())
            usages = find_deprecated_usages(schema, query)
            assert (
                len(usages) == 0
            ), f"Graphql file name {filename} uses deprecated fields {usages}"

        process_file(filename, query_parser, query_renderer)