Skip to content

Commit

Permalink
Merge pull request #581 from enthought/add_python_libdir
Browse files Browse the repository at this point in the history
Add python libdir
  • Loading branch information
cournape committed Aug 3, 2015
2 parents 1d45af0 + 8da8d7d commit cf5b7a1
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 26 deletions.
68 changes: 45 additions & 23 deletions egginst/runtime.py
Expand Up @@ -14,15 +14,19 @@


def _compute_site_packages(prefix, platform, major_minor):
# Adapted from distutils.sysconfig.get_python_lib for 2.7.9
prefix = prefix or sys.exec_prefix

if platform.os == WINDOWS:
return ntpath.join(prefix, "Lib", "site-packages")
getsitepackages = getattr(site, "getsitepackages", None)
if getsitepackages is not None:
return getsitepackages()[0]
else:
return posixpath.join(
prefix, "lib", "python" + major_minor, "site-packages"
)
# Adapted from distutils.sysconfig.get_python_lib for 2.7.9
prefix = prefix or sys.exec_prefix

if platform.os == WINDOWS:
return ntpath.join(prefix, "Lib", "site-packages")
else:
return posixpath.join(
prefix, "lib", "python" + major_minor, "site-packages"
)


class RuntimeInfo(object):
Expand All @@ -49,18 +53,23 @@ def from_prefix_and_platform(cls, prefix, platform, version_info):
else:
executable = "python"

major_minor = "{0}.{1}".format(*version_info[:2])

if platform.os == WINDOWS:
executable += ".exe"
executable = ntpath.join(bindir, executable)
python_libdir = ntpath.join(prefix, "Lib")
else:
executable = posixpath.join(bindir, executable)
python_libdir = posixpath.join(
prefix, "lib", "python" + major_minor
)

major_minor = "{0}.{1}".format(*version_info[:2])
site_packages = _compute_site_packages(prefix, platform, major_minor)

return cls(
prefix, bindir, scriptsdir, site_packages, executable,
version_info, platform, CPYTHON,
prefix, bindir, scriptsdir, python_libdir, site_packages,
executable, version_info, platform, CPYTHON,
)

@classmethod
Expand All @@ -79,41 +88,54 @@ def from_running_python(cls, platform=None):

platform = platform or Platform.from_running_python()

major_minor = "{0}.{1}".format(*sys.version_info[:2])

if platform.os == WINDOWS:
bindir = prefix
scriptsdir = os.path.join(prefix, "Scripts")
python_libdir = ntpath.join(prefix, "Lib")
else:
bindir = scriptsdir = os.path.join(prefix, "bin")

getsitepackages = getattr(site, "getsitepackages", None)
if getsitepackages is not None:
site_packages = getsitepackages()
else:
major_minor = "{0}.{1}".format(*sys.version_info[:2])
site_packages = _compute_site_packages(
prefix, platform, major_minor
python_libdir = posixpath.join(
prefix, "lib", "python" + major_minor
)

site_packages = _compute_site_packages(prefix, platform, major_minor)

return cls(
prefix, bindir, scriptsdir, site_packages, sys.executable,
sys.version_info, platform, CPYTHON,
prefix, bindir, scriptsdir, python_libdir, site_packages,
sys.executable, sys.version_info, platform, CPYTHON,
)

def __init__(self, prefix, bindir, scriptsdir, site_packages, executable,
version_info, platform, implementation):
def __init__(self, prefix, bindir, scriptsdir, python_libdir,
site_packages, executable, version_info, platform,
implementation):
def normpath(p):
if platform.os == WINDOWS:
return ntpath.normpath(p)
else:
return posixpath.normpath(p)

self.prefix = normpath(prefix)
"The runtime prefix."

self.bindir = normpath(bindir)
"The directory where the python binary is installed."

self.python_libdir = normpath(python_libdir)
"The directory where the python stdlib is installed."

self.scriptsdir = normpath(scriptsdir)
"The directory where the scripts are installed."

self.site_packages = normpath(site_packages)
"The site packages directory."

self.executable = normpath(executable)
"The full path to the python binary."

self.version_info = version_info
"The version info tuple."

self.platform = platform
self.implementation = implementation
Expand Down
31 changes: 28 additions & 3 deletions egginst/tests/test_runtime.py
@@ -1,6 +1,8 @@
import os.path
import sys

import mock

from egginst.vendor.okonomiyaki.platforms import EPDPlatform

from egginst.runtime import CPYTHON, RuntimeInfo
Expand Down Expand Up @@ -28,6 +30,21 @@ def test_simple_from_running_python(self):
self.assertEqual(runtime_info.minor, sys.version_info[1])
self.assertEqual(runtime_info.implementation, CPYTHON)

def test_with_getsitepackages(self):
# Given
prefix = "/usr/local"
platform = EPDPlatform.from_epd_string("rh5-64").platform
version_info = (3, 4, 3, "final", 0)

# When
with mock.patch("site.getsitepackages",
return_value=["/usr/s1", "/usr/s2"], create=True):
runtime_info = RuntimeInfo.from_prefix_and_platform(
prefix, platform, version_info)

# Then
self.assertEqual(runtime_info.site_packages, "/usr/s1")

def test_from_prefix_and_platform(self):
# Given
prefix = "/usr/local"
Expand All @@ -44,7 +61,10 @@ def test_from_prefix_and_platform(self):
self.assertEqual(runtime_info.bindir, prefix + "/bin")
self.assertEqual(runtime_info.scriptsdir, prefix + "/bin")
self.assertEqual(
runtime_info.site_packages, prefix + "/lib/python3.4/site-packages")
runtime_info.python_libdir, prefix + "/lib/python3.4")
self.assertEqual(
runtime_info.site_packages,
prefix + "/lib/python3.4/site-packages")
self.assertEqual(runtime_info.major, 3)
self.assertEqual(runtime_info.micro, 3)

Expand All @@ -62,7 +82,10 @@ def test_from_prefix_and_platform(self):
self.assertEqual(runtime_info.bindir, prefix + "/bin")
self.assertEqual(runtime_info.scriptsdir, prefix + "/bin")
self.assertEqual(
runtime_info.site_packages, prefix + "/lib/python2.7/site-packages")
runtime_info.python_libdir, prefix + "/lib/python2.7")
self.assertEqual(
runtime_info.site_packages,
prefix + "/lib/python2.7/site-packages")
self.assertEqual(runtime_info.major, 2)

# Given
Expand All @@ -78,6 +101,7 @@ def test_from_prefix_and_platform(self):
self.assertEqual(runtime_info.prefix, prefix)
self.assertEqual(runtime_info.bindir, prefix)
self.assertEqual(runtime_info.scriptsdir, prefix + "\\Scripts")
self.assertEqual(runtime_info.python_libdir, prefix + "\\Lib")
self.assertEqual(
runtime_info.site_packages, prefix + "\\Lib\\site-packages")
self.assertEqual(runtime_info.major, 3)
Expand All @@ -98,5 +122,6 @@ def test_normalization(self):
self.assertEqual(runtime_info.bindir, norm_prefix + "/bin")
self.assertEqual(runtime_info.scriptsdir, norm_prefix + "/bin")
self.assertEqual(
runtime_info.site_packages, norm_prefix + "/lib/python2.7/site-packages")
runtime_info.site_packages,
norm_prefix + "/lib/python2.7/site-packages")
self.assertEqual(runtime_info.major, 2)

0 comments on commit cf5b7a1

Please sign in to comment.