utils: copy tools-related utility functions
This commit is contained in:
		
							parent
							
								
									f59ff0c641
								
							
						
					
					
						commit
						e826ebff53
					
				
							
								
								
									
										128
									
								
								qubesmgmt/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								qubesmgmt/utils.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | |||||||
|  | # encoding=utf-8 | ||||||
|  | # | ||||||
|  | # The Qubes OS Project, https://www.qubes-os.org/ | ||||||
|  | # | ||||||
|  | # Copyright (C) 2010-2015  Joanna Rutkowska <joanna@invisiblethingslab.com> | ||||||
|  | # Copyright (C) 2013-2015  Marek Marczykowski-Górecki | ||||||
|  | #                              <marmarek@invisiblethingslab.com> | ||||||
|  | # Copyright (C) 2014-2015  Wojtek Porczyk <woju@invisiblethingslab.com> | ||||||
|  | # | ||||||
|  | # This program is free software; you can redistribute it and/or modify | ||||||
|  | # it under the terms of the GNU Lesser General Public License as published by | ||||||
|  | # the Free Software Foundation; either version 2.1 of the License, or | ||||||
|  | # (at your option) any later version. | ||||||
|  | # | ||||||
|  | # This program is distributed in the hope that it will be useful, | ||||||
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | # GNU Lesser General Public License for more details. | ||||||
|  | # | ||||||
|  | # You should have received a copy of the GNU Lesser General Public License along | ||||||
|  | # with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | '''Various utility functions.''' | ||||||
|  | 
 | ||||||
|  | import pkg_resources | ||||||
|  | 
 | ||||||
|  | import docutils | ||||||
|  | import docutils.core | ||||||
|  | import docutils.io | ||||||
|  | import qubesmgmt.exc | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def format_doc(docstring): | ||||||
|  |     '''Return parsed documentation string, stripping RST markup. | ||||||
|  |     ''' | ||||||
|  | 
 | ||||||
|  |     if not docstring: | ||||||
|  |         return '' | ||||||
|  | 
 | ||||||
|  |     # pylint: disable=unused-variable | ||||||
|  |     output, pub = docutils.core.publish_programmatically( | ||||||
|  |         source_class=docutils.io.StringInput, | ||||||
|  |         source=' '.join(docstring.strip().split()), | ||||||
|  |         source_path=None, | ||||||
|  |         destination_class=docutils.io.NullOutput, destination=None, | ||||||
|  |         destination_path=None, | ||||||
|  |         reader=None, reader_name='standalone', | ||||||
|  |         parser=None, parser_name='restructuredtext', | ||||||
|  |         writer=None, writer_name='null', | ||||||
|  |         settings=None, settings_spec=None, settings_overrides=None, | ||||||
|  |         config_section=None, enable_exit_status=None) | ||||||
|  |     return pub.writer.document.astext() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def parse_size(size): | ||||||
|  |     '''Parse human readable size into bytes.''' | ||||||
|  |     units = [ | ||||||
|  |         ('K', 1000), ('KB', 1000), | ||||||
|  |         ('M', 1000 * 1000), ('MB', 1000 * 1000), | ||||||
|  |         ('G', 1000 * 1000 * 1000), ('GB', 1000 * 1000 * 1000), | ||||||
|  |         ('Ki', 1024), ('KiB', 1024), | ||||||
|  |         ('Mi', 1024 * 1024), ('MiB', 1024 * 1024), | ||||||
|  |         ('Gi', 1024 * 1024 * 1024), ('GiB', 1024 * 1024 * 1024), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     size = size.strip().upper() | ||||||
|  |     if size.isdigit(): | ||||||
|  |         return int(size) | ||||||
|  | 
 | ||||||
|  |     for unit, multiplier in units: | ||||||
|  |         if size.endswith(unit): | ||||||
|  |             size = size[:-len(unit)].strip() | ||||||
|  |             return int(size) * multiplier | ||||||
|  | 
 | ||||||
|  |     raise qubesmgmt.exc.QubesException("Invalid size: {0}.".format(size)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def mbytes_to_kmg(size): | ||||||
|  |     '''Convert mbytes to human readable format.''' | ||||||
|  |     if size > 1024: | ||||||
|  |         return "%d GiB" % (size / 1024) | ||||||
|  |     else: | ||||||
|  |         return "%d MiB" % size | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def kbytes_to_kmg(size): | ||||||
|  |     '''Convert kbytes to human readable format.''' | ||||||
|  |     if size > 1024: | ||||||
|  |         return mbytes_to_kmg(size / 1024) | ||||||
|  |     else: | ||||||
|  |         return "%d KiB" % size | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def bytes_to_kmg(size): | ||||||
|  |     '''Convert bytes to human readable format.''' | ||||||
|  |     if size > 1024: | ||||||
|  |         return kbytes_to_kmg(size / 1024) | ||||||
|  |     else: | ||||||
|  |         return "%d B" % size | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def size_to_human(size): | ||||||
|  |     """Humane readable size, with 1/10 precision""" | ||||||
|  |     if size < 1024: | ||||||
|  |         return str(size) | ||||||
|  |     elif size < 1024 * 1024: | ||||||
|  |         return str(round(size / 1024.0, 1)) + ' KiB' | ||||||
|  |     elif size < 1024 * 1024 * 1024: | ||||||
|  |         return str(round(size / (1024.0 * 1024), 1)) + ' MiB' | ||||||
|  |     else: | ||||||
|  |         return str(round(size / (1024.0 * 1024 * 1024), 1)) + ' GiB' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_entry_point_one(group, name): | ||||||
|  |     '''Get a single entry point of given type, | ||||||
|  |     raise TypeError when there are multiple. | ||||||
|  |     ''' | ||||||
|  |     epoints = tuple(pkg_resources.iter_entry_points(group, name)) | ||||||
|  |     if not epoints: | ||||||
|  |         raise KeyError(name) | ||||||
|  |     elif len(epoints) > 1: | ||||||
|  |         raise TypeError( | ||||||
|  |             'more than 1 implementation of {!r} found: {}'.format(name, | ||||||
|  |                 ', '.join('{}.{}'.format(ep.module_name, '.'.join(ep.attrs)) | ||||||
|  |                     for ep in epoints))) | ||||||
|  |     return epoints[0].load() | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki