Ejemplo n.º 1
0
    def test_ctor(self):
        # When
        repository = Repository()

        # Then
        self.assertEqual(len(repository), 0)

        # Given
        eggs = [
            "dummy-1.0.1-1.egg",
            "dummy_with_appinst-1.0.0-1.egg",
            "dummy_with_entry_points-1.0.0-1.egg",
            "dummy_with_proxy-1.3.40-3.egg",
            "dummy_with_proxy_scripts-1.0.0-1.egg",
            "dummy_with_proxy_softlink-1.0.0-1.egg",
            "nose-1.2.1-1.egg",
            "nose-1.3.0-1.egg",
            "nose-1.3.0-2.egg",
        ]
        paths = (os.path.join(_EGGINST_COMMON_DATA, egg) for egg in eggs)
        packages = [RepositoryPackageMetadata.from_egg(path) for path in paths]

        # When
        repository = Repository(packages)

        # Then
        self.assertEqual(len(repository), len(eggs))
Ejemplo n.º 2
0
    def _create_repositories(self, entries, installed_entries):
        repository = Repository()
        for entry in entries:
            repository.add_package(entry)

        installed_repository = Repository()
        for entry in installed_entries:
            installed_repository.add_package(entry)

        return repository, installed_repository
Ejemplo n.º 3
0
def create_repositories(remote_entries=None, installed_entries=None):
    if remote_entries is None:
        remote_entries = []
    if installed_entries is None:
        installed_entries = []

    remote_repository = Repository()
    for remote_entry in remote_entries:
        remote_repository.add_package(remote_entry)
    installed_repository = Repository()
    for installed_entry in installed_entries:
        installed_repository.add_package(installed_entry)

    return remote_repository, installed_repository
Ejemplo n.º 4
0
def repository_factory(session, indices, quiet=False, raise_on_error=False):
    unavailables = []
    full_repository = Repository()

    _write_and_flush("Fetching indices: ", quiet)

    with ThreadPoolExecutor(max_workers=4) as executor:
        tasks = []
        for url, store_location in indices:
            task = executor.submit(_fetch_repository, session, url,
                                   store_location, raise_on_error)
            tasks.append(task)

        for task in as_completed(tasks):
            repository_or_none = task.result()
            if repository_or_none is None:
                unavailables.append(store_location)
            else:
                for package in repository_or_none.iter_packages():
                    full_repository.add_package(package)
            _write_and_flush(".", quiet)

    _write_and_flush("\n\n", quiet)

    if len(unavailables) > 0 and not quiet:
        _print_unavailables_warning(unavailables)
    return full_repository
Ejemplo n.º 5
0
def repository_factory(session, indices):
    """
    Create a repository from legacy indices.

    Parameters
    ----------
    session : Session
        A :py:class:`~enstaller.session.Session` instance.
    indices : list
        Sequence of (index_url, store_name) pairs, e.g. the indices property of
        :py:class:`~enstaller.config.Configuration` instances.

    Note
    ----

    This does not use etag caching nor write anything in sys.stdout. If you
    want to use etag caching, simply do::

        with session.etag():
            repository = repository_factory(session, ...)
    """
    repository = Repository()
    for url, store_location in indices:
        resp = session.fetch(url)
        json_data = resp.json()

        for package in parse_index(json_data, store_location):
            repository.add_package(package)
    return repository
    def test_simple_installed(self):
        # Given
        entries = [
            dummy_repository_package_factory("MKL", "10.3", 1),
            dummy_repository_package_factory("numpy",
                                             "1.8.0",
                                             2,
                                             dependencies=["MKL 10.3"]),
        ]

        repository = repository_factory(entries)
        installed_repository = Repository()
        installed_repository.add_package(
            dummy_installed_package_factory("MKL", "10.3", 1))

        expected_actions = [
            ('install', "numpy-1.8.0-2.egg"),
        ]

        # When
        request = Request()
        request.install(Requirement("numpy"))

        solver = Solver(repository, installed_repository)
        actions = solver.resolve(request)

        # Then
        self.assertListEqual(actions, expected_actions)
Ejemplo n.º 7
0
    def test_no_update_enstaller(self):
        config = Configuration()
        session = mocked_session_factory(config.repository_cache)

        opts = mock.Mock()
        opts.yes = False

        self.assertFalse(update_enstaller(session, Repository(), opts))
Ejemplo n.º 8
0
    def _create_store_and_repository(self, eggs):
        repository = Repository()
        for egg in eggs:
            path = os.path.join(_EGGINST_COMMON_DATA, egg)
            package = RepositoryPackageMetadata.from_egg(path)
            repository.add_package(package)

        return repository
Ejemplo n.º 9
0
    def test_delete_non_existing(self):
        # Given
        path = os.path.join(_EGGINST_COMMON_DATA, "nose-1.3.0-1.egg")
        to_remove = PackageMetadata.from_egg(path)
        repository = Repository()

        # When/Then
        with self.assertRaises(NoSuchPackage):
            repository.delete_package(to_remove)
Ejemplo n.º 10
0
def unconnected_enpkg_factory(prefixes=None):
    """
    Create an Enpkg instance which does not require an authenticated
    repository.
    """
    if prefixes is None:
        prefixes = [sys.prefix]
    config = Configuration()
    repository = Repository()
    return Enpkg(repository,
                 mocked_session_factory(config.repository_cache),
                 prefixes=prefixes)
Ejemplo n.º 11
0
    def test_imports_option_empty(self):
        # Given
        r_output = textwrap.dedent("""\
            Name                 Version              Location
            ============================================================
            """)
        repository = Repository()

        # When
        with mock_print() as m:
            imports_option(repository)

        # Then
        self.assertMultiLineEqual(m.value, r_output)
    def test_simple_all_installed(self):
        # Given
        entries = [
            dummy_repository_package_factory("MKL", "10.3", 1),
            dummy_repository_package_factory("numpy",
                                             "1.8.0",
                                             2,
                                             dependencies=["MKL 10.3"]),
        ]

        repository = repository_factory(entries)

        installed_entries = [
            dummy_installed_package_factory("MKL", "10.3", 1),
            dummy_installed_package_factory("numpy", "1.8.0", 2)
        ]
        installed_repository = Repository()
        for package in installed_entries:
            installed_repository.add_package(package)

        # When
        request = Request()
        request.install(Requirement("numpy"))

        solver = Solver(repository, installed_repository)
        actions = solver.resolve(request)

        # Then
        self.assertListEqual(actions, [])

        # When
        solver = Solver(repository, installed_repository, force=True)
        actions = solver.resolve(request)

        # Then
        self.assertListEqual(actions, [("remove", "numpy-1.8.0-2.egg"),
                                       ("install", "numpy-1.8.0-2.egg")])

        # When
        solver = Solver(repository,
                        installed_repository,
                        force=True,
                        forceall=True)
        actions = solver.resolve(request)

        # Then
        self.assertListEqual(actions, [("remove", "numpy-1.8.0-2.egg"),
                                       ("remove", "MKL-10.3-1.egg"),
                                       ("install", "MKL-10.3-1.egg"),
                                       ("install", "numpy-1.8.0-2.egg")])
Ejemplo n.º 13
0
    def test_fetch_invalid_md5(self):
        # Given
        filename = "nose-1.3.0-1.egg"
        path = os.path.join(_EGGINST_COMMON_DATA, filename)

        repository = Repository()
        package = RepositoryPackageMetadata.from_egg(path)
        package.md5 = "a" * 32
        repository.add_package(package)

        downloader = _DownloadManager(mocked_session_factory(self.tempdir),
                                      repository)
        with self.assertRaises(InvalidChecksum):
            downloader.fetch(filename)
Ejemplo n.º 14
0
def _fetch_repository(session, url, store_location, raise_on_error):
    with session.etag():
        resp = session.get(url, stream=True)
        if resp.status_code != 200:
            if _should_raise(resp, raise_on_error):
                resp.raise_for_status()
            else:
                return None  # failed.append(store_location)
        else:
            data = io.BytesIO()
            for chunk in _ResponseIterator(resp):
                data.write(chunk)
            json_data = decode_json_from_buffer(data.getvalue())
            return Repository(parse_index(json_data, store_location))
Ejemplo n.º 15
0
    def test_print_install_time(self):
        with mkdtemp():
            installed_entries = [
                dummy_installed_package_factory("dummy", "1.0.1", 1)
            ]
            installed_repository = Repository()
            for package in installed_entries:
                installed_repository.add_package(package)

            self.assertRegexpMatches(
                install_time_string(installed_repository, "dummy"),
                "dummy-1.0.1-1.egg was installed on:")

            self.assertEqual(
                install_time_string(installed_repository, "ddummy"), "")
Ejemplo n.º 16
0
    def test_find_packages_invalid_versions(self):
        # Given
        entries = [
            dummy_installed_package_factory("numpy", "1.6.1", 1),
            dummy_installed_package_factory("numpy", "1.8k", 2),
        ]
        repository = Repository()
        for entry in entries:
            repository.add_package(entry)

        # When
        packages = repository.find_packages("numpy")

        # Then
        self.assertEqual(len(packages), 2)
        assertCountEqual(self, packages, entries)
Ejemplo n.º 17
0
    def test_iter_most_recent_packages(self):
        # Given
        eggs = ["nose-1.3.0-1.egg", "nose-1.2.1-1.egg"]
        repository = Repository()
        for egg in eggs:
            path = os.path.join(_EGGINST_COMMON_DATA, egg)
            package = RepositoryPackageMetadata.from_egg(path)
            repository.add_package(package)

        # When
        metadata = list(repository.iter_most_recent_packages())

        # Then
        self.assertEqual(len(metadata), 1)
        self.assertEqual(metadata[0].version,
                         EnpkgVersion.from_string("1.3.0-1"))
Ejemplo n.º 18
0
 def setUp(self):
     eggs = [
         "dummy-1.0.1-1.egg",
         "dummy_with_appinst-1.0.0-1.egg",
         "dummy_with_entry_points-1.0.0-1.egg",
         "dummy_with_proxy-1.3.40-3.egg",
         "dummy_with_proxy_scripts-1.0.0-1.egg",
         "dummy_with_proxy_softlink-1.0.0-1.egg",
         "nose-1.2.1-1.egg",
         "nose-1.3.0-1.egg",
         "nose-1.3.0-2.egg",
     ]
     self.repository = Repository()
     for egg in eggs:
         path = os.path.join(_EGGINST_COMMON_DATA, egg)
         package = RepositoryPackageMetadata.from_egg(path)
         self.repository.add_package(package)
Ejemplo n.º 19
0
    def test_sorted_packages_invalid(self):
        # Given
        entries = [
            dummy_installed_package_factory("numpy", "1.6.1", 1),
            dummy_installed_package_factory("numpy", "1.8k", 2),
        ]
        repository = Repository()
        for entry in entries:
            repository.add_package(entry)

        # When
        packages = repository.find_sorted_packages("numpy")

        # Then
        self.assertEqual(len(packages), 2)
        assertCountEqual(
            self, [p.version for p in packages],
            [EnpkgVersion.from_string(v) for v in ("1.6.1-1", "1.8k-2")])
Ejemplo n.º 20
0
    def test_delete_simple(self):
        # Given
        eggs = ["flake8-2.0.0-2.egg", "nose-1.3.0-1.egg", "nose-1.2.1-1.egg"]
        repository = Repository()
        for egg in eggs:
            path = os.path.join(_EGGINST_COMMON_DATA, egg)
            package = RepositoryPackageMetadata.from_egg(path)
            repository.add_package(package)

        path = os.path.join(_EGGINST_COMMON_DATA, "nose-1.3.0-1.egg")
        to_remove = PackageMetadata.from_egg(path)

        # When
        repository.delete_package(to_remove)

        # Then
        assertCountEqual(self, [p.key for p in repository.iter_packages()],
                         ["flake8-2.0.0-2.egg", "nose-1.2.1-1.egg"])
    def test_remove_actions(self):
        # Given
        repository = Repository()

        for egg in [DUMMY_EGG]:
            egginst = EggInst(egg, self.prefix)
            egginst.install()

        solver = Solver(repository, Repository._from_prefixes([self.prefix]))

        request = Request()
        request.remove(Requirement("dummy"))

        # When
        actions = solver.resolve(request)

        # Then
        self.assertEqual(actions, [("remove", os.path.basename(DUMMY_EGG))])
Ejemplo n.º 22
0
    def test_fetch_unauthorized(self):
        # Given
        filename = "nose-1.3.0-1.egg"
        url = "http://api.enthought.com/eggs/yoyo/"

        repository = Repository()

        path = os.path.join(_EGGINST_COMMON_DATA, filename)
        package = RepositoryPackageMetadata.from_egg(path, url)
        repository.add_package(package)

        responses.add(responses.GET, url + filename,
                      body='{"error": "forbidden"}',
                      status=403)
        downloader = _DownloadManager(mocked_session_factory(self.tempdir),
                                      repository)

        # When/Then
        with self.assertRaises(requests.exceptions.HTTPError):
            downloader.fetch(filename)
Ejemplo n.º 23
0
    def test_imports_option_sys_only(self):
        # Given
        r_output = textwrap.dedent("""\
            Name                 Version              Location
            ============================================================
            dummy                1.0.1-1              sys
            """)

        repository = Repository()
        metadata = InstalledPackageMetadata.from_egg(DUMMY_EGG,
                                                     "random string",
                                                     sys.prefix)
        repository.add_package(metadata)

        # When
        with mock_print() as m:
            imports_option(repository)

        # Then
        self.assertMultiLineEqual(m.value, r_output)
Ejemplo n.º 24
0
    def test_install_not_available(self):
        # Given
        config = Configuration()
        config.update(auth=FAKE_AUTH)

        nose = dummy_repository_package_factory("nose", "1.3.0", 1)
        nose.available = False
        repository = Repository()
        repository.add_package(nose)

        enpkg = Enpkg(repository,
                      mocked_session_factory(config.repository_cache),
                      [self.prefix])
        enpkg.execute = mock.Mock()

        # When/Then
        with mock.patch("enstaller.config.subscription_message") as \
                subscription_message:
            with self.assertRaises(SystemExit) as e:
                install_req(enpkg, config, "nose", FakeOptions())
            subscription_message.assert_called()
            self.assertEqual(e.exception.code, 1)
Ejemplo n.º 25
0
def repository_factory(entries):
    repository = Repository()
    for entry in entries:
        repository.add_package(entry)
    return repository
Ejemplo n.º 26
0
 def _repository_factory(self, packages):
     repository = Repository()
     for p in packages:
         repository.add_package(p)
     return repository
Ejemplo n.º 27
0
def _old_style_indices_to_repository(indices, python_version=PY_VER):
    repository = Repository()
    for index in indices:
        for package in _old_style_index_to_packages(index, python_version):
            repository.add_package(package)
    return repository