scripts/qmp-shell: Fix "FuzzyJSON" parser
I'm not sure when this regressed (Or maybe if it was ever working right to begin with?), but the Python AST requires you to change "Names" to "Constants" in order to truly convert `false` to `False`. Signed-off-by: John Snow <jsnow@redhat.com> Message-id: 20210607200649.1840382-24-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
ad4eebee00
commit
6faf2384ec
@ -95,18 +95,19 @@ class QMPShellError(Exception):
|
|||||||
class FuzzyJSON(ast.NodeTransformer):
|
class FuzzyJSON(ast.NodeTransformer):
|
||||||
"""
|
"""
|
||||||
This extension of ast.NodeTransformer filters literal "true/false/null"
|
This extension of ast.NodeTransformer filters literal "true/false/null"
|
||||||
values in an AST and replaces them by proper "True/False/None" values that
|
values in a Python AST and replaces them by proper "True/False/None" values
|
||||||
Python can properly evaluate.
|
that Python can properly evaluate.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def visit_Name(cls, node): # pylint: disable=invalid-name
|
def visit_Name(cls, # pylint: disable=invalid-name
|
||||||
|
node: ast.Name) -> ast.AST:
|
||||||
if node.id == 'true':
|
if node.id == 'true':
|
||||||
node.id = 'True'
|
return ast.Constant(value=True)
|
||||||
if node.id == 'false':
|
if node.id == 'false':
|
||||||
node.id = 'False'
|
return ast.Constant(value=False)
|
||||||
if node.id == 'null':
|
if node.id == 'null':
|
||||||
node.id = 'None'
|
return ast.Constant(value=None)
|
||||||
return node
|
return node
|
||||||
|
|
||||||
|
|
||||||
@ -174,10 +175,9 @@ class QMPShell(qmp.QEMUMonitorProtocol):
|
|||||||
# Try once again as FuzzyJSON:
|
# Try once again as FuzzyJSON:
|
||||||
try:
|
try:
|
||||||
tree = ast.parse(val, mode='eval')
|
tree = ast.parse(val, mode='eval')
|
||||||
return ast.literal_eval(FuzzyJSON().visit(tree))
|
transformed = FuzzyJSON().visit(tree)
|
||||||
except SyntaxError:
|
return ast.literal_eval(transformed)
|
||||||
pass
|
except (SyntaxError, ValueError):
|
||||||
except ValueError:
|
|
||||||
pass
|
pass
|
||||||
return val
|
return val
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user