Commit 7e825d61 authored by Gary Poster's avatar Gary Poster

simplify resulting site.py function

parent 8f1f787f
...@@ -1390,69 +1390,66 @@ def _generate_site(dest, working_set, executable, extra_paths=(), ...@@ -1390,69 +1390,66 @@ def _generate_site(dest, working_set, executable, extra_paths=(),
rpsetup = '\n'.join( rpsetup = '\n'.join(
[(line and ' %s' % (line,) or line) [(line and ' %s' % (line,) or line)
for line in rpsetup.split('\n')]) for line in rpsetup.split('\n')])
real_site_path = _get_module_file(executable, 'site') namespace_setup = ''
real_site = open(real_site_path, 'r') addsitedir = addsitedir_snippet
site = open(site_path, 'w')
extra_path_snippet = add_site_packages_snippet[add_site_packages]
extra_path_snippet_followup = add_site_packages_snippet_followup[
add_site_packages]
if add_site_packages: if add_site_packages:
stdlib, site_paths = _get_system_paths(executable) stdlib, site_paths = _get_system_paths(executable)
extra_path_snippet = extra_path_snippet % _format_paths( path_string = ''.join([
(repr(p) for p in site_paths), 2) path_string,
(",\n"
" # These are the underlying Python's site-packages.\n"
" "),
_format_paths((repr(p) for p in site_paths), 2)])
distribution = working_set.find(
pkg_resources.Requirement.parse('setuptools'))
if distribution is not None:
# We need to worry about namespace packages.
namespace_setup = namespace_add_site_packages_setup % (
distribution.location,)
addsitedir = addsitedir_namespace_add_site_packages_snippet
addsitepackages_marker = 'def addsitepackages(' addsitepackages_marker = 'def addsitepackages('
enableusersite_marker = 'ENABLE_USER_SITE = ' enableusersite_marker = 'ENABLE_USER_SITE = '
successful_rewrite = False successful_rewrite = False
for line in real_site.readlines(): real_site_path = _get_module_file(executable, 'site')
if line.startswith(enableusersite_marker): real_site = open(real_site_path, 'r')
site.write(enableusersite_marker) site = open(site_path, 'w')
site.write('False # buildout does not support user sites.\n') try:
elif line.startswith(addsitepackages_marker): for line in real_site.readlines():
site.write(addsitepackages_script % ( if line.startswith(enableusersite_marker):
extra_path_snippet, rpsetup, path_string, site.write(enableusersite_marker)
extra_path_snippet_followup)) site.write('False # buildout does not support user sites.\n')
site.write(line[len(addsitepackages_marker):]) elif line.startswith(addsitepackages_marker):
successful_rewrite = True site.write(addsitepackages_script % (
else: namespace_setup, rpsetup, path_string, addsitedir))
site.write(line) site.write(line[len(addsitepackages_marker):])
successful_rewrite = True
else:
site.write(line)
finally:
site.close()
real_site.close()
if not successful_rewrite: if not successful_rewrite:
raise RuntimeError('Buildout did not successfully rewrite site.py') raise RuntimeError('Buildout did not successfully rewrite site.py')
return site_path return site_path
add_site_packages_snippet = [''' namespace_add_site_packages_setup = '''
paths = []''', ''' setuptools_path = %r
paths = [ # These are the underlying Python's site-packages. sys.path.append(setuptools_path)
%s] known_paths.add(setuptools_path)
sys.path[0:0] = paths import pkg_resources'''
known_paths.update([os.path.normcase(os.path.abspath(p)) for p in paths])
try:
import pkg_resources
except ImportError:
# No namespace packages in sys.path; no fixup needed.
pkg_resources = None''']
add_site_packages_snippet_followup = ['', '''
if pkg_resources is not None:
# There may be namespace packages in sys.path. This is much faster
# than importing pkg_resources after the sys.path has a large number
# of eggs.
for p in sys.path:
pkg_resources.fixup_namespace_packages(p)''']
addsitepackages_script = '''\ addsitedir_snippet = '''
def addsitepackages(known_paths):%s for path in paths:
%s paths[0:0] = [ # eggs addsitedir(path, known_paths)'''
%s
] addsitedir_namespace_add_site_packages_snippet = '''
# Process all dirs. Look for .pth files. If they exist, defer
# processing "import" varieties.
dotpth = os.extsep + "pth" dotpth = os.extsep + "pth"
deferred = [] for path in paths:
for path in reversed(paths): # This duplicates addsitedir except for adding the pkg_resources call.
# Duplicating addsitedir.
sitedir, sitedircase = makepath(path) sitedir, sitedircase = makepath(path)
if not sitedircase in known_paths and os.path.exists(sitedir): if not sitedircase in known_paths and os.path.exists(sitedir):
sys.path.insert(0, sitedir) sys.path.append(sitedir)
pkg_resources.working_set.add_entry(sitedir)
known_paths.add(sitedircase) known_paths.add(sitedircase)
try: try:
names = os.listdir(sitedir) names = os.listdir(sitedir)
...@@ -1461,44 +1458,18 @@ def addsitepackages(known_paths):%s ...@@ -1461,44 +1458,18 @@ def addsitepackages(known_paths):%s
names = [name for name in names if name.endswith(dotpth)] names = [name for name in names if name.endswith(dotpth)]
names.sort() names.sort()
for name in names: for name in names:
# Duplicating addpackage. addpackage(sitedir, name, known_paths)'''
fullname = os.path.join(sitedir, name)
try: addsitepackages_script = '''\
f = open(fullname, "rU") def addsitepackages(known_paths):
except IOError: """Add site packages.
continue
try: This function is written by buildout. See original_addsitepackages,
for line in f: below, for the original version."""%s
if line.startswith("#"): %s paths = [
continue # Eggs.
if (line.startswith("import ") or %s
line.startswith("import\t")): ]%s
# This line is supposed to be executed. It
# might be a setuptools namespace package
# installed with a system package manager.
# Defer this so we can process egg namespace
# packages first, or else the eggs with the same
# namespace will be ignored.
deferred.append((sitedir, name, fullname, line))
continue
line = line.rstrip()
dir, dircase = makepath(sitedir, line)
if not dircase in known_paths and os.path.exists(dir):
sys.path.append(dir)
known_paths.add(dircase)
finally:
f.close()%s
# Process "import ..." .pth lines.
for sitedir, name, fullname, line in deferred:
# Note that some lines--such as the one setuptools writes for
# namespace packages--expect some or all of sitedir, name, and
# fullname to be present in the frame locals, as it is in
# ``addpackage``.
try:
exec line
except:
print "Error in %%s" %% (fullname,)
raise
global addsitepackages global addsitepackages
addsitepackages = original_addsitepackages addsitepackages = original_addsitepackages
return known_paths return known_paths
......
...@@ -1020,66 +1020,17 @@ following shows the part that buildout inserts. ...@@ -1020,66 +1020,17 @@ following shows the part that buildout inserts.
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
#... #...
def addsitepackages(known_paths): def addsitepackages(known_paths):
paths = [] """Add site packages.
paths[0:0] = [ # eggs <BLANKLINE>
This function is written by buildout. See original_addsitepackages,
below, for the original version."""
paths = [
# Eggs.
'/interpreter/eggs/demo-0.3-pyN.N.egg', '/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg' '/interpreter/eggs/demoneeded-1.1-pyN.N.egg'
] ]
# Process all dirs. Look for .pth files. If they exist, defer for path in paths:
# processing "import" varieties. addsitedir(path, known_paths)
dotpth = os.extsep + "pth"
deferred = []
for path in reversed(paths):
# Duplicating addsitedir.
sitedir, sitedircase = makepath(path)
if not sitedircase in known_paths and os.path.exists(sitedir):
sys.path.insert(0, sitedir)
known_paths.add(sitedircase)
try:
names = os.listdir(sitedir)
except os.error:
continue
names = [name for name in names if name.endswith(dotpth)]
names.sort()
for name in names:
# Duplicating addpackage.
fullname = os.path.join(sitedir, name)
try:
f = open(fullname, "rU")
except IOError:
continue
try:
for line in f:
if line.startswith("#"):
continue
if (line.startswith("import ") or
line.startswith("import ")):
# This line is supposed to be executed. It
# might be a setuptools namespace package
# installed with a system package manager.
# Defer this so we can process egg namespace
# packages first, or else the eggs with the same
# namespace will be ignored.
deferred.append((sitedir, name, fullname, line))
continue
line = line.rstrip()
dir, dircase = makepath(sitedir, line)
if not dircase in known_paths and os.path.exists(dir):
sys.path.append(dir)
known_paths.add(dircase)
finally:
f.close()
# Process "import ..." .pth lines.
for sitedir, name, fullname, line in deferred:
# Note that some lines--such as the one setuptools writes for
# namespace packages--expect some or all of sitedir, name, and
# fullname to be present in the frame locals, as it is in
# ``addpackage``.
try:
exec line
except:
print "Error in %s" % (fullname,)
raise
global addsitepackages global addsitepackages
addsitepackages = original_addsitepackages addsitepackages = original_addsitepackages
return known_paths return known_paths
...@@ -1088,12 +1039,6 @@ following shows the part that buildout inserts. ...@@ -1088,12 +1039,6 @@ following shows the part that buildout inserts.
<BLANKLINE> <BLANKLINE>
def original_addsitepackages(known_paths):... def original_addsitepackages(known_paths):...
As you can see, it manipulates the path to insert the eggs and then processes
any .pth files. The lines in the .pth files that use the "import" feature
are deferred because it is a pattern we will need in a later example, when we
show how we can add site packages, and handle competing namespace packages
in both site packages and eggs.
Here are some examples of the interpreter in use. Here are some examples of the interpreter in use.
>>> print call_py(interpreter_path, "print 16+26") >>> print call_py(interpreter_path, "print 16+26")
...@@ -1102,10 +1047,10 @@ Here are some examples of the interpreter in use. ...@@ -1102,10 +1047,10 @@ Here are some examples of the interpreter in use.
>>> res = call_py(interpreter_path, "import sys; print sys.path") >>> res = call_py(interpreter_path, "import sys; print sys.path")
>>> print res # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE >>> print res # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
['', ['',
'/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg',
'/interpreter/parts/interpreter', '/interpreter/parts/interpreter',
...] ...,
'/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg']
<BLANKLINE> <BLANKLINE>
>>> clean_paths = eval(res.strip()) # This is used later for comparison. >>> clean_paths = eval(res.strip()) # This is used later for comparison.
...@@ -1167,7 +1112,10 @@ paths join a base to a path, as with the use of this argument in the ...@@ -1167,7 +1112,10 @@ paths join a base to a path, as with the use of this argument in the
>>> sys.stdout.write('#\n'); cat(site_path) # doctest: +ELLIPSIS >>> sys.stdout.write('#\n'); cat(site_path) # doctest: +ELLIPSIS
#... #...
def addsitepackages(known_paths): def addsitepackages(known_paths):
paths = [] """Add site packages.
<BLANKLINE>
This function is written by buildout. See original_addsitepackages,
below, for the original version."""
<BLANKLINE> <BLANKLINE>
import os import os
<BLANKLINE> <BLANKLINE>
...@@ -1175,7 +1123,8 @@ paths join a base to a path, as with the use of this argument in the ...@@ -1175,7 +1123,8 @@ paths join a base to a path, as with the use of this argument in the
base = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) base = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
base = os.path.dirname(base) base = os.path.dirname(base)
base = os.path.dirname(base) base = os.path.dirname(base)
paths[0:0] = [ # eggs paths = [
# Eggs.
join(base, 'eggs/demo-0.3-pyN.N.egg'), join(base, 'eggs/demo-0.3-pyN.N.egg'),
join(base, 'eggs/demoneeded-1.1-pyN.N.egg') join(base, 'eggs/demoneeded-1.1-pyN.N.egg')
]... ]...
...@@ -1186,10 +1135,10 @@ The paths resolve in practice as you would expect. ...@@ -1186,10 +1135,10 @@ The paths resolve in practice as you would expect.
... "import sys, pprint; pprint.pprint(sys.path)") ... "import sys, pprint; pprint.pprint(sys.path)")
... # doctest: +ELLIPSIS ... # doctest: +ELLIPSIS
['', ['',
'/interpreter/eggs/demo-0.3-py2.4.egg',
'/interpreter/eggs/demoneeded-1.1-py2.4.egg',
'/interpreter/parts/interpreter', '/interpreter/parts/interpreter',
...] ...,
'/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg']
<BLANKLINE> <BLANKLINE>
The ``extra_paths`` argument affects the path in site.py. Notice that The ``extra_paths`` argument affects the path in site.py. Notice that
...@@ -1203,8 +1152,12 @@ The ``extra_paths`` argument affects the path in site.py. Notice that ...@@ -1203,8 +1152,12 @@ The ``extra_paths`` argument affects the path in site.py. Notice that
>>> sys.stdout.write('#\n'); cat(site_path) # doctest: +ELLIPSIS >>> sys.stdout.write('#\n'); cat(site_path) # doctest: +ELLIPSIS
#... #...
def addsitepackages(known_paths): def addsitepackages(known_paths):
paths = [] """Add site packages.
paths[0:0] = [ # eggs <BLANKLINE>
This function is written by buildout. See original_addsitepackages,
below, for the original version."""
paths = [
# Eggs.
'/interpreter/eggs/demo-0.3-pyN.N.egg', '/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg', '/interpreter/eggs/demoneeded-1.1-pyN.N.egg',
'/interpreter/other' '/interpreter/other'
...@@ -1214,11 +1167,11 @@ The ``extra_paths`` argument affects the path in site.py. Notice that ...@@ -1214,11 +1167,11 @@ The ``extra_paths`` argument affects the path in site.py. Notice that
... "import sys, pprint; pprint.pprint(sys.path)") ... "import sys, pprint; pprint.pprint(sys.path)")
... # doctest: +ELLIPSIS ... # doctest: +ELLIPSIS
['', ['',
'/interpreter/parts/interpreter',
...,
'/interpreter/eggs/demo-0.3-pyN.N.egg', '/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg', '/interpreter/eggs/demoneeded-1.1-pyN.N.egg',
'/interpreter/other', '/interpreter/other']
'/interpreter/parts/interpreter',
...]
<BLANKLINE> <BLANKLINE>
The ``generate_scripts`` function: using site-packages The ``generate_scripts`` function: using site-packages
...@@ -1249,10 +1202,8 @@ and the Python you use is not managed precisely by your application (for ...@@ -1249,10 +1202,8 @@ and the Python you use is not managed precisely by your application (for
instance, it is a system Python), you open yourself up to these instance, it is a system Python), you open yourself up to these
possibilities. Don't be unaware of the dangers. possibilities. Don't be unaware of the dangers.
That explained, let's see how it works. Unfortunately, because of how That explained, let's see how it works. If you don't use namespace packages,
setuptools namespace packages are implemented differently for operating this is very straightforward.
system packages (debs or rpms) and normal installation, there's a tricky
dance.
>>> reset_interpreter() >>> reset_interpreter()
>>> generated = zc.buildout.easy_install.generate_scripts( >>> generated = zc.buildout.easy_install.generate_scripts(
...@@ -1262,28 +1213,88 @@ dance. ...@@ -1262,28 +1213,88 @@ dance.
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
#... #...
def addsitepackages(known_paths): def addsitepackages(known_paths):
paths = [ # These are the underlying Python's site-packages. """Add site packages.
'...'] <BLANKLINE>
sys.path[0:0] = paths This function is written by buildout. See original_addsitepackages,
known_paths.update([os.path.normcase(os.path.abspath(p)) for p in paths]) below, for the original version."""
try: paths = [
import pkg_resources # Eggs.
except ImportError:
# No namespace packages in sys.path; no fixup needed.
pkg_resources = None
paths[0:0] = [ # eggs
'/interpreter/eggs/demo-0.3-pyN.N.egg', '/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg' '/interpreter/eggs/demoneeded-1.1-pyN.N.egg',
# These are the underlying Python's site-packages.
...
]...
It simply adds the site-packages after the eggs.
Here's an example of the new script in use. Other documents and tests in
this package give the feature a more thorough workout, but this should
give you an idea of the feature.
>>> res = call_py(interpreter_path, "import sys; print sys.path")
>>> print res # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
['',
'/interpreter/parts/interpreter',
...,
'/interpreter/eggs/demo-0.3-py2.4.egg',
'/interpreter/eggs/demoneeded-1.1-py2.4.egg',
...]
<BLANKLINE>
The clean_paths gathered earlier is a subset of this full list of paths.
>>> full_paths = eval(res.strip())
>>> len(clean_paths) < len(full_paths)
True
>>> set(os.path.normpath(p) for p in clean_paths).issubset(
... os.path.normpath(p) for p in full_paths)
True
Unfortunately, because of how setuptools namespace packages are implemented
differently for operating system packages (debs or rpms) as opposed to
standard setuptools installation, there's a slightly trickier dance if you
use them. To show this we'll needs some extra eggs that use namespaces.
We'll use the ``tellmy.fortune`` package, which we'll need to make an initial
call to another text fixture to create.
>>> from zc.buildout.tests import create_sample_namespace_eggs
>>> namespace_eggs = tmpdir('namespace_eggs')
>>> create_sample_namespace_eggs(namespace_eggs)
>>> ws = zc.buildout.easy_install.install(
... ['demo', 'tellmy.fortune'], join(interpreter_dir, 'eggs'),
... links=[link_server, namespace_eggs], index=link_server+'index/')
>>> generated = zc.buildout.easy_install.generate_scripts(
... interpreter_bin_dir, ws, sys.executable, interpreter_parts_dir,
... interpreter='py', add_site_packages=True)
>>> sys.stdout.write('#\n'); cat(site_path)
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
#...
def addsitepackages(known_paths):
"""Add site packages.
<BLANKLINE>
This function is written by buildout. See original_addsitepackages,
below, for the original version."""
setuptools_path = '...setuptools...'
sys.path.append(setuptools_path)
known_paths.add(setuptools_path)
import pkg_resources
paths = [
# Eggs.
'/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/tellmy.fortune-1.0-pyN.N.egg',
'...setuptools...',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg',
# These are the underlying Python's site-packages.
...
] ]
# Process all dirs. Look for .pth files. If they exist, defer
# processing "import" varieties.
dotpth = os.extsep + "pth" dotpth = os.extsep + "pth"
deferred = [] for path in paths:
for path in reversed(paths): # This duplicates addsitedir except for adding the pkg_resources call.
# Duplicating addsitedir.
sitedir, sitedircase = makepath(path) sitedir, sitedircase = makepath(path)
if not sitedircase in known_paths and os.path.exists(sitedir): if not sitedircase in known_paths and os.path.exists(sitedir):
sys.path.insert(0, sitedir) sys.path.append(sitedir)
pkg_resources.working_set.add_entry(sitedir)
known_paths.add(sitedircase) known_paths.add(sitedircase)
try: try:
names = os.listdir(sitedir) names = os.listdir(sitedir)
...@@ -1292,50 +1303,7 @@ dance. ...@@ -1292,50 +1303,7 @@ dance.
names = [name for name in names if name.endswith(dotpth)] names = [name for name in names if name.endswith(dotpth)]
names.sort() names.sort()
for name in names: for name in names:
# Duplicating addpackage. addpackage(sitedir, name, known_paths)
fullname = os.path.join(sitedir, name)
try:
f = open(fullname, "rU")
except IOError:
continue
try:
for line in f:
if line.startswith("#"):
continue
if (line.startswith("import ") or
line.startswith("import ")):
# This line is supposed to be executed. It
# might be a setuptools namespace package
# installed with a system package manager.
# Defer this so we can process egg namespace
# packages first, or else the eggs with the same
# namespace will be ignored.
deferred.append((sitedir, name, fullname, line))
continue
line = line.rstrip()
dir, dircase = makepath(sitedir, line)
if not dircase in known_paths and os.path.exists(dir):
sys.path.append(dir)
known_paths.add(dircase)
finally:
f.close()
if pkg_resources is not None:
# There may be namespace packages in sys.path. This is much faster
# than importing pkg_resources after the sys.path has a large number
# of eggs.
for p in sys.path:
pkg_resources.fixup_namespace_packages(p)
# Process "import ..." .pth lines.
for sitedir, name, fullname, line in deferred:
# Note that some lines--such as the one setuptools writes for
# namespace packages--expect some or all of sitedir, name, and
# fullname to be present in the frame locals, as it is in
# ``addpackage``.
try:
exec line
except:
print "Error in %s" % (fullname,)
raise
global addsitepackages global addsitepackages
addsitepackages = original_addsitepackages addsitepackages = original_addsitepackages
return known_paths return known_paths
...@@ -1344,35 +1312,23 @@ dance. ...@@ -1344,35 +1312,23 @@ dance.
<BLANKLINE> <BLANKLINE>
def original_addsitepackages(known_paths):... def original_addsitepackages(known_paths):...
As you can see, the script now first tries to import pkg_resources. If it >>> print call_py(interpreter_path, "import sys; print sys.path")
exists, then we need to process egg files specially to look for namespace ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
packages there *before* we process process lines in .pth files that use the
"import" feature--lines that might be part of the setuptools namespace
package implementation for system packages, as mentioned above, and that
must come after processing egg namespaces.
Here's an example of the new script in use. Other documents and tests in
this package give the feature a more thorough workout, but this should
give you an idea of the feature.
>>> res = call_py(interpreter_path, "import sys; print sys.path")
>>> print res # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
['', ['',
'/interpreter/eggs/demo-0.3-py2.4.egg',
'/interpreter/eggs/demoneeded-1.1-py2.4.egg',
'...',
'/interpreter/parts/interpreter', '/interpreter/parts/interpreter',
...,
'...setuptools...',
'/interpreter/eggs/demo-0.3-pyN.N.egg',
'/interpreter/eggs/tellmy.fortune-1.0-pyN.N.egg',
'/interpreter/eggs/demoneeded-1.1-pyN.N.egg',
...] ...]
<BLANKLINE>
The clean_paths gathered earlier is a subset of this full list of paths. As you can see, the script now first imports pkg_resources. Then we
need to process egg files specially to look for namespace packages there
>>> full_paths = eval(res.strip()) *before* we process process lines in .pth files that use the "import"
>>> len(clean_paths) < len(full_paths) feature--lines that might be part of the setuptools namespace package
True implementation for system packages, as mentioned above, and that must
>>> set(os.path.normpath(p) for p in clean_paths).issubset( come after processing egg namespaces.
... os.path.normpath(p) for p in full_paths)
True
The ``exec_sitecustomize`` argument does the same thing for the The ``exec_sitecustomize`` argument does the same thing for the
sitecustomize module--it allows you to include the code from the sitecustomize module--it allows you to include the code from the
...@@ -1392,6 +1348,9 @@ files then initialize the Python environment as we have already seen. Let's ...@@ -1392,6 +1348,9 @@ files then initialize the Python environment as we have already seen. Let's
see a simple example. see a simple example.
>>> reset_interpreter() >>> reset_interpreter()
>>> ws = zc.buildout.easy_install.install(
... ['demo'], join(interpreter_dir, 'eggs'), links=[link_server],
... index=link_server+'index/')
>>> generated = zc.buildout.easy_install.generate_scripts( >>> generated = zc.buildout.easy_install.generate_scripts(
... interpreter_bin_dir, ws, sys.executable, interpreter_parts_dir, ... interpreter_bin_dir, ws, sys.executable, interpreter_parts_dir,
... reqs=['demo']) ... reqs=['demo'])
......
...@@ -2890,8 +2890,12 @@ def increment_on_command_line(): ...@@ -2890,8 +2890,12 @@ def increment_on_command_line():
###################################################################### ######################################################################
def make_py_with_system_install(make_py, sample_eggs): def make_py_with_system_install(make_py, sample_eggs):
from zc.buildout.testing import write, mkdir
py_path, site_packages_path = make_py() py_path, site_packages_path = make_py()
create_sample_namespace_eggs(sample_eggs, site_packages_path)
return py_path
def create_sample_namespace_eggs(dest, site_packages_path=None):
from zc.buildout.testing import write, mkdir
for pkg, version in (('version', '1.0'), ('version', '1.1'), for pkg, version in (('version', '1.0'), ('version', '1.1'),
('fortune', '1.0')): ('fortune', '1.0')):
tmp = tempfile.mkdtemp() tmp = tempfile.mkdtemp()
...@@ -2918,14 +2922,13 @@ def make_py_with_system_install(make_py, sample_eggs): ...@@ -2918,14 +2922,13 @@ def make_py_with_system_install(make_py, sample_eggs):
" author='bob', url='bob', author_email='bob')\n" " author='bob', url='bob', author_email='bob')\n"
% locals() % locals()
) )
zc.buildout.testing.sdist(tmp, sample_eggs) zc.buildout.testing.sdist(tmp, dest)
if pkg == 'version' and version == '1.1': if (site_packages_path and pkg == 'version' and version == '1.1'):
# We install the 1.1 version in site packages the way a # We install the 1.1 version in site packages the way a
# system packaging system (debs, rpms) would do it. # system packaging system (debs, rpms) would do it.
zc.buildout.testing.sys_install(tmp, site_packages_path) zc.buildout.testing.sys_install(tmp, site_packages_path)
finally: finally:
shutil.rmtree(tmp) shutil.rmtree(tmp)
return py_path
def create_sample_eggs(test, executable=sys.executable): def create_sample_eggs(test, executable=sys.executable):
write = test.globs['write'] write = test.globs['write']
......
...@@ -168,9 +168,8 @@ provided. ...@@ -168,9 +168,8 @@ provided.
Here's an example of using the generated interpreter. Here's an example of using the generated interpreter.
>>> print system(join(sample_buildout, 'bin', 'py') + >>> print system(join(sample_buildout, 'bin', 'py') +
... ' -c "import sys, pprint; pprint.pprint(sys.path[:3])"') ... ' -c "import sys, pprint; pprint.pprint(sys.path[-2:])"')
['', ['/sample-buildout/eggs/demo-0.2-pyN.N.egg',
'/sample-buildout/eggs/demo-0.2-pyN.N.egg',
'/sample-buildout/eggs/demoneeded-1.2c1-pyN.N.egg'] '/sample-buildout/eggs/demoneeded-1.2c1-pyN.N.egg']
<BLANKLINE> <BLANKLINE>
...@@ -241,13 +240,12 @@ Now let's take a look at add-site-packages. ...@@ -241,13 +240,12 @@ Now let's take a look at add-site-packages.
... ''' -c "import sys, pprint; pprint.pprint(sys.path)"''') ... ''' -c "import sys, pprint; pprint.pprint(sys.path)"''')
... # doctest: +ELLIPSIS ... # doctest: +ELLIPSIS
['', ['',
'/sample-buildout/parts/py',
...,
'/sample-buildout/eggs/demo-0.2-pyN.N.egg', '/sample-buildout/eggs/demo-0.2-pyN.N.egg',
'/sample-buildout/eggs/demoneeded-1.2c1-pyN.N.egg', '/sample-buildout/eggs/demoneeded-1.2c1-pyN.N.egg',
'/executable_buildout/eggs/setuptools-0.6c11-pyN.N.egg', '/executable_buildout/eggs/setuptools-X-pyN.N.egg',
'/executable_buildout/site-packages', '/executable_buildout/site-packages']
'/sample-buildout/parts/py',
'/executable_buildout/parts/py',
...]
<BLANKLINE> <BLANKLINE>
Next we will use the exec-sitecustomize option. It simply copies Next we will use the exec-sitecustomize option. It simply copies
...@@ -327,9 +325,8 @@ Now let's put it in action. ...@@ -327,9 +325,8 @@ Now let's put it in action.
Generated interpreter '/sample-buildout/bin/python'. Generated interpreter '/sample-buildout/bin/python'.
>>> print system(join(sample_buildout, 'bin', 'python') + >>> print system(join(sample_buildout, 'bin', 'python') +
... ' -c "import sys, pprint; pprint.pprint(sys.path[:3])"') ... ' -c "import sys, pprint; pprint.pprint(sys.path[-2:])"')
['', ['/sample-buildout/eggs/demo-0.2-pyN.N.egg',
'/sample-buildout/eggs/demo-0.2-pyN.N.egg',
'/sample-buildout/eggs/demoneeded-1.2c1-pyN.N.egg'] '/sample-buildout/eggs/demoneeded-1.2c1-pyN.N.egg']
<BLANKLINE> <BLANKLINE>
>>> print system(join(sample_buildout, 'bin', 'python') + >>> print system(join(sample_buildout, 'bin', 'python') +
......
...@@ -226,7 +226,7 @@ Let's look at the site.py that was generated: ...@@ -226,7 +226,7 @@ Let's look at the site.py that was generated:
... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
#... #...
def addsitepackages(known_paths): def addsitepackages(known_paths):
paths = [] "..."
<BLANKLINE> <BLANKLINE>
import os import os
<BLANKLINE> <BLANKLINE>
...@@ -234,7 +234,8 @@ Let's look at the site.py that was generated: ...@@ -234,7 +234,8 @@ Let's look at the site.py that was generated:
base = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) base = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
base = os.path.dirname(base) base = os.path.dirname(base)
base = os.path.dirname(base) base = os.path.dirname(base)
paths[0:0] = [ # eggs paths = [
# Eggs.
'/foo/bar', '/foo/bar',
join(base, 'spam') join(base, 'spam')
]... ]...
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment