Merge lp:~james-w/pkgme-service/review-click into lp:pkgme-service

Proposed by James Westby
Status: Merged
Approved by: James Westby
Approved revision: no longer in the source branch.
Merged at revision: 144
Proposed branch: lp:~james-w/pkgme-service/review-click
Merge into: lp:pkgme-service
Diff against target: 142 lines (+102/-1)
2 files modified
src/djpkgme/tasks.py (+47/-1)
src/djpkgme/tests/test_tasks.py (+55/-0)
To merge this branch: bzr merge lp:~james-w/pkgme-service/review-click
Reviewer Review Type Date Requested Status
Matias Bordese (community) Approve
Review via email: mp+190754@code.launchpad.net

Commit message

Add a job for reviewing click packages with a simple check.

Description of the change

Hi,

This proposal adds a simple check for click packages. We can add more
checks later when we've proved that a simple one works.

Thanks,

James

To post a comment you must log in.
Revision history for this message
Matias Bordese (matiasb) wrote :

LGTM

review: Approve
144. By James Westby

[r=matiasb] Add a job for reviewing click packages with a simple check.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/djpkgme/tasks.py'
2--- src/djpkgme/tasks.py 2013-10-09 20:32:44 +0000
3+++ src/djpkgme/tasks.py 2013-10-11 20:11:11 +0000
4@@ -1,6 +1,7 @@
5 import json
6 import os
7 import shutil
8+import subprocess
9 import sys
10 import traceback
11
12@@ -222,7 +223,11 @@
13 metadata.get('myapps_id', '<unknown myapps id>'),
14 metadata.get('package_url', '<unknown package url>'),
15 ))
16- job = PackageAppJob()
17+ if 'click_framework' in metadata:
18+ # It's a click package
19+ job = ReviewClickJob()
20+ else:
21+ job = PackageAppJob()
22 return self.run_with_error_handling(job, metadata, overrides)
23
24 def run_with_error_handling(self, job, metadata, overrides):
25@@ -358,6 +363,47 @@
26 output_dir, settings.PKGME_OUTPUT_DIRECTORY, package_name)
27
28
29+class ReviewClickJob(object):
30+
31+ # The name of the directory that we store the downloaded file in.
32+ DOWNLOAD_DIRECTORY_NAME = 'download'
33+
34+ def transform_results(self, generated_info, metadata):
35+ return dict(pkgme_extra_data=generated_info)
36+
37+ def download_package(self, metadata, temp_dir, logger):
38+ logger.info(
39+ "Downloading package from %s", metadata['package_url'])
40+ download_path = download_file(
41+ metadata['package_url'], temp_dir)
42+ logger.info(
43+ "Downloaded package from %s", metadata['package_url'])
44+ return download_path
45+
46+ def unpack_package(self, package_file, temp_dir):
47+ dest = os.path.join(temp_dir, 'unpacked')
48+ subprocess.check_call(['dpkg-deb', '-R', package_file, dest])
49+ return dest
50+
51+ def run(self, metadata, overrides, logger):
52+ working_dirs = []
53+ results = []
54+ with TempDir() as temp_dir:
55+ package_file = self.download_package(metadata, temp_dir, logger)
56+ unpacked = self.unpack_package(package_file)
57+ results.append(self.check_package_name_matches(metadata, unpacked))
58+ return results
59+
60+ def check_package_name_matches(self, metadata, package):
61+ with open(os.path.join(package, 'DEBIAN/manifest')) as f:
62+ manifest_content = json.loads(f.read())
63+ passed = manifest_content['name'] == metadata['package_fullname']
64+ return {
65+ 'description': 'Stated package name matches the manifest',
66+ 'passed': passed,
67+ }
68+
69+
70 class CauseOopsTask(Task):
71 def run(self):
72 raise AssertionError("Manually generated celery oops")
73
74=== modified file 'src/djpkgme/tests/test_tasks.py'
75--- src/djpkgme/tests/test_tasks.py 2013-10-09 20:32:44 +0000
76+++ src/djpkgme/tests/test_tasks.py 2013-10-11 20:11:11 +0000
77@@ -36,6 +36,7 @@
78 PackageAppJob,
79 prepare_icons,
80 prepare_metadata,
81+ ReviewClickJob,
82 translate_dict,
83 write_metadata,
84 )
85@@ -451,3 +452,57 @@
86 basename = os.path.basename(output_tar_path)
87 cleaned_package_name = PackageName.clean(name)
88 self.assertEqual("%s.tar.gz" % cleaned_package_name, basename)
89+
90+
91+class TestReviewClickJobIntegration(TestCaseWithFactory):
92+
93+ @patch('djpkgme.tasks.download_file')
94+ def test_download_package(self, mock_download_file):
95+ mock_download_file.return_value = 'some/path'
96+ job = ReviewClickJob()
97+ metadata = self.factory.make_metadata()
98+ temp_dir = 'temp/dir'
99+ logger = logging.getLogger()
100+ returned_path = job.download_package(metadata, temp_dir, logger)
101+ self.assertEqual(mock_download_file.return_value, returned_path)
102+ self.assertTrue(mock_download_file.called)
103+ mock_download_file.assert_called_with(metadata['package_url'],
104+ temp_dir)
105+
106+ @patch('djpkgme.tasks.subprocess.check_call')
107+ def test_unpack_package(self, mock_call):
108+ job = ReviewClickJob()
109+ package_file = 'some/package'
110+ temp_dir = 'temp/dir'
111+ unpack_path = os.path.join(temp_dir, 'unpacked')
112+ returned_path = job.unpack_package(package_file, temp_dir)
113+ self.assertEqual(unpack_path, returned_path)
114+ mock_call.assert_called_with(
115+ ['dpkg-deb', '-R', package_file, unpack_path])
116+
117+ def make_manifest_file(self, manifest_content, directory):
118+ debian_dir = os.path.join(directory, 'DEBIAN')
119+ os.mkdir(debian_dir)
120+ with open(os.path.join(debian_dir, 'manifest'), 'w') as f:
121+ f.write(json.dumps(manifest_content))
122+
123+ def test_check_package_name_matches(self):
124+ job = ReviewClickJob()
125+ package_name = 'some.package'
126+ metadata = dict(package_fullname=package_name)
127+ tempdir = self.useFixture(TempDir()).path
128+ self.make_manifest_file(dict(name=package_name), tempdir)
129+ result = job.check_package_name_matches(metadata, tempdir)
130+ self.assertEqual(True, result['passed'])
131+ self.assertEqual(
132+ "Stated package name matches the manifest",
133+ result['description'])
134+
135+ def test_check_package_name_doesnt_match(self):
136+ job = ReviewClickJob()
137+ package_name = 'some.package'
138+ metadata = dict(package_fullname=package_name)
139+ tempdir = self.useFixture(TempDir()).path
140+ self.make_manifest_file(dict(name='some.other.package'), tempdir)
141+ result = job.check_package_name_matches(metadata, tempdir)
142+ self.assertEqual(False, result['passed'])

Subscribers

People subscribed via source and target branches