4 Commits

Author SHA1 Message Date
Kenneth Reitz a484f9b693 pythons 2012-02-26 13:20:33 -05:00
Kenneth Reitz 706d8b4327 yeah 2012-02-26 13:18:08 -05:00
Kenneth Reitz 17b811865c mission statement 2012-02-26 13:17:50 -05:00
utahta ea7cb63494 v1.1 2011-08-29 18:01:31 +09:00
26 changed files with 344 additions and 224 deletions
+1
View File
@@ -9,3 +9,4 @@ pythonbrew.egg-info
dist dist
__pycache__ __pycache__
*.swp *.swp
.idea
+3
View File
@@ -1,3 +1,6 @@
* 1.1
- Added --framework, --universal and --static options to install command.
* 1.0 * 1.0
- Added systemwide install support. (issue #31) - Added systemwide install support. (issue #31)
- Fixed issue #41 Handle venv binary with the symlink command. - Fixed issue #41 Handle venv binary with the symlink command.
+5
View File
@@ -173,6 +173,11 @@ See more details below
Changelog Changelog
========= =========
1.1 (2011-08-29)
----------------
- Added --framework, --universal and --static options to install command.
1.0 (2011-08-08) 1.0 (2011-08-08)
---------------- ----------------
+23 -13
View File
@@ -1,6 +1,16 @@
Overview Overview
======== ========
Pythonbrew is anti-virtualenv. This isn't.
Differences:
- No `switch`. That's crazy.
- Bottles (pre-compiled Pythons)
----------------------------------
pythonbrew is a program to automate the building and installation of Python in the users $HOME. pythonbrew is a program to automate the building and installation of Python in the users $HOME.
pythonbrew is inspired by `perlbrew <http://github.com/gugod/App-perlbrew>`_ and `rvm <https://github.com/wayneeseguin/rvm>`_. pythonbrew is inspired by `perlbrew <http://github.com/gugod/App-perlbrew>`_ and `rvm <https://github.com/wayneeseguin/rvm>`_.
@@ -12,7 +22,7 @@ The recommended way to download and install pythonbrew is to run these statement
curl -kL http://xrl.us/pythonbrewinstall | bash curl -kL http://xrl.us/pythonbrewinstall | bash
After that, pythonbrew installs itself to ~/.pythonbrew. After that, pythonbrew installs itself to ~/.pythonbrew.
Please add the following line to the end of your ~/.bashrc:: Please add the following line to the end of your ~/.bashrc::
@@ -40,7 +50,7 @@ Usage
===== =====
pythonbrew command [options] pythonbrew command [options]
Install some pythons:: Install some pythons::
pythonbrew install 2.7.2 pythonbrew install 2.7.2
@@ -53,7 +63,7 @@ Install some pythons::
pythonbrew install /path/to/Python-2.7.2.tgz pythonbrew install /path/to/Python-2.7.2.tgz
pythonbrew install /path/to/Python-2.7.2 pythonbrew install /path/to/Python-2.7.2
pythonbrew install 2.7.2 3.2 pythonbrew install 2.7.2 3.2
Permanently use the specified python:: Permanently use the specified python::
pythonbrew switch 2.7.2 pythonbrew switch 2.7.2
@@ -95,7 +105,7 @@ Upgrades pythonbrew to the latest version::
Disable pythonbrew:: Disable pythonbrew::
pythonbrew off pythonbrew off
Create/Remove a symbolic link to python (in a directory on your $PATH):: Create/Remove a symbolic link to python (in a directory on your $PATH)::
pythonbrew symlink # Create a symbolic link, like "py2.7.2", for each installed version pythonbrew symlink # Create a symbolic link, like "py2.7.2", for each installed version
@@ -105,12 +115,12 @@ Create/Remove a symbolic link to python (in a directory on your $PATH)::
pythonbrew symlink -v foo # Create a symbolic link to the specified virtual environment python in bin directory pythonbrew symlink -v foo # Create a symbolic link to the specified virtual environment python in bin directory
Runs the buildout with specified or current using python:: Runs the buildout with specified or current using python::
pythonbrew buildout pythonbrew buildout
pythonbrew buildout -p 2.6.6 pythonbrew buildout -p 2.6.6
Create isolated python environments (uses virtualenv):: Create isolated python environments (uses virtualenv)::
pythonbrew venv init pythonbrew venv init
pythonbrew venv create proj pythonbrew venv create proj
pythonbrew venv list pythonbrew venv list
@@ -139,10 +149,10 @@ py <python file>
list list
List the installed all pythons. List the installed all pythons.
list -k <version> list -k <version>
List the available install pythons. List the available install pythons.
uninstall <version> uninstall <version>
Uninstall the given version of python. Uninstall the given version of python.
@@ -154,19 +164,19 @@ update
off off
Disable pythonbrew. Disable pythonbrew.
symlink symlink
Create/Remove a symbolic link to python (in a directory on your $PATH) Create/Remove a symbolic link to python (in a directory on your $PATH)
buildout buildout
Runs the buildout with specified or current using python. Runs the buildout with specified or current using python.
venv venv
Create isolated python environments (uses virtualenv) Create isolated python environments (uses virtualenv)
version version
Show version. Show version.
See more details below See more details below
`pythonbrew help <command>` `pythonbrew help <command>`
+24 -9
View File
@@ -3,8 +3,6 @@ from pythonbrew.basecommand import Command
from pythonbrew.installer.pythoninstaller import PythonInstaller,\ from pythonbrew.installer.pythoninstaller import PythonInstaller,\
PythonInstallerMacOSX PythonInstallerMacOSX
from pythonbrew.util import is_macosx from pythonbrew.util import is_macosx
from pythonbrew.exceptions import UnknownVersionException,\
AlreadyInstalledException, NotSupportedVersionException
class InstallCommand(Command): class InstallCommand(Command):
name = "install" name = "install"
@@ -61,7 +59,28 @@ class InstallCommand(Command):
default=0, default=0,
help="Enable parallel make." help="Enable parallel make."
) )
self.parser.add_option(
"--framework",
dest="framework",
action="store_true",
default=False,
help="Build (MacOSX|Darwin) framework."
)
self.parser.add_option(
"--universal",
dest="universal",
action="store_true",
default=False,
help="Build for both 32 & 64 bit Intel."
)
self.parser.add_option(
"--static",
dest="static",
action="store_true",
default=False,
help="Build static libraries."
)
def run_command(self, options, args): def run_command(self, options, args):
if not args: if not args:
self.parser.print_help() self.parser.print_help()
@@ -74,11 +93,7 @@ class InstallCommand(Command):
else: else:
p = PythonInstaller(arg, options) p = PythonInstaller(arg, options)
p.install() p.install()
except UnknownVersionException: except:
continue continue
except AlreadyInstalledException:
continue
except NotSupportedVersionException:
continue
InstallCommand() InstallCommand()
+2 -2
View File
@@ -6,7 +6,7 @@ from pythonbrew.define import PATH_DISTS, VERSION, ROOT,\
from pythonbrew.log import logger from pythonbrew.log import logger
from pythonbrew.downloader import Downloader, get_pythonbrew_update_url,\ from pythonbrew.downloader import Downloader, get_pythonbrew_update_url,\
get_stable_version, get_headerinfo_from_url get_stable_version, get_headerinfo_from_url
from pythonbrew.util import rm_r, extract_downloadfile, Link, is_gzip, Subprocess from pythonbrew.util import rm_r, extract_downloadfile, Link, is_gzip, Subprocess, Version
class UpdateCommand(Command): class UpdateCommand(Command):
name = "update" name = "update"
@@ -75,7 +75,7 @@ class UpdateCommand(Command):
else: else:
version = get_stable_version() version = get_stable_version()
# check for version # check for version
if not options.force and version <= VERSION: if not options.force and Version(version) <= VERSION:
logger.info("You are already running the installed latest version of pythonbrew.") logger.info("You are already running the installed latest version of pythonbrew.")
return return
+1 -1
View File
@@ -6,7 +6,7 @@ except:
import configparser as ConfigParser import configparser as ConfigParser
# pythonbrew version # pythonbrew version
VERSION = "1.0" VERSION = "1.1"
# pythonbrew installer root path # pythonbrew installer root path
INSTALLER_ROOT = os.path.dirname(os.path.abspath(__file__)) INSTALLER_ROOT = os.path.dirname(os.path.abspath(__file__))
+3 -1
View File
@@ -181,5 +181,7 @@ latest = True
[Python-3.2] [Python-3.2]
url = http://www.python.org/ftp/python/3.2/Python-3.2.tgz url = http://www.python.org/ftp/python/3.2/Python-3.2.tgz
latest = True
[Python-3.2.1]
url = http://www.python.org/ftp/python/3.2.1/Python-3.2.1.tgz
latest = True
+57 -23
View File
@@ -2,12 +2,13 @@ import os
import sys import sys
import shutil import shutil
import mimetypes import mimetypes
import re
from pythonbrew.util import makedirs, symlink, Package, is_url, Link,\ from pythonbrew.util import makedirs, symlink, Package, is_url, Link,\
unlink, is_html, Subprocess, rm_r,\ unlink, is_html, Subprocess, rm_r,\
is_python25, is_python24, is_python26, is_python27,\ is_python25, is_python24, is_python26, is_python27,\
extract_downloadfile, is_archive_file, path_to_fileurl, is_file,\ extract_downloadfile, is_archive_file, path_to_fileurl, is_file,\
fileurl_to_path, is_python30, is_python31, is_python32,\ fileurl_to_path, is_python30, is_python31, is_python32,\
get_macosx_deployment_target get_macosx_deployment_target, Version
from pythonbrew.define import PATH_BUILD, PATH_DISTS, PATH_PYTHONS,\ from pythonbrew.define import PATH_BUILD, PATH_DISTS, PATH_PYTHONS,\
ROOT, PATH_LOG, DISTRIBUTE_SETUP_DLSITE,\ ROOT, PATH_LOG, DISTRIBUTE_SETUP_DLSITE,\
PATH_PATCHES_MACOSX_PYTHON25, PATH_PATCHES_MACOSX_PYTHON24,\ PATH_PATCHES_MACOSX_PYTHON25, PATH_PATCHES_MACOSX_PYTHON24,\
@@ -16,7 +17,7 @@ from pythonbrew.downloader import get_python_version_url, Downloader,\
get_headerinfo_from_url get_headerinfo_from_url
from pythonbrew.log import logger from pythonbrew.log import logger
from pythonbrew.exceptions import UnknownVersionException,\ from pythonbrew.exceptions import UnknownVersionException,\
AlreadyInstalledException, NotSupportedVersionException NotSupportedVersionException
class PythonInstaller(object): class PythonInstaller(object):
"""Python installer """Python installer
@@ -45,11 +46,21 @@ class PythonInstaller(object):
self.install_dir = os.path.join(PATH_PYTHONS, pkg.name) self.install_dir = os.path.join(PATH_PYTHONS, pkg.name)
self.build_dir = os.path.join(PATH_BUILD, pkg.name) self.build_dir = os.path.join(PATH_BUILD, pkg.name)
self.download_file = os.path.join(PATH_DISTS, filename) self.download_file = os.path.join(PATH_DISTS, filename)
self.options = options
self.logfile = os.path.join(PATH_LOG, 'build.log')
self.patches = []
if Version(self.pkg.version) >= '3.1':
self.configure_options = ['--with-computed-gotos']
else:
self.configure_options = []
def install(self):
# cleanup # cleanup
if os.path.isdir(self.build_dir): if os.path.isdir(self.build_dir):
shutil.rmtree(self.build_dir) shutil.rmtree(self.build_dir)
# get content type. # get content type.
if is_file(self.download_url): if is_file(self.download_url):
path = fileurl_to_path(self.download_url) path = fileurl_to_path(self.download_url)
@@ -61,16 +72,11 @@ class PythonInstaller(object):
# note: maybe got 404 or 503 http status code. # note: maybe got 404 or 503 http status code.
logger.error("Invalid content-type: `%s`" % self.content_type) logger.error("Invalid content-type: `%s`" % self.content_type)
return return
self.options = options
self.logfile = os.path.join(PATH_LOG, 'build.log')
self.configure_options = ''
self.patches = []
def install(self):
if os.path.isdir(self.install_dir): if os.path.isdir(self.install_dir):
logger.info("You are already installed `%s`" % self.pkg.name) logger.info("You are already installed `%s`" % self.pkg.name)
raise AlreadyInstalledException return
self.download_and_extract() self.download_and_extract()
logger.info("\nThis could take a while. You can run the following command on another shell to track the status:") logger.info("\nThis could take a while. You can run the following command on another shell to track the status:")
logger.info(" tail -f %s\n" % self.logfile) logger.info(" tail -f %s\n" % self.logfile)
@@ -114,7 +120,7 @@ class PythonInstaller(object):
sys.exit(1) sys.exit(1)
def patch(self): def patch(self):
version = self.pkg.version version = Version(self.pkg.version)
# for ubuntu 11.04(Natty) # for ubuntu 11.04(Natty)
if is_python24(version): if is_python24(version):
patch_dir = os.path.join(PATH_PATCHES_ALL, "python24") patch_dir = os.path.join(PATH_PATCHES_ALL, "python24")
@@ -170,7 +176,10 @@ class PythonInstaller(object):
def configure(self): def configure(self):
s = Subprocess(log=self.logfile, cwd=self.build_dir, verbose=self.options.verbose) s = Subprocess(log=self.logfile, cwd=self.build_dir, verbose=self.options.verbose)
s.check_call("./configure --prefix=%s %s %s" % (self.install_dir, self.options.configure, self.configure_options)) cmd = "./configure --prefix=%s %s %s" % (self.install_dir, self.options.configure, ' '.join(self.configure_options))
if self.options.verbose:
logger.log(cmd)
s.check_call(cmd)
def make(self): def make(self):
jobs = self.options.jobs jobs = self.options.jobs
@@ -185,7 +194,7 @@ class PythonInstaller(object):
s.check_call("make test") s.check_call("make test")
def make_install(self): def make_install(self):
version = self.pkg.version version = Version(self.pkg.version)
if version == "1.5.2" or version == "1.6.1": if version == "1.5.2" or version == "1.6.1":
makedirs(self.install_dir) makedirs(self.install_dir)
s = Subprocess(log=self.logfile, cwd=self.build_dir, verbose=self.options.verbose) s = Subprocess(log=self.logfile, cwd=self.build_dir, verbose=self.options.verbose)
@@ -193,14 +202,27 @@ class PythonInstaller(object):
def symlink(self): def symlink(self):
install_dir = os.path.realpath(self.install_dir) install_dir = os.path.realpath(self.install_dir)
if self.options.framework:
# create symlink bin -> /path/to/Frameworks/Python.framework/Versions/?.?/bin
bin_dir = os.path.join(install_dir, 'bin')
if os.path.exists(bin_dir):
rm_r(bin_dir)
m = re.match(r'\d\.\d', self.pkg.version)
if m:
version = m.group(0)
symlink(os.path.join(install_dir,'Frameworks','Python.framework','Versions',version,'bin'),
os.path.join(bin_dir))
path_python = os.path.join(install_dir,'bin','python') path_python = os.path.join(install_dir,'bin','python')
if not os.path.isfile(path_python): if not os.path.isfile(path_python):
path_python3 = os.path.join(install_dir,'bin','python3') src = None
path_python3_0 = os.path.join(install_dir,'bin','python3.0') for d in os.listdir(os.path.join(install_dir,'bin')):
if os.path.isfile(path_python3): if re.match(r'python\d\.\d', d):
symlink(path_python3, path_python) src = d
elif os.path.isfile(path_python3_0): break
symlink(path_python3_0, path_python) if src:
path_src = os.path.join(install_dir,'bin',src)
symlink(path_src, path_python)
def install_setuptools(self): def install_setuptools(self):
options = self.options options = self.options
@@ -237,14 +259,26 @@ class PythonInstallerMacOSX(PythonInstaller):
super(PythonInstallerMacOSX, self).__init__(arg, options) super(PythonInstallerMacOSX, self).__init__(arg, options)
# check for version # check for version
version = self.pkg.version version = Version(self.pkg.version)
if version < '2.6' and (version != '2.4.6' and version < '2.5.5'): if version < '2.6' and (version != '2.4.6' and version < '2.5.5'):
logger.error("`%s` is not supported on MacOSX Snow Leopard" % self.pkg.name) logger.error("`%s` is not supported on MacOSX Snow Leopard" % self.pkg.name)
raise NotSupportedVersionException raise NotSupportedVersionException
# set configure options # set configure options
target = get_macosx_deployment_target() target = get_macosx_deployment_target()
if target: if target:
self.configure_options = 'MACOSX_DEPLOYMENT_TARGET=%s' % target self.configure_options.append('MACOSX_DEPLOYMENT_TARGET=%s' % target)
# set build options
if options.framework and options.static:
logger.error("Can't specify both framework and static.")
raise Exception
if options.framework:
self.configure_options.append('--enable-framework=%s' % os.path.join(self.install_dir, 'Frameworks'))
elif not options.static:
self.configure_options.append('--enable-shared')
if options.universal:
self.configure_options.append('--enable-universalsdk=/')
self.configure_options.append('--with-universal-archs=intel')
# note: skip `make test` to avoid hanging test_threading. # note: skip `make test` to avoid hanging test_threading.
if is_python25(version) or is_python24(version): if is_python25(version) or is_python24(version):
@@ -252,7 +286,7 @@ class PythonInstallerMacOSX(PythonInstaller):
def patch(self): def patch(self):
# note: want an interface to the source patching functionality. like a patchperl. # note: want an interface to the source patching functionality. like a patchperl.
version = self.pkg.version version = Version(self.pkg.version)
if is_python24(version): if is_python24(version):
patch_dir = PATH_PATCHES_MACOSX_PYTHON24 patch_dir = PATH_PATCHES_MACOSX_PYTHON24
self._add_patches_to_list(patch_dir, ['patch-configure', 'patch-Makefile.pre.in', self._add_patches_to_list(patch_dir, ['patch-configure', 'patch-Makefile.pre.in',
+86 -9
View File
@@ -72,26 +72,31 @@ def get_macosx_deployment_target():
return m.group(1) return m.group(1)
return None return None
def _py_version_cmp(v, v1, v2):
if is_str(v):
v = Version(v)
return v >= v1 and v < v2
def is_python24(version): def is_python24(version):
return version >= '2.4' and version < '2.5' return _py_version_cmp(version, '2.4', '2.5')
def is_python25(version): def is_python25(version):
return version >= '2.5' and version < '2.6' return _py_version_cmp(version, '2.5', '2.6')
def is_python26(version): def is_python26(version):
return version >= '2.6' and version < '2.7' return _py_version_cmp(version, '2.6', '2.7')
def is_python27(version): def is_python27(version):
return version >= '2.7' and version < '2.8' return _py_version_cmp(version, '2.7', '2.8')
def is_python30(version): def is_python30(version):
return version >= '3.0' and version < '3.1' return _py_version_cmp(version, '3.0', '3.1')
def is_python31(version): def is_python31(version):
return version >= '3.1' and version < '3.2' return _py_version_cmp(version, '3.1', '3.2')
def is_python32(version): def is_python32(version):
return version >= '3.2' and version < '3.3' return _py_version_cmp(version, '3.2', '3.3')
def makedirs(path): def makedirs(path):
if not os.path.exists(path): if not os.path.exists(path):
@@ -220,6 +225,8 @@ def get_using_python_pkgname():
"""return: Python-<VERSION> or None""" """return: Python-<VERSION> or None"""
path = get_using_python_path() path = get_using_python_path()
for d in sorted(os.listdir(PATH_PYTHONS)): for d in sorted(os.listdir(PATH_PYTHONS)):
if not os.path.exists(os.path.join(PATH_PYTHONS, d, 'bin','python')):
continue
if path and os.path.samefile(path, os.path.join(PATH_PYTHONS, d, 'bin','python')): if path and os.path.samefile(path, os.path.join(PATH_PYTHONS, d, 'bin','python')):
return d return d
return None return None
@@ -286,6 +293,9 @@ def bltin_any(iter):
return True return True
return False return False
#-----------------------------
# class
#-----------------------------
class Subprocess(object): class Subprocess(object):
def __init__(self, log=None, cwd=None, verbose=False, debug=False): def __init__(self, log=None, cwd=None, verbose=False, debug=False):
self._log = log self._log = log
@@ -355,7 +365,7 @@ class Package(object):
if alias: if alias:
self.name = 'Python-%s' % alias self.name = 'Python-%s' % alias
self.alias = alias self.alias = alias
class Link(object): class Link(object):
def __init__(self, url): def __init__(self, url):
self._url = url self._url = url
@@ -374,4 +384,71 @@ class Link(object):
def base_url(self): def base_url(self):
return posixpath.basename(self._url.split('#', 1)[0].split('?', 1)[0]) return posixpath.basename(self._url.split('#', 1)[0].split('?', 1)[0])
class Version(object):
"""version compare
"""
def __init__(self, v):
self._version = v
self._p = self._parse_version(v)
def __lt__(self, o):
if is_str(o):
o = self._parse_version(o)
return self._p < o
def __le__(self, o):
if is_str(o):
o = self._parse_version(o)
return self._p <= o
def __eq__(self, o):
if is_str(o):
o = self._parse_version(o)
return self._p == o
def __ne__(self, o):
if is_str(o):
o = self._parse_version(o)
return self._p != o
def __gt__(self, o):
if is_str(o):
o = self._parse_version(o)
return self._p > o
def __ge__(self, o):
if is_str(o):
o = self._parse_version(o)
return self._p >= o
def _parse_version(self, s):
"""see pkg_resouce.parse_version
"""
component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE)
replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get
def _parse_version_parts(s):
for part in component_re.split(s):
part = replace(part,part)
if not part or part=='.':
continue
if part[:1] in '0123456789':
yield part.zfill(8) # pad for numeric comparison
else:
yield '*'+part
yield '*final' # ensure that alpha/beta/candidate are before final
parts = []
for part in _parse_version_parts(s.lower()):
if part.startswith('*'):
if part<'*final': # remove '-' before a prerelease tag
while parts and parts[-1]=='*final-': parts.pop()
# remove trailing zeros from each series of numeric parts
while parts and parts[-1]=='00000000':
parts.pop()
parts.append(part)
return tuple(parts)
def __repr__(self):
return self._version
+1 -1
View File
@@ -1 +1 @@
1.0 1.1
-17
View File
@@ -1,17 +0,0 @@
import os
import shutil
PYTHONBREW_ROOT = '/tmp/pythonbrew.test'
TESTPY_VERSION = ['2.4.6', '2.5.5', '2.6.6', '3.2']
def cleanall():
if os.path.isdir(PYTHONBREW_ROOT):
shutil.rmtree(PYTHONBREW_ROOT)
def setup():
os.environ['PYTHONBREW_ROOT'] = PYTHONBREW_ROOT
cleanall()
from pythonbrew.installer import install_pythonbrew
install_pythonbrew()
def teardown():
cleanall()
-11
View File
@@ -1,11 +0,0 @@
class UpdateOptions(object):
master = False
develop = False
config = False
force = False
def test_update():
from pythonbrew.commands.update import UpdateCommand
c = UpdateCommand()
c.run_command(UpdateOptions(), None)
-4
View File
@@ -1,4 +0,0 @@
def test_help():
from pythonbrew.commands.help import HelpCommand
c = HelpCommand()
c.run_command(None, None)
-4
View File
@@ -1,4 +0,0 @@
def test_version():
from pythonbrew.commands.version import VersionCommand
c = VersionCommand()
c.run_command(None, None)
-18
View File
@@ -1,18 +0,0 @@
from tests import TESTPY_VERSION
class InstallOptions(object):
force = True
no_test = True
verbose = False
configure = ""
no_setuptools = False
alias = None
jobs = 2
def test_install():
from pythonbrew.commands.install import InstallCommand
py_version = TESTPY_VERSION.pop(0)
c = InstallCommand()
c.run_command(InstallOptions(), [py_version]) # pybrew install -f -j2 2.4.6
c.run_command(InstallOptions(), TESTPY_VERSION) # pybrew install -f -j2 2.5.6 2.6.6 3.2
-7
View File
@@ -1,7 +0,0 @@
from tests import TESTPY_VERSION
def test_switch():
from pythonbrew.commands.switch import SwitchCommand
for py_version in TESTPY_VERSION:
c = SwitchCommand()
c.run_command(None, [py_version])
-7
View File
@@ -1,7 +0,0 @@
from tests import TESTPY_VERSION
def test_use():
from pythonbrew.commands.use import UseCommand
for py_version in TESTPY_VERSION:
c = UseCommand()
c.run_command(None, [py_version])
-4
View File
@@ -1,4 +0,0 @@
def test_off():
from pythonbrew.commands.off import OffCommand
c = OffCommand()
c.run_command(None, None)
-8
View File
@@ -1,8 +0,0 @@
class ListOptions(object):
all_versions = False
known = False
def test_list():
from pythonbrew.commands.list import ListCommand
c = ListCommand()
c.run_command(ListOptions(), None)
-22
View File
@@ -1,22 +0,0 @@
from tests import PYTHONBREW_ROOT
import os
TESTPY_FILE = os.path.join(PYTHONBREW_ROOT, 'etc', 'testfile.py')
class PyOptions(object):
pythons = []
verbose = False
bin = "python"
options = ""
def _create_pyfile():
fp = open(TESTPY_FILE, 'w')
fp.write("print('test')")
fp.close()
def test_py():
from pythonbrew.commands.py import PyCommand
_create_pyfile()
c = PyCommand()
c.run_command(PyOptions(), [TESTPY_FILE])
-31
View File
@@ -1,31 +0,0 @@
from tests import PYTHONBREW_ROOT
import os
BUILDOUT_DIR = os.path.join(PYTHONBREW_ROOT, 'etc', 'buildout')
BUILDOUT_CONF = os.path.join(BUILDOUT_DIR, 'buildout.cfg')
def _create_buildout_cfg():
if not os.path.isdir(BUILDOUT_DIR):
os.makedirs(BUILDOUT_DIR)
fp = open(BUILDOUT_CONF, 'w')
fp.write("""[buildout]
parts = test
develop =
[test]
recipe =
eggs =""")
fp.close()
class BuildoutOptions(object):
python = '2.6.6'
def test_buildout():
from pythonbrew.commands.buildout import BuildoutCommand
# Runs the buildout
_create_buildout_cfg()
os.chdir(BUILDOUT_DIR)
c = BuildoutCommand()
c.run_command(BuildoutOptions(), [])
-21
View File
@@ -1,21 +0,0 @@
class VenvOptions(object):
python = '2.6.6'
all = False
no_site_packages = False
def test_venv():
import os
from pythonbrew.commands.venv import VenvCommand
from pythonbrew.util import Subprocess
from pythonbrew.define import PATH_HOME_ETC_VENV
s = Subprocess()
c = VenvCommand()
c.run_command(VenvOptions(), ['init'])
c.run_command(VenvOptions(), ['create', 'aaa'])
s.shell('source %s' % PATH_HOME_ETC_VENV)
c.run_command(VenvOptions(), ['list'])
c.run_command(VenvOptions(), ['use', 'aaa'])
c.run_command(VenvOptions(), ['delete', 'aaa'])
s.shell('source %s' % PATH_HOME_ETC_VENV)
# finish
os.unlink(PATH_HOME_ETC_VENV)
-7
View File
@@ -1,7 +0,0 @@
from tests import TESTPY_VERSION
def test_uninstall():
from pythonbrew.commands.uninstall import UninstallCommand
for py_version in TESTPY_VERSION:
c = UninstallCommand()
c.run_command(None, [py_version])
-4
View File
@@ -1,4 +0,0 @@
def test_clean():
from pythonbrew.commands.cleanup import CleanupCommand
c = CleanupCommand()
c.run_command(None, None)
+138
View File
@@ -0,0 +1,138 @@
# coding=utf-8
#---------------------------------------------------------------------------
# Copyright 2011 utahta
#---------------------------------------------------------------------------
import os
import shutil
#---------------------------------------------------------------------------
# Settings
#---------------------------------------------------------------------------
PYTHONBREW_ROOT = '/tmp/pythonbrew.test'
TESTPY_VERSION = ['2.4.6', '2.5.5', '2.6.6', '3.2']
def _cleanall():
if os.path.isdir(PYTHONBREW_ROOT):
shutil.rmtree(PYTHONBREW_ROOT)
def _install_pythonbrew():
from pythonbrew.installer import install_pythonbrew
install_pythonbrew()
def setup():
os.environ['PYTHONBREW_ROOT'] = PYTHONBREW_ROOT
_cleanall()
_install_pythonbrew()
def teardown():
_cleanall()
class Options(object):
def __init__(self, opts):
for (k,v) in opts.items():
setattr(self, k, v)
#---------------------------------------------------------------------------
# Test
#---------------------------------------------------------------------------
def test_00_update():
from pythonbrew.commands.update import UpdateCommand
c = UpdateCommand()
c.run_command(Options({'master':False, 'develop':False, 'config':False, 'force':False}),
None)
def test_01_help():
from pythonbrew.commands.help import HelpCommand
c = HelpCommand()
c.run_command(None, None)
def test_02_version():
from pythonbrew.commands.version import VersionCommand
c = VersionCommand()
c.run_command(None, None)
def test_03_install():
from pythonbrew.commands.install import InstallCommand
py_version = TESTPY_VERSION.pop(0)
o = Options({'force':True, 'no_test':True, 'verbose':False, 'configure':"",
'no_setuptools': False, 'alias':None, 'jobs':2,
'framework':False, 'universal':False, 'static':False})
c = InstallCommand()
c.run_command(o, [py_version]) # pybrew install -f -j2 2.4.6
c.run_command(o, TESTPY_VERSION) # pybrew install -f -j2 2.5.6 2.6.6 3.2
def test_04_switch():
from pythonbrew.commands.switch import SwitchCommand
for py_version in TESTPY_VERSION:
c = SwitchCommand()
c.run_command(None, [py_version])
def test_05_use():
from pythonbrew.commands.use import UseCommand
for py_version in TESTPY_VERSION:
c = UseCommand()
c.run_command(None, [py_version])
def test_06_off():
from pythonbrew.commands.off import OffCommand
c = OffCommand()
c.run_command(None, None)
def test_07_list():
from pythonbrew.commands.list import ListCommand
c = ListCommand()
c.run_command(Options({'all_versions':False, 'known':False}),
None)
def test_08_py():
from pythonbrew.commands.py import PyCommand
TESTPY_FILE = os.path.join(PYTHONBREW_ROOT, 'etc', 'testfile.py')
fp = open(TESTPY_FILE, 'w')
fp.write("print('test')")
fp.close()
# Runs the python script
c = PyCommand()
c.run_command(Options({'pythons':[], 'verbose':False, 'bin':"python", 'options':""}),
[TESTPY_FILE])
def test_09_buildout():
from pythonbrew.commands.buildout import BuildoutCommand
BUILDOUT_DIR = os.path.join(PYTHONBREW_ROOT, 'etc', 'buildout')
BUILDOUT_CONF = os.path.join(BUILDOUT_DIR, 'buildout.cfg')
if not os.path.isdir(BUILDOUT_DIR):
os.makedirs(BUILDOUT_DIR)
fp = open(BUILDOUT_CONF, 'w')
fp.write("""[buildout]
parts = test
develop =
[test]
recipe =
eggs =""")
fp.close()
# Runs the buildout
os.chdir(BUILDOUT_DIR)
c = BuildoutCommand()
c.run_command(Options({'python':'2.6.6'}), [])
def test_10_venv():
from pythonbrew.commands.venv import VenvCommand
c = VenvCommand()
o = Options({'python':'2.6.6', 'all':False, 'no_site_packages':False})
c.run_command(o, ['init'])
c.run_command(o, ['create', 'aaa'])
c.run_command(o, ['list'])
c.run_command(o, ['use', 'aaa'])
c.run_command(o, ['delete', 'aaa'])
def test_11_uninstall():
from pythonbrew.commands.uninstall import UninstallCommand
for py_version in TESTPY_VERSION:
c = UninstallCommand()
c.run_command(None, [py_version])
def test_12_clean():
from pythonbrew.commands.cleanup import CleanupCommand
c = CleanupCommand()
c.run_command(None, None)