910e62b5创建于 1月15日历史提交
#!/usr/bin/env python3
# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import json
import os
import sys

from difflib import unified_diff
from schema_loader import SchemaLoader

# Utility for running two separate API schema files through the SchemaLoader and
# comparing the output of each. Intended to be used when converting an extension
# API schema file from one format to another i.e. from the old IDL or JSON
# format to WebIDL.
#
# This file can be run manually, but is also used in automated tests for schema
# files which have been converted to WebIDL to ensure there is no functional
# changes introduced during the conversion process.


def LoadAndReturnUnifiedDiff(file_one: str, file_two: str) -> str:
  """Loads two schemas passed in and returns any differences from the output.

  Args:
    file_one: Filepath string to the first schema.
    file_two: Filepath string to the second schema.

  Returns:
    A human readable string containing the diff between the outputs of the
    SchemaLoader in the unified_diff format. May be an empty string if there is
    no difference detected.
  """
  root = os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir,
                      os.pardir)
  schema_one = SchemaLoader(root).LoadSchema(file_one)
  schema_two = SchemaLoader(root).LoadSchema(file_two)

  difference = unified_diff(
      json.dumps(schema_one, indent=2, sort_keys=True).splitlines(),
      json.dumps(schema_two, indent=2, sort_keys=True).splitlines())

  diff_list = list(difference)
  if not diff_list:
    return ''
  return '\n'.join(diff_list)


if __name__ == "__main__":
  args = sys.argv[1:]
  if len(args) != 2:
    raise Exception(
        'Must be called with two parameters, each a file path to an API schema'
        ' file you want to compare the differences between after they are both'
        ' parsed and processed.')

  diff = LoadAndReturnUnifiedDiff(args[0], args[1])
  if diff:
    print(diff)
  else:
    print('No difference found!')