Index: third_party/WebKit/Source/platform/inspector_protocol/CheckProtocolCompatibility.py |
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/generate-inspector-protocol-version b/third_party/WebKit/Source/platform/inspector_protocol/CheckProtocolCompatibility.py |
similarity index 59% |
rename from third_party/WebKit/Source/platform/inspector_protocol/generate-inspector-protocol-version |
rename to third_party/WebKit/Source/platform/inspector_protocol/CheckProtocolCompatibility.py |
index 8c13092541378d46aec11f7ebde98ce95453f25b..dd9acad898b43e439653540948fea5bc2d9c66f8 100755 |
--- a/third_party/WebKit/Source/platform/inspector_protocol/generate-inspector-protocol-version |
+++ b/third_party/WebKit/Source/platform/inspector_protocol/CheckProtocolCompatibility.py |
@@ -45,11 +45,9 @@ |
# |
# Adding --show_changes to the command line prints out a list of valid public API changes. |
-import collections |
import copy |
import os.path |
import optparse |
-import re |
import sys |
try: |
@@ -57,10 +55,11 @@ try: |
except ImportError: |
import simplejson as json |
+ |
def list_to_map(items, key): |
result = {} |
for item in items: |
- if not "experimental" in item and not "hidden" in item: |
+ if "experimental" not in item and "hidden" not in item: |
result[item[key]] = item |
return result |
@@ -95,7 +94,7 @@ def compare_schemas(d_1, d_2, reverse): |
for name in domains_by_name_1: |
domain_1 = domains_by_name_1[name] |
- if not name in domains_by_name_2: |
+ if name not in domains_by_name_2: |
errors.append("%s: domain has been %s" % (name, removed(reverse))) |
continue |
compare_domains(domain_1, domains_by_name_2[name], types_1, types_2, errors, reverse) |
@@ -108,7 +107,7 @@ def compare_domains(domain_1, domain_2, types_map_1, types_map_2, errors, revers |
commands_2 = named_list_to_map(domain_2, "commands", "name") |
for name in commands_1: |
command_1 = commands_1[name] |
- if not name in commands_2: |
+ if name not in commands_2: |
errors.append("%s.%s: command has been %s" % (domain_1["domain"], name, removed(reverse))) |
continue |
compare_commands(domain_name, command_1, commands_2[name], types_map_1, types_map_2, errors, reverse) |
@@ -117,7 +116,7 @@ def compare_domains(domain_1, domain_2, types_map_1, types_map_2, errors, revers |
events_2 = named_list_to_map(domain_2, "events", "name") |
for name in events_1: |
event_1 = events_1[name] |
- if not name in events_2: |
+ if name not in events_2: |
errors.append("%s.%s: event has been %s" % (domain_1["domain"], name, removed(reverse))) |
continue |
compare_events(domain_name, event_1, events_2[name], types_map_1, types_map_2, errors, reverse) |
@@ -146,13 +145,13 @@ def compare_events(domain_name, event_1, event_2, types_map_1, types_map_2, erro |
def compare_params_list(context, kind, params_1, params_2, types_map_1, types_map_2, depth, errors, reverse): |
for name in params_1: |
param_1 = params_1[name] |
- if not name in params_2: |
- if not "optional" in param_1: |
+ if name not in params_2: |
+ if "optional" not in param_1: |
errors.append("%s.%s: required %s has been %s" % (context, name, kind, removed(reverse))) |
continue |
param_2 = params_2[name] |
- if param_2 and "optional" in param_2 and not "optional" in param_1: |
+ if param_2 and "optional" in param_2 and "optional" not in param_1: |
errors.append("%s.%s: %s %s is now %s" % (context, name, required(reverse), kind, required(not reverse))) |
continue |
type_1 = extract_type(param_1, types_map_1, errors) |
@@ -187,7 +186,7 @@ def compare_types(context, kind, type_1, type_2, types_map_1, types_map_2, depth |
def extract_type(typed_object, types_map, errors): |
if "type" in typed_object: |
- result = { "id": "<transient>", "type": typed_object["type"] } |
+ result = {"id": "<transient>", "type": typed_object["type"]} |
if typed_object["type"] == "object": |
result["properties"] = [] |
elif typed_object["type"] == "array": |
@@ -195,9 +194,9 @@ def extract_type(typed_object, types_map, errors): |
return result |
elif "$ref" in typed_object: |
ref = typed_object["$ref"] |
- if not ref in types_map: |
+ if ref not in types_map: |
errors.append("Can not resolve type: %s" % ref) |
- types_map[ref] = { "id": "<transient>", "type": "object" } |
+ types_map[ref] = {"id": "<transient>", "type": "object"} |
return types_map[ref] |
@@ -224,10 +223,11 @@ def normalize_types(obj, domain_name, types): |
normalize_types(value, domain_name, types) |
-def load_schema(file, domains): |
- if not os.path.isfile(file): |
+def load_schema(file_name, domains): |
+ # pylint: disable=W0613 |
+ if not os.path.isfile(file_name): |
return |
- input_file = open(file, "r") |
+ input_file = open(file_name, "r") |
json_string = input_file.read() |
parsed_json = json.loads(json_string) |
domains += parsed_json["domains"] |
@@ -237,141 +237,141 @@ def load_schema(file, domains): |
def self_test(): |
def create_test_schema_1(): |
return [ |
- { |
- "domain": "Network", |
- "types": [ |
- { |
- "id": "LoaderId", |
- "type": "string" |
- }, |
- { |
- "id": "Headers", |
- "type": "object" |
- }, |
- { |
- "id": "Request", |
- "type": "object", |
- "properties": [ |
- { "name": "url", "type": "string" }, |
- { "name": "method", "type": "string" }, |
- { "name": "headers", "$ref": "Headers" }, |
- { "name": "becameOptionalField", "type": "string" }, |
- { "name": "removedField", "type": "string" }, |
- ] |
- } |
- ], |
- "commands": [ |
- { |
- "name": "removedCommand", |
- }, |
- { |
- "name": "setExtraHTTPHeaders", |
- "parameters": [ |
- { "name": "headers", "$ref": "Headers" }, |
- { "name": "mismatched", "type": "string" }, |
- { "name": "becameOptional", "$ref": "Headers" }, |
- { "name": "removedRequired", "$ref": "Headers" }, |
- { "name": "becameRequired", "$ref": "Headers", "optional": True }, |
- { "name": "removedOptional", "$ref": "Headers", "optional": True }, |
- ], |
- "returns": [ |
- { "name": "mimeType", "type": "string" }, |
- { "name": "becameOptional", "type": "string" }, |
- { "name": "removedRequired", "type": "string" }, |
- { "name": "becameRequired", "type": "string", "optional": True }, |
- { "name": "removedOptional", "type": "string", "optional": True }, |
- ] |
- } |
- ], |
- "events": [ |
- { |
- "name": "requestWillBeSent", |
- "parameters": [ |
- { "name": "frameId", "type": "string", "experimental": True }, |
- { "name": "request", "$ref": "Request" }, |
- { "name": "becameOptional", "type": "string" }, |
- { "name": "removedRequired", "type": "string" }, |
- { "name": "becameRequired", "type": "string", "optional": True }, |
- { "name": "removedOptional", "type": "string", "optional": True }, |
+ { |
+ "domain": "Network", |
+ "types": [ |
+ { |
+ "id": "LoaderId", |
+ "type": "string" |
+ }, |
+ { |
+ "id": "Headers", |
+ "type": "object" |
+ }, |
+ { |
+ "id": "Request", |
+ "type": "object", |
+ "properties": [ |
+ {"name": "url", "type": "string"}, |
+ {"name": "method", "type": "string"}, |
+ {"name": "headers", "$ref": "Headers"}, |
+ {"name": "becameOptionalField", "type": "string"}, |
+ {"name": "removedField", "type": "string"}, |
] |
- }, |
- { |
- "name": "removedEvent", |
- "parameters": [ |
- { "name": "errorText", "type": "string" }, |
- { "name": "canceled", "type": "boolean", "optional": True } |
- ] |
- } |
- ] |
- }, |
- { |
- "domain": "removedDomain" |
- } |
- ] |
+ } |
+ ], |
+ "commands": [ |
+ { |
+ "name": "removedCommand", |
+ }, |
+ { |
+ "name": "setExtraHTTPHeaders", |
+ "parameters": [ |
+ {"name": "headers", "$ref": "Headers"}, |
+ {"name": "mismatched", "type": "string"}, |
+ {"name": "becameOptional", "$ref": "Headers"}, |
+ {"name": "removedRequired", "$ref": "Headers"}, |
+ {"name": "becameRequired", "$ref": "Headers", "optional": True}, |
+ {"name": "removedOptional", "$ref": "Headers", "optional": True}, |
+ ], |
+ "returns": [ |
+ {"name": "mimeType", "type": "string"}, |
+ {"name": "becameOptional", "type": "string"}, |
+ {"name": "removedRequired", "type": "string"}, |
+ {"name": "becameRequired", "type": "string", "optional": True}, |
+ {"name": "removedOptional", "type": "string", "optional": True}, |
+ ] |
+ } |
+ ], |
+ "events": [ |
+ { |
+ "name": "requestWillBeSent", |
+ "parameters": [ |
+ {"name": "frameId", "type": "string", "experimental": True}, |
+ {"name": "request", "$ref": "Request"}, |
+ {"name": "becameOptional", "type": "string"}, |
+ {"name": "removedRequired", "type": "string"}, |
+ {"name": "becameRequired", "type": "string", "optional": True}, |
+ {"name": "removedOptional", "type": "string", "optional": True}, |
+ ] |
+ }, |
+ { |
+ "name": "removedEvent", |
+ "parameters": [ |
+ {"name": "errorText", "type": "string"}, |
+ {"name": "canceled", "type": "boolean", "optional": True} |
+ ] |
+ } |
+ ] |
+ }, |
+ { |
+ "domain": "removedDomain" |
+ } |
+ ] |
def create_test_schema_2(): |
return [ |
- { |
- "domain": "Network", |
- "types": [ |
- { |
- "id": "LoaderId", |
- "type": "string" |
- }, |
- { |
- "id": "Request", |
- "type": "object", |
- "properties": [ |
- { "name": "url", "type": "string" }, |
- { "name": "method", "type": "string" }, |
- { "name": "headers", "type": "object" }, |
- { "name": "becameOptionalField", "type": "string", "optional": True }, |
- ] |
- } |
- ], |
- "commands": [ |
- { |
- "name": "addedCommand", |
- }, |
- { |
- "name": "setExtraHTTPHeaders", |
- "parameters": [ |
- { "name": "headers", "type": "object" }, |
- { "name": "mismatched", "type": "object" }, |
- { "name": "becameOptional", "type": "object" , "optional": True }, |
- { "name": "addedRequired", "type": "object" }, |
- { "name": "becameRequired", "type": "object" }, |
- { "name": "addedOptional", "type": "object", "optional": True }, |
- ], |
- "returns": [ |
- { "name": "mimeType", "type": "string" }, |
- { "name": "becameOptional", "type": "string", "optional": True }, |
- { "name": "addedRequired", "type": "string"}, |
- { "name": "becameRequired", "type": "string" }, |
- { "name": "addedOptional", "type": "string", "optional": True }, |
- ] |
- } |
- ], |
- "events": [ |
- { |
- "name": "requestWillBeSent", |
- "parameters": [ |
- { "name": "request", "$ref": "Request" }, |
- { "name": "becameOptional", "type": "string", "optional": True }, |
- { "name": "addedRequired", "type": "string"}, |
- { "name": "becameRequired", "type": "string" }, |
- { "name": "addedOptional", "type": "string", "optional": True }, |
- ] |
- }, |
- { |
- "name": "addedEvent" |
- } |
- ] |
- }, |
- { |
- "domain": "addedDomain" |
- } |
- ] |
+ { |
+ "domain": "Network", |
+ "types": [ |
+ { |
+ "id": "LoaderId", |
+ "type": "string" |
+ }, |
+ { |
+ "id": "Request", |
+ "type": "object", |
+ "properties": [ |
+ {"name": "url", "type": "string"}, |
+ {"name": "method", "type": "string"}, |
+ {"name": "headers", "type": "object"}, |
+ {"name": "becameOptionalField", "type": "string", "optional": True}, |
+ ] |
+ } |
+ ], |
+ "commands": [ |
+ { |
+ "name": "addedCommand", |
+ }, |
+ { |
+ "name": "setExtraHTTPHeaders", |
+ "parameters": [ |
+ {"name": "headers", "type": "object"}, |
+ {"name": "mismatched", "type": "object"}, |
+ {"name": "becameOptional", "type": "object", "optional": True}, |
+ {"name": "addedRequired", "type": "object"}, |
+ {"name": "becameRequired", "type": "object"}, |
+ {"name": "addedOptional", "type": "object", "optional": True}, |
+ ], |
+ "returns": [ |
+ {"name": "mimeType", "type": "string"}, |
+ {"name": "becameOptional", "type": "string", "optional": True}, |
+ {"name": "addedRequired", "type": "string"}, |
+ {"name": "becameRequired", "type": "string"}, |
+ {"name": "addedOptional", "type": "string", "optional": True}, |
+ ] |
+ } |
+ ], |
+ "events": [ |
+ { |
+ "name": "requestWillBeSent", |
+ "parameters": [ |
+ {"name": "request", "$ref": "Request"}, |
+ {"name": "becameOptional", "type": "string", "optional": True}, |
+ {"name": "addedRequired", "type": "string"}, |
+ {"name": "becameRequired", "type": "string"}, |
+ {"name": "addedOptional", "type": "string", "optional": True}, |
+ ] |
+ }, |
+ { |
+ "name": "addedEvent" |
+ } |
+ ] |
+ }, |
+ { |
+ "domain": "addedDomain" |
+ } |
+ ] |
expected_errors = [ |
"removedDomain: domain has been removed", |
@@ -389,16 +389,16 @@ def self_test(): |
] |
expected_errors_reverse = [ |
- "addedDomain: domain has been added", |
- "Network.addedEvent: event has been added", |
- "Network.addedCommand: command has been added", |
- "Network.setExtraHTTPHeaders.mismatched: parameter base type mismatch, 'string' vs 'object'", |
- "Network.setExtraHTTPHeaders.removedRequired: required parameter has been removed", |
- "Network.setExtraHTTPHeaders.becameOptional: required parameter is now optional", |
- "Network.setExtraHTTPHeaders.addedRequired: required response parameter has been added", |
- "Network.setExtraHTTPHeaders.becameRequired: optional response parameter is now required", |
- "Network.requestWillBeSent.becameRequired: optional parameter is now required", |
- "Network.requestWillBeSent.addedRequired: required parameter has been added", |
+ "addedDomain: domain has been added", |
+ "Network.addedEvent: event has been added", |
+ "Network.addedCommand: command has been added", |
+ "Network.setExtraHTTPHeaders.mismatched: parameter base type mismatch, 'string' vs 'object'", |
+ "Network.setExtraHTTPHeaders.removedRequired: required parameter has been removed", |
+ "Network.setExtraHTTPHeaders.becameOptional: required parameter is now optional", |
+ "Network.setExtraHTTPHeaders.addedRequired: required response parameter has been added", |
+ "Network.setExtraHTTPHeaders.becameRequired: optional response parameter is now required", |
+ "Network.requestWillBeSent.becameRequired: optional parameter is now required", |
+ "Network.requestWillBeSent.addedRequired: required parameter has been added", |
] |
def is_subset(subset, superset, message): |
@@ -418,11 +418,10 @@ def self_test(): |
compare_schemas(create_test_schema_2(), create_test_schema_1(), True))) |
- |
-def load_domains_and_baselines(file, domains, baseline_domains): |
- version = load_schema(os.path.normpath(file), domains) |
+def load_domains_and_baselines(file_name, domains, baseline_domains): |
+ version = load_schema(os.path.normpath(file_name), domains) |
suffix = "-%s.%s.json" % (version["major"], version["minor"]) |
- baseline_file = file.replace(".json", suffix) |
+ baseline_file = file_name.replace(".json", suffix) |
load_schema(os.path.normpath(baseline_file), baseline_domains) |
return version |
@@ -434,29 +433,25 @@ def main(): |
cmdline_parser = optparse.OptionParser() |
cmdline_parser.add_option("--show_changes") |
- cmdline_parser.add_option("--o") |
+ cmdline_parser.add_option("--expected_errors") |
+ cmdline_parser.add_option("--stamp") |
arg_options, arg_values = cmdline_parser.parse_args() |
- if len(arg_values) < 1 or not arg_options.o: |
- sys.stderr.write("Usage: %s --o OUTPUT_FILE [--show_changes] PROTOCOL_FOLDER1 ?PROTOCOL_FOLDER2 \n" % sys.argv[0]) |
+ if len(arg_values) < 1: |
+ sys.stderr.write("Usage: %s [--show_changes] <protocol-1> [, <protocol-2>...]\n" % sys.argv[0]) |
return 1 |
- output_path = arg_options.o |
- output_file = open(output_path, "w") |
- |
domains = [] |
baseline_domains = [] |
version = load_domains_and_baselines(arg_values[0], domains, baseline_domains) |
- if len(arg_values) > 1: |
- load_domains_and_baselines(arg_values[1], domains, baseline_domains) |
+ for dependency in arg_values[1:]: |
+ load_domains_and_baselines(dependency, domains, baseline_domains) |
- expected_errors = [ |
- "Debugger.globalObjectCleared: event has been removed", |
- "Runtime.executionContextCreated.context parameter->Runtime.ExecutionContextDescription.frameId: required property has been removed", |
- "Debugger.canSetScriptSource: command has been removed", |
- "Console.messageRepeatCountUpdated: event has been removed", |
- "Console.messagesCleared: event has been removed" |
- ] |
+ expected_errors = [] |
+ if arg_options.expected_errors: |
+ expected_errors_file = open(arg_options.expected_errors, "r") |
+ expected_errors = json.loads(expected_errors_file.read())["errors"] |
+ expected_errors_file.close() |
errors = compare_schemas(baseline_domains, domains, False) |
unexpected_errors = [] |
@@ -466,7 +461,7 @@ def main(): |
if len(unexpected_errors) > 0: |
sys.stderr.write(" Compatibility checks FAILED\n") |
for error in unexpected_errors: |
- sys.stderr.write( " %s\n" % error) |
+ sys.stderr.write(" %s\n" % error) |
return 1 |
if arg_options.show_changes: |
@@ -476,8 +471,9 @@ def main(): |
for change in changes: |
print " %s" % change |
- json.dump({"version": version, "domains": domains}, output_file, indent=4, sort_keys=False, separators=(',', ': ')) |
- output_file.close() |
+ if arg_options.stamp: |
+ with open(arg_options.stamp, 'a') as _: |
+ pass |
if __name__ == '__main__': |
sys.exit(main()) |