def data(self): data = self.read() mime = magic.from_buffer(data, mime=True) if mime.startswith('text'): return data.decode('utf-8') else: return 'Non-text data: ' + mime + '\n'
def wrapper(cls, raw=False, *args, **kw): data = fcn(cls) if raw: # return raw data without decompressing return data mime_type, mime_subtype = magic.from_buffer(data, mime=True).split('/') while mime_subtype in ('x-bzip2', 'x-bzip', 'bzip', 'x-gzip', 'gzip', 'x-xz'): if mime_subtype in ('x-bzip2', 'x-bzip', 'bzip'): data = bz2.decompress(data) elif mime_subtype in ('x-gzip', 'gzip'): data = zlib.decompress(data, 16+zlib.MAX_WBITS) elif mime_subtype in ('x-xz'): data = lzma.decompress(data) mime_type, mime_subtype = magic.from_buffer(data, mime=True).split('/') return data
def __init__(self, id=None, filename=None, url=None, size=None, mimetype=None, data=None, created=None, modified=None): self.id = id # make sure the file name is valid # TODO: fix this to remove all os.path.sep chars self.filename = filename if self.filename is not None: self.filename = os.path.basename(re.sub(r'\.\.', '', self.filename)) self.url = url self.size = size self.mimetype = mimetype self.data = data self.created = created self.modified = modified # don't trust the content type -- users often set the wrong mimetypes if self.data is not None: mimetype = magic.from_buffer(self.read(), mime=True) if mimetype == 'application/octet-stream': # assume these are plaintext self.mimetype = 'text/plain' else: self.mimetype = mimetype
def add_attachment(self, ids, data=None, filepath=None, filename=None, mimetype=None, is_patch=False, is_private=False, comment=None, summary=None, **kw): """Add an attachment to a bug :param ids: The ids or aliases of bugs that you want to add the attachment to. :type ids: list of ints and/or strings :param data: Raw attachment data :type data: binary data :param filepath: Path to the file. :type filepath: string :param filename: The file name that will be displayed in the UI for the attachment. :type filename: string :param mimetype: The MIME type of the attachment, like text/plain or image/png. :type mimetype: string :param comment: A comment to add along with the attachment. :type comment: string :param summary: A short string describing the attachment. :type summary: string :param is_patch: True if Bugzilla should treat this attachment as a patch. If specified, a content_type doesn't need to be specified as it is forced to text/plain. Defaults to false if unspecified. :type is_patch: boolean :param is_private: True if the attachment should be private, False if public. Defaults to false if unspecified. :type is_private: boolean :raises ValueError: if no bug IDs are specified :raises ValueError: if data or filepath arguments aren't specified :raises ValueError: if data isn't defined and filepath points to a nonexistent file :raises ValueError: if filepath isn't defined and summary or filename isn't specified :returns: attachment IDs created :rtype: list of attachment IDs """ if not ids: raise ValueError('No bug ID(s) specified') if data is not None: params['data'] = base64.b64encode(data) else: if filepath is None: raise ValueError('Either data or a filepath must be passed as an argument') else: if not os.path.exists(filepath): raise ValueError('File not found: {}'.format(filepath)) else: with open(filepath, 'rb') as f: params['data'] = base64.b64encode(f.read()) if filename is None: if filepath is not None: filename = os.path.basename(filepath) else: raise ValueError('A valid filename must be specified') if mimetype is None and not is_patch: if data is not None: mimetype = magic.from_buffer(data, mime=True) else: mimetype = magic.from_file(filepath, mime=True) if summary is None: if filepath is not None: summary = filename else: raise ValueError('A valid summary must be specified') params = {'ids': ids} params['file_name'] = filename params['summary'] = summary if not is_patch: params['content_type'] = mimetype params['comment'] = comment params['is_patch'] = is_patch method = 'Bug.add_attachment' req = self.create_request(method, params) result = self.send(req) return result['attachments']