Пример #1
0
    def test_build_repository_with_specified_root(self, mock):
        from papaye.proxy import PyPiProxy
        from papaye.models import Package, ReleaseFile, Root
        mock.return_value = self.pypi_response
        info_dict = json.loads(self.pypi_response.content.decode('utf-8'))
        root = Root()

        proxy = PyPiProxy(self.request, 'pyramid')
        result = proxy.build_repository(with_metadata=True, root=root)

        self.assertIsInstance(result, Package)
        for release in result.releases.values():
            self.assertIn(release.__name__, info_dict['releases'].keys())
        self.assertEqual(len(result.releases.keys()),
                         len(info_dict['releases'].keys()))
        self.assertEqual(len(result['1.5'].release_files.keys()), 1)
        self.assertIsInstance(result['1.5'].release_files.values()[0],
                              ReleaseFile)
        self.assertTrue(
            getattr(result['1.5'].release_files.values()[0], 'pypi_url', None))
        self.assertEqual(
            result['1.5'].release_files.values()[0].pypi_url,
            "https://pypi.python.org/packages/source/p/pyramid/pyramid-1.5.tar.gz"
        )
        self.assertIsNotNone(result['1.5'].metadata)
        assert result.__parent__ is root
Пример #2
0
    def test_smart_merge_with_existing_release(self, mock):
        from papaye.proxy import PyPiProxy
        from papaye.factories import repository_root_factory
        from papaye.models import Package, Release, ReleaseFile
        mock.return_value = self.pypi_response
        root = repository_root_factory(self.request)

        # Existing releases
        package = Package(name='pyramid')
        package['1.5'] = Release(name='1.5', version='1.5', metadata={})
        package['1.5']['pyramid-1.5.tar.gz'] = ReleaseFile(
            filename='pyramid-1.5.tar.gz', content=b'', md5_digest='12345')

        package = Package(name='pyramid')
        package['1.5'] = Release(name='1.5', version='1.5', metadata={})
        package['1.5']['pyramid-1.5.tar.gz'] = ReleaseFile(
            filename='pyramid-1.5.tar.gz', content=b'', md5_digest='12345')

        proxy = PyPiProxy(self.request, 'pyramid')
        result = proxy.smart_merge(root, package)

        self.assertEqual([key for key in result.releases.keys()], [
            '1.5',
        ])
        self.assertEqual(result['1.5']['pyramid-1.5.tar.gz'].md5_digest,
                         '12345')
Пример #3
0
def not_found(request):
    settings = request.registry.settings
    proxy = settings.get('papaye.proxy', False)
    proxy = True if proxy and proxy == 'true' else False
    if not proxy:
        return HTTPNotFound()
    try:
        proxy = PyPiProxy(request, request.matchdict['traverse'][0])
        package = proxy.build_repository()
        if not package:
            return HTTPNotFound()
        if len(request.matchdict['traverse']) == 1:
            view = ListReleaseFileView(package, request)
        elif len(request.matchdict['traverse']) == 2:
            context = package[request.matchdict['traverse'][1]]
            view = ListReleaseFileByReleaseView(context, request)
        elif len(request.matchdict['traverse']) == 3:
            release_file = package[request.matchdict['traverse'][1]][
                request.matchdict['traverse'][2]]
            package_name, release_name, _ = request.matchdict['traverse']
            download_release_from_pypi.delay(package_name, release_name)
            return HTTPTemporaryRedirect(location=release_file.pypi_url)
    except KeyError:
        return HTTPNotFound()
    return view()
Пример #4
0
def download_release_from_pypi(config, package_name, release_name):
    try:
        repository_is_updated = False
        conn = get_connection(config)
        proxy = PyPiProxy(conn, package_name)
        root = repository_root_factory(conn)
        package = proxy.build_repository(release_name=release_name,
                                         with_metadata=True)
        if not package:
            logger.error('Package {} not found on PYPI'.format(package_name))
        for release_file in package[release_name].release_files.values():
            logger.info('Download file "{}"'.format(release_file.filename))
            release_file.set_content(
                requests.get(release_file.pypi_url).content)
            with release_file.content.open() as content:
                binary_content = content.read()
                if hashlib.md5(
                        binary_content).hexdigest() != release_file.md5_digest:
                    continue
            release_file.size = len(binary_content)
            repository_is_updated = True

        package = proxy.smart_merge(root, package)
        if repository_is_updated:
            root[package.name] = package
            for release in package:
                release.__parent__ = package
                for release_file in release:
                    release_file.__parent__ = release

        transaction.commit()
    except:
        transaction.abort()
Пример #5
0
    def test_get_remote_informations_connection_error(self, mock):
        from papaye.proxy import PyPiProxy
        mock.side_effect = ConnectionError
        url = "http://pypi.python.org/pypi/pyramid/json"

        proxy = PyPiProxy(self.request, 'pyramid')
        result = proxy.get_remote_informations(url)
        self.assertIsNone(result)
Пример #6
0
    def test_get_remote_informations_404(self, mock):
        from papaye.proxy import PyPiProxy
        mock.return_value = FakeGRequestResponse(404, b'')
        url = "http://pypi.python.org/pypi/pyramid/json"

        proxy = PyPiProxy(self.request, 'pyramid')
        result = proxy.get_remote_informations(url)
        self.assertIsNone(result)
Пример #7
0
    def test_build_repository_404_error(self, mock):
        from papaye.proxy import PyPiProxy
        mock.return_value = FakeGRequestResponse(404, b'')

        proxy = PyPiProxy(self.request, 'pyramid')
        result = proxy.build_repository()

        self.assertIsNone(result)
Пример #8
0
    def test_get_remote_informations(self, mock):
        from papaye.proxy import PyPiProxy
        mock.return_value = self.pypi_response
        url = "http://pypi.python.org/pypi/pyramid/json"

        proxy = PyPiProxy(self.request, 'pyramid')
        result = proxy.get_remote_informations(url)
        self.assertIsInstance(result, dict)
        self.assertEqual(result['info']['name'], 'pyramid')