1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#!/usr/bin/env python
import os
import tempfile
import zipfile
import mozfile
here = os.path.dirname(os.path.abspath(__file__))
# stubs is a dict of the form {'addon id': 'install manifest content'}
stubs = {
"test-addon-1@mozilla.org": "test_addon_1.rdf",
"test-addon-2@mozilla.org": "test_addon_2.rdf",
"test-addon-3@mozilla.org": "test_addon_3.rdf",
"test-addon-4@mozilla.org": "test_addon_4.rdf",
"test-addon-invalid-no-id@mozilla.org": "test_addon_invalid_no_id.rdf",
"test-addon-invalid-version@mozilla.org": "test_addon_invalid_version.rdf",
"test-addon-invalid-no-manifest@mozilla.org": None,
"test-addon-invalid-not-wellformed@mozilla.org": "test_addon_invalid_not_wellformed.rdf",
"test-addon-unpack@mozilla.org": "test_addon_unpack.rdf",
}
def generate_addon(addon_id, path=None, name=None, xpi=True):
"""
Method to generate a single addon.
:param addon_id: id of an addon to generate from the stubs dictionary
:param path: path where addon and .xpi should be generated
:param name: name for the addon folder or .xpi file
:param xpi: Flag if an XPI or folder should be generated
Returns the file-path of the addon's .xpi file
"""
if addon_id not in stubs:
raise IOError('Requested addon stub "%s" does not exist' % addon_id)
# Generate directory structure for addon
try:
tmpdir = path or tempfile.mkdtemp()
addon_dir = os.path.join(tmpdir, name or addon_id)
os.mkdir(addon_dir)
except IOError:
raise IOError("Could not generate directory structure for addon stub.")
# Write install.rdf for addon
if stubs[addon_id]:
install_rdf = os.path.join(addon_dir, "install.rdf")
with open(install_rdf, "w") as f:
manifest = os.path.join(here, "install_manifests", stubs[addon_id])
f.write(open(manifest, "r").read())
if not xpi:
return addon_dir
# Generate the .xpi for the addon
xpi_file = os.path.join(tmpdir, (name or addon_id) + ".xpi")
with zipfile.ZipFile(xpi_file, "w") as x:
x.write(install_rdf, install_rdf[len(addon_dir) :])
# Ensure we remove the temporary folder to not install the addon twice
mozfile.rmtree(addon_dir)
return xpi_file
|