Skip to content

Commit 323e84e

Browse files
committed
Evaluate PEP 508 environment markers for package dependencies
Previously any wheel dependencies that had an environment marker (such as 'python_version>3.3') were simply ignored, leading to missing packages in the Python environment constructed by bazel. Fixes bazel-contrib#49
1 parent 44711d8 commit 323e84e

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

rules_python/whl.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import argparse
1717
import json
1818
import os
19+
import pkg_resources
1920
import re
2021
import zipfile
2122

@@ -86,10 +87,10 @@ def dependencies(self, extra=None):
8687
if requirement.get('extra') != extra:
8788
# Match the requirements for the extra we're looking for.
8889
continue
89-
if 'environment' in requirement:
90-
# TODO(mattmoor): What's the best way to support "environment"?
91-
# This typically communicates things like python version (look at
92-
# "wheel" for a good example)
90+
marker = requirement.get('environment')
91+
if marker and not pkg_resources.evaluate_marker(marker):
92+
# The current environment does not match the provided PEP 508 marker,
93+
# so ignore this requirement.
9394
continue
9495
requires = requirement.get('requires', [])
9596
for entry in requires:

rules_python/whl_test.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414

1515
import os
1616
import unittest
17+
import sys
1718

1819
from rules_python import whl
1920

21+
VERSION_TUPLE = sys.version_info.major, sys.version_info.minor
22+
2023

2124
def TestData(name):
2225
return os.path.join(os.environ['TEST_SRCDIR'], name)
@@ -60,11 +63,19 @@ def test_mock_whl(self):
6063
self.assertEqual(wheel.name(), 'mock')
6164
self.assertEqual(wheel.distribution(), 'mock')
6265
self.assertEqual(wheel.version(), '2.0.0')
66+
if VERSION_TUPLE < (3, 3):
67+
expected_deps = ['funcsigs', 'pbr', 'six']
68+
else:
69+
expected_deps = ['pbr', 'six']
6370
self.assertEqual(set(wheel.dependencies()),
64-
set(['pbr', 'six']))
71+
set(expected_deps))
6572
self.assertEqual('pypi__mock_2_0_0', wheel.repository_name())
6673
self.assertEqual(['docs', 'test'], wheel.extras())
67-
self.assertEqual(set(wheel.dependencies(extra='docs')), set())
74+
if VERSION_TUPLE < (3, 0) or VERSION_TUPLE >= (3, 3):
75+
expected_doc_deps = ['sphinx']
76+
else:
77+
expected_doc_deps = ['sphinx', 'Pygments', 'jinja2']
78+
self.assertEqual(set(wheel.dependencies(extra='docs')), set(expected_doc_deps))
6879
self.assertEqual(set(wheel.dependencies(extra='test')), set(['unittest2']))
6980

7081
def test_google_cloud_language_whl(self):
@@ -74,9 +85,12 @@ def test_google_cloud_language_whl(self):
7485
self.assertEqual(wheel.name(), 'google-cloud-language')
7586
self.assertEqual(wheel.distribution(), 'google_cloud_language')
7687
self.assertEqual(wheel.version(), '0.29.0')
88+
expected_deps = ['google-gax', 'google-cloud-core',
89+
'googleapis-common-protos[grpc]']
90+
if VERSION_TUPLE < (3, 4):
91+
expected_deps.append('enum34')
7792
self.assertEqual(set(wheel.dependencies()),
78-
set(['google-gax', 'google-cloud-core',
79-
'googleapis-common-protos[grpc]']))
93+
set(expected_deps))
8094
self.assertEqual('pypi__google_cloud_language_0_29_0',
8195
wheel.repository_name())
8296
self.assertEqual([], wheel.extras())

0 commit comments

Comments
 (0)