mirror of
https://github.com/tc39/test262.git
synced 2025-07-31 01:44:54 +02:00
The "monkeyYaml" parser is intended to serve as a lightweight fallback to Python's standard YAML parser in contexts where the latter is not available. Any intentionally-simplified implementation will necessarily exhibit non-standard behavior for different input, so not all input accepted by the standard parser will be accepted by "monkeyYaml". If loaded exclusively in fallback situations, these edge cases can only be identified (and debugged) in the environments that require the fallback. This has allowed developers to unknowingly author tests that cause errors. Update the test runner to use "monkeyYaml" in all cases, ensuring more consistent behavior across contexts and precluding this class of regression.
131 lines
3.4 KiB
Python
131 lines
3.4 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.
|
|
|
|
# TODO: resolve differences with common.py and unify into one file.
|
|
|
|
|
|
import logging
|
|
import optparse
|
|
import os
|
|
from os import path
|
|
import platform
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import time
|
|
import imp
|
|
|
|
# from TestCasePackagerConfig import *
|
|
|
|
headerPatternStr = r"(?:(?:\s*\/\/.*)?\s*\n)*"
|
|
captureCommentPatternStr = r"\/\*\*?((?:\s|\S)*?)\*\/\s*\n"
|
|
anyPatternStr = r"(?:\s|\S)*"
|
|
|
|
headerPattern = re.compile("^" + headerPatternStr)
|
|
|
|
# Should match anything
|
|
testRecordPattern = re.compile(r"^(" + headerPatternStr +
|
|
r")(?:" + captureCommentPatternStr +
|
|
r")?(" + anyPatternStr +
|
|
r")$")
|
|
|
|
stars = re.compile(r"\s*\n\s*\*\s?")
|
|
atattrs = re.compile(r"\s*\n\s*\*\s*@")
|
|
|
|
yamlPattern = re.compile(r"---((?:\s|\S)*)---")
|
|
newlinePattern = re.compile(r"\n")
|
|
|
|
yamlLoad = None
|
|
|
|
def stripStars(text):
|
|
return stars.sub('\n', text).strip()
|
|
|
|
def stripHeader(src):
|
|
header = headerPattern.match(src).group(0)
|
|
return src[len(header):]
|
|
|
|
def matchParts(src, name):
|
|
match = testRecordPattern.match(src)
|
|
if match == None:
|
|
raise Exception('unrecognized: ' + name)
|
|
return match
|
|
|
|
def hasYAML(text):
|
|
match = yamlPattern.match(text)
|
|
if match == None:
|
|
return False
|
|
return True
|
|
|
|
def oldAttrParser(testRecord, body, name):
|
|
propTexts = atattrs.split(body)
|
|
testRecord['commentary'] = stripStars(propTexts[0])
|
|
del propTexts[0]
|
|
for propText in propTexts:
|
|
propMatch = re.match(r"^\w+", propText)
|
|
if propMatch == None:
|
|
raise Exception('Malformed "@" attribute: ' + name)
|
|
propName = propMatch.group(0)
|
|
propVal = stripStars(propText[len(propName):])
|
|
|
|
if propName in testRecord:
|
|
raise Exception('duplicate: ' + propName)
|
|
testRecord[propName] = propVal;
|
|
|
|
def yamlAttrParser(testRecord, attrs, name):
|
|
match = yamlPattern.match(attrs)
|
|
body = match.group(1)
|
|
importYamlLoad()
|
|
parsed = yamlLoad(body)
|
|
|
|
if (parsed is None):
|
|
print "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 parseTestRecord(src, name):
|
|
testRecord = {}
|
|
match = matchParts(src, name)
|
|
testRecord['header'] = match.group(1).strip()
|
|
testRecord['test'] = match.group(3) # do not trim
|
|
|
|
attrs = match.group(2)
|
|
if attrs:
|
|
if hasYAML(attrs):
|
|
yamlAttrParser(testRecord, attrs, name)
|
|
else:
|
|
oldAttrParser(testRecord, attrs, 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()
|