Skip to content

Commit

Permalink
Fixed python#5940: distutils.command.build_clib.check_library_list is…
Browse files Browse the repository at this point in the history
… doing the right checkings again
  • Loading branch information
Tarek Ziadé committed May 6, 2009
1 parent bcf8506 commit dd9f65f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 10 deletions.
25 changes: 15 additions & 10 deletions Lib/distutils/command/build_clib.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,15 @@ def run(self):


def check_library_list(self, libraries):
"""Ensure that the list of libraries (presumably provided as a
command option 'libraries') is valid, i.e. it is a list of
2-tuples, where the tuples are (library_name, build_info_dict).
Raise DistutilsSetupError if the structure is invalid anywhere;
just returns otherwise."""
# Yechh, blecch, ackk: this is ripped straight out of build_ext.py,
# with only names changed to protect the innocent!
"""Ensure that the list of libraries is valid.
`library` is presumably provided as a command option 'libraries'.
This method checks that it is a list of 2-tuples, where the tuples
are (library_name, build_info_dict).
Raise DistutilsSetupError if the structure is invalid anywhere;
just returns otherwise.
"""
if not isinstance(libraries, list):
raise DistutilsSetupError(
"'libraries' option must be a list of tuples")
Expand All @@ -134,15 +136,18 @@ def check_library_list(self, libraries):
raise DistutilsSetupError(
"each element of 'libraries' must a 2-tuple")

if isinstance(lib[0], str):
name, build_info = lib

if not isinstance(name, str):
raise DistutilsSetupError(
"first element of each tuple in 'libraries' "
"must be a string (the library name)")
if '/' in lib[0] or (os.sep != '/' and os.sep in lib[0]):

if '/' in name or (os.sep != '/' and os.sep in name):
raise DistutilsSetupError("bad library name '%s': "
"may not contain directory separators" % lib[0])

if not isinstance(lib[1], dict):
if not isinstance(build_info, dict):
raise DistutilsSetupError(
"second element of each tuple in 'libraries' "
"must be a dictionary (build info)")
Expand Down
47 changes: 47 additions & 0 deletions Lib/distutils/tests/test_build_clib.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""Tests for distutils.command.build_clib."""
import unittest

from distutils.command.build_clib import build_clib
from distutils.errors import DistutilsSetupError
from distutils.tests import support

class BuildCLibTestCase(support.TempdirManager,
support.LoggingSilencer,
unittest.TestCase):

def test_check_library_dist(self):
pkg_dir, dist = self.create_dist()
cmd = build_clib(dist)

# 'libraries' option must be a list
self.assertRaises(DistutilsSetupError, cmd.check_library_list, 'foo')

# each element of 'libraries' must a 2-tuple
self.assertRaises(DistutilsSetupError, cmd.check_library_list,
['foo1', 'foo2'])

# first element of each tuple in 'libraries'
# must be a string (the library name)
self.assertRaises(DistutilsSetupError, cmd.check_library_list,
[(1, 'foo1'), ('name', 'foo2')])

# library name may not contain directory separators
self.assertRaises(DistutilsSetupError, cmd.check_library_list,
[('name', 'foo1'),
('another/name', 'foo2')])

# second element of each tuple must be a dictionary (build info)
self.assertRaises(DistutilsSetupError, cmd.check_library_list,
[('name', {}),
('another', 'foo2')])

# those work
libs = [('name', {}), ('name', {'ok': 'good'})]
cmd.check_library_list(libs)


def test_suite():
return unittest.makeSuite(BuildCLibTestCase)

if __name__ == "__main__":
unittest.main(defaultTest="test_suite")
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,9 @@ Installation
Library
-------

- Issue #5940: distutils.command.build_clib.check_library_list was not doing
the right type checkings anymore.

- Issue #4875: On win32, ctypes.util.find_library does no longer
return directories.

Expand Down

0 comments on commit dd9f65f

Please sign in to comment.