diff options
author | Jeremy Bowman <jbowman@edx.org> | 2018-05-15 16:26:04 -0400 |
---|---|---|
committer | Jeremy Bowman <jbowman@edx.org> | 2018-05-15 16:54:03 -0400 |
commit | 0c2e5c9db4c7dd26ba49ffc4a75657715be587b0 (patch) | |
tree | 8497f0948432ce3c912a3fe379d2480ed11f6d0d /setuptools | |
parent | 5dddf7f26295af7ab9cd5dbf1e2b4472d7739187 (diff) | |
download | external_python_setuptools-0c2e5c9db4c7dd26ba49ffc4a75657715be587b0.tar.gz external_python_setuptools-0c2e5c9db4c7dd26ba49ffc4a75657715be587b0.tar.bz2 external_python_setuptools-0c2e5c9db4c7dd26ba49ffc4a75657715be587b0.zip |
Fix attr: with package_dirs
Diffstat (limited to 'setuptools')
-rw-r--r-- | setuptools/config.py | 34 | ||||
-rw-r--r-- | setuptools/tests/test_config.py | 53 |
2 files changed, 77 insertions, 10 deletions
diff --git a/setuptools/config.py b/setuptools/config.py index 6343840e..d3f0b123 100644 --- a/setuptools/config.py +++ b/setuptools/config.py @@ -102,14 +102,14 @@ def parse_configuration( If False exceptions are propagated as expected. :rtype: list """ - meta = ConfigMetadataHandler( - distribution.metadata, command_options, ignore_option_errors) - meta.parse() - options = ConfigOptionsHandler( distribution, command_options, ignore_option_errors) options.parse() + meta = ConfigMetadataHandler( + distribution.metadata, command_options, ignore_option_errors, distribution.package_dir) + meta.parse() + return meta, options @@ -281,7 +281,7 @@ class ConfigHandler(object): return f.read() @classmethod - def _parse_attr(cls, value): + def _parse_attr(cls, value, package_dir=None): """Represents value as a module attribute. Examples: @@ -301,7 +301,21 @@ class ConfigHandler(object): module_name = '.'.join(attrs_path) module_name = module_name or '__init__' - sys.path.insert(0, os.getcwd()) + parent_path = os.getcwd() + if package_dir: + if attrs_path[0] in package_dir: + # A custom path was specified for the module we want to import + custom_path = package_dir[attrs_path[0]] + parts = custom_path.rsplit('/', 1) + if len(parts) > 1: + parent_path = os.path.join(os.getcwd(), parts[0]) + module_name = parts[1] + else: + module_name = custom_path + elif '' in package_dir: + # A custom parent directory was specified for all root modules + parent_path = os.path.join(os.getcwd(), package_dir['']) + sys.path.insert(0, parent_path) try: module = import_module(module_name) value = getattr(module, attr_name) @@ -400,6 +414,12 @@ class ConfigMetadataHandler(ConfigHandler): """ + def __init__(self, target_obj, options, ignore_option_errors=False, + package_dir=None): + super(ConfigMetadataHandler, self).__init__(target_obj, options, + ignore_option_errors) + self.package_dir = package_dir + @property def parsers(self): """Metadata item name to parser function mapping.""" @@ -440,7 +460,7 @@ class ConfigMetadataHandler(ConfigHandler): )) return version - version = self._parse_attr(value) + version = self._parse_attr(value, self.package_dir) if callable(version): version = version() diff --git a/setuptools/tests/test_config.py b/setuptools/tests/test_config.py index 17ac09c8..de7c8b4d 100644 --- a/setuptools/tests/test_config.py +++ b/setuptools/tests/test_config.py @@ -10,13 +10,15 @@ class ErrConfigHandler(ConfigHandler): def make_package_dir(name, base_dir): - dir_package = base_dir.mkdir(name) + dir_package = base_dir + for dir_name in name.split('/'): + dir_package = dir_package.mkdir(dir_name) init_file = dir_package.join('__init__.py') init_file.write('') return dir_package, init_file -def fake_env(tmpdir, setup_cfg, setup_py=None): +def fake_env(tmpdir, setup_cfg, setup_py=None, package_path='fake_package'): if setup_py is None: setup_py = ( @@ -28,7 +30,7 @@ def fake_env(tmpdir, setup_cfg, setup_py=None): config = tmpdir.join('setup.cfg') config.write(setup_cfg) - package_dir, init_file = make_package_dir('fake_package', tmpdir) + package_dir, init_file = make_package_dir(package_path, tmpdir) init_file.write( 'VERSION = (1, 2, 3)\n' @@ -285,6 +287,51 @@ class TestMetadata: with get_dist(tmpdir) as dist: _ = dist.metadata.version + def test_version_with_package_dir_simple(self, tmpdir): + + _, config = fake_env( + tmpdir, + '[metadata]\n' + 'version = attr: fake_package_simple.VERSION\n' + '[options]\n' + 'package_dir =\n' + ' = src\n', + package_path='src/fake_package_simple' + ) + + with get_dist(tmpdir) as dist: + assert dist.metadata.version == '1.2.3' + + def test_version_with_package_dir_rename(self, tmpdir): + + _, config = fake_env( + tmpdir, + '[metadata]\n' + 'version = attr: fake_package_rename.VERSION\n' + '[options]\n' + 'package_dir =\n' + ' fake_package_rename = fake_dir\n', + package_path='fake_dir' + ) + + with get_dist(tmpdir) as dist: + assert dist.metadata.version == '1.2.3' + + def test_version_with_package_dir_complex(self, tmpdir): + + _, config = fake_env( + tmpdir, + '[metadata]\n' + 'version = attr: fake_package_complex.VERSION\n' + '[options]\n' + 'package_dir =\n' + ' fake_package_complex = src/fake_dir\n', + package_path='src/fake_dir' + ) + + with get_dist(tmpdir) as dist: + assert dist.metadata.version == '1.2.3' + def test_unknown_meta_item(self, tmpdir): fake_env( |