Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.buildout
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
6
Merge Requests
6
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
slapos.buildout
Commits
7e825d61
Commit
7e825d61
authored
Feb 12, 2010
by
Gary Poster
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simplify resulting site.py function
parent
8f1f787f
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
202 additions
and
271 deletions
+202
-271
src/zc/buildout/easy_install.py
src/zc/buildout/easy_install.py
+59
-88
src/zc/buildout/easy_install.txt
src/zc/buildout/easy_install.txt
+125
-166
src/zc/buildout/tests.py
src/zc/buildout/tests.py
+7
-4
z3c.recipe.scripts_/src/z3c/recipe/scripts/README.txt
z3c.recipe.scripts_/src/z3c/recipe/scripts/README.txt
+8
-11
z3c.recipe.scripts_/src/z3c/recipe/scripts/tests.py
z3c.recipe.scripts_/src/z3c/recipe/scripts/tests.py
+3
-2
No files found.
src/zc/buildout/easy_install.py
View file @
7e825d61
...
@@ -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
...
...
src/zc/buildout/easy_install.txt
View file @
7e825d61
...
@@ -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'])
...
...
src/zc/buildout/tests.py
View file @
7e825d61
...
@@ -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'
]
...
...
z3c.recipe.scripts_/src/z3c/recipe/scripts/README.txt
View file @
7e825d61
...
@@ -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') +
...
...
z3c.recipe.scripts_/src/z3c/recipe/scripts/tests.py
View file @
7e825d61
...
@@ -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')
]...
]...
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment