diff --git a/test/test_jsinterp_parser.py b/test/test_jsinterp_parser.py index 95b27d1ae..86cfb3984 100644 --- a/test/test_jsinterp_parser.py +++ b/test/test_jsinterp_parser.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals # Allow direct execution import os import sys + if sys.version_info < (2, 7): import unittest2 as unittest else: @@ -36,7 +37,7 @@ class TestJSInterpreterParser(unittest.TestCase): (Token.OPEXPR, [(Token.MEMBER, (Token.INT, 42), None, None)]), None) ]) - )] + )] self.assertEqual(list(jsi.statements()), ast) def test_calc(self): @@ -258,46 +259,47 @@ class TestJSInterpreterParser(unittest.TestCase): jsi = JSInterpreter('return (1) + (2) * ((( (( (((((3)))))) )) ));') ast = [ (Token.RETURN, (Token.EXPR, [ - (Token.ASSIGN, None, - (Token.OPEXPR, [ - (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.INT, 1), None, None) - ]), None),]), None, None), + (Token.ASSIGN, None, + (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 1), None, None) + ]), None)]), None, None), - (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.INT, 2), None, None) - ]), None)]), None, None), + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 2), None, None) + ]), None)]), None, None), - (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.INT, 3), None, None) + (Token.MEMBER, + (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 3), None, None) + ]), None)]), None, None) ]), None)]), None, None) ]), None)]), None, None) ]), None)]), None, None) ]), None)]), None, None) + ]), None)]), None, None) - ]), None)]), None, None) + ]), None)]), None, None) - ]), None)]), None, None) - ]), None)]), None, None) - ]), None)]), None, None), + ]), None)]), None, None), - (Token.OP, _OPERATORS['*'][1]), - (Token.OP, _OPERATORS['+'][1]) - ]), None) - ])) + (Token.OP, _OPERATORS['*'][1]), + (Token.OP, _OPERATORS['+'][1]) + ]), None) + ])) ] self.assertEqual(list(jsi.statements()), ast) @@ -316,11 +318,11 @@ class TestJSInterpreterParser(unittest.TestCase): (Token.ASSIGN, _ASSIGN_OPERATORS['='][1], (Token.OPEXPR, [(Token.MEMBER, (Token.ID, 'x'), None, None)]), - (Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.INT, 30), None, None), - (Token.MEMBER, (Token.INT, 1), None, None), - (Token.OP, _OPERATORS['+'][1]) - ]), + (Token.ASSIGN, None, + (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 30), None, None), + (Token.MEMBER, (Token.INT, 1), None, None), + (Token.OP, _OPERATORS['+'][1])]), None)) ]), @@ -335,16 +337,16 @@ class TestJSInterpreterParser(unittest.TestCase): jsi = JSInterpreter('var x = 20; x += 30 + 1; return x;') ast[1] = (Token.EXPR, [ - (Token.ASSIGN, - _ASSIGN_OPERATORS['+='][1], - (Token.OPEXPR, [(Token.MEMBER, (Token.ID, 'x'), None, None)]), - (Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.INT, 30), None, None), - (Token.MEMBER, (Token.INT, 1), None, None), - (Token.OP, _OPERATORS['+'][1]) - ]), - None)) - ]) + (Token.ASSIGN, + _ASSIGN_OPERATORS['+='][1], + (Token.OPEXPR, [(Token.MEMBER, (Token.ID, 'x'), None, None)]), + (Token.ASSIGN, None, + (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 30), None, None), + (Token.MEMBER, (Token.INT, 1), None, None), + (Token.OP, _OPERATORS['+'][1])]), + None)) + ]) self.assertEqual(list(jsi.statements()), ast) jsi = JSInterpreter('var x = 20; x -= 30 + 1; return x;') @@ -352,11 +354,11 @@ class TestJSInterpreterParser(unittest.TestCase): (Token.ASSIGN, _ASSIGN_OPERATORS['-='][1], (Token.OPEXPR, [(Token.MEMBER, (Token.ID, 'x'), None, None)]), - (Token.ASSIGN, None, (Token.OPEXPR, [ - (Token.MEMBER, (Token.INT, 30), None, None), - (Token.MEMBER, (Token.INT, 1), None, None), - (Token.OP, _OPERATORS['+'][1]) - ]), + (Token.ASSIGN, None, + (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 30), None, None), + (Token.MEMBER, (Token.INT, 1), None, None), + (Token.OP, _OPERATORS['+'][1])]), None)) ]) self.assertEqual(list(jsi.statements()), ast) @@ -502,7 +504,7 @@ class TestJSInterpreterParser(unittest.TestCase): ast = [] self.assertEqual(list(jsi.statements()), ast) - jsi = JSInterpreter('function x(a) { return a.split(""); }', objects={'a': 'abc'}) + jsi = JSInterpreter('function x(a) { return a.split(""); }', variables={'a': 'abc'}) ast = [] self.assertEqual(list(jsi.statements()), ast) @@ -517,7 +519,7 @@ class TestJSInterpreterParser(unittest.TestCase): self.assertEqual(list(jsi.statements()), ast) def test_getfield(self): - jsi = JSInterpreter('return a.var;', objects={'a': {'var': 3}}) + jsi = JSInterpreter('return a.var;', variables={'a': {'var': 3}}) ast = [(Token.RETURN, (Token.EXPR, [ (Token.ASSIGN, @@ -533,5 +535,6 @@ class TestJSInterpreterParser(unittest.TestCase): ] self.assertEqual(list(jsi.statements()), ast) + if __name__ == '__main__': unittest.main() diff --git a/youtube_dl/jsinterp/jsinterp.py b/youtube_dl/jsinterp/jsinterp.py index 8d8e260d4..0fc4b262a 100644 --- a/youtube_dl/jsinterp/jsinterp.py +++ b/youtube_dl/jsinterp/jsinterp.py @@ -3,7 +3,6 @@ from ..compat import compat_str import re - from ..utils import ExtractorError from .tstream import TokenStream from .jsgrammar import Token @@ -223,7 +222,7 @@ class JSInterpreter(object): peek_id, peek_value, peek_pos = token_stream.peek() elif peek_id is Token.POPEN: # TODO handle field query - raise ExtractorError('Field querry is not yet supported at %d' % peek_pos) + raise ExtractorError('Field query is not yet supported at %d' % peek_pos) if peek_id is Token.ID: token_stream.pop() @@ -470,7 +469,7 @@ class JSInterpreter(object): def getvalue(self, ref): if (ref.value is None or ref.value is self.undefined or - isinstance(ref.value, (int, float, str, compat_str, list))): + isinstance(ref.value, (int, float, compat_str, list))): return ref.value ref_id, ref_value = ref.value if ref_id is Token.ID: @@ -510,7 +509,6 @@ class JSInterpreter(object): name = stmt[0] ref = None - abort = False if name == 'funcdecl': # TODO interpret funcdecl raise ExtractorError('''Can't interpret statement called %s''' % name) @@ -523,7 +521,7 @@ class JSInterpreter(object): elif name is Token.VAR: for name, value in stmt[1]: self.context.local_vars[name] = Reference(self.getvalue(self.interpret_expression(value)), - (self.context.local_vars, name)) + (self.context.local_vars, name)) elif name is Token.EXPR: for expr in stmt[1]: ref = self.interpret_expression(expr)