Commit f1fcb31ecd5710d1bbf0dd0c4a580dad7452f772

Authored by Christian Herdtweck
1 parent aede664b

created PathNotFoundException in xglob; yield as 3rd arg instead of raising it

oletools/thirdparty/xglob/xglob.py
@@ -60,6 +60,15 @@ __version__ = '0.05' @@ -60,6 +60,15 @@ __version__ = '0.05'
60 60
61 import os, fnmatch, glob, zipfile 61 import os, fnmatch, glob, zipfile
62 62
  63 +#=== EXCEPTIONS ==============================================================
  64 +
  65 +class PathNotFoundException(Exception):
  66 + """ raised if given a fixed file/dir (not a glob) that does not exist """
  67 + def __init__(self, path):
  68 + super(PathNotFoundException, self).__init__(
  69 + 'Given path does not exist: %r' % path)
  70 +
  71 +
63 #=== FUNCTIONS =============================================================== 72 #=== FUNCTIONS ===============================================================
64 73
65 # recursive glob function to find files in any subfolder: 74 # recursive glob function to find files in any subfolder:
@@ -118,8 +127,11 @@ def iter_files(files, recursive=False, zip_password=None, zip_fname='*'): @@ -118,8 +127,11 @@ def iter_files(files, recursive=False, zip_password=None, zip_fname='*'):
118 - then files matching zip_fname are opened from the zip archive 127 - then files matching zip_fname are opened from the zip archive
119 128
120 Iterator: yields (container, filename, data) for each file. If zip_password is None, then 129 Iterator: yields (container, filename, data) for each file. If zip_password is None, then
121 - only the filename is returned, container and data=None. Otherwise container si the  
122 - filename of the container (zip file), and data is the file content. 130 + only the filename is returned, container and data=None. Otherwise container is the
  131 + filename of the container (zip file), and data is the file content (or an exception).
  132 + If a given filename is not a glob and does not exist, the triplet
  133 + (None, filename, PathNotFoundException) is yielded. (Globs matching nothing
  134 + do not trigger exceptions)
123 """ 135 """
124 #TODO: catch exceptions and yield them for the caller (no file found, file is not zip, wrong password, etc) 136 #TODO: catch exceptions and yield them for the caller (no file found, file is not zip, wrong password, etc)
125 #TODO: use logging instead of printing 137 #TODO: use logging instead of printing
@@ -132,7 +144,7 @@ def iter_files(files, recursive=False, zip_password=None, zip_fname='*'): @@ -132,7 +144,7 @@ def iter_files(files, recursive=False, zip_password=None, zip_fname='*'):
132 iglob = glob.iglob 144 iglob = glob.iglob
133 for filespec in files: 145 for filespec in files:
134 if not is_glob(filespec) and not os.path.exists(filespec): 146 if not is_glob(filespec) and not os.path.exists(filespec):
135 - raise ValueError('given path {} does not exist!'.format(filespec)) 147 + yield None, PathNotFoundException(filespec), None
136 for filename in iglob(filespec): 148 for filename in iglob(filespec):
137 if zip_password is not None: 149 if zip_password is not None:
138 # Each file is expected to be a zip archive: 150 # Each file is expected to be a zip archive: