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
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')
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()
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()
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)
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)
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)
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')