def run(self): failed = [] for library in self._options.libraries: try: xml_doc = StringIO() # LibraryDocumentation().save() calls close() for the underlying # file but closing StringIO object discards its data. # This is why close() is overridden below. xml_doc.original_close = xml_doc.close try: try: if library.endswith('.xml'): with open(library) as xml_file: xml_doc.write(xml_file.read()) else: xml_doc.close = lambda: None LibraryDocumentation(library).save(xml_doc, 'xml') except DataError as e: message = "Library not found" if 'ImportError' in e.message else e.message failed.append(library) sys.stderr.write( "Skipping '%s' due to an error: %s.\n" % (library, message)) continue xml_doc.name = library self._uploader.upload_file(xml_doc, self._options.lib_name, self._options.lib_version) sys.stdout.write("Updated documentation for '%s'.\n" % library) finally: xml_doc.original_close() except DataError as e: failed.append(library) sys.stderr.write('%s: Remote error: %s\n' % (os.path.basename(__file__), e.message)) if failed: sys.stderr.write('\nERROR: Uploading %d file(s) failed:\n' % len(failed)) for name in failed: sys.stderr.write('* %s\n' % name) exit(1)