예제 #1
0
    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()
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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()))
예제 #5
0
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
  )
예제 #6
0
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)
예제 #7
0
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))
예제 #8
0
 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
예제 #9
0
 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
예제 #10
0
 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)
예제 #11
0
 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
예제 #12
0
 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
예제 #13
0
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)
예제 #14
0
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))
예제 #15
0
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
예제 #16
0
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