def test_all_does_not_raise_with_empty_path_envvar(self): # type: () -> None """additionally, tests that the module does not raise at import.""" with patch.dict(os.environ, clear=True): if PY3: import importlib importlib.reload(interpreter) else: reload(interpreter) PythonInterpreter.all()
def test_find_compatible_interpreters(): py27 = ensure_python_interpreter(PY27) py35 = ensure_python_interpreter(PY35) py36 = ensure_python_interpreter(PY36) pex_python_path = ':'.join([py27, py35, py36]) def find_interpreters(*constraints): return [interp.binary for interp in find_compatible_interpreters(pex_python_path=pex_python_path, compatibility_constraints=constraints)] assert [py35, py36] == find_interpreters('>3') assert [py27] == find_interpreters('<3') assert [py36] == find_interpreters('>{}'.format(PY35)) assert [py35] == find_interpreters('>{}, <{}'.format(PY27, PY36)) assert [py36] == find_interpreters('>=3.6') assert [] == find_interpreters('<2') assert [] == find_interpreters('>4') assert [] == find_interpreters('>{}, <{}'.format(PY27, PY35)) # All interpreters on PATH including whatever interpreter is currently running. all_known_interpreters = set(PythonInterpreter.all()) all_known_interpreters.add(PythonInterpreter.get()) interpreters = find_compatible_interpreters(compatibility_constraints=['<3']) assert set(interpreters).issubset(all_known_interpreters)
def test_find_compatible_interpreters(): py27 = ensure_python_interpreter(PY27) py35 = ensure_python_interpreter(PY35) py36 = ensure_python_interpreter(PY36) pex_python_path = ':'.join([py27, py35, py36]) def find_interpreters(*constraints): return [ interp.binary for interp in find_compatible_interpreters( path=pex_python_path, compatibility_constraints=constraints) ] assert [py35, py36] == find_interpreters('>3') assert [py27] == find_interpreters('<3') assert [py36] == find_interpreters('>{}'.format(PY35)) assert [py35] == find_interpreters('>{}, <{}'.format(PY27, PY36)) assert [py36] == find_interpreters('>=3.6') assert [] == find_interpreters('<2') assert [] == find_interpreters('>4') assert [] == find_interpreters('>{}, <{}'.format(PY27, PY35)) # All interpreters on PATH including whatever interpreter is currently running. all_known_interpreters = set(PythonInterpreter.all()) all_known_interpreters.add(PythonInterpreter.get()) interpreters = find_compatible_interpreters( compatibility_constraints=['<3']) assert set(interpreters).issubset(all_known_interpreters)
def test_find_compatible_interpreters(): py27 = ensure_python_interpreter(PY27) py35 = ensure_python_interpreter(PY35) py36 = ensure_python_interpreter(PY36) pex_python_path = ':'.join([py27, py35, py36]) def find_interpreters(*constraints): return [ interp.binary for interp in find_compatible_interpreters( pex_python_path, constraints) ] assert [py35, py36] == find_interpreters('>3') assert [py27] == find_interpreters('<3') assert [py36] == find_interpreters('>{}'.format(PY35)) assert [py35] == find_interpreters('>{}, <{}'.format(PY27, PY36)) assert [py36] == find_interpreters('>=3.6') assert [] == find_interpreters('<2') assert [] == find_interpreters('>4') assert [] == find_interpreters('>{}, <{}'.format(PY27, PY35)) # All interpreters on PATH. interpreters = find_compatible_interpreters( pex_python_path='', compatibility_constraints=['<3']) assert set(interpreters).issubset(set(PythonInterpreter.all()))
def find_compatible_interpreters(pex_python_path=None, compatibility_constraints=None): """Find all compatible interpreters on the system within the supplied constraints and use PEX_PYTHON_PATH if it is set. If not, fall back to interpreters on $PATH. """ if pex_python_path: interpreters = [] for binary in pex_python_path.split(os.pathsep): try: interpreters.append(PythonInterpreter.from_binary(binary)) except Executor.ExecutionError: print("Python interpreter %s in PEX_PYTHON_PATH failed to load properly." % binary, file=sys.stderr) if not interpreters: die('PEX_PYTHON_PATH was defined, but no valid interpreters could be identified. Exiting.') else: # We may have been invoked with a specific interpreter not on the $PATH, make sure our # sys.executable is included as a candidate in this case. interpreters = OrderedSet([PythonInterpreter.get()]) # Add all qualifying interpreters found in $PATH. interpreters.update(PythonInterpreter.all()) return list( matched_interpreters(interpreters, compatibility_constraints) if compatibility_constraints else interpreters )
def find_compatible_interpreters(pex_python_path, compatibility_constraints): """Find all compatible interpreters on the system within the supplied constraints and use PEX_PYTHON_PATH if it is set. If not, fall back to interpreters on $PATH. """ if pex_python_path: interpreters = [] for binary in pex_python_path.split(os.pathsep): try: interpreters.append(PythonInterpreter.from_binary(binary)) except Executor.ExecutionError: print( "Python interpreter %s in PEX_PYTHON_PATH failed to load properly." % binary, file=sys.stderr) if not interpreters: die('PEX_PYTHON_PATH was defined, but no valid interpreters could be identified. Exiting.' ) else: if not os.getenv('PATH', ''): # no $PATH, use sys.executable interpreters = [PythonInterpreter.get()] else: # get all qualifying interpreters found in $PATH interpreters = PythonInterpreter.all() return list( matched_interpreters(interpreters, compatibility_constraints ) if compatibility_constraints else interpreters)
def test_find_compatible_interpreters(): py27 = ensure_python_interpreter(PY27) py35 = ensure_python_interpreter(PY35) py36 = ensure_python_interpreter(PY36) path = [py27, py35, py36] assert [py35, py36] == find_interpreters(path, '>3') assert [py27] == find_interpreters(path, '<3') assert [py36] == find_interpreters(path, '>{}'.format(PY35)) assert [py35] == find_interpreters(path, '>{}, <{}'.format(PY27, PY36)) assert [py36] == find_interpreters(path, '>=3.6') assert [] == find_interpreters(path, '<2') assert [] == find_interpreters(path, '>4') assert [] == find_interpreters(path, '>{}, <{}'.format(PY27, PY35)) # All interpreters on PATH including whatever interpreter is currently running. all_known_interpreters = set(PythonInterpreter.all()) all_known_interpreters.add(PythonInterpreter.get()) interpreters = set( iter_compatible_interpreters(compatibility_constraints=['<3'])) i_rendered = '\n '.join(sorted(map(repr, interpreters))) aki_rendered = '\n '.join(sorted(map(repr, all_known_interpreters))) assert interpreters.issubset(all_known_interpreters), dedent(""" interpreters '<3': {interpreters} all known interpreters: {all_known_interpreters} """.format(interpreters=i_rendered, all_known_interpreters=aki_rendered))
def _setup_paths(self, paths, filters=()): """Find interpreters under paths, and cache them.""" for interpreter in self._matching(PythonInterpreter.all(paths), filters=filters): identity_str = str(interpreter.identity) pi = self._interpreter_from_relpath(identity_str, filters=filters) if pi is None: self._setup_interpreter(interpreter, identity_str) pi = self._interpreter_from_relpath(identity_str, filters=filters) if pi: yield pi
def _setup_paths(self, paths, filters=()): """Find interpreters under paths, and cache them.""" for interpreter in self._matching(PythonInterpreter.all(paths), filters=filters): identity_str = str(interpreter.identity) pi = self._interpreter_from_relpath(identity_str, filters=filters) if pi is None: self._setup_interpreter(interpreter, identity_str) pi = self._interpreter_from_relpath(identity_str, filters=filters) if pi: yield pi
def _setup_paths(self, paths, filters): for interpreter in self._matching(PythonInterpreter.all(paths), filters): identity_str = str(interpreter.identity) path = os.path.join(self._path, identity_str) pi = self._interpreter_from_path(path, filters) if pi is None: self._setup_interpreter(interpreter) pi = self._interpreter_from_path(path, filters) if pi is None: continue self._interpreters.add(pi)
def _setup_paths(self, paths, filters): """Find interpreters under paths, and cache them.""" for interpreter in self._matching(PythonInterpreter.all(paths), filters): identity_str = str(interpreter.identity) cache_path = os.path.join(self._cache_dir, identity_str) pi = self._interpreter_from_path(cache_path, filters) if pi is None: self._setup_interpreter(interpreter, cache_path) pi = self._interpreter_from_path(cache_path, filters) if pi: yield pi
def _setup_paths(self, paths, filters): """Find interpreters under paths, and cache them.""" for interpreter in self._matching(PythonInterpreter.all(paths), filters): identity_str = str(interpreter.identity) cache_path = os.path.join(self._cache_dir, identity_str) pi = self._interpreter_from_path(cache_path, filters) if pi is None: self._setup_interpreter(interpreter, cache_path) pi = self._interpreter_from_path(cache_path, filters) if pi: yield pi
def find_compatible_interpreters(path=None, compatibility_constraints=None): """Find all compatible interpreters on the system within the supplied constraints and use path if it is set. If not, fall back to interpreters on $PATH. """ interpreters = OrderedSet() paths = None if path: paths = path.split(os.pathsep) else: # We may have been invoked with a specific interpreter, make sure our sys.executable is included # as a candidate in this case. interpreters.add(PythonInterpreter.get()) interpreters.update(PythonInterpreter.all(paths=paths)) return _filter_compatible_interpreters( interpreters, compatibility_constraints=compatibility_constraints)
def test_find_compatible_interpreters(): # type: () -> None py27 = ensure_python_interpreter(PY27) py35 = ensure_python_interpreter(PY35) py36 = ensure_python_interpreter(PY36) path = [py27, py35, py36] assert [py35, py36] == find_interpreters(path, constraints=[">3"]) assert [py27] == find_interpreters(path, constraints=["<3"]) assert [py36] == find_interpreters(path, constraints=[">{}".format(PY35)]) assert [py35 ] == find_interpreters(path, constraints=[">{}, <{}".format(PY27, PY36)]) assert [py36] == find_interpreters(path, constraints=[">=3.6"]) with pytest.raises(UnsatisfiableInterpreterConstraintsError): find_interpreters(path, constraints=["<2"]) with pytest.raises(UnsatisfiableInterpreterConstraintsError): find_interpreters(path, constraints=[">4"]) with pytest.raises(UnsatisfiableInterpreterConstraintsError): find_interpreters(path, constraints=[">{}, <{}".format(PY27, PY35)]) # All interpreters on PATH including whatever interpreter is currently running. all_known_interpreters = set(PythonInterpreter.all()) all_known_interpreters.add(PythonInterpreter.get()) interpreters = set( iter_compatible_interpreters(interpreter_constraints=["<3"])) i_rendered = "\n ".join(sorted(map(repr, interpreters))) aki_rendered = "\n ".join(sorted(map(repr, all_known_interpreters))) assert interpreters.issubset(all_known_interpreters), dedent(""" interpreters '<3': {interpreters} all known interpreters: {all_known_interpreters} """.format(interpreters=i_rendered, all_known_interpreters=aki_rendered))
def test_find_compatible_interpreters(): pex_python_path = ':'.join([ ensure_python_interpreter('2.7.9'), ensure_python_interpreter('2.7.10'), ensure_python_interpreter('2.7.11'), ensure_python_interpreter('3.4.2'), ensure_python_interpreter('3.5.4'), ensure_python_interpreter('3.6.2'), ensure_python_interpreter('3.6.3') ]) interpreters = find_compatible_interpreters(pex_python_path, ['>3']) assert interpreters[0].binary == pex_python_path.split(':')[3] # 3.4.2 interpreters = find_compatible_interpreters(pex_python_path, ['<3']) assert interpreters[0].binary == pex_python_path.split(':')[0] # 2.7.9 interpreters = find_compatible_interpreters(pex_python_path, ['>3.5.4']) assert interpreters[0].binary == pex_python_path.split(':')[5] # 3.6.2 interpreters = find_compatible_interpreters(pex_python_path, ['>3.4.2, <3.6']) assert interpreters[0].binary == pex_python_path.split(':')[4] # 3.5.4 interpreters = find_compatible_interpreters(pex_python_path, ['>3.6.2']) assert interpreters[0].binary == pex_python_path.split(':')[6] # 3.6.3 interpreters = find_compatible_interpreters(pex_python_path, ['<2']) assert not interpreters interpreters = find_compatible_interpreters(pex_python_path, ['>4']) assert not interpreters interpreters = find_compatible_interpreters(pex_python_path, ['<2.7.11, >2.7.9']) assert interpreters[0].binary == pex_python_path.split(':')[1] # 2.7.10 interpreters = find_compatible_interpreters('', ['<3']) assert interpreters[0] in PythonInterpreter.all( ) # All interpreters on PATH
def test_find_compatible_interpreters(): pex_python_path = ':'.join([ ensure_python_interpreter('2.7.9'), ensure_python_interpreter('2.7.10'), ensure_python_interpreter('2.7.11'), ensure_python_interpreter('3.4.2'), ensure_python_interpreter('3.5.4'), ensure_python_interpreter('3.6.2'), ensure_python_interpreter('3.6.3') ]) interpreters = find_compatible_interpreters(pex_python_path, ['>3']) assert interpreters[0].binary == pex_python_path.split(':')[3] # 3.4.2 interpreters = find_compatible_interpreters(pex_python_path, ['<3']) assert interpreters[0].binary == pex_python_path.split(':')[0] # 2.7.9 interpreters = find_compatible_interpreters(pex_python_path, ['>3.5.4']) assert interpreters[0].binary == pex_python_path.split(':')[5] # 3.6.2 interpreters = find_compatible_interpreters(pex_python_path, ['>3.4.2, <3.6']) assert interpreters[0].binary == pex_python_path.split(':')[4] # 3.5.4 interpreters = find_compatible_interpreters(pex_python_path, ['>3.6.2']) assert interpreters[0].binary == pex_python_path.split(':')[6] # 3.6.3 interpreters = find_compatible_interpreters(pex_python_path, ['<2']) assert not interpreters interpreters = find_compatible_interpreters(pex_python_path, ['>4']) assert not interpreters interpreters = find_compatible_interpreters(pex_python_path, ['<2.7.11, >2.7.9']) assert interpreters[0].binary == pex_python_path.split(':')[1] # 2.7.10 interpreters = find_compatible_interpreters('', ['<3']) assert interpreters[0] in PythonInterpreter.all() # All interpreters on PATH