mirror of https://github.com/tc39/test262.git
129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
# Copyright 2011 by Google, Inc. All rights reserved.
|
|
# This code is governed by the BSD license found in the LICENSE file.
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import re
|
|
import imp
|
|
|
|
# Matches trailing whitespace and any following blank lines.
|
|
_BLANK_LINES = r"([ \t]*[\r\n]{1,2})*"
|
|
|
|
# Matches the YAML frontmatter block.
|
|
_YAML_PATTERN = re.compile(r"/\*---(.*)---\*/" + _BLANK_LINES, re.DOTALL)
|
|
|
|
# Matches all known variants for the license block.
|
|
_LICENSE_PATTERN = re.compile(
|
|
r'// Copyright( \([C]\))? (\w+) .+\. {1,2}All rights reserved\.[\r\n]{1,2}' +
|
|
r'(' +
|
|
r'// This code is governed by the( BSD)? license found in the LICENSE file\.' +
|
|
r'|' +
|
|
r'// See LICENSE for details\.' +
|
|
r'|' +
|
|
r'// Use of this source code is governed by a BSD-style license that can be[\r\n]{1,2}' +
|
|
r'// found in the LICENSE file\.' +
|
|
r'|' +
|
|
r'// See LICENSE or https://github\.com/tc39/test262/blob/master/LICENSE' +
|
|
r')[\r\n]{1,2}' + _BLANK_LINES, re.IGNORECASE)
|
|
|
|
yamlLoad = None
|
|
|
|
def yamlAttrParser(testRecord, attrs, name, onerror):
|
|
importYamlLoad()
|
|
|
|
parsed = yamlLoad(attrs)
|
|
if parsed is None:
|
|
onerror("Failed to parse yaml in name %s" % name)
|
|
return
|
|
|
|
for key in parsed:
|
|
value = parsed[key]
|
|
if key == "info":
|
|
key = "commentary"
|
|
testRecord[key] = value
|
|
|
|
if 'flags' in testRecord:
|
|
for flag in testRecord['flags']:
|
|
testRecord[flag] = ""
|
|
|
|
def findLicense(src):
|
|
match = _LICENSE_PATTERN.search(src)
|
|
if not match:
|
|
return None
|
|
|
|
return match.group(0)
|
|
|
|
def findAttrs(src):
|
|
match = _YAML_PATTERN.search(src)
|
|
if not match:
|
|
return (None, None)
|
|
|
|
return (match.group(0), match.group(1).strip())
|
|
|
|
def parseTestRecord(src, name, onerror = print):
|
|
# Find the license block.
|
|
header = findLicense(src)
|
|
|
|
# Find the YAML frontmatter.
|
|
(frontmatter, attrs) = findAttrs(src)
|
|
|
|
# YAML frontmatter is required for all tests.
|
|
if frontmatter is None:
|
|
onerror("Missing frontmatter: %s" % name)
|
|
|
|
# The license should be placed before the frontmatter and there shouldn't be
|
|
# be any extra content between the license and the frontmatter.
|
|
if header is not None and frontmatter is not None:
|
|
headerIdx = src.index(header)
|
|
frontmatterIdx = src.index(frontmatter)
|
|
if headerIdx > frontmatterIdx:
|
|
onerror("Unexpected license after frontmatter: %s" % name)
|
|
|
|
# Search for any extra test content, but ignore whitespace only or comment lines.
|
|
extra = src[headerIdx + len(header) : frontmatterIdx]
|
|
if extra and any(line.strip() and not line.lstrip().startswith("//") for line in extra.split("\n")):
|
|
onerror("Unexpected test content between license and frontmatter: %s" % name)
|
|
|
|
# Remove the license and YAML parts from the actual test content.
|
|
test = src
|
|
if frontmatter is not None:
|
|
test = test.replace(frontmatter, '')
|
|
if header is not None:
|
|
test = test.replace(header, '')
|
|
|
|
testRecord = {}
|
|
testRecord['header'] = header.strip() if header else ''
|
|
testRecord['test'] = test
|
|
|
|
if attrs:
|
|
yamlAttrParser(testRecord, attrs, name, onerror)
|
|
|
|
# Report if the license block is missing in non-generated tests.
|
|
if header is None and "generated" not in testRecord:
|
|
onerror("No license found in: %s" % name)
|
|
|
|
return testRecord
|
|
|
|
def importYamlLoad():
|
|
global yamlLoad
|
|
if yamlLoad:
|
|
return
|
|
monkeyYaml = loadMonkeyYaml()
|
|
yamlLoad = monkeyYaml.load
|
|
|
|
def loadMonkeyYaml():
|
|
f = None
|
|
try:
|
|
p = os.path.dirname(os.path.realpath(__file__))
|
|
(f, pathname, description) = imp.find_module("monkeyYaml", [p])
|
|
module = imp.load_module("monkeyYaml", f, pathname, description)
|
|
return module
|
|
except:
|
|
raise ImportError("Cannot load monkeyYaml")
|
|
finally:
|
|
if f:
|
|
f.close()
|