Skip to content
This repository has been archived by the owner on Jan 28, 2020. It is now read-only.

Commit

Permalink
normalize package names during matching on adding/updating deps
Browse files Browse the repository at this point in the history
  • Loading branch information
EnTeQuAk committed Sep 27, 2012
1 parent afe8fb3 commit 1749650
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 12 deletions.
30 changes: 20 additions & 10 deletions folivora/forms.py
Expand Up @@ -7,6 +7,7 @@
ProjectMember)
from .utils.forms import ModelForm, JabberField
from .utils.parsers import get_parser, get_parser_choices
from .utils.pypi import normalize_name
from .tasks import sync_project

import floppyforms as forms
Expand Down Expand Up @@ -34,18 +35,21 @@ def clean(self):
if data and 'parser' in cleaned_data:
parser = get_parser(cleaned_data['parser'])
packages, missing = parser.parse(data)
packages = dict((normalize_name(k), v) for k, v in packages.iteritems())

known_packages = Package.objects.filter(name__in=packages.keys())\
.values_list('name', 'pk')
known_package_names = map(lambda x: x[0], known_packages)
pkg_names = [normalize_name(name) for name in packages.keys()]

known_packages = Package.objects.filter(normalized_name__in=pkg_names)\
.values_list('normalized_name', 'name', 'pk')
known_package_names = map(lambda x: x[1], known_packages)

# TODO: report missing back to the ui.
missing.extend(
set(packages.keys()).difference(set(known_package_names)))
normalized = (normalize_name(n) for n in known_package_names)
missing.extend(set(pkg_names).difference(normalized))

for name, pk in known_packages:
for normalized, name, pk in known_packages:
project_deps.append(ProjectDependency(package_id=pk,
version=packages[name]))
version=packages[normalized]))
cleaned_data['requirements'] = project_deps
return cleaned_data

Expand Down Expand Up @@ -110,9 +114,15 @@ def clean(self):
data = cleaned_data['packages']
parser = get_parser(cleaned_data['parser'])
packages, missing_packages = parser.parse(data.splitlines())
known_packages = set(Package.objects.filter(name__in=packages)
.values_list('name', flat=True))
unknown_packages = set(packages).difference(known_packages)
pkg_names = [normalize_name(name) for name in packages.keys()]
known_packages = set(Package.objects.filter(normalized_name__in=pkg_names)
.values_list('normalized_name', 'name'))
pkg_mapping = dict(known_packages)

# Show real package names instead of normalized version.
unknown_packages = set(pkg_mapping[n] for n in
set(pkg_names).difference(x[0] for x in known_packages))

if unknown_packages:
raise ValidationError(_(
'Could not find the following dependencies: %s') %
Expand Down
18 changes: 16 additions & 2 deletions folivora/tests.py
Expand Up @@ -369,8 +369,9 @@ def setUp(self):
self.c = Client()
self.c.login(username='apollo13', password='pwd')
Package.objects.bulk_create([
Package(name='Django'),
Package(name='Sphinx')
Package(name='Django', normalized_name='django'),
Package(name='Sphinx', normalized_name='sphinx'),
Package(name='django_compressor', normalized_name='django-compressor')
])

def test_create_project_without_req(self):
Expand Down Expand Up @@ -410,6 +411,19 @@ def test_create_project_with_borked_req(self):
# although the requirements are somewhat borked we import what we can
self.assertEqual(p.dependencies.count(), 2)

def test_create_project_with_falsy_package_name(self):
"""Ensure that unsupported requirement lines are skipped"""
response = self.c.post('/projects/add/', {
'slug': 'test', 'name': 'test',
'requirements': ContentFile('django-compressor==1.2', name='req.txt'),
'parser': 'pip_requirements'})
self.assertEqual(response.status_code, 302)
self.assertEqual(response['Location'],
'http://testserver/project/test/')
p = Project.objects.get(slug='test')
# although the requirements are somewhat borked we import what we can
self.assertEqual(p.dependencies.count(), 1)

def test_update_project(self):
"""Test project changes work"""
response = self.c.post('/projects/add/', {
Expand Down

0 comments on commit 1749650

Please sign in to comment.