Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

82 lines (66 sloc) 2.719 kb
# Unwrapt - cross-platform package system emulator
# Copyright (C) 2010 Chris Oliver <>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 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
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <>.
import os
def url_join(*args):
""" Returns full URL """
# Strip any leading or trailing slashes from the parts.
args = [x.strip("/") for x in args]
return "/".join(args)
def to_url(repository, architecture, format):
return url_join(repository["url"], architecture, format)
def to_filename(directory, url):
Forms a full filename from a directory and url.
i.e. Strips the url of the protocol prefix, replaces all slashes with
underscores, and appends it to directory.
return os.path.join(directory, url.split("//")[1].replace("/", "_"))
def format_number(number, SI=0, space=' '):
Turn numbers into human-readable metric-like numbers
Used from the urlgrabber library
symbols = ['', # (none)
'k', # kilo
'M', # mega
'G', # giga
'T', # tera
'P', # peta
'E', # exa
'Z', # zetta
'Y'] # yotta
if SI: step = 1000.0
else: step = 1024.0
thresh = 999
depth = 0
max_depth = len(symbols) - 1
# we want numbers between 0 and thresh, but don't exceed the length
# of our list. In that event, the formatting will be screwed up,
# but it'll still show the right number.
while number > thresh and depth < max_depth:
depth = depth + 1
number = number / step
if type(number) == type(1) or type(number) == type(1L):
# it's an int or a long, which means it didn't get divided,
# which means it's already short enough
format = '%i%s%s'
elif number < 9.95:
# must use 9.95 for proper sizing. For example, 9.99 will be
# rounded to 10.0 with the .1f format string (which is too long)
format = '%.1f%s%s'
format = '%.0f%s%s'
return(format % (float(number or 0), space, symbols[depth]))
Jump to Line
Something went wrong with that request. Please try again.