[pypy-svn] r45020 - in pypy/dist/pypy/interpreter/pyparser: . test

lac at codespeak.net lac at codespeak.net
Fri Jul 13 14:53:46 CEST 2007


Author: lac
Date: Fri Jul 13 14:53:45 2007
New Revision: 45020

Added:
   pypy/dist/pypy/interpreter/pyparser/test/fakes.py   (contents, props changed)
   pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder_future.py   (contents, props changed)
Modified:
   pypy/dist/pypy/interpreter/pyparser/astbuilder.py
   pypy/dist/pypy/interpreter/pyparser/grammar.py
   pypy/dist/pypy/interpreter/pyparser/test/__init__.py
   pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py
   pypy/dist/pypy/interpreter/pyparser/test/test_parser.py
Log:
- Refactored FakeSpace helper class to a separate file
- Added a dummy builder for future_import_feature
- Ate some of the trailing whitespace

Justas


Modified: pypy/dist/pypy/interpreter/pyparser/astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/astbuilder.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/astbuilder.py	Fri Jul 13 14:53:45 2007
@@ -1038,6 +1038,7 @@
     'while_stmt' : build_while_stmt,
     'import_name' : build_import_name,
     'import_from' : build_import_from,
+    'future_import_feature': None,
     'yield_stmt' : build_yield_stmt,
     'continue_stmt' : build_continue_stmt,
     'del_stmt' : build_del_stmt,

Modified: pypy/dist/pypy/interpreter/pyparser/grammar.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/grammar.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/grammar.py	Fri Jul 13 14:53:45 2007
@@ -112,7 +112,8 @@
         # This attribute is here for convenience
         self.debug = debug
         # the parser that represent the grammar used
-        assert isinstance( parser, Parser )
+        # Commented the assert: this eases the testing
+        #assert isinstance( parser, Parser )
         self.parser = parser
 
     def context(self):
@@ -122,13 +123,13 @@
     def restore(self, ctx):
         """Accept an opaque context object"""
         pass
-    
+
     def alternative(self, rule, source):
         return False
-    
+
     def sequence(self, rule, source, elts_number):
         return False
-    
+
     def token(self, name, value, source):
         return False
 
@@ -191,7 +192,7 @@
                 self.stack.append(SyntaxNode(rule.codename, [], source.current_lineno()))
             else:
                 self.stack.append(TempSyntaxNode(rule.codename, [], source.current_lineno()))
-                
+
         if self.debug:
             self.stack[-1].dumpstr()
         return True
@@ -674,11 +675,11 @@
         else:
             # error unknown or negative integer
         """
-        # XXX (adim): this is trunk's keyword management        
+        # XXX (adim): this is trunk's keyword management
         # if (self.value is not None and builder.keywords is not None
         #     and self.value not in builder.keywords):
         #     return 0
-        
+
         ctx = source.context()
         tk = source.next()
         if tk.codename == self.codename:
@@ -749,7 +750,7 @@
         self.symbols = {}   # mapping symbol name -> symbol code
         self.tokens = { 'NULLTOKEN' : -1 }
         self.EmptyToken = Token( self, -1, None )
-        self.tok_name = {}  
+        self.tok_name = {}
         self.tok_values = {}
         self.tok_rvalues = {}
         self._ann_sym_count = -10
@@ -795,7 +796,7 @@
                 self.tok_values[value] = val
                 # XXX : this reverse mapping seemed only to be used
                 # because of pycodegen visitAugAssign
-                self.tok_rvalues[val] = value 
+                self.tok_rvalues[val] = value
             return val
         return self.tokens[ tok ]
 
@@ -837,10 +838,10 @@
     def build_alternative( self, name_id, args ):
         # assert isinstance( name_id, int )
         assert isinstance(args, list)
-        alt = Alternative( self, name_id, args )        
+        alt = Alternative( self, name_id, args )
         self.all_rules.append( alt )
         return alt
-    
+
     def Alternative_n(self, name, args ):
         # assert isinstance(name, str)
         name_id = self.add_symbol( name )
@@ -851,7 +852,7 @@
         alt = Sequence( self, name_id, args )
         self.all_rules.append( alt )
         return alt
-    
+
     def Sequence_n(self, name, args ):
         # assert isinstance(name, str)
         name_id = self.add_symbol( name )
@@ -862,7 +863,7 @@
         alt = KleeneStar( self, name_id, _min, _max, rule )
         self.all_rules.append( alt )
         return alt
-    
+
     def KleeneStar_n(self, name, _min = 0, _max = -1, rule = None ):
         # assert isinstance(name, str)
         name_id = self.add_symbol( name )

Modified: pypy/dist/pypy/interpreter/pyparser/test/__init__.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/__init__.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/test/__init__.py	Fri Jul 13 14:53:45 2007
@@ -0,0 +1 @@
+

Added: pypy/dist/pypy/interpreter/pyparser/test/fakes.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/interpreter/pyparser/test/fakes.py	Fri Jul 13 14:53:45 2007
@@ -0,0 +1,38 @@
+
+class FakeSpace:
+    w_None = None
+    w_str = str
+    w_basestring = basestring
+    w_int = int
+
+    def wrap(self,obj):
+        return obj
+
+    def isinstance(self, obj, wtype ):
+        return isinstance(obj,wtype)
+
+    def is_true(self, obj):
+        return obj
+
+    def eq_w(self, obj1, obj2):
+        return obj1 == obj2
+
+    def is_w(self, obj1, obj2):
+        return obj1 is obj2
+
+    def type(self, obj):
+        return type(obj)
+
+    def newlist(self, lst):
+        return list(lst)
+
+    def newtuple(self, lst):
+        return tuple(lst)
+
+    def call_method(self, obj, meth, *args):
+        return getattr(obj, meth)(*args)
+
+    def call_function(self, func, *args):
+        return func(*args)
+
+    builtin = dict(int=int, long=long, float=float, complex=complex)

Modified: pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py	Fri Jul 13 14:53:45 2007
@@ -13,7 +13,7 @@
 
 from pypy.interpreter.astcompiler import ast
 
-
+from fakes import FakeSpace
 from expressions import TESTS, SINGLE_INPUTS, EXEC_INPUTS
 
 def arglist_equal(left,right):
@@ -49,7 +49,7 @@
         left_nodes = list(left.getChildren())
         right_nodes = list(right.getChildren())
         if len(left_nodes) != len(right_nodes):
-            print "Number of children mismatch:", left, right 
+            print "Number of children mismatch:", left, right
             return False
         for left_node, right_node in zip(left_nodes, right_nodes):
             if not nodes_equal(left_node, right_node, check_lineno):
@@ -60,7 +60,7 @@
         return left==right
     if left.__class__.__name__ != right.__class__.__name__:
         print "Node type mismatch:", left, right
-        return False    
+        return False
     if isinstance(left,test_ast.Function) and isinstance(right,ast_ast.Function):
         left_nodes = list(left.getChildren())
         right_nodes = [] # generated ast differ here because argnames is a list of nodes in
@@ -118,7 +118,7 @@
         if right.value is None:
             right_nodes = (ast_ast.Const(None),)
         else:
-            right_nodes = right.getChildren()    
+            right_nodes = right.getChildren()
     elif isinstance(left,test_ast.Subscript):
         # test_ast.Subscript is not expressive enough to tell the difference
         # between a[x] and a[x,]  :-(
@@ -131,14 +131,14 @@
         left_nodes = left.getChildren()
         right_nodes = right.getChildren()
     if len(left_nodes)!=len(right_nodes):
-        print "Number of children mismatch:", left, right 
+        print "Number of children mismatch:", left, right
         return False
     for i,j in zip(left_nodes,right_nodes):
         if not nodes_equal(i,j, check_lineno):
             return False
     if check_lineno:
         # left is a stablecompiler.ast node which means and stable compiler
-        # doesn't set a lineno on each Node. 
+        # doesn't set a lineno on each Node.
         # (stablecompiler.ast.Expression doesn't have a lineno attribute)
         if hasattr(left, 'lineno') and left.lineno is not None and left.lineno != right.lineno:
             print "(1) (%s) left: %s, right: %s" % (left, left.lineno, right.lineno)
@@ -175,44 +175,6 @@
     }
 
 
-class FakeSpace:
-    w_None = None
-    w_str = str
-    w_basestring = basestring
-    w_int = int
-    
-    def wrap(self,obj):
-        return obj
-
-    def isinstance(self, obj, wtype ):
-        return isinstance(obj,wtype)
-
-    def is_true(self, obj):
-        return obj
-
-    def eq_w(self, obj1, obj2):
-        return obj1 == obj2
-
-    def is_w(self, obj1, obj2):
-        return obj1 is obj2
-
-    def type(self, obj):
-        return type(obj)
-
-    def newlist(self, lst):
-        return list(lst)
-
-    def newtuple(self, lst):
-        return tuple(lst)
-    
-    def call_method(self, obj, meth, *args):
-        return getattr(obj, meth)(*args)
-
-    def call_function(self, func, *args):
-        return func(*args)
-
-    builtin = dict(int=int, long=long, float=float, complex=complex)
-
 # Create parser from Grammar_stable, not current grammar.
 stable_parser = pythonparse.make_pyparser('stable')
 python_parser = pythonparse.make_pyparser() # 'native') # 2.5a')
@@ -241,7 +203,7 @@
         check_lineno = False
     print "-" * 30
     print "ORIG :", python_ast
-    print 
+    print
     print "BUILT:", pypy_ast
     print "-" * 30
     assert nodes_equal(python_ast, pypy_ast, check_lineno), 'failed on %r' % (expr)
@@ -258,12 +220,12 @@
             yield check_expression, expr, 'exec'
 
 
-NEW_GRAMMAR_SNIPPETS = [    
+NEW_GRAMMAR_SNIPPETS = [
     'snippet_with_1.py',
     'snippet_with_2.py',
     ]
 
-SNIPPETS = [    
+SNIPPETS = [
     'snippet_1.py',
     'snippet_several_statements.py',
     'snippet_simple_function.py',

Added: pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder_future.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder_future.py	Fri Jul 13 14:53:45 2007
@@ -0,0 +1,37 @@
+from pypy.interpreter.pyparser.astbuilder import AstBuilder
+from pypy.interpreter.pyparser.grammar import Parser
+from pypy.interpreter.pyparser.pytoken import setup_tokens
+from fakes import FakeSpace
+
+
+class ParserStub():
+    def __init__(self):
+        self.tokens = {}
+        self._sym_count = 0
+        self.tok_values = {}
+        self.tok_rvalues = {}
+
+    def add_token( self, tok, value = None ):
+        # assert isinstance( tok, str )
+        if not tok in self.tokens:
+            val = self._sym_count
+            self._sym_count += 1
+            self.tokens[tok] = val
+            #self.tok_name[val] = tok
+            if value is not None:
+                self.tok_values[value] = val
+                self.tok_rvalues[val] = value
+            return val
+        return self.tokens[ tok ]
+
+
+class TestBuilderFuture:
+    def setup_class(self):
+        self.parser = ParserStub()
+        setup_tokens(self.parser)
+
+    def setup_method(self, method):
+        self.builder = AstBuilder(self.parser, space=FakeSpace())
+
+    def test_future_rules(self):
+        assert 'future_import_feature' in self.builder.build_rules

Modified: pypy/dist/pypy/interpreter/pyparser/test/test_parser.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/test_parser.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_parser.py	Fri Jul 13 14:53:45 2007
@@ -1,5 +1,7 @@
 from pypy.interpreter.pyparser.grammar import Parser
 from pypy.interpreter.pyparser import error
+from fakes import FakeSpace
+
 
 def test_symbols():
     p = Parser()
@@ -42,47 +44,10 @@
     v = p.add_symbol( 'sym3' )
     assert v == 9
 
-class FakeSpace:
-    w_None = None
-    w_str = str
-    w_basestring = basestring
-    w_int = int
-    
-    def wrap(self,obj):
-        return obj
-
-    def isinstance(self, obj, wtype ):
-        return isinstance(obj,wtype)
-
-    def is_true(self, obj):
-        return obj
-
-    def eq_w(self, obj1, obj2):
-        return obj1 == obj2
-
-    def is_w(self, obj1, obj2):
-        return obj1 is obj2
-
-    def type(self, obj):
-        return type(obj)
-
-    def newlist(self, lst):
-        return list(lst)
-
-    def newtuple(self, lst):
-        return tuple(lst)
-    
-    def call_method(self, obj, meth, *args):
-        return getattr(obj, meth)(*args)
-
-    def call_function(self, func, *args):
-        return func(*args)
-
-    builtin = dict(int=int, long=long, float=float, complex=complex)
 
 from pypy.interpreter.pyparser.asthelper import get_atoms
 class RuleTracer(dict):
-    
+
     def __init__(self, *args, **kw):
         self.trace = []
 
@@ -92,7 +57,7 @@
                     'single_input', 'file_input', 'future_import_list',
                     'import_from_future', 'future_import_as_names']:
             return None
-        
+
         def record_trace(builder, number):
             result = [t.value for t in get_atoms(builder, number)]
             self.trace.append((attr, result))
@@ -100,7 +65,7 @@
 
     def get(self, attr, default):
         return self.__getitem__(attr)
-    
+
 from pypy.interpreter.pyparser.astbuilder import AstBuilder
 class MockBuilder(AstBuilder):
 
@@ -110,7 +75,7 @@
 
 
 class TestFuture(object):
-    
+
     def setup_class(self):
         from pypy.interpreter.pyparser.pythonparse import make_pyparser
         self.parser = make_pyparser('2.5a')
@@ -121,18 +86,18 @@
     def check_parse_mode(self, tst, expected, mode):
         self.parser.parse_source(tst, mode, self.builder)
         assert self.builder.build_rules.trace == expected
-        
+
     def check_parse(self, tst, expected):
         self.check_parse_mode(tst, expected, 'exec')
         self.builder.build_rules.trace = []
         self.check_parse_mode(tst, expected, 'single')
 
-        
+
     def test_single_future_import(self):
         tst = 'from __future__ import na\n'
         expected = [('future_import_feature', ['na'])]
         self.check_parse(tst, expected)
-        
+
     def test_double_future_import(self):
         tst = 'from __future__ import na, xx\n'
         expected = [('future_import_feature', ['na']),
@@ -160,7 +125,7 @@
         tst = 'from __future__ import na as x\n'
         expected = [('future_import_feature', ['na', 'as', 'x'])]
         self.check_parse(tst, expected)
-        
+
     def test_single_future_as(self):
         tst = 'import sys;from __future__ import na as x\n'
         expected = []
@@ -174,4 +139,4 @@
         tst = 'import sys'
         expected = [('import_name', ['import', 'sys'])]
         self.check_parse(tst, expected)
-        
+



More information about the Pypy-commit mailing list