diff --git a/plug/pip_resolve.py b/plug/pip_resolve.py index 60796480..20a7555c 100644 --- a/plug/pip_resolve.py +++ b/plug/pip_resolve.py @@ -6,6 +6,7 @@ import pip import pkg_resources import utils +import re def create_tree_of_packages_dependencies(dist_tree, packages_names, req_file_path): @@ -63,8 +64,24 @@ def create_package_as_root(package, dir_as_root): dir_as_root[DEPENDENCIES][package_as_root[NAME]] = package_tree return dir_as_root +sys_platform_re = re.compile('sys_platform\s*==\s*[\'"](.+)[\'"]') +sys_platform = sys.platform.lower() + +def matches_environment(requirement): + """Filter out requirements that should not be installed + in this environment. Only sys_platform is inspected right now. + This should be expanded to include other environment markers. + See: https://www.python.org/dev/peps/pep-0508/#environment-markers + """ + if 'sys_platform' in requirement.line: + match = sys_platform_re.findall(requirement.line) + if len(match) > 0: + return match[0].lower() == sys_platform + return True + def get_requirements_list(requirements_file): req_list = list(requirements.parse(requirements_file)) + req_list = filter(matches_environment, req_list) required = [req.name.replace('_', '-') for req in req_list] return required diff --git a/test/inspect.test.js b/test/inspect.test.js index 55cbe4cf..b4958ee8 100644 --- a/test/inspect.test.js +++ b/test/inspect.test.js @@ -138,6 +138,32 @@ test('package name differs from requirement', function (t) { }); }); +test('package depends on platform', function (t) { + chdirWorkspaces('pip-app-deps-conditional'); + return subProcess.execute('pip', + ['install', '-r', 'requirements.txt', '--disable-pip-version-check'] + ) + .then(function () { + return plugin.inspect('.', 'requirements.txt') + .then(function (result) { + var pkg = result.package; + t.notOk(pkg.dependencies.pypiwin32, 'win32 dep ignored'); + t.same(pkg.dependencies['posix-ipc'], { + from: [ + 'pip-app-deps-conditional@0.0.0', + 'posix-ipc@1.0.0', + ], + name: 'posix-ipc', + version: '1.0.0', + }, 'posix-ipc looks ok'); + t.end(); + }); + }) + .catch(function (error) { + t.fail(error); + }); +}); + function chdirWorkspaces(dir) { process.chdir(path.resolve(__dirname, 'workspaces', dir)); } diff --git a/test/workspaces/pip-app-deps-conditional/requirements.txt b/test/workspaces/pip-app-deps-conditional/requirements.txt new file mode 100644 index 00000000..e87cec37 --- /dev/null +++ b/test/workspaces/pip-app-deps-conditional/requirements.txt @@ -0,0 +1,2 @@ +pypiwin32==219; sys_platform == 'win32' +posix_ipc==1.0.0