CVS: Products/Zelenium - CHANGES.txt:1.29 README.txt:1.8 zuite.py:1.18

Tres Seaver <[email protected]>
Newsgroups gmane.comp.web.zope.public-cvs
Message-ID <[email protected]>
Update of /cvs-repository/Products/Zelenium
In directory cvs.zope.org:/tmp/cvs-serv25227

Modified Files:
	CHANGES.txt README.txt zuite.py 
Log Message:
 - Add support for ordering / globbing test cases / subdirs.


=== Products/Zelenium/CHANGES.txt 1.28 => 1.29 ===
--- Products/Zelenium/CHANGES.txt:1.28	Sat May  7 16:33:25 2005
+++ Products/Zelenium/CHANGES.txt	Mon May  9 14:50:28 2005
@@ -6,12 +6,6 @@
       including recursion through subdirectories of that path.  Currently,
       the implementation has the following issues:
 
-      o It doesn't provide control over the order in which test cases or
-        subdirectories are returned.
-
-      o It doesn't allow exclusion / filtering of subdirectories or
-        test cases.
-
       o It only creates OFS.Image.File objects for test cases (no templates,
         scripts, etc.)
 


=== Products/Zelenium/README.txt 1.7 => 1.8 ===
--- Products/Zelenium/README.txt:1.7	Sat May  7 16:38:07 2005
+++ Products/Zelenium/README.txt	Mon May  9 14:50:28 2005
@@ -67,6 +67,24 @@
     suite will recursively load testcases from files in / under the
     directory pointed to by that path.
 
+    The list of files to be included is computed via the following
+    rules:
+
+     - If the directory contains a file, '.objects', it is presumed to
+       contain a list of files to be included, one per line;  only those
+       files / subdirectories (if present) will be included.  In this case,
+       the test cases will be presented in the order indicated in the file,
+       followed by any test cases from subdirectories.
+
+     - Otherwise, if the suite's property, 'filename_glob' is non-empty,
+       it will be expanded (via Python's 'glob.glob') to compute the list
+       of filenames.  The test cases will be presented in alphabetical
+       order, followed by any test cases from subdirectories.
+
+     - Otherwise, any file will be considered a testcase.  The test cases
+       will be presented in alphabetical order, followed by any test cases
+       from subdirectories.
+
   Exporting an Archive
 
     On the "Zip" tab, supply a filename and click the "Download" button.


=== Products/Zelenium/zuite.py 1.17 => 1.18 ===
--- Products/Zelenium/zuite.py:1.17	Sat May  7 16:33:25 2005
+++ Products/Zelenium/zuite.py	Mon May  9 14:50:28 2005
@@ -4,6 +4,7 @@
 
 $Id$
 """
+import glob
 import os
 import re
 from urllib import unquote
@@ -29,7 +30,7 @@
 
 _PINK_BACKGROUND = re.compile('bgcolor="#ffcfcf"')
 
-_EXCLUDE_NAMES = ( 'CVS', '.svn' )
+_EXCLUDE_NAMES = ( 'CVS', '.svn', '.objects' )
 
 def _getNow():
     if _NOW is not None:
@@ -60,11 +61,19 @@
                       , 'selenium-logo.png'
                       ]
 
-def _makeFile(filename):
-    path = os.path.join(_SUPPORT_DIR, filename)
-    return File(id=filename, title='', file=open(path).read())
+def _makeFile(filename, prefix=None, id=None):
 
-_SUPPORT_FILES = dict( [ ( x, _makeFile(x) )
+    if prefix:
+        path = os.path.join( prefix, filename )
+    else:
+        path = filename
+
+    if id is None:
+        id = os.path.split( path )[ 1 ]
+
+    return File( id=id, title='', file=open(path).read() )
+
+_SUPPORT_FILES = dict( [ ( x, _makeFile( x, prefix=_SUPPORT_DIR ) )
                             for x in _SUPPORT_FILE_NAMES ] )
 
 _MARKER = object()
@@ -89,6 +98,7 @@
                           , 'Page Template'
                           )
     filesystem_path = ''
+    filename_glob = ''
     _v_filesystem_objects = None
 
     _properties = ( { 'id' : 'test_case_metatypes'
@@ -99,6 +109,10 @@
                     , 'type' : 'string'
                     , 'mode' : 'w'
                     }
+                  , { 'id' : 'filename_glob'
+                    , 'type' : 'string'
+                    , 'mode' : 'w'
+                    }
                   )
 
     security = ClassSecurityInfo()
@@ -170,20 +184,29 @@
     security.declarePrivate( '_recurseFSTestCases' )
     def _recurseFSTestCases( self, result, prefix, fsobjs ):
 
-        for tcid, test_case in fsobjs.get( 'testcases', {} ).items():
-            path = '/'.join( prefix + ( tcid, ) )
-            result.append( { 'id' : tcid
-                            , 'title' : test_case.title_or_id()
-                            , 'url' : path
-                            , 'path' : path
-                            , 'test_case' : test_case
-                            } )
-
-        for name, info in fsobjs.get( 'subdirs', {} ).items():
-            self._recurseFSTestCases( result
-                                    , prefix + ( name, )
-                                    , info
-                                    )
+        test_cases = dict( [ ( x.getId(), x )
+                                for x in fsobjs.get( 'testcases', () ) ] )
+        subdirs = fsobjs.get( 'subdirs', {} )
+
+        for name in fsobjs.get( 'ordered', [] ):
+
+            if name in test_cases:
+                test_case = test_cases[ name ]
+                name = test_case.getId()
+                path = '/'.join( prefix + ( name, ) )
+                result.append( { 'id' : name
+                               , 'title' : test_case.title_or_id()
+                               , 'url' : path
+                               , 'path' : path
+                               , 'test_case' : test_case
+                               } )
+
+            if name in subdirs:
+                info = subdirs[ name ]
+                self._recurseFSTestCases( result
+                                        , prefix + ( name, )
+                                        , info
+                                        )
 
 
     security.declareProtected(ManageSeleniumTestCases, 'getZipFileName')
@@ -367,18 +390,32 @@
     security.declarePrivate('_grubFilesystem')
     def _grubFilesystem( self, path ):
 
-        info = { 'testcases' : {}, 'subdirs' : {} }
+        info = { 'testcases' : (), 'subdirs' : {} }
+
+        # Look for a '.objects' file with an explicit manifiest
+        manifest = os.path.join( path, '.objects' )
 
-        for name in os.listdir( path ):
+        if os.path.isfile( manifest ):
+            filenames = [ x.strip() for x in open( manifest ).readlines() ]
 
-            if name in _EXCLUDE_NAMES:
-                continue
+        elif self.filename_glob:
+            globbed = glob.glob( os.path.join( path, self.filename_glob ) )
+            filenames = [ os.path.split( x )[ 1 ] for x in globbed ]
+
+        else:   # guess
+            filenames = [ x for x in os.listdir( path )
+                                if x not in _EXCLUDE_NAMES ]
+            filenames.sort()
+
+        info[ 'ordered' ] = filenames
+
+        for name in filenames:
 
             fqfn = os.path.join( path, name )
 
             if os.path.isfile( fqfn ):
                 testcase = _makeFile( fqfn )
-                info[ 'testcases' ][ name ] = testcase.__of__( self )
+                info[ 'testcases' ] += ( testcase, )
 
             elif os.path.isdir( fqfn ):
                 info[ 'subdirs' ][ name ] = self._grubFilesystem( fqfn )
@@ -408,17 +445,45 @@
 
         test_cases = self.listTestCases()
 
-        # ensure suffixes
+        paths = { '' : [] }
+
+        def _ensurePath( prefix, element ):
+            elements = paths.setdefault( prefix, [] )
+            if element not in elements:
+                elements.append( element )
+
         for info in test_cases:
-            info[ 'path' ] = self._getFilename( info[ 'path' ] )
+            # ensure suffixes
+            path = self._getFilename( info[ 'path' ] )
+            info[ 'path' ] = path
             info[ 'url' ] = self._getFilename( info[ 'url' ] )
 
+        for info in test_cases:
+            #parent, filename = os.path.split( info[ 'path' ] )
+            #paths.setdefault( parent, [] ).append( filename )
+            elements = info[ 'path' ].split( os.path.sep )
+            _ensurePath( '', elements[ 0 ] )
+            for i in range( 1, len( elements ) ):
+                prefix = '/'.join( elements[ : i ] )
+                _ensurePath( prefix, elements[ i ] )
+
         archive.writestr( 'testSuite.html'
                         , self.test_suite_html( test_cases=test_cases ) )
 
         for k, v in _SUPPORT_FILES.items():
             archive.writestr( k, v.manage_FTPget() )
 
+        for pathname, filenames in paths.items():
+
+            if pathname == '':
+                filename = '.objects'
+            else:
+                filename = '%s/.objects' % pathname
+
+            archive.writestr( filename
+                            , '\n'.join( filenames )
+                            )
+
         for info in test_cases:
             test_case = info[ 'test_case' ]
 
@@ -558,8 +623,9 @@
     security.declareProtected( View, 'get' )
     def get( self, key, default=_MARKER ):
 
-        if key in self._fsobjs[ 'testcases' ]:
-            return self._fsobjs[ 'testcases' ][ key ].__of__( self )
+        for tc in self._fsobjs[ 'testcases' ]:
+            if tc.getId() == key:
+                return tc.__of__( self )
 
         if key in self._fsobjs[ 'subdirs' ]:
             return self.__class__( self._fsobjs[ 'subdirs' ][ key ]

_______________________________________________
Zope-CVS maillist  -  [email protected]
http://mail.zope.org/mailman/listinfo/zope-cvs

Zope CVS instructions: http://dev.zope.org/CVS
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.