Commit f1fcb31ecd5710d1bbf0dd0c4a580dad7452f772
1 parent
aede664b
created PathNotFoundException in xglob; yield as 3rd arg instead of raising it
Showing
1 changed file
with
15 additions
and
3 deletions
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: |