Merge lp:~jml/pkgme/binary-all-info-slpit into lp:pkgme

Proposed by Jonathan Lange
Status: Merged
Approved by: James Westby
Approved revision: 71
Merged at revision: 68
Proposed branch: lp:~jml/pkgme/binary-all-info-slpit
Merge into: lp:pkgme
Diff against target: 334 lines (+126/-71)
11 files modified
pkgme/backends/binary/all_info (+0/-61)
pkgme/backends/binary/build_depends (+14/-0)
pkgme/backends/binary/depends (+11/-0)
pkgme/backends/binary/extra_files (+36/-0)
pkgme/backends/binary/package_name (+17/-0)
pkgme/info_elements.py (+9/-0)
pkgme/package_files.py (+1/-1)
pkgme/tests/test_binary_backend.py (+8/-8)
pkgme/tests/test_info_elements.py (+16/-0)
pkgme/tests/test_package_files.py (+14/-0)
pkgme/tests/test_project_info.py (+0/-1)
To merge this branch: bzr merge lp:~jml/pkgme/binary-all-info-slpit
Reviewer Review Type Date Requested Status
James Westby Approve
Review via email: mp+68236@code.launchpad.net

Description of the change

This splits up the all_info binary backend script into multiple scripts. The price is a little bit of duplication, but the gain is less weird-ass boilerplate/iffery and easier debugging when experimenting from the command line.

Main interesting bit of this change is correctly using ExtraFiles itself to get itself out of the info, and then giving it a proper clean() method so we can turn a JSON dump into a dictionary of files.

To post a comment you must log in.
Revision history for this message
James Westby (james-w) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== removed file 'pkgme/backends/binary/all_info'
2--- pkgme/backends/binary/all_info 2011-07-15 16:30:18 +0000
3+++ pkgme/backends/binary/all_info 1970-01-01 00:00:00 +0000
4@@ -1,61 +0,0 @@
5-#!/usr/bin/python
6-
7-import json
8-import os
9-import sys
10-
11-from pkgme.binary import (
12- CATEGORIES,
13- DEPENDS,
14- get_desktop_file,
15- get_install_file,
16- guess_dependencies,
17- METADATA_FILE,
18- PACKAGE_NAME,
19- TAGLINE,
20- )
21-from pkgme.info_elements import (
22- BuildDepends,
23- Depends,
24- ExtraFiles,
25- PackageName,
26- )
27-
28-# XXX: Split this into multiple files. all_info is the wrong fit. Also,
29-# multiple files would allow for easier experimentation.
30-
31-
32-def get_all_info(wanted, metadata):
33- package_name = metadata[PACKAGE_NAME]
34- output = {}
35- path = os.getcwd()
36- if PackageName.name in wanted:
37- output[PackageName.name] = package_name
38- if ExtraFiles.name in wanted:
39- install_file = get_install_file(package_name, path, True)
40- desktop_file = get_desktop_file(
41- package_name, path,
42- tagline=metadata.get(TAGLINE, ''),
43- categories=metadata.get(CATEGORIES, ''))
44- output[ExtraFiles.name] = {
45- # XXX: Hardcoded literal attack!
46- 'debian/install': install_file,
47- 'debian/%s.desktop' % (package_name,): desktop_file.get_contents(),
48- }
49- if BuildDepends.name in wanted:
50- output[BuildDepends.name] = list(guess_dependencies(path))
51- if Depends.name in wanted:
52- output[Depends.name] = DEPENDS
53- return output
54-
55-
56-def main():
57- wanted = json.load(sys.stdin)
58- with open(METADATA_FILE) as f:
59- metadata = json.load(f)
60- output = get_all_info(wanted, metadata)
61- json.dump(output, sys.stdout)
62-
63-
64-if __name__ == '__main__':
65- main()
66
67=== added file 'pkgme/backends/binary/build_depends'
68--- pkgme/backends/binary/build_depends 1970-01-01 00:00:00 +0000
69+++ pkgme/backends/binary/build_depends 2011-07-18 11:33:32 +0000
70@@ -0,0 +1,14 @@
71+#!/usr/bin/python
72+
73+import os
74+
75+from pkgme.binary import guess_dependencies
76+
77+
78+def main():
79+ path = os.getcwd()
80+ print ', '.join(guess_dependencies(path))
81+
82+
83+if __name__ == '__main__':
84+ main()
85
86=== added file 'pkgme/backends/binary/depends'
87--- pkgme/backends/binary/depends 1970-01-01 00:00:00 +0000
88+++ pkgme/backends/binary/depends 2011-07-18 11:33:32 +0000
89@@ -0,0 +1,11 @@
90+#!/usr/bin/python
91+
92+from pkgme.binary import DEPENDS
93+
94+
95+def main():
96+ print DEPENDS
97+
98+
99+if __name__ == '__main__':
100+ main()
101
102=== added file 'pkgme/backends/binary/extra_files'
103--- pkgme/backends/binary/extra_files 1970-01-01 00:00:00 +0000
104+++ pkgme/backends/binary/extra_files 2011-07-18 11:33:32 +0000
105@@ -0,0 +1,36 @@
106+#!/usr/bin/python
107+
108+import json
109+import os
110+import sys
111+
112+from pkgme.binary import (
113+ CATEGORIES,
114+ get_desktop_file,
115+ get_install_file,
116+ METADATA_FILE,
117+ PACKAGE_NAME,
118+ TAGLINE,
119+ )
120+
121+
122+def main():
123+ with open(METADATA_FILE) as f:
124+ metadata = json.load(f)
125+ package_name = metadata[PACKAGE_NAME]
126+ path = os.getcwd()
127+ install_file = get_install_file(package_name, path, True)
128+ desktop_file = get_desktop_file(
129+ package_name, path,
130+ tagline=metadata.get(TAGLINE, ''),
131+ categories=metadata.get(CATEGORIES, ''))
132+ json.dump(
133+ {
134+ # XXX: Hardcoded literal attack!
135+ 'debian/install': install_file,
136+ 'debian/%s.desktop' % (package_name,): desktop_file.get_contents(),
137+ }, sys.stdout)
138+
139+
140+if __name__ == '__main__':
141+ main()
142
143=== added file 'pkgme/backends/binary/package_name'
144--- pkgme/backends/binary/package_name 1970-01-01 00:00:00 +0000
145+++ pkgme/backends/binary/package_name 2011-07-18 11:33:32 +0000
146@@ -0,0 +1,17 @@
147+#!/usr/bin/python
148+
149+import json
150+from pkgme.binary import (
151+ METADATA_FILE,
152+ PACKAGE_NAME,
153+ )
154+
155+
156+def main():
157+ with open(METADATA_FILE) as f:
158+ metadata = json.load(f)
159+ print metadata[PACKAGE_NAME]
160+
161+
162+if __name__ == '__main__':
163+ main()
164
165=== modified file 'pkgme/info_elements.py'
166--- pkgme/info_elements.py 2011-07-15 16:04:55 +0000
167+++ pkgme/info_elements.py 2011-07-18 11:33:32 +0000
168@@ -1,3 +1,6 @@
169+import json
170+
171+
172 class MissingInfoError(Exception):
173 pass
174
175@@ -159,6 +162,12 @@
176 """
177 default = {}
178
179+ @classmethod
180+ def clean(cls, value):
181+ if isinstance(value, dict):
182+ return value
183+ return json.loads(value)
184+
185
186 # The following are for 'binary'.
187
188
189=== modified file 'pkgme/package_files.py'
190--- pkgme/package_files.py 2011-07-14 16:03:47 +0000
191+++ pkgme/package_files.py 2011-07-18 11:33:32 +0000
192@@ -94,7 +94,7 @@
193 files = []
194 for file_cls in self.files_cls:
195 files.append(file_cls.from_info(new_info))
196- extra_files = values.get(ExtraFiles.name, {})
197+ extra_files = ExtraFiles.get_value(project_info)
198 for path, contents in extra_files.items():
199 files.append(BasicFile(path, contents))
200 return files
201
202=== modified file 'pkgme/tests/test_binary_backend.py'
203--- pkgme/tests/test_binary_backend.py 2011-07-15 16:30:18 +0000
204+++ pkgme/tests/test_binary_backend.py 2011-07-18 11:33:32 +0000
205@@ -49,7 +49,7 @@
206 backend = ExternalHelpersBackend(BACKEND_NAME, backend_dir)
207 self.assertEqual(0, backend.want(tempdir.path))
208
209- def test_all_info_package_name(self):
210+ def test_package_name(self):
211 # The binary backend gets the package name from the metadata file.
212 tempdir = self.useFixture(TempdirFixture())
213 tempdir.create_file(METADATA_FILE, json.dumps({PACKAGE_NAME: 'foo'}))
214@@ -58,7 +58,7 @@
215 self.assertEqual(
216 {PackageName.name: "foo"}, info.get_all([PackageName.name]))
217
218- def test_all_info_build_depends(self):
219+ def test_build_depends(self):
220 tempdir = self.useFixture(TempdirFixture())
221 tempdir.create_file(METADATA_FILE, json.dumps({PACKAGE_NAME: 'foo'}))
222 shutil.copy(
223@@ -66,18 +66,18 @@
224 tempdir.path)
225 backend = ExternalHelpersBackend(BACKEND_NAME, backend_dir)
226 info = backend.get_info(tempdir.path)
227- deps = list(guess_dependencies(tempdir.path))
228+ deps = ', '.join(guess_dependencies(tempdir.path))
229 self.assertEqual(
230 {BuildDepends.name: deps}, info.get_all([BuildDepends.name]))
231
232- def test_all_info_depends(self):
233+ def test_depends(self):
234 tempdir = self.useFixture(TempdirFixture())
235 tempdir.create_file(METADATA_FILE, json.dumps({PACKAGE_NAME: 'foo'}))
236 backend = ExternalHelpersBackend(BACKEND_NAME, backend_dir)
237 info = backend.get_info(tempdir.path)
238 self.assertEqual({Depends.name: DEPENDS}, info.get_all([Depends.name]))
239
240- def test_all_info_extra_files_install_file(self):
241+ def test_extra_files_install_file(self):
242 # We create an 'install' file that tells debhelper to just copy
243 # everything to opt.
244 tempdir = self.useFixture(TempdirFixture())
245@@ -86,12 +86,12 @@
246 backend = ExternalHelpersBackend(BACKEND_NAME, backend_dir)
247 info = backend.get_info(tempdir.path)
248 extra_files = info.get_all([ExtraFiles.name])[ExtraFiles.name]
249- install_file = extra_files['debian/install']
250+ install_file = json.loads(extra_files)['debian/install']
251 self.assertEqual(
252 get_install_file(package_name, tempdir.path, True),
253 install_file)
254
255- def test_all_info_extra_files_desktop_file(self):
256+ def test_extra_files_desktop_file(self):
257 # We create an 'install' file that tells debhelper to just copy
258 # everything to opt.
259 tempdir = self.useFixture(TempdirFixture())
260@@ -113,5 +113,5 @@
261 backend = ExternalHelpersBackend(BACKEND_NAME, backend_dir)
262 info = backend.get_info(tempdir.path)
263 extra_files = info.get_all([ExtraFiles.name])[ExtraFiles.name]
264- desktop = extra_files['debian/%s.desktop' % (package_name,)]
265+ desktop = json.loads(extra_files)['debian/%s.desktop' % (package_name,)]
266 self.assertEqual(expected_desktop_file, desktop)
267
268=== modified file 'pkgme/tests/test_info_elements.py'
269--- pkgme/tests/test_info_elements.py 2011-07-15 16:04:55 +0000
270+++ pkgme/tests/test_info_elements.py 2011-07-18 11:33:32 +0000
271@@ -1,7 +1,10 @@
272+import json
273+
274 from testtools import TestCase
275
276 from pkgme.info_elements import (
277 BuildDepends,
278+ ExtraFiles,
279 InfoElement,
280 MissingInfoError,
281 )
282@@ -105,3 +108,16 @@
283 # `all_info`.
284 value = BuildDepends.clean(["python", "gtk2"])
285 self.assertEqual("python, gtk2, debhelper (>= 7)", value)
286+
287+
288+class ExtraFilesTestCase(TestCase):
289+
290+ def test_clean_preserves_dict(self):
291+ in_value = {'foo': 'bar'}
292+ out_value = ExtraFiles.clean(in_value)
293+ self.assertEqual(out_value, in_value)
294+
295+ def test_clean_loads_json(self):
296+ in_value = {'foo': 'bar'}
297+ out_value = ExtraFiles.clean(json.dumps(in_value))
298+ self.assertEqual(out_value, in_value)
299
300=== modified file 'pkgme/tests/test_package_files.py'
301--- pkgme/tests/test_package_files.py 2011-07-14 16:03:47 +0000
302+++ pkgme/tests/test_package_files.py 2011-07-18 11:33:32 +0000
303@@ -1,3 +1,4 @@
304+import json
305 import os
306
307 from debian import changelog
308@@ -470,3 +471,16 @@
309 self.assertEqual('foo.txt', foo.path)
310 self.assertEqual("Hello world!\n", foo.get_contents())
311 self.assertEqual(True, foo.overwrite)
312+
313+ def test_extra_files_single_info(self):
314+ group = PackageFileGroup()
315+ project_info = DictInfo({
316+ ExtraFiles.name: json.dumps({
317+ 'foo.txt': "Hello world!\n",
318+ 'debian/install': "Bwawahahaha\n",
319+ })})
320+ files = group.get_files(project_info)
321+ [foo, install] = files
322+ self.assertEqual('foo.txt', foo.path)
323+ self.assertEqual("Hello world!\n", foo.get_contents())
324+ self.assertEqual(True, foo.overwrite)
325
326=== modified file 'pkgme/tests/test_project_info.py'
327--- pkgme/tests/test_project_info.py 2011-07-15 09:22:47 +0000
328+++ pkgme/tests/test_project_info.py 2011-07-18 11:33:32 +0000
329@@ -1,5 +1,4 @@
330 import json
331-import os
332 import sys
333
334 from fixtures import TestWithFixtures

Subscribers

People subscribed via source and target branches