Merge lp:~cr3/ubuntu/quantal/checkbox/0.14 into lp:ubuntu/quantal/checkbox

Proposed by Marc Tardif
Status: Merged
Merged at revision: 44
Proposed branch: lp:~cr3/ubuntu/quantal/checkbox/0.14
Merge into: lp:ubuntu/quantal/checkbox
Diff against target: 253616 lines (+100165/-44578)
317 files modified
backend (+16/-5)
bin/checkbox-cli (+1/-1)
bin/checkbox-gtk (+1/-1)
bin/checkbox-qt (+1/-1)
bin/checkbox-urwid (+1/-1)
checkbox/application.py (+3/-3)
checkbox/arguments.py (+1/-1)
checkbox/attribute.py (+1/-1)
checkbox/component.py (+13/-13)
checkbox/contrib/REThread.py (+1/-1)
checkbox/contrib/bpickle.py (+81/-60)
checkbox/contrib/glock.py (+15/-20)
checkbox/contrib/persist.py (+10/-10)
checkbox/dispatcher.py (+4/-4)
checkbox/job.py (+4/-4)
checkbox/lib/cache.py (+2/-2)
checkbox/lib/config.py (+22/-25)
checkbox/lib/conversion.py (+4/-4)
checkbox/lib/enum.py (+2/-2)
checkbox/lib/fifo.py (+33/-36)
checkbox/lib/log.py (+1/-1)
checkbox/lib/path.py (+9/-13)
checkbox/lib/process.py (+6/-5)
checkbox/lib/redirect.py (+7/-7)
checkbox/lib/resolver.py (+8/-15)
checkbox/lib/safe.py (+29/-31)
checkbox/lib/script.py (+2/-2)
checkbox/lib/selector.py (+2/-2)
checkbox/lib/signal.py (+2/-2)
checkbox/lib/template.py (+8/-9)
checkbox/lib/template_i18n.py (+5/-5)
checkbox/lib/tests/resolver.py (+2/-2)
checkbox/lib/transport.py (+73/-103)
checkbox/lib/tz.py (+55/-0)
checkbox/lib/update.py (+2/-2)
checkbox/lib/url.py (+2/-2)
checkbox/message.py (+4/-4)
checkbox/parsers/cpuinfo.py (+4/-4)
checkbox/parsers/device.py (+1/-1)
checkbox/parsers/dmidecode.py (+2/-2)
checkbox/parsers/submission.py (+14/-14)
checkbox/parsers/tests/cputable.py (+1/-1)
checkbox/parsers/tests/description.py (+3/-3)
checkbox/parsers/tests/dmidecode.py (+1/-1)
checkbox/parsers/tests/udevadm.py (+1/-1)
checkbox/parsers/udevadm.py (+3/-5)
checkbox/plugin.py (+1/-1)
checkbox/properties.py (+10/-10)
checkbox/reactor.py (+3/-3)
checkbox/report.py (+21/-28)
checkbox/reports/launchpad_report.py (+1/-1)
checkbox/reports/xml_report.py (+12/-10)
checkbox/resource.py (+6/-7)
checkbox/tests/report.py (+1/-1)
checkbox/user_interface.py (+25/-7)
checkbox/variables.py (+28/-28)
checkbox_cli/cli_interface.py (+17/-13)
checkbox_gtk/gtk_interface.py (+50/-7)
checkbox_gtk/hyper_text_view.py (+5/-7)
checkbox_qt/qt_interface.py (+105/-54)
checkbox_urwid/urwid_interface.py (+40/-17)
data/documents/RTF_Russian.rtf (+0/-51)
data/images/SVG_Color_Image_Xubuntu.svg (+0/-109)
data/whitelists/default.whitelist (+7/-2)
data/whitelists/smoke.whitelist (+25/-0)
data/whitelists/sniff.whitelist (+25/-0)
debian/changelog (+215/-0)
debian/checkbox.dirs (+1/-0)
debian/control (+55/-12)
debian/po/ast.po (+2/-2)
debian/po/cs.po (+2/-2)
debian/po/de.po (+2/-2)
debian/po/en_AU.po (+2/-2)
debian/po/en_GB.po (+2/-2)
debian/po/es.po (+3/-4)
debian/po/fr.po (+2/-2)
debian/po/he.po (+2/-2)
debian/po/hu.po (+2/-2)
debian/po/it.po (+2/-2)
debian/po/ja.po (+8/-5)
debian/po/nl.po (+2/-2)
debian/po/oc.po (+3/-3)
debian/po/pl.po (+2/-2)
debian/po/pt_BR.po (+22/-16)
debian/po/ro.po (+2/-2)
debian/po/ru.po (+2/-2)
debian/po/tr.po (+119/-0)
debian/po/uk.po (+2/-2)
debian/po/zh_CN.po (+119/-0)
debian/po/zh_TW.po (+5/-3)
debian/rules (+9/-2)
examples/checkbox-qt.ini (+1/-1)
examples/checkbox.ini (+1/-3)
gtk/checkbox-gtk.ui (+14/-2)
install/config (+40/-9)
install/postinst (+0/-7)
jobs/audio.txt.in (+22/-4)
jobs/autotest.txt.in (+0/-8)
jobs/benchmarks.txt.in (+201/-0)
jobs/camera.txt.in (+7/-7)
jobs/codecs.txt.in (+2/-2)
jobs/disk.txt.in (+13/-18)
jobs/firewire.txt.in (+11/-11)
jobs/graphics.txt.in (+68/-3)
jobs/hibernate.txt.in (+7/-2)
jobs/info.txt.in (+14/-16)
jobs/keys.txt.in (+19/-3)
jobs/local.txt.in (+16/-38)
jobs/ltp.txt.in (+0/-13)
jobs/mago.txt.in (+0/-10)
jobs/mediacard.txt.in (+16/-16)
jobs/miscellanea.txt.in (+21/-0)
jobs/networking.txt.in (+4/-1)
jobs/optical.txt.in (+10/-1)
jobs/panel_clock_test.txt.in (+5/-3)
jobs/phoronix.txt.in (+0/-11)
jobs/power-management.txt.in (+59/-8)
jobs/qa_regression.txt.in (+0/-9)
jobs/resource.txt.in (+5/-0)
jobs/smoke.txt.in (+50/-0)
jobs/sniff.txt.in (+74/-0)
jobs/stress.txt.in (+110/-24)
jobs/suspend.txt.in (+90/-30)
jobs/touchpad.txt.in (+46/-0)
jobs/unity.txt.in (+0/-14)
jobs/usb.txt.in (+3/-2)
jobs/wireless.txt.in (+6/-6)
plugins/apport_prompt.py (+4/-4)
plugins/backend_info.py (+9/-5)
plugins/error_prompt.py (+3/-2)
plugins/jobs_info.py (+80/-22)
plugins/jobs_prompt.py (+30/-2)
plugins/launchpad_exchange.py (+6/-6)
plugins/launchpad_prompt.py (+1/-1)
plugins/message_info.py (+20/-6)
plugins/recover_prompt.py (+16/-7)
plugins/resource_info.py (+1/-1)
plugins/suites_prompt.py (+37/-12)
plugins/system_info.py (+1/-1)
plugins/user_interface.py (+12/-1)
po/POTFILES.in (+2/-6)
po/ace.po (+756/-355)
po/af.po (+756/-355)
po/am.po (+756/-355)
po/ar.po (+839/-403)
po/ast.po (+1451/-682)
po/az.po (+777/-370)
po/be.po (+795/-367)
po/bg.po (+766/-357)
po/bn.po (+2526/-532)
po/bo.po (+766/-357)
po/br.po (+766/-357)
po/bs.po (+2492/-466)
po/ca.po (+816/-375)
po/ca@valencia.po (+766/-357)
po/checkbox.pot (+722/-371)
po/ckb.po (+759/-355)
po/cs.po (+1425/-653)
po/cy.po (+752/-351)
po/da.po (+981/-378)
po/de.po (+1695/-844)
po/dv.po (+750/-349)
po/el.po (+1515/-747)
po/en_AU.po (+1876/-1100)
po/en_CA.po (+769/-360)
po/en_GB.po (+1823/-1055)
po/eo.po (+766/-357)
po/es.po (+1508/-605)
po/et.po (+756/-355)
po/eu.po (+771/-367)
po/fa.po (+750/-349)
po/fi.po (+1585/-474)
po/fr.po (+1231/-437)
po/ga.po (+750/-349)
po/gd.po (+756/-355)
po/gl.po (+795/-367)
po/he.po (+770/-355)
po/hi.po (+766/-357)
po/hr.po (+766/-357)
po/hu.po (+2456/-475)
po/hy.po (+751/-350)
po/id.po (+761/-357)
po/is.po (+756/-355)
po/it.po (+1608/-840)
po/ja.po (+870/-390)
po/jbo.po (+750/-349)
po/ka.po (+756/-355)
po/kk.po (+759/-355)
po/km.po (+2764/-593)
po/kn.po (+755/-354)
po/ko.po (+835/-370)
po/ku.po (+756/-355)
po/ky.po (+750/-349)
po/lt.po (+766/-357)
po/lv.po (+934/-369)
po/mk.po (+756/-355)
po/ml.po (+756/-355)
po/mr.po (+756/-355)
po/ms.po (+1436/-668)
po/my.po (+759/-356)
po/nb.po (+762/-356)
po/nds.po (+751/-350)
po/ne.po (+755/-354)
po/nl.po (+1480/-701)
po/nn.po (+756/-355)
po/oc.po (+899/-409)
po/pl.po (+770/-358)
po/ps.po (+750/-349)
po/pt.po (+769/-359)
po/pt_BR.po (+1398/-649)
po/ro.po (+1470/-699)
po/ru.po (+1551/-572)
po/sd.po (+750/-349)
po/shn.po (+750/-349)
po/si.po (+769/-356)
po/sk.po (+797/-381)
po/sl.po (+1440/-673)
po/sq.po (+778/-366)
po/sr.po (+770/-358)
po/sv.po (+786/-364)
po/ta.po (+756/-355)
po/te.po (+756/-355)
po/th.po (+759/-355)
po/tr.po (+1465/-685)
po/ug.po (+1558/-675)
po/uk.po (+791/-367)
po/ur.po (+750/-349)
po/uz.po (+755/-354)
po/vi.po (+759/-355)
po/zh_CN.po (+2472/-706)
po/zh_HK.po (+766/-357)
po/zh_TW.po (+827/-372)
qt/checkbox-qt.ui (+1/-1)
qt/frontend/qtfront.cpp (+231/-161)
qt/frontend/qtfront.h (+15/-5)
qt/frontend/qtfront.ui (+45/-10)
qt/frontend/treemodel.cpp (+57/-36)
qt/frontend/treemodel.h (+4/-0)
run (+2/-9)
scripts/alsa_info (+928/-0)
scripts/ansi_parser (+18/-18)
scripts/audio_settings (+3/-3)
scripts/autotest_filter (+0/-128)
scripts/autotest_suite (+0/-118)
scripts/block_device_resource (+36/-0)
scripts/camera_test (+118/-70)
scripts/cdimage_resource (+10/-6)
scripts/check_is_laptop (+1/-1)
scripts/check_unity (+0/-20)
scripts/cking_suite (+11/-9)
scripts/clocktest.c (+10/-10)
scripts/cpu_offlining (+10/-4)
scripts/cpu_scaling_test (+211/-147)
scripts/cpu_topology (+25/-23)
scripts/cpuinfo_resource (+4/-4)
scripts/create_connection (+48/-40)
scripts/disk_read_performance_test (+1/-1)
scripts/disk_smart (+53/-36)
scripts/dmi_resource (+4/-4)
scripts/dns_server_test (+2/-2)
scripts/dpkg_resource (+15/-9)
scripts/filter_packages (+10/-6)
scripts/filter_templates (+14/-7)
scripts/floppy_test (+35/-23)
scripts/fwts_test (+54/-28)
scripts/gconf_resource (+8/-7)
scripts/gpu_test (+222/-0)
scripts/gst_pipeline_test (+24/-31)
scripts/hal_resource (+18/-14)
scripts/internet_test (+105/-33)
scripts/key_test (+412/-0)
scripts/keyboard_test (+6/-3)
scripts/lsb_resource (+5/-4)
scripts/ltp_filter (+0/-90)
scripts/ltp_suite (+0/-151)
scripts/mago_filter (+0/-98)
scripts/mago_suite (+0/-96)
scripts/max_diskspace_used (+1/-1)
scripts/media_keys_test (+0/-275)
scripts/meminfo_resource (+3/-3)
scripts/memory_info (+4/-4)
scripts/memory_test (+50/-41)
scripts/module_resource (+5/-4)
scripts/network_bandwidth_test (+38/-30)
scripts/network_check (+18/-18)
scripts/network_device_info (+3/-3)
scripts/network_info (+12/-7)
scripts/network_ntp_test (+37/-29)
scripts/obex_send (+73/-71)
scripts/optical_detect (+3/-3)
scripts/optical_read_test (+25/-10)
scripts/package_resource (+11/-8)
scripts/phoronix_filter (+0/-148)
scripts/phoronix_suite (+0/-307)
scripts/pm_log_check (+267/-0)
scripts/pm_test (+799/-0)
scripts/process_wait (+2/-0)
scripts/pts_run (+19/-0)
scripts/qa_regression_suite (+0/-171)
scripts/removable_storage_test (+107/-86)
scripts/removable_storage_watcher (+42/-23)
scripts/resolution_test (+18/-16)
scripts/run_templates (+2/-2)
scripts/samba_test (+1/-1)
scripts/sleep_test (+0/-355)
scripts/threaded_memtest.c (+25/-25)
scripts/tomcat_test (+1/-1)
scripts/touchpad_test (+190/-0)
scripts/udev_resource (+12/-7)
scripts/uname_resource (+5/-4)
scripts/virt_check (+2/-2)
scripts/wake_on_lan_test (+0/-150)
scripts/xorg_memory_test (+45/-44)
scripts/xrandr_cycle (+40/-32)
setup.cfg (+3/-6)
setup.py (+2/-2)
test (+15/-15)
To merge this branch: bzr merge lp:~cr3/ubuntu/quantal/checkbox/0.14
Reviewer Review Type Date Requested Status
Ubuntu branches Pending
Review via email: mp+111701@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'backend'
--- backend 2011-08-10 21:09:56 +0000
+++ backend 2012-06-23 00:59:17 +0000
@@ -1,4 +1,4 @@
1#!/usr/bin/python1#!/usr/bin/python3
22
3import os3import os
4import sys4import sys
@@ -19,9 +19,16 @@
19 if len(args) < 2:19 if len(args) < 2:
20 parser.error("Missing INPUT and OUTPUT")20 parser.error("Missing INPUT and OUTPUT")
2121
22 # Set PATH
22 if options.path:23 if options.path:
23 os.environ["PATH"] = options.path24 os.environ["PATH"] = options.path
2425
26 # Set PYTHONPATH
27 pythonpath = sys.path[0]
28 if "PYTHONPATH" in os.environ:
29 pythonpath = ":".join([pythonpath, os.environ["PYTHONPATH"]])
30 os.environ["PYTHONPATH"] = pythonpath
31
25 reader = FifoReader(args[0])32 reader = FifoReader(args[0])
26 writer = FifoWriter(args[1])33 writer = FifoWriter(args[1])
2734
@@ -36,12 +43,16 @@
36 if isinstance(message, dict) and "command" in message:43 if isinstance(message, dict) and "command" in message:
37 job = Job(message["command"], message.get("environ"),44 job = Job(message["command"], message.get("environ"),
38 message.get("timeout"))45 message.get("timeout"))
39 result = job.execute()46 status, data, duration = job.execute()
47 try:
48 data = data.decode("utf-8")
49 except UnicodeDecodeError:
50 status, data, duration = (FAIL, "Decode error", 0,)
40 else:51 else:
41 result = (FAIL, "", 0,)52 status, data, duration = (FAIL, "", 0,)
4253
43 writer.write_object(result)54 writer.write_object((status, data, duration,))
44 except IOError, e:55 except IOError:
45 break56 break
4657
47 return 058 return 0
4859
=== modified file 'bin/checkbox-cli'
--- bin/checkbox-cli 2012-02-10 11:19:05 +0000
+++ bin/checkbox-cli 2012-06-23 00:59:17 +0000
@@ -15,4 +15,4 @@
15 fi15 fi
16fi16fi
1717
18python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini18python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini
1919
=== modified file 'bin/checkbox-gtk'
--- bin/checkbox-gtk 2012-02-10 11:19:05 +0000
+++ bin/checkbox-gtk 2012-06-23 00:59:17 +0000
@@ -15,4 +15,4 @@
15 fi15 fi
16fi16fi
1717
18python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini18python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini
1919
=== modified file 'bin/checkbox-qt'
--- bin/checkbox-qt 2012-03-21 02:22:11 +0000
+++ bin/checkbox-qt 2012-06-23 00:59:17 +0000
@@ -23,4 +23,4 @@
23 (cd $CHECKBOX_FRONTEND; qmake; make; ./checkbox-qt-service &)23 (cd $CHECKBOX_FRONTEND; qmake; make; ./checkbox-qt-service &)
24fi24fi
2525
26python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini26python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini
2727
=== modified file 'bin/checkbox-urwid'
--- bin/checkbox-urwid 2012-02-10 11:19:05 +0000
+++ bin/checkbox-urwid 2012-06-23 00:59:17 +0000
@@ -15,4 +15,4 @@
15 fi15 fi
16fi16fi
1717
18python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini18python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini
1919
=== modified file 'checkbox/application.py'
--- checkbox/application.py 2012-03-21 02:22:11 +0000
+++ checkbox/application.py 2012-06-23 00:59:17 +0000
@@ -35,7 +35,7 @@
35from checkbox.reactor import Reactor35from checkbox.reactor import Reactor
3636
3737
38class Application(object):38class Application:
3939
40 reactor_factory = Reactor40 reactor_factory = Reactor
4141
@@ -55,7 +55,7 @@
55 raise55 raise
5656
5757
58class ApplicationManager(object):58class ApplicationManager:
5959
60 application_factory = Application60 application_factory = Application
6161
@@ -130,7 +130,7 @@
130130
131 # Check options131 # Check options
132 if options.version:132 if options.version:
133 print config.get_defaults().version133 print(config.get_defaults().version)
134 sys.exit(0)134 sys.exit(0)
135135
136 return self.application_factory(config)136 return self.application_factory(config)
137137
=== modified file 'checkbox/arguments.py'
--- checkbox/arguments.py 2009-08-19 15:36:05 +0000
+++ checkbox/arguments.py 2012-06-23 00:59:17 +0000
@@ -21,7 +21,7 @@
21from checkbox.lib.decorator import merge_function_metadata21from checkbox.lib.decorator import merge_function_metadata
2222
2323
24class ArgumentReplacer(object):24class ArgumentReplacer:
25 """A decorator helper that filters arguments to be passed to a function.25 """A decorator helper that filters arguments to be passed to a function.
2626
27 Create one with the original function and a function to replace27 Create one with the original function and a function to replace
2828
=== modified file 'checkbox/attribute.py'
--- checkbox/attribute.py 2009-01-20 18:55:20 +0000
+++ checkbox/attribute.py 2012-06-23 00:59:17 +0000
@@ -19,7 +19,7 @@
19from checkbox.variables import Variable19from checkbox.variables import Variable
2020
2121
22class Attribute(object):22class Attribute:
2323
24 def __init__(self, name, cls, variable_factory=None):24 def __init__(self, name, cls, variable_factory=None):
25 self.name = name25 self.name = name
2626
=== modified file 'checkbox/component.py'
--- checkbox/component.py 2010-03-09 16:58:36 +0000
+++ checkbox/component.py 2012-06-23 00:59:17 +0000
@@ -29,7 +29,7 @@
29from checkbox.variables import get_variables29from checkbox.variables import get_variables
3030
3131
32class ComponentSection(object):32class ComponentSection:
33 """33 """
34 Component section which is essentially a container of modules. These34 Component section which is essentially a container of modules. These
35 map to the modules referenced in the configuration passed as argument35 map to the modules referenced in the configuration passed as argument
@@ -99,7 +99,7 @@
99 name, self.name)99 name, self.name)
100100
101 if not self.has_module(name):101 if not self.has_module(name):
102 raise Exception, "No such such module: %s" % name102 raise Exception("No such such module: %s" % name)
103103
104 filenames = itertools.chain(*[path_expand_recursive(m)104 filenames = itertools.chain(*[path_expand_recursive(m)
105 for m in self.modules])105 for m in self.modules])
@@ -109,10 +109,10 @@
109 basename = basename.replace(".py", "")109 basename = basename.replace(".py", "")
110 if basename == name:110 if basename == name:
111 globals = {}111 globals = {}
112 exec open(filename) in globals112 exec(open(filename).read(), globals)
113 if "factory" not in globals:113 if "factory" not in globals:
114 raise Exception, "Variable 'factory' not found in: %s" \114 raise Exception("Variable 'factory' not found in: %s" \
115 % filename115 % filename)
116116
117 module = globals["factory"]()117 module = globals["factory"]()
118 module.__module__ = name118 module.__module__ = name
@@ -122,14 +122,14 @@
122122
123 # Set configuration values123 # Set configuration values
124 variables = get_variables(module)124 variables = get_variables(module)
125 environ = dict([(k.lower(), v) for k, v in os.environ.iteritems()])125 environ = dict([(k.lower(), v) for k, v in os.environ.items()])
126 for attribute, variable in variables.iteritems():126 for attribute, variable in variables.items():
127 if config and attribute.name in config:127 if config and attribute.name in config:
128 value = config.get(attribute.name)128 value = config.get(attribute.name)
129 variable.set(value)129 variable.set(value)
130 else:130 else:
131 value = variable.get()131 value = variable.get()
132 if isinstance(value, basestring):132 if isinstance(value, str):
133 value = value % environ133 value = value % environ
134 variable.set(value)134 variable.set(value)
135 elif isinstance(value, list):135 elif isinstance(value, list):
@@ -137,16 +137,16 @@
137 variable.set(value)137 variable.set(value)
138138
139 # Check required attributes139 # Check required attributes
140 for attribute, variable in variables.iteritems():140 for attribute, variable in variables.items():
141 value = variable.get()141 value = variable.get()
142 if value is None and variable._required:142 if value is None and variable._required:
143 raise Exception, "Configuration '%s' missing " \143 raise Exception("Configuration '%s' missing " \
144 "required attribute: %s" \144 "required attribute: %s" \
145 % (config_name, attribute.name)145 % (config_name, attribute.name))
146146
147 return module147 return module
148148
149 raise Exception, "Failed to find module '%s' in: %s" % (name, filenames)149 raise Exception("Failed to find module '%s' in: %s" % (name, filenames))
150150
151 def load_modules(self):151 def load_modules(self):
152 """152 """
@@ -160,7 +160,7 @@
160 return modules160 return modules
161161
162162
163class ComponentManager(object):163class ComponentManager:
164 """164 """
165 Component manager which is essentially a container of sections.165 Component manager which is essentially a container of sections.
166 """166 """
167167
=== modified file 'checkbox/contrib/REThread.py'
--- checkbox/contrib/REThread.py 2009-01-20 16:46:15 +0000
+++ checkbox/contrib/REThread.py 2012-06-23 00:59:17 +0000
@@ -60,7 +60,7 @@
60 Does nothing if no exception was caught.'''60 Does nothing if no exception was caught.'''
6161
62 if self._exception:62 if self._exception:
63 raise self._exception[0], self._exception[1], self._exception[2]63 raise self._exception[0](self._exception[1]).with_traceback(self._exception[2])
6464
65#65#
66# Unit test66# Unit test
6767
=== modified file 'checkbox/contrib/bpickle.py'
--- checkbox/contrib/bpickle.py 2010-03-09 16:58:36 +0000
+++ checkbox/contrib/bpickle.py 2012-06-23 00:59:17 +0000
@@ -39,129 +39,150 @@
3939
40 type_names = [type(obj)]40 type_names = [type(obj)]
41 for type_name in type_names:41 for type_name in type_names:
42 if _dt.has_key(type_name):42 if type_name in _dt:
43 return _dt[type_name](obj)43 return _dt[type_name](obj)
4444
45 type_names.extend(type_name.__bases__)45 type_names.extend(type_name.__bases__)
4646
47 raise ValueError, "Unsupported type: %s" % type(obj)47 raise ValueError("Unsupported type: %s" % type(obj))
4848
4949
50def loads(str, _lt=loads_table):50def loads(str, _lt=loads_table):
51 if not str:51 if not str:
52 raise ValueError, "Can't load empty string"52 raise ValueError("Can't load empty string")
53 try:53 try:
54 return _lt[str[0]](str, 0)[0]54 return _lt[str[0]](str, 0)[0]
55 except KeyError, e:55 except KeyError as e:
56 raise ValueError, "Unknown type character: %s" % e56 raise ValueError("Unknown type character: %s" % e)
57 except IndexError:57 except IndexError:
58 raise ValueError, "Corrupted data"58 raise ValueError("Corrupted data")
59
5960
60def dumps_bool(obj):61def dumps_bool(obj):
61 return "b%d" % int(obj)62 return ("b%d" % int(obj)).encode("ascii")
63
6264
63def dumps_int(obj):65def dumps_int(obj):
64 return "i%s;" % obj66 return ("i%s;" % obj).encode("ascii")
67
6568
66def dumps_float(obj):69def dumps_float(obj):
67 return "f%r;" % obj70 return ("f%r;" % obj).encode("ascii")
71
72
73def dumps_bytes(obj):
74 return ("c%s:" % len(obj)).encode("ascii") + obj
75
6876
69def dumps_str(obj):77def dumps_str(obj):
70 return "s%s:%s" % (len(obj), obj)
71
72def dumps_unicode(obj):
73 obj = obj.encode("utf-8")78 obj = obj.encode("utf-8")
74 return "u%s:%s" % (len(obj), obj)79 return ("s%s:" % len(obj)).encode("ascii") + obj
80
7581
76def dumps_list(obj, _dt=None):82def dumps_list(obj, _dt=None):
77 return "l%s;" % "".join([dumps(val, _dt) for val in obj])83 return b"l" + b"".join([dumps(val, _dt) for val in obj]) + b";"
84
7885
79def dumps_tuple(obj, _dt=None):86def dumps_tuple(obj, _dt=None):
80 return "t%s;" % "".join([dumps(val, _dt) for val in obj])87 return b"t" + b"".join([dumps(val, _dt) for val in obj]) + b";"
88
8189
82def dumps_dict(obj, _dt=None):90def dumps_dict(obj, _dt=None):
83 res = []91 res = []
84 keys = sorted(obj.iterkeys())92 keys = sorted(obj.keys())
85 append = res.append93 append = res.append
86 for key in keys:94 for key in keys:
87 val = obj[key]95 val = obj[key]
88 append(dumps(key, _dt))96 append(dumps(key, _dt))
89 append(dumps(val, _dt))97 append(dumps(val, _dt))
90 return "d%s;" % "".join(res)98 return b"d" + b"".join(res) + b";"
99
91100
92def dumps_none(obj):101def dumps_none(obj):
93 return "n"102 return b"n"
103
94104
95def loads_bool(str, pos):105def loads_bool(str, pos):
96 return bool(int(str[pos+1])), pos+2106 return bool(int(chr(str[pos + 1]))), pos + 2
107
97108
98def loads_int(str, pos):109def loads_int(str, pos):
99 endpos = str.index(";", pos)110 endpos = str.index(b";", pos)
100 return int(str[pos+1:endpos]), endpos+1111 return int(str[pos + 1:endpos]), endpos + 1
112
101113
102def loads_float(str, pos):114def loads_float(str, pos):
103 endpos = str.index(";", pos)115 endpos = str.index(b";", pos)
104 return float(str[pos+1:endpos]), endpos+1116 return float(str[pos + 1:endpos]), endpos + 1
117
118
119def loads_bytes(str, pos):
120 startpos = str.index(b":", pos) + 1
121 endpos = startpos + int(str[pos + 1:startpos - 1])
122 return str[startpos:endpos], endpos
123
105124
106def loads_str(str, pos):125def loads_str(str, pos):
107 startpos = str.index(":", pos)+1126 startpos = str.index(b":", pos) + 1
108 endpos = startpos+int(str[pos+1:startpos-1])127 endpos = startpos + int(str[pos + 1:startpos - 1])
109 return str[startpos:endpos], endpos
110
111def loads_unicode(str, pos):
112 startpos = str.index(":", pos)+1
113 endpos = startpos+int(str[pos+1:startpos-1])
114 return str[startpos:endpos].decode("utf-8"), endpos128 return str[startpos:endpos].decode("utf-8"), endpos
115129
130
116def loads_list(str, pos, _lt=loads_table):131def loads_list(str, pos, _lt=loads_table):
117 pos += 1132 pos += 1
118 res = []133 res = []
119 append = res.append134 append = res.append
120 while str[pos] != ";":135 while str[pos] != ord(";"):
121 obj, pos = _lt[str[pos]](str, pos)136 obj, pos = _lt[str[pos]](str, pos)
122 append(obj)137 append(obj)
123 return res, pos+1138 return res, pos + 1
139
124140
125def loads_tuple(str, pos, _lt=loads_table):141def loads_tuple(str, pos, _lt=loads_table):
126 pos += 1142 pos += 1
127 res = []143 res = []
128 append = res.append144 append = res.append
129 while str[pos] != ";":145 while str[pos] != ord(";"):
130 obj, pos = _lt[str[pos]](str, pos)146 obj, pos = _lt[str[pos]](str, pos)
131 append(obj)147 append(obj)
132 return tuple(res), pos+1148 return tuple(res), pos + 1
149
133150
134def loads_dict(str, pos, _lt=loads_table):151def loads_dict(str, pos, _lt=loads_table):
135 pos += 1152 pos += 1
136 res = {}153 res = {}
137 while str[pos] != ";":154 while str[pos] != ord(";"):
138 key, pos = _lt[str[pos]](str, pos)155 key, pos = _lt[str[pos]](str, pos)
139 val, pos = _lt[str[pos]](str, pos)156 val, pos = _lt[str[pos]](str, pos)
140 res[key] = val157 res[key] = val
141 return res, pos+1158 return res, pos + 1
159
142160
143def loads_none(str, pos):161def loads_none(str, pos):
144 return None, pos+1162 return None, pos + 1
145163
146164
147dumps_table.update({ bool: dumps_bool,165dumps_table.update({
148 int: dumps_int,166 bool: dumps_bool,
149 long: dumps_int,167 int: dumps_int,
150 float: dumps_float,168 float: dumps_float,
151 str: dumps_str,169 bytes: dumps_bytes,
152 unicode: dumps_unicode,170 str: dumps_str,
153 list: dumps_list,171 list: dumps_list,
154 tuple: dumps_tuple,172 tuple: dumps_tuple,
155 dict: dumps_dict,173 dict: dumps_dict,
156 type(None): dumps_none })174 type(None): dumps_none,
157175 })
158loads_table.update({ "b": loads_bool,176
159 "i": loads_int,177loads_table.update({
160 "f": loads_float,178 ord("b"): loads_bool,
161 "s": loads_str,179 ord("i"): loads_int,
162 "u": loads_unicode,180 ord("f"): loads_float,
163 "l": loads_list,181 ord("c"): loads_str,
164 "t": loads_tuple,182 ord("s"): loads_str,
165 "d": loads_dict,183 ord("u"): loads_str,
166 "n": loads_none })184 ord("l"): loads_list,
167185 ord("t"): loads_tuple,
186 ord("d"): loads_dict,
187 ord("n"): loads_none,
188 })
168189
=== modified file 'checkbox/contrib/glock.py'
--- checkbox/contrib/glock.py 2010-03-09 16:58:36 +0000
+++ checkbox/contrib/glock.py 2012-06-23 00:59:17 +0000
@@ -1,4 +1,4 @@
1#!/usr/bin/env python1#!/usr/bin/env python3
2# -*- coding: latin1 -*-2# -*- coding: latin1 -*-
3#----------------------------------------------------------------------------3#----------------------------------------------------------------------------
4# glock.py: Global mutex4# glock.py: Global mutex
@@ -70,11 +70,6 @@
70 pass70 pass
7171
7272
73# Constants
74# ---------:
75if sys.version[:3] < '2.2':
76 True, False = 1, 0 # built-in in Python 2.2+
77
78#----------------------------------------------------------------------------73#----------------------------------------------------------------------------
79class GlobalLock:74class GlobalLock:
80#----------------------------------------------------------------------------75#----------------------------------------------------------------------------
@@ -177,7 +172,7 @@
177 options = fcntl.LOCK_EX|fcntl.LOCK_NB172 options = fcntl.LOCK_EX|fcntl.LOCK_NB
178 try:173 try:
179 fcntl.flock(self.fdlock, options)174 fcntl.flock(self.fdlock, options)
180 except IOError, message: #(errno 13: perm. denied,175 except IOError as message: #(errno 13: perm. denied,
181 # 36: Resource deadlock avoided)176 # 36: Resource deadlock avoided)
182 if not blocking and self._errnoOf (message) == errno.EWOULDBLOCK:177 if not blocking and self._errnoOf (message) == errno.EWOULDBLOCK:
183 raise LockAlreadyAcquired('Lock %s already acquired by '178 raise LockAlreadyAcquired('Lock %s already acquired by '
@@ -230,7 +225,7 @@
230 try:225 try:
231 win32event.ReleaseMutex(self.mutex)226 win32event.ReleaseMutex(self.mutex)
232 #print "released mutex"227 #print "released mutex"
233 except pywintypes.error, e:228 except pywintypes.error as e:
234 errCode, fctName, errMsg = e.args229 errCode, fctName, errMsg = e.args
235 if errCode == 288:230 if errCode == 288:
236 raise NotOwner("Attempt to release somebody else's lock")231 raise NotOwner("Attempt to release somebody else's lock")
@@ -264,7 +259,7 @@
264#----------------------------------------------------------------------------259#----------------------------------------------------------------------------
265 ##TODO: a more serious test with distinct processes !260 ##TODO: a more serious test with distinct processes !
266261
267 print 'Testing glock.py...'262 print('Testing glock.py...')
268263
269 # unfortunately can't test inter-process lock here!264 # unfortunately can't test inter-process lock here!
270 lockName = 'myFirstLock'265 lockName = 'myFirstLock'
@@ -283,31 +278,31 @@
283 # Check that <> threads of same process do block:278 # Check that <> threads of same process do block:
284 import threading, time279 import threading, time
285 thread = threading.Thread(target=threadMain, args=(l,))280 thread = threading.Thread(target=threadMain, args=(l,))
286 print 'main: locking...',281 print('main: locking...', end=' ')
287 l.acquire()282 l.acquire()
288 print ' done.'283 print(' done.')
289 thread.start()284 thread.start()
290 time.sleep(3)285 time.sleep(3)
291 print '\nmain: unlocking...',286 print('\nmain: unlocking...', end=' ')
292 l.release()287 l.release()
293 print ' done.'288 print(' done.')
294 time.sleep(0.1)289 time.sleep(0.1)
295290
296 print '=> Test of glock.py passed.'291 print('=> Test of glock.py passed.')
297 return l292 return l
298293
299def threadMain(lock):294def threadMain(lock):
300 print 'thread started(%s).' % lock295 print('thread started(%s).' % lock)
301 try: lock.acquire(blocking=False)296 try: lock.acquire(blocking=False)
302 except LockAlreadyAcquired: pass297 except LockAlreadyAcquired: pass
303 else: raise Exception('should have raised LockAlreadyAcquired')298 else: raise Exception('should have raised LockAlreadyAcquired')
304 print 'thread: locking (should stay blocked for ~ 3 sec)...',299 print('thread: locking (should stay blocked for ~ 3 sec)...', end=' ')
305 lock.acquire()300 lock.acquire()
306 print 'thread: locking done.'301 print('thread: locking done.')
307 print 'thread: unlocking...',302 print('thread: unlocking...', end=' ')
308 lock.release()303 lock.release()
309 print ' done.'304 print(' done.')
310 print 'thread ended.'305 print('thread ended.')
311306
312#----------------------------------------------------------------------------307#----------------------------------------------------------------------------
313# M A I N308# M A I N
314309
=== modified file 'checkbox/contrib/persist.py'
--- checkbox/contrib/persist.py 2012-02-23 11:56:50 +0000
+++ checkbox/contrib/persist.py 2012-06-23 00:59:17 +0000
@@ -41,7 +41,7 @@
41 pass41 pass
4242
4343
44class Persist(object):44class Persist:
45 """Persistence handler.45 """Persistence handler.
4646
47 There are three different kinds of opition maps, regarding the47 There are three different kinds of opition maps, regarding the
@@ -257,7 +257,7 @@
257 current = self._traverse(map, path)257 current = self._traverse(map, path)
258 if type(current) is list and value in current:258 if type(current) is list and value in current:
259 return259 return
260 path = path+(sys.maxint,)260 path = path+(sys.maxsize,)
261 self._traverse(map, path, setvalue=value)261 self._traverse(map, path, setvalue=value)
262262
263 def remove(self, path, value=NOTHING, soft=False, weak=False):263 def remove(self, path, value=NOTHING, soft=False, weak=False):
@@ -317,7 +317,7 @@
317 return RootedPersist(self, path)317 return RootedPersist(self, path)
318318
319319
320class RootedPersist(object):320class RootedPersist:
321321
322 def __init__(self, parent, root):322 def __init__(self, parent, root):
323 self.parent = parent323 self.parent = parent
@@ -408,7 +408,7 @@
408 return ".".join(result)408 return ".".join(result)
409409
410410
411class Backend(object):411class Backend:
412412
413 def new(self):413 def new(self):
414 return {}414 return {}
@@ -491,7 +491,7 @@
491 if keys:491 if keys:
492 return keys()492 return keys()
493 elif type(obj) is list:493 elif type(obj) is list:
494 return range(len(obj))494 return list(range(len(obj)))
495 return NotImplemented495 return NotImplemented
496496
497497
@@ -513,18 +513,18 @@
513class PickleBackend(DiskBackend):513class PickleBackend(DiskBackend):
514514
515 def __init__(self):515 def __init__(self):
516 import cPickle516 import pickle
517 self._pickle = cPickle517 self._pickle = cPickle
518518
519 def load(self, filepath):519 def load(self, filepath):
520 file = open(filepath)520 file = open(filepath, "rb")
521 try:521 try:
522 return self._pickle.load(file)522 return self._pickle.load(file)
523 finally:523 finally:
524 safe_close(file, self.safe_file_closing)524 safe_close(file, self.safe_file_closing)
525525
526 def save(self, filepath, map):526 def save(self, filepath, map):
527 file = open(filepath, "w")527 file = open(filepath, "wb")
528 try:528 try:
529 self._pickle.dump(map, file, 2)529 self._pickle.dump(map, file, 2)
530 finally:530 finally:
@@ -538,14 +538,14 @@
538 self._bpickle = bpickle538 self._bpickle = bpickle
539539
540 def load(self, filepath):540 def load(self, filepath):
541 file = open(filepath)541 file = open(filepath, "rb")
542 try:542 try:
543 return self._bpickle.loads(file.read())543 return self._bpickle.loads(file.read())
544 finally:544 finally:
545 safe_close(file, self.safe_file_closing)545 safe_close(file, self.safe_file_closing)
546546
547 def save(self, filepath, map):547 def save(self, filepath, map):
548 file = open(filepath, "w")548 file = open(filepath, "wb")
549 try:549 try:
550 file.write(self._bpickle.dumps(map))550 file.write(self._bpickle.dumps(map))
551 finally:551 finally:
552552
=== modified file 'checkbox/dispatcher.py'
--- checkbox/dispatcher.py 2011-11-18 12:46:21 +0000
+++ checkbox/dispatcher.py 2012-06-23 00:59:17 +0000
@@ -83,9 +83,9 @@
83 # then behaves like a list using the latest events.83 # then behaves like a list using the latest events.
84 if self.event_types.issubset(self.kwargs):84 if self.event_types.issubset(self.kwargs):
85 self.notify = notify = super(ListenerQueue, self).notify85 self.notify = notify = super(ListenerQueue, self).notify
86 keys = self.kwargs.keys()86 keys = list(self.kwargs.keys())
87 for values in product(*self.kwargs.values()):87 for values in product(*list(self.kwargs.values())):
88 self.kwargs = dict(zip(keys, values))88 self.kwargs = dict(list(zip(keys, values)))
89 notify(event)89 notify(event)
9090
9191
@@ -171,7 +171,7 @@
171171
172 def registerHandler(self, event_types, handler, count=None):172 def registerHandler(self, event_types, handler, count=None):
173 """See Dispatcher."""173 """See Dispatcher."""
174 if not isinstance(event_types, (list, tuple,)):174 if not isinstance(event_types, (list, tuple)):
175 event_types = (event_types,)175 event_types = (event_types,)
176176
177 listener = self.listener_factory(event_types, handler, count)177 listener = self.listener_factory(event_types, handler, count)
178178
=== modified file 'checkbox/job.py'
--- checkbox/job.py 2012-02-15 00:11:21 +0000
+++ checkbox/job.py 2012-06-23 00:59:17 +0000
@@ -39,7 +39,7 @@
3939
40DEFAULT_JOB_TIMEOUT = 30 # used in case a job specifies invalid timeout40DEFAULT_JOB_TIMEOUT = 30 # used in case a job specifies invalid timeout
4141
42class Job(object):42class Job:
4343
44 def __init__(self, command, environ=None, timeout=None):44 def __init__(self, command, environ=None, timeout=None):
45 if environ is None:45 if environ is None:
@@ -93,8 +93,8 @@
93 (signal_to_name(term_signal),93 (signal_to_name(term_signal),
94 signal_to_description(term_signal))94 signal_to_description(term_signal))
95 else:95 else:
96 raise Exception, "Command not terminated: %s" \96 raise Exception("Command not terminated: %s" \
97 % self.command97 % self.command)
9898
99 duration = process.endtime - process.starttime99 duration = process.endtime - process.starttime
100100
@@ -133,7 +133,7 @@
133 def _find_matching_messages(self, **kwargs):133 def _find_matching_messages(self, **kwargs):
134 for filename in self._walk_messages():134 for filename in self._walk_messages():
135 message = self._read_message(filename,cache=True)135 message = self._read_message(filename,cache=True)
136 for key, value in kwargs.iteritems():136 for key, value in kwargs.items():
137 if message.get(key) != value:137 if message.get(key) != value:
138 break138 break
139 else:139 else:
140140
=== modified file 'checkbox/lib/cache.py'
--- checkbox/lib/cache.py 2009-01-20 18:55:20 +0000
+++ checkbox/lib/cache.py 2012-06-23 00:59:17 +0000
@@ -16,7 +16,7 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19class Cache(object):19class Cache:
2020
21 def __init__(self, function):21 def __init__(self, function):
22 self._cache = {}22 self._cache = {}
@@ -27,7 +27,7 @@
27 return self27 return self
2828
29 def __call__(self, *args):29 def __call__(self, *args):
30 if not self._cache.has_key((self._instance,) + args):30 if (self._instance,) + args not in self._cache:
31 self._cache[(self._instance,) + args] = self._function(self._instance, *args)31 self._cache[(self._instance,) + args] = self._function(self._instance, *args)
3232
33 return self._cache[(self._instance,) + args]33 return self._cache[(self._instance,) + args]
3434
=== modified file 'checkbox/lib/config.py'
--- checkbox/lib/config.py 2012-02-10 11:19:05 +0000
+++ checkbox/lib/config.py 2012-06-23 00:59:17 +0000
@@ -19,9 +19,8 @@
19import os19import os
20import re20import re
21import logging21import logging
22import posixpath
2322
24from ConfigParser import ConfigParser23from configparser import ConfigParser
2524
26from checkbox.lib.text import split25from checkbox.lib.text import split
2726
@@ -32,7 +31,7 @@
32 super(IncludeDict, self).__init__()31 super(IncludeDict, self).__init__()
33 self._parser = parser32 self._parser = parser
3433
35 for (key, value) in os.environ.iteritems():34 for (key, value) in os.environ.items():
36 if key.startswith("CHECKBOX"):35 if key.startswith("CHECKBOX"):
37 super(IncludeDict, self).__setitem__(key.lower(), value)36 super(IncludeDict, self).__setitem__(key.lower(), value)
3837
@@ -41,20 +40,18 @@
41 if isinstance(value, list):40 if isinstance(value, list):
42 value = value[0]41 value = value[0]
43 for path in split(value):42 for path in split(value):
44 path = self._parser._interpolate("DEFAULT", None, path, self)43 path = self._parser._interpolation.before_get(
45 path = posixpath.expanduser(path)44 self._parser, "DEFAULT", None, path, self)
46 if not posixpath.exists(path):45 path = os.path.expanduser(path)
47 raise Exception, "No such configuration file: %s" % path46 if not os.path.exists(path):
48 if posixpath.isdir(path):47 raise Exception("No such configuration file: %s" % path)
48 if os.path.isdir(path):
49 logging.info("Parsing config filenames from directory: %s",49 logging.info("Parsing config filenames from directory: %s",
50 path)50 path)
51 def walk_func(arg, directory, names):51 for dirpath, dirnames, filenames in os.walk(path):
52 for name in names:52 for filename in filenames:
53 path = posixpath.join(directory, name)53 path = os.path.join(dirpath, filename)
54 if not posixpath.isdir(path):54 self._parser.read(path)
55 arg._parser.read(path)
56
57 posixpath.walk(path, walk_func, self)
58 else:55 else:
59 logging.info("Parsing config filename: %s", path)56 logging.info("Parsing config filename: %s", path)
60 self._parser.read(path)57 self._parser.read(path)
@@ -64,20 +61,20 @@
64 super(IncludeDict, self).__setitem__(key, value)61 super(IncludeDict, self).__setitem__(key, value)
6562
6663
67class ConfigSection(object):64class ConfigSection:
6865
69 def __init__(self, parent, name, attributes={}):66 def __init__(self, parent, name, attributes={}):
70 self.parent = parent67 self.parent = parent
71 self.name = name68 self.name = name
72 self.attributes = {}69 self.attributes = {}
73 for key, value in attributes.iteritems():70 for key, value in attributes.items():
74 self.attributes[key] = re.sub("\n\.\n", "\n\n", value)71 self.attributes[key] = re.sub("\n\.\n", "\n\n", value)
7572
76 def __getattr__(self, name):73 def __getattr__(self, name):
77 if name in self.attributes:74 if name in self.attributes:
78 return self.get(name)75 return self.get(name)
7976
80 raise AttributeError, name77 raise AttributeError(name)
8178
82 def __contains__(self, name):79 def __contains__(self, name):
83 return name in self.attributes80 return name in self.attributes
@@ -96,7 +93,7 @@
96 if name in self.attributes:93 if name in self.attributes:
97 return self.get(name)94 return self.get(name)
9895
99 raise AttributeError, name96 raise AttributeError(name)
10097
101 def get(self, name):98 def get(self, name):
102 name_upper = name.upper()99 name_upper = name.upper()
@@ -106,10 +103,10 @@
106 return os.environ[name_upper]103 return os.environ[name_upper]
107104
108105
109class Config(object):106class Config:
110107
111 def __init__(self):108 def __init__(self):
112 self._parser = ConfigParser()109 self._parser = ConfigParser(empty_lines_in_values=False)
113 self._parser._defaults = IncludeDict(self._parser)110 self._parser._defaults = IncludeDict(self._parser)
114111
115 # Copy attributes from the parser to avoid one additional112 # Copy attributes from the parser to avoid one additional
@@ -121,7 +118,7 @@
121 for config in configs:118 for config in configs:
122 match = re.match("(.*)/([^/]+)=(.*)", config)119 match = re.match("(.*)/([^/]+)=(.*)", config)
123 if not match:120 if not match:
124 raise Exception, "Invalid config string: %s" % config121 raise Exception("Invalid config string: %s" % config)
125122
126 (name, option, value) = match.groups()123 (name, option, value) = match.groups()
127124
@@ -145,11 +142,11 @@
145 def read_file(self, file, filename="<stream>"):142 def read_file(self, file, filename="<stream>"):
146 logging.info("Reading configurations from: %s", filename)143 logging.info("Reading configurations from: %s", filename)
147144
148 self._parser.readfp(file, filename)145 self._parser.read_file(file, filename)
149146
150 def read_filename(self, filename):147 def read_filename(self, filename):
151 if not posixpath.exists(filename):148 if not os.path.exists(filename):
152 raise Exception, "No such configuration file: %s" % filename149 raise Exception("No such configuration file: %s" % filename)
153150
154 file = open(filename, "r")151 file = open(filename, "r")
155 return self.read_file(file, filename)152 return self.read_file(file, filename)
156153
=== modified file 'checkbox/lib/conversion.py'
--- checkbox/lib/conversion.py 2011-11-18 12:46:21 +0000
+++ checkbox/lib/conversion.py 2012-06-23 00:59:17 +0000
@@ -18,12 +18,13 @@
18#18#
19import re19import re
2020
21from dateutil import tz
22from datetime import (21from datetime import (
23 datetime,22 datetime,
24 timedelta,23 timedelta,
25 )24 )
2625
26from checkbox.lib.tz import tzutc
27
2728
28DATETIME_RE = re.compile(r"""29DATETIME_RE = re.compile(r"""
29 ^(?P<year>\d\d\d\d)-?(?P<month>\d\d)-?(?P<day>\d\d)30 ^(?P<year>\d\d\d\d)-?(?P<month>\d\d)-?(?P<day>\d\d)
@@ -108,8 +109,7 @@
108 milliseconds = 999999109 milliseconds = 999999
109110
110 dt = datetime(111 dt = datetime(
111 year, month, day, hour, minute, second, milliseconds,112 year, month, day, hour, minute, second, milliseconds, tzinfo=tzutc)
112 tzinfo=tz.tzutc())
113113
114 tz_sign = time_parts['tz_sign']114 tz_sign = time_parts['tz_sign']
115 tz_hour = time_parts['tz_hour']115 tz_hour = time_parts['tz_hour']
@@ -150,7 +150,7 @@
150150
151 :param string: The string representation.151 :param string: The string representation.
152 """152 """
153 if isinstance(string, basestring):153 if isinstance(string, str):
154 for regex, formatter in TYPE_FORMATS:154 for regex, formatter in TYPE_FORMATS:
155 match = regex.match(string)155 match = regex.match(string)
156 if match:156 if match:
157157
=== modified file 'checkbox/lib/enum.py'
--- checkbox/lib/enum.py 2011-06-13 14:22:39 +0000
+++ checkbox/lib/enum.py 2012-06-23 00:59:17 +0000
@@ -25,7 +25,7 @@
25 pass25 pass
2626
2727
28class Enum(object):28class Enum:
2929
30 def __init__(self, *names):30 def __init__(self, *names):
31 value = 031 value = 0
@@ -44,7 +44,7 @@
44 "enum value does not define: %s" % value)44 "enum value does not define: %s" % value)
45 value = getattr(self, value)45 value = getattr(self, value)
4646
47 if not isinstance(value, (int, long)):47 if not isinstance(value, int):
48 raise EnumException(48 raise EnumException(
49 "enum value is not an integer: %s" % value)49 "enum value is not an integer: %s" % value)
5050
5151
=== modified file 'checkbox/lib/fifo.py'
--- checkbox/lib/fifo.py 2011-06-13 14:22:39 +0000
+++ checkbox/lib/fifo.py 2012-06-23 00:59:17 +0000
@@ -22,26 +22,27 @@
22from checkbox.contrib.bpickle import dumps, loads22from checkbox.contrib.bpickle import dumps, loads
23from checkbox.lib.selector import Selector, SelectorIO23from checkbox.lib.selector import Selector, SelectorIO
2424
25class FifoBase(object):25
2626class FifoBase:
27 mode = None27
28 flags = None
2829
29 def __init__(self, path, timeout=None):30 def __init__(self, path, timeout=None):
30 self.path = path31 self.path = path
31 self.file = open(path, self.mode)32 self.fileno = os.open(path, self.flags)
32 self._timeout = timeout33 self._timeout = timeout
3334
34 def __del__(self):35 def __del__(self):
35 self.close()36 self.close()
3637
37 def close(self):38 def close(self):
38 self.file.close()39 os.close(self.fileno)
3940
40 def wait_for(self, operation):41 def wait_for(self, operation):
41 if self._timeout is not None:42 if self._timeout is not None:
42 selector = Selector()43 selector = Selector()
43 selector.set_timeout(self._timeout)44 selector.set_timeout(self._timeout)
44 selector.add_fd(self.file.fileno(), operation)45 selector.add_fd(self.fileno, operation)
4546
46 selector.execute()47 selector.execute()
4748
@@ -49,57 +50,53 @@
49 return False50 return False
50 return True51 return True
5152
53
52class FifoReader(FifoBase):54class FifoReader(FifoBase):
5355
54 #on Linux, opening a FIFO in read-write mode is non-blocking and56 flags = os.O_RDWR
55 #succeeds even if other end is not open as per FIFO(7)
56 mode = "w+"
5757
58 def read_string(self):58 def read_bytes(self):
59 # Check if a connection arrived within the timeout59 # Check if a connection arrived within the timeout
60 if not self.wait_for(SelectorIO.READ):60 if not self.wait_for(SelectorIO.READ):
61 return None61 return None
6262
63 size = struct.calcsize("i")63 size = struct.calcsize("i")
64 length_string = self.file.read(size)64 length_bytes = os.read(self.fileno, size)
65 if not length_string:65 if not length_bytes:
66 return ""66 return b""
6767
68 length = struct.unpack(">i", length_string)[0]68 length = struct.unpack(">i", length_bytes)[0]
69 return self.file.read(length)69 return os.read(self.fileno, length)
7070
71 def read_object(self):71 def read_object(self):
72 string = self.read_string()72 _bytes = self.read_bytes()
73 if not string:73 if not _bytes:
74 return None74 return None
7575
76 return loads(string)76 return loads(_bytes)
7777
7878
79class FifoWriter(FifoBase):79class FifoWriter(FifoBase):
8080
81 #on Linux, opening a FIFO in read-write mode is non-blocking and81 flags = os.O_RDWR | os.O_CREAT | os.O_TRUNC
82 #succeeds even if other end is not open as per FIFO(7)82
83 mode = "w+"83 def write_bytes(self, _bytes):
8484
85 def write_string(self, string):85 # Wait until I can write
86
87 # Wait until I can write
88 if not self.wait_for(SelectorIO.WRITE):86 if not self.wait_for(SelectorIO.WRITE):
89 return None 87 return None
9088
91 length = len(string)89 length = len(_bytes)
92 length_string = struct.pack(">i", length)90 length_bytes = struct.pack(">i", length)
93 self.file.write(length_string)91 os.write(self.fileno, length_bytes)
94 self.file.write(string)92 os.write(self.fileno, _bytes)
95 self.file.flush()
96 return length93 return length
9794
98 def write_object(self, object):95 def write_object(self, object):
99 string = dumps(object)96 _bytes = dumps(object)
100 return self.write_string(string)97 return self.write_bytes(_bytes)
10198
10299
103def create_fifo(path, mode=0666):100def create_fifo(path, mode=0o666):
104 os.mkfifo(path, mode)101 os.mkfifo(path, mode)
105 return path102 return path
106103
=== modified file 'checkbox/lib/log.py'
--- checkbox/lib/log.py 2011-07-01 11:37:27 +0000
+++ checkbox/lib/log.py 2012-06-23 00:59:17 +0000
@@ -36,7 +36,7 @@
36 if kwargs:36 if kwargs:
37 args_string += ", "37 args_string += ", "
38 if kwargs:38 if kwargs:
39 args_string += ", ".join(["%s=%s" % (k, v) for k, v in kwargs.iteritems()])39 args_string += ", ".join(["%s=%s" % (k, v) for k, v in kwargs.items()])
4040
41 module = object.__module__ if object.__module__ else inspect.getfile(object)41 module = object.__module__ if object.__module__ else inspect.getfile(object)
42 if inspect.ismethod(object):42 if inspect.ismethod(object):
4343
=== modified file 'checkbox/lib/path.py'
--- checkbox/lib/path.py 2009-01-20 18:55:20 +0000
+++ checkbox/lib/path.py 2012-06-23 00:59:17 +0000
@@ -16,13 +16,13 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19import posixpath19import os
2020
21from glob import glob21from glob import glob
2222
2323
24def path_split(path):24def path_split(path):
25 return path.split(posixpath.sep)25 return path.split(os.path.sep)
2626
27def path_common(l1, l2, common=[]):27def path_common(l1, l2, common=[]):
28 if len(l1) < 1:28 if len(l1) < 1:
@@ -40,26 +40,22 @@
40 (common, l1, l2) = path_common(path_split(p1), path_split(p2))40 (common, l1, l2) = path_common(path_split(p1), path_split(p2))
41 p = []41 p = []
42 if len(l1) > 0:42 if len(l1) > 0:
43 p = ["..%s" % posixpath.sep * len(l1)]43 p = ["..%s" % os.path.sep * len(l1)]
4444
45 p = p + l245 p = p + l2
46 return posixpath.join( *p )46 return os.path.join( *p )
4747
48def path_expand(path):48def path_expand(path):
49 path = posixpath.expanduser(path)49 path = os.path.expanduser(path)
50 return glob(path)50 return glob(path)
5151
52def path_expand_recursive(path):52def path_expand_recursive(path):
53 paths = []53 paths = []
54 for path in path_expand(path):54 for path in path_expand(path):
55 if posixpath.isdir(path):55 if os.path.isdir(path):
56 def walk_func(arg, directory, names):56 for dirpath, dirnames, filenames in os.walk(path):
57 for name in names:57 for filename in filenames:
58 path = posixpath.join(directory, name)58 paths.append(os.path.join(dirpath, filename))
59 if not posixpath.isdir(path):
60 arg.append(path)
61
62 posixpath.walk(path, walk_func, paths)
63 else:59 else:
64 paths.append(path)60 paths.append(path)
6561
6662
=== modified file 'checkbox/lib/process.py'
--- checkbox/lib/process.py 2012-03-07 19:46:29 +0000
+++ checkbox/lib/process.py 2012-06-23 00:59:17 +0000
@@ -16,7 +16,7 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19from __future__ import absolute_import19
2020
21import os21import os
22import time22import time
@@ -56,7 +56,7 @@
56 # that it would block waiting for a full BUFSIZ unless we explicitly56 # that it would block waiting for a full BUFSIZ unless we explicitly
57 # set the files non blocking, and there would be extra uneeded57 # set the files non blocking, and there would be extra uneeded
58 # overhead like EOL conversion. So I think it's handier to use os.read()58 # overhead like EOL conversion. So I think it's handier to use os.read()
59 self.outdata = self.errdata = ""59 self.outdata = self.errdata = b""
60 self.starttime = self.endtime = None60 self.starttime = self.endtime = None
61 self._outeof = self._erreof = False61 self._outeof = self._erreof = False
6262
@@ -77,7 +77,8 @@
77 os.dup2(self.outw, STDOUT_FILENO)77 os.dup2(self.outw, STDOUT_FILENO)
78 os.dup2(self.errw, STDERR_FILENO)78 os.dup2(self.errw, STDERR_FILENO)
79 # stdout and stderr connected to pipe, so close all other files79 # stdout and stderr connected to pipe, so close all other files
80 map(os.close, [self.outr, self.outw, self.errr, self.errw])80 for fileno in self.outr, self.outw, self.errr, self.errw:
81 os.close(fileno)
81 try:82 try:
82 cmd = ["/bin/bash", "-c", cmd]83 cmd = ["/bin/bash", "-c", cmd]
83 os.execve(cmd[0], cmd, env)84 os.execve(cmd[0], cmd, env)
@@ -103,12 +104,12 @@
103 else:104 else:
104 if self.outr in ready[0]:105 if self.outr in ready[0]:
105 outchunk = os.read(self.outr, self.BUFSIZ)106 outchunk = os.read(self.outr, self.BUFSIZ)
106 if outchunk == "":107 if outchunk == b"":
107 self._outeof = True108 self._outeof = True
108 self.outdata += outchunk109 self.outdata += outchunk
109 if self.errr in ready[0]:110 if self.errr in ready[0]:
110 errchunk = os.read(self.errr, self.BUFSIZ)111 errchunk = os.read(self.errr, self.BUFSIZ)
111 if errchunk == "":112 if errchunk == b"":
112 self._erreof = True113 self._erreof = True
113 self.errdata += errchunk114 self.errdata += errchunk
114 if self._outeof and self._erreof:115 if self._outeof and self._erreof:
115116
=== modified file 'checkbox/lib/redirect.py'
--- checkbox/lib/redirect.py 2010-03-09 16:58:36 +0000
+++ checkbox/lib/redirect.py 2012-06-23 00:59:17 +0000
@@ -52,28 +52,28 @@
52 file = _file_write(file)52 file = _file_write(file)
53 sys.stdout, file = file, sys.stdout53 sys.stdout, file = file, sys.stdout
54 try:54 try:
55 ret = apply(func, args)55 ret = func(*args)
56 finally:56 finally:
57 print ret57 print(ret)
58 sys.stdout, file = file, sys.stdout58 sys.stdout, file = file, sys.stdout
59 return ret59 return ret
6060
61def redirect_to_string(func, *args):61def redirect_to_string(func, *args):
62 # apply func(*args) with stdout redirected to return string.62 # apply func(*args) with stdout redirected to return string.
63 file = tempfile.TemporaryFile()63 file = tempfile.TemporaryFile()
64 apply(redirect_to_file, (file, func) + args)64 redirect_to_file(*(file, func) + args)
65 file.seek(0)65 file.seek(0)
66 return file.read()66 return file.read()
6767
68def redirect_to_lines(func, *args):68def redirect_to_lines(func, *args):
69 # apply func(*args), returning a list of redirected stdout lines.69 # apply func(*args), returning a list of redirected stdout lines.
70 file = tempfile.TemporaryFile()70 file = tempfile.TemporaryFile()
71 apply(redirect_to_file, (file, func) + args)71 redirect_to_file(*(file, func) + args)
72 file.seek(0)72 file.seek(0)
73 return file.readlines()73 return file.readlines()
7474
7575
76class RedirectTee(object):76class RedirectTee:
7777
78 def __init__(self, *optargs):78 def __init__(self, *optargs):
79 self._files = []79 self._files = []
@@ -114,7 +114,7 @@
114 return 0114 return 0
115115
116116
117class RedirectEcho(object):117class RedirectEcho:
118118
119 def __init__(self, input, *output):119 def __init__(self, input, *output):
120 self._infile = _file_read(input)120 self._infile = _file_read(input)
@@ -124,7 +124,7 @@
124 self._output = None124 self._output = None
125125
126 def read(self, *howmuch):126 def read(self, *howmuch):
127 stuff = apply(self._infile.read, howmuch)127 stuff = self._infile.read(*howmuch)
128 if self._output:128 if self._output:
129 self._output.write(stuff)129 self._output.write(stuff)
130 return stuff130 return stuff
131131
=== modified file 'checkbox/lib/resolver.py'
--- checkbox/lib/resolver.py 2010-03-09 16:58:36 +0000
+++ checkbox/lib/resolver.py 2012-06-23 00:59:17 +0000
@@ -21,13 +21,10 @@
21 Main class. Instantiate with the root directory of your items.21 Main class. Instantiate with the root directory of your items.
22 """22 """
2323
24 def __init__(self, compare=None, key=None):24 def __init__(self, key=None):
25 if compare is None:
26 compare = lambda a, b: cmp(a, b)
27 if key is None:25 if key is None:
28 key = lambda k: k26 key = lambda k: k
2927
30 self.compare = compare
31 self.key = key28 self.key = key
3229
33 # detect repeated resolution attempts - these indicate some circular dependency30 # detect repeated resolution attempts - these indicate some circular dependency
@@ -43,7 +40,7 @@
43 def add(self, item, *dependencies):40 def add(self, item, *dependencies):
44 key = self.key(item)41 key = self.key(item)
45 if key in self.items:42 if key in self.items:
46 raise Exception, "%s: key already exists" % key43 raise Exception("%s: key already exists" % key)
47 self.items[key] = item44 self.items[key] = item
4845
49 dependency_keys = [self.key(d) for d in dependencies]46 dependency_keys = [self.key(d) for d in dependencies]
@@ -69,7 +66,7 @@
69 msg = "no dependencies found for %s" % key66 msg = "no dependencies found for %s" % key
70 if found:67 if found:
71 msg += " while resolving %s" % found68 msg += " while resolving %s" % found
72 raise Exception, msg69 raise Exception(msg)
7370
74 dependencies = self.dependencies.get(key, set())71 dependencies = self.dependencies.get(key, set())
75 resolved = set()72 resolved = set()
@@ -81,7 +78,7 @@
81 scapegoat = found78 scapegoat = found
82 else:79 else:
83 scapegoat = dependency80 scapegoat = dependency
84 raise Exception, "circular dependency involving %s and %s" % (key, scapegoat)81 raise Exception("circular dependency involving %s and %s" % (key, scapegoat))
85 # add resolution82 # add resolution
86 self.reentrant_resolution.add(resolution_step)83 self.reentrant_resolution.add(resolution_step)
87 # and its dependencies, if any84 # and its dependencies, if any
@@ -104,18 +101,14 @@
104 if item:101 if item:
105 # Immediate dependents102 # Immediate dependents
106 key = self.key(item)103 key = self.key(item)
107 all_dependents = filter(104 all_dependents = [x for x in iter(self.items.values()) if key in self.resolve(x)[:-1]]
108 lambda x: key in self.resolve(x)[:-1],105 dependents = [x for x in all_dependents if self.key(self.get_dependencies(x)[-2]) == key]
109 self.items.itervalues())
110 dependents = filter(
111 lambda x: self.key(self.get_dependencies(x)[-2]) == key,
112 all_dependents)
113 else:106 else:
114 # First level of dependents107 # First level of dependents
115 dependents = filter(lambda x: len(self.resolve(x)) == 1, self.items.itervalues())108 dependents = [x for x in iter(self.items.values()) if len(self.resolve(x)) == 1]
116109
117 index = 0110 index = 0
118 dependents = sorted(dependents, self.compare)111 dependents = sorted(dependents)
119 while index < len(dependents):112 while index < len(dependents):
120 sub_dependents = self.get_dependents(dependents[index])113 sub_dependents = self.get_dependents(dependents[index])
121 if sub_dependents:114 if sub_dependents:
122115
=== modified file 'checkbox/lib/safe.py'
--- checkbox/lib/safe.py 2012-02-23 11:56:50 +0000
+++ checkbox/lib/safe.py 2012-06-23 00:59:17 +0000
@@ -17,72 +17,70 @@
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19import os19import os
20import posixpath20import hashlib
21import shutil21import shutil
2222
23from stat import ST_MODE, S_IMODE, S_ISFIFO23from stat import ST_MODE, S_IMODE, S_ISFIFO
2424
2525
26def safe_change_mode(path, mode):26def safe_change_mode(path, mode):
27 if not posixpath.exists(path):27 if not os.path.exists(path):
28 raise Exception, "Path does not exist: %s" % path28 raise Exception("Path does not exist: %s" % path)
2929
30 old_mode = os.stat(path)[ST_MODE]30 old_mode = os.stat(path)[ST_MODE]
31 if mode != S_IMODE(old_mode):31 if mode != S_IMODE(old_mode):
32 os.chmod(path, mode)32 os.chmod(path, mode)
3333
34def safe_make_directory(path, mode=0755):34def safe_make_directory(path, mode=0o755):
35 if posixpath.exists(path):35 if os.path.exists(path):
36 if not posixpath.isdir(path):36 if not os.path.isdir(path):
37 raise Exception, "Path is not a directory: %s" % path37 raise Exception("Path is not a directory: %s" % path)
38 else:38 else:
39 os.makedirs(path, mode)39 os.makedirs(path, mode)
4040
41def safe_make_fifo(path, mode=0666):41def safe_make_fifo(path, mode=0o666):
42 if posixpath.exists(path):42 if os.path.exists(path):
43 mode = os.stat(path)[ST_MODE]43 mode = os.stat(path)[ST_MODE]
44 if not S_ISFIFO(mode):44 if not S_ISFIFO(mode):
45 raise Exception, "Path is not a FIFO: %s" % path45 raise Exception("Path is not a FIFO: %s" % path)
46 else:46 else:
47 os.mkfifo(path, mode)47 os.mkfifo(path, mode)
4848
49def safe_remove_directory(path):49def safe_remove_directory(path):
50 if posixpath.exists(path):50 if os.path.exists(path):
51 if not posixpath.isdir(path):51 if not os.path.isdir(path):
52 raise Exception, "Path is not a directory: %s" % path52 raise Exception("Path is not a directory: %s" % path)
5353
54 shutil.rmtree(path)54 shutil.rmtree(path)
5555
56def safe_remove_file(path):56def safe_remove_file(path):
57 if posixpath.exists(path):57 if os.path.exists(path):
58 if not posixpath.isfile(path):58 if not os.path.isfile(path):
59 raise Exception, "Path is not a file: %s" % path59 raise Exception("Path is not a file: %s" % path)
6060
61 os.remove(path)61 os.remove(path)
6262
63def safe_rename(old, new):63def safe_rename(old, new):
64 if old != new:64 if old != new:
65 if not posixpath.exists(old):65 if not os.path.exists(old):
66 raise Exception, "Old path does not exist: %s" % old66 raise Exception("Old path does not exist: %s" % old)
67 if posixpath.exists(new):67 if os.path.exists(new):
68 raise Exception, "New path exists already: %s" % new68 raise Exception("New path exists already: %s" % new)
6969
70 os.rename(old, new)70 os.rename(old, new)
7171
72def safe_md5sum():72class safe_md5sum:
73 try:73
74 import hashlib74 def __init__(self):
75 digest = hashlib.md5()75 self.digest = hashlib.md5()
76 except ImportError:76 self.hexdigest = self.digest.hexdigest
77 # for Python << 2.577
78 import md578 def update(self, string):
79 digest = md5.new()79 self.digest.update(string.encode("utf-8"))
80
81 return digest
8280
83def safe_md5sum_file(name):81def safe_md5sum_file(name):
84 md5sum = None82 md5sum = None
85 if posixpath.exists(name):83 if os.path.exists(name):
86 file = open(name)84 file = open(name)
87 digest = safe_md5sum()85 digest = safe_md5sum()
88 while 1:86 while 1:
8987
=== modified file 'checkbox/lib/script.py'
--- checkbox/lib/script.py 2009-01-20 18:55:20 +0000
+++ checkbox/lib/script.py 2012-06-23 00:59:17 +0000
@@ -26,8 +26,8 @@
26 if not posixpath.exists(path):26 if not posixpath.exists(path):
27 path = get_path(script)27 path = get_path(script)
28 if not path:28 if not path:
29 raise Exception, "Script not found in PATH: %s" % script29 raise Exception("Script not found in PATH: %s" % script)
3030
31 globals = {}31 globals = {}
32 execfile(path, globals)32 exec(compile(open(path).read(), path, 'exec'), globals)
33 return globals33 return globals
3434
=== modified file 'checkbox/lib/selector.py'
--- checkbox/lib/selector.py 2011-06-13 14:22:39 +0000
+++ checkbox/lib/selector.py 2012-06-23 00:59:17 +0000
@@ -39,7 +39,7 @@
39 "FAILED")39 "FAILED")
4040
4141
42class Selector(object):42class Selector:
43 __slots__ = ("_read_fds", "_write_fds", "_except_fds",43 __slots__ = ("_read_fds", "_write_fds", "_except_fds",
44 "_save_read_fds", "_save_write_fds", "_save_except_fds",44 "_save_read_fds", "_save_write_fds", "_save_except_fds",
45 "_fd_set_size", "_timeout", "_state", "_errno")45 "_fd_set_size", "_timeout", "_state", "_errno")
@@ -166,7 +166,7 @@
166 self._read_fds, self._write_fds, self._except_fds = select.select(166 self._read_fds, self._write_fds, self._except_fds = select.select(
167 self._save_read_fds, self._save_write_fds,167 self._save_read_fds, self._save_write_fds,
168 self._save_except_fds, self._timeout)168 self._save_except_fds, self._timeout)
169 except select.error, e:169 except select.error as e:
170 self._errno = e.errno170 self._errno = e.errno
171 if e.errno == errno.EINTR:171 if e.errno == errno.EINTR:
172 self._state = SelectorState.SIGNALED172 self._state = SelectorState.SIGNALED
173173
=== modified file 'checkbox/lib/signal.py'
--- checkbox/lib/signal.py 2009-03-31 13:54:12 +0000
+++ checkbox/lib/signal.py 2012-06-23 00:59:17 +0000
@@ -72,7 +72,7 @@
72 signal -- number of the signal as returned by wait72 signal -- number of the signal as returned by wait
73 """73 """
7474
75 if signal_name_table.has_key(signal):75 if signal in signal_name_table:
76 return signal_name_table[signal]76 return signal_name_table[signal]
77 return _("UNKNOWN")77 return _("UNKNOWN")
7878
@@ -84,6 +84,6 @@
84 """84 """
8585
86 name = signal_to_name(signal)86 name = signal_to_name(signal)
87 if signal_description_table.has_key(name):87 if name in signal_description_table:
88 return signal_description_table[name]88 return signal_description_table[name]
89 return _("Unknown signal")89 return _("Unknown signal")
9090
=== modified file 'checkbox/lib/template.py'
--- checkbox/lib/template.py 2011-11-18 12:46:21 +0000
+++ checkbox/lib/template.py 2012-06-23 00:59:17 +0000
@@ -23,7 +23,7 @@
23EXTENDED_STRING = "_extended"23EXTENDED_STRING = "_extended"
2424
2525
26class Template(object):26class Template:
2727
28 def _reader(self, file, size=4096, delimiter=r"\n{2,}"):28 def _reader(self, file, size=4096, delimiter=r"\n{2,}"):
29 buffer_old = ""29 buffer_old = ""
@@ -42,7 +42,7 @@
4242
43 def dump_file(self, elements, file, filename="<stream>"):43 def dump_file(self, elements, file, filename="<stream>"):
44 for element in elements:44 for element in elements:
45 for long_key in element.keys():45 for long_key in list(element.keys()):
46 if long_key.endswith(EXTENDED_STRING):46 if long_key.endswith(EXTENDED_STRING):
47 short_key = long_key.replace(EXTENDED_STRING, "")47 short_key = long_key.replace(EXTENDED_STRING, "")
48 del element[short_key]48 del element[short_key]
@@ -79,11 +79,10 @@
79 def _save(field, value, extended):79 def _save(field, value, extended):
80 extended = extended.rstrip("\n")80 extended = extended.rstrip("\n")
81 if field:81 if field:
82 if element.has_key(field):82 if field in element:
83 raise Exception, \83 raise Exception("Template %s has a duplicate field '%s'" \
84 "Template %s has a duplicate field '%s'" \
85 " with a new value '%s'." \84 " with a new value '%s'." \
86 % (filename, field, value)85 % (filename, field, value))
87 element[field] = value86 element[field] = value
88 if extended:87 if extended:
89 element["%s%s" % (field, EXTENDED_STRING)] = extended88 element["%s%s" % (field, EXTENDED_STRING)] = extended
@@ -128,8 +127,8 @@
128 extended += bit127 extended += bit
129 continue128 continue
130129
131 raise Exception, "Template %s parse error at: %s" \130 raise Exception("Template %s parse error at: %s" \
132 % (filename, line)131 % (filename, line))
133132
134 _save(field, value, extended)133 _save(field, value, extended)
135134
@@ -140,5 +139,5 @@
140 def load_filename(self, filename):139 def load_filename(self, filename):
141 logging.info("Loading elements from filename: %s", filename)140 logging.info("Loading elements from filename: %s", filename)
142141
143 file = open(filename, "r")142 file = open(filename, "r", encoding="utf-8")
144 return self.load_file(file, filename)143 return self.load_file(file, filename)
145144
=== modified file 'checkbox/lib/template_i18n.py'
--- checkbox/lib/template_i18n.py 2012-02-10 11:19:05 +0000
+++ checkbox/lib/template_i18n.py 2012-06-23 00:59:17 +0000
@@ -53,7 +53,7 @@
5353
54 language_match = re.match(r"([^_@.]+)(_[^_@.]+)?(\..+)?", language)54 language_match = re.match(r"([^_@.]+)(_[^_@.]+)?(\..+)?", language)
55 if not language_match:55 if not language_match:
56 raise Exception, "Unknown language format: %s" % language56 raise Exception("Unknown language format: %s" % language)
5757
58 ret = [language_match.group(1)]58 ret = [language_match.group(1)]
59 if modifier_match:59 if modifier_match:
@@ -75,7 +75,7 @@
7575
76 def _get_languages(self):76 def _get_languages(self):
77 languages = []77 languages = []
78 if environ.has_key("LANGUAGE") and environ["LANGUAGE"]:78 if "LANGUAGE" in environ and environ["LANGUAGE"]:
79 for language in environ["LANGUAGE"].split(":"):79 for language in environ["LANGUAGE"].split(":"):
80 if language:80 if language:
81 languages.extend(self._get_language_list(language))81 languages.extend(self._get_language_list(language))
@@ -96,11 +96,11 @@
96 def _filter_languages(self, element):96 def _filter_languages(self, element):
97 filter = {}97 filter = {}
98 basekeys = {}98 basekeys = {}
99 for key in element.iterkeys():99 for key in element.keys():
100 basekey = re.sub(r"^_?([^-]+).*$", "\\1", key)100 basekey = re.sub(r"^_?([^-]+).*$", "\\1", key)
101 basekeys[basekey] = None101 basekeys[basekey] = None
102102
103 for key in basekeys.iterkeys():103 for key in basekeys.keys():
104 if self._languages:104 if self._languages:
105 for language in self._languages:105 for language in self._languages:
106 field = "%s-%s" % (key, language)106 field = "%s-%s" % (key, language)
@@ -124,7 +124,7 @@
124 filter[key] = self._filter_field(element[field])124 filter[key] = self._filter_field(element[field])
125 continue125 continue
126126
127 raise Exception, "No language found for key: %s" % key127 raise Exception("No language found for key: %s" % key)
128128
129 return filter129 return filter
130130
131131
=== modified file 'checkbox/lib/tests/resolver.py'
--- checkbox/lib/tests/resolver.py 2009-08-19 15:36:05 +0000
+++ checkbox/lib/tests/resolver.py 2012-06-23 00:59:17 +0000
@@ -26,7 +26,7 @@
26 resolver = Resolver()26 resolver = Resolver()
27 try:27 try:
28 resolver.get_dependencies('a')28 resolver.get_dependencies('a')
29 except Exception, error:29 except Exception as error:
30 self.assertTrue(error.args[0].startswith('no dependencies'))30 self.assertTrue(error.args[0].startswith('no dependencies'))
31 else:31 else:
32 self.fail('non existing element accepted by resolver')32 self.fail('non existing element accepted by resolver')
@@ -67,7 +67,7 @@
67 resolver.add('b', 'a')67 resolver.add('b', 'a')
68 try:68 try:
69 resolver.get_dependencies('a')69 resolver.get_dependencies('a')
70 except Exception, error:70 except Exception as error:
71 self.assertTrue(error.args[0].startswith('circular dependency'))71 self.assertTrue(error.args[0].startswith('circular dependency'))
72 else:72 else:
73 self.fail('circular dependency not detected')73 self.fail('circular dependency not detected')
7474
=== modified file 'checkbox/lib/transport.py'
--- checkbox/lib/transport.py 2011-09-29 13:12:01 +0000
+++ checkbox/lib/transport.py 2012-06-23 00:59:17 +0000
@@ -22,101 +22,67 @@
22import re22import re
23import stat23import stat
24import sys24import sys
25import posixpath
2625
27import mimetools26import email.generator
27import http.client
28import mimetypes28import mimetypes
29import socket29import socket
30import httplib30import ssl
31import urllib31import urllib.request, urllib.parse, urllib.error
3232
3333
34# Build the appropriate socket wrapper for ssl34class ProxyHTTPConnection(http.client.HTTPConnection):
35try:35
36 # Python 2.6 introduced a better ssl package36 _ports = {"http": http.client.HTTP_PORT, "https": http.client.HTTPS_PORT}
37 import ssl
38 _ssl_wrap_socket = ssl.wrap_socket
39except ImportError:
40 # Python versions prior to 2.6 don't have ssl and ssl.wrap_socket instead
41 # they use httplib.FakeSocket
42 def _ssl_wrap_socket(sock, key_file, cert_file):
43 ssl_sock = socket.ssl(sock, key_file, cert_file)
44 return httplib.FakeSocket(sock, ssl_sock)
45
46try:
47 # Python 2.6 introduced create_connection convenience function
48 create_connection = socket.create_connection
49except AttributeError:
50 def create_connection(address, timeout=None):
51 msg = "getaddrinfo returns an empty list"
52 host, port = address
53 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
54 af, socktype, proto, canonname, sa = res
55 sock = None
56 try:
57 sock = socket.socket(af, socktype, proto)
58 if timeout is not None:
59 sock.settimeout(timeout)
60 sock.connect(sa)
61 return sock
62
63 except socket.error, msg:
64 if sock is not None:
65 sock.close()
66
67 raise socket.error, msg
68
69
70class ProxyHTTPConnection(httplib.HTTPConnection):
71
72 _ports = {"http" : httplib.HTTP_PORT, "https" : httplib.HTTPS_PORT}
7337
74 def request(self, method, url, body=None, headers={}):38 def request(self, method, url, body=None, headers={}):
75 #request is called before connect, so can interpret url and get39 #request is called before connect, so can interpret url and get
76 #real host/port to be used to make CONNECT request to proxy40 #real host/port to be used to make CONNECT request to proxy
77 scheme, rest = urllib.splittype(url)41 scheme, rest = urllib.parse.splittype(url)
78 if scheme is None:42 if scheme is None:
79 raise ValueError, "unknown URL type: %s" % url43 raise ValueError("unknown URL type: %s" % url)
80 #get host44 #get host
81 host, rest = urllib.splithost(rest)45 host, rest = urllib.parse.splithost(rest)
82 #try to get port46 #try to get port
83 host, port = urllib.splitport(host)47 host, port = urllib.parse.splitport(host)
84 #if port is not defined try to get from scheme48 #if port is not defined try to get from scheme
85 if port is None:49 if port is None:
86 try:50 try:
87 port = self._ports[scheme]51 port = self._ports[scheme]
88 except KeyError:52 except KeyError:
89 raise ValueError, "unknown protocol for: %s" % url53 raise ValueError("unknown protocol for: %s" % url)
90 else:54 else:
91 port = int(port)55 port = int(port)
9256
93 self._real_host = host57 self._real_host = host
94 self._real_port = port58 self._real_port = port
95 httplib.HTTPConnection.request(self, method, url, body, headers)59 http.client.HTTPConnection.request(self, method, url, body, headers)
9660
97 def connect(self):61 def connect(self):
98 httplib.HTTPConnection.connect(self)62 http.client.HTTPConnection.connect(self)
99 #send proxy CONNECT request63 #send proxy CONNECT request
100 self.send("CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self._real_host, self._real_port))64 self.send((
65 "CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self._real_host, self._real_port)
66 ).encode("ascii"))
101 #expect a HTTP/1.0 200 Connection established67 #expect a HTTP/1.0 200 Connection established
102 response = self.response_class(self.sock, strict=self.strict, method=self._method)68 response = self.response_class(self.sock, method=self._method)
103 (version, code, message) = response._read_status()69 (version, code, message) = response._read_status()
104 #probably here we can handle auth requests...70 #probably here we can handle auth requests...
105 if code != 200:71 if code != 200:
106 #proxy returned and error, abort connection, and raise exception72 #proxy returned and error, abort connection, and raise exception
107 self.close()73 self.close()
108 raise socket.error, "Proxy connection failed: %d %s" % (code, message.strip())74 raise socket.error("Proxy connection failed: %d %s" % (code, message.strip()))
109 #eat up header block from proxy....75 #eat up header block from proxy....
110 while True:76 while True:
111 #should not use directly fp probablu77 #should not use directly fp probably
112 line = response.fp.readline()78 line = response.fp.readline()
113 if line == "\r\n":79 if line == b"\r\n":
114 break80 break
11581
11682
117class ProxyHTTPSConnection(ProxyHTTPConnection):83class ProxyHTTPSConnection(ProxyHTTPConnection):
11884
119 default_port = httplib.HTTPS_PORT85 default_port = http.client.HTTPS_PORT
12086
121 def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None):87 def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None):
122 ProxyHTTPConnection.__init__(self, host, port)88 ProxyHTTPConnection.__init__(self, host, port)
@@ -125,10 +91,10 @@
12591
126 def connect(self):92 def connect(self):
127 ProxyHTTPConnection.connect(self)93 ProxyHTTPConnection.connect(self)
128 self.sock = _ssl_wrap_socket(self.sock, self.key_file, self.cert_file)94 self.sock = ssl.wrap_socket(self.sock, self.key_file, self.cert_file)
12995
13096
131class VerifiedHTTPSConnection(httplib.HTTPSConnection):97class VerifiedHTTPSConnection(http.client.HTTPSConnection):
13298
133 # Compatibility layer with Python 2.599 # Compatibility layer with Python 2.5
134 timeout = None100 timeout = None
@@ -163,14 +129,14 @@
163 def connect(self):129 def connect(self):
164 # overrides the version in httplib so that we do130 # overrides the version in httplib so that we do
165 # certificate verification131 # certificate verification
166 sock = create_connection((self.host, self.port), self.timeout)132 sock = socket.create_connection((self.host, self.port), self.timeout)
167 if self._tunnel_host:133 if self._tunnel_host:
168 self.sock = sock134 self.sock = sock
169 self._tunnel()135 self._tunnel()
170136
171 # wrap the socket using verification with the root137 # wrap the socket using verification with the root
172 # certs in trusted_root_certs138 # certs in trusted_root_certs
173 self.sock = _ssl_wrap_socket(sock,139 self.sock = ssl.wrap_socket(sock,
174 self.key_file,140 self.key_file,
175 self.cert_file,141 self.cert_file,
176 cert_reqs=ssl.CERT_REQUIRED,142 cert_reqs=ssl.CERT_REQUIRED,
@@ -181,20 +147,20 @@
181 "Failed to verify cert for hostname: %s" % self.host)147 "Failed to verify cert for hostname: %s" % self.host)
182148
183149
184class HTTPTransport(object):150class HTTPTransport:
185 """Transport makes a request to exchange message data over HTTP."""151 """Transport makes a request to exchange message data over HTTP."""
186152
187 def __init__(self, url):153 def __init__(self, url):
188 self.url = url154 self.url = url
189155
190 proxies = urllib.getproxies()156 proxies = urllib.request.getproxies()
191 self.http_proxy = proxies.get("http")157 self.http_proxy = proxies.get("http")
192 self.https_proxy = proxies.get("https")158 self.https_proxy = proxies.get("https")
193159
194 def _unpack_host_and_port(self, string):160 def _unpack_host_and_port(self, string):
195 scheme, rest = urllib.splittype(string)161 scheme, rest = urllib.parse.splittype(string)
196 host, rest = urllib.splithost(rest)162 host, rest = urllib.parse.splithost(rest)
197 host, port = urllib.splitport(host)163 host, port = urllib.parse.splitport(host)
198 if port is not None:164 if port is not None:
199 port = int(port)165 port = int(port)
200166
@@ -204,14 +170,14 @@
204 if timeout:170 if timeout:
205 socket.setdefaulttimeout(timeout)171 socket.setdefaulttimeout(timeout)
206172
207 scheme, rest = urllib.splittype(self.url)173 scheme, rest = urllib.parse.splittype(self.url)
208 if scheme == "http":174 if scheme == "http":
209 if self.http_proxy:175 if self.http_proxy:
210 host, port = self._unpack_host_and_port(self.http_proxy)176 host, port = self._unpack_host_and_port(self.http_proxy)
211 else:177 else:
212 host, port = self._unpack_host_and_port(self.url)178 host, port = self._unpack_host_and_port(self.url)
213179
214 connection = httplib.HTTPConnection(host, port)180 connection = http.client.HTTPConnection(host, port)
215 elif scheme == "https":181 elif scheme == "https":
216 if self.https_proxy:182 if self.https_proxy:
217 host, port = self._unpack_host_and_port(self.https_proxy)183 host, port = self._unpack_host_and_port(self.https_proxy)
@@ -220,18 +186,18 @@
220 host, port = self._unpack_host_and_port(self.url)186 host, port = self._unpack_host_and_port(self.url)
221 connection = VerifiedHTTPSConnection(host, port)187 connection = VerifiedHTTPSConnection(host, port)
222 else:188 else:
223 raise Exception, "Unknown URL scheme: %s" % scheme189 raise Exception("Unknown URL scheme: %s" % scheme)
224190
225 return connection191 return connection
226192
227 def _encode_multipart_formdata(self, fields=[], files=[]):193 def _encode_multipart_formdata(self, fields=[], files=[]):
228 boundary = mimetools.choose_boundary()194 boundary = email.generator._make_boundary().encode("ascii")
229195
230 lines = []196 lines = []
231 for (key, value) in fields:197 for (key, value) in fields:
232 lines.append("--" + boundary)198 lines.append(b"--" + boundary)
233 lines.append("Content-Disposition: form-data; name=\"%s\"" % key)199 lines.append(b"Content-Disposition: form-data; name=\"" + key + b"\"")
234 lines.append("")200 lines.append(b"")
235 lines.append(value)201 lines.append(value)
236202
237 for (key, file) in files:203 for (key, file) in files:
@@ -240,27 +206,30 @@
240 else:206 else:
241 length = os.fstat(file.fileno())[stat.ST_SIZE]207 length = os.fstat(file.fileno())[stat.ST_SIZE]
242208
243 filename = posixpath.basename(file.name)209 content_type = mimetypes.guess_type(file.name)[0]
244 if isinstance(filename, unicode):210 if content_type:
245 filename = filename.encode("UTF-8")211 content_type = content_type.encode("ascii")
246212 else:
247 lines.append("--" + boundary)213 content_type = b"application/octet-stream"
248 lines.append("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\""214
249 % (key, filename))215 filename = os.path.basename(file.name)
250 lines.append("Content-Type: %s"216 filename = filename.encode("utf-8")
251 % mimetypes.guess_type(filename)[0] or "application/octet-stream")217
252 lines.append("Content-Length: %s" % length)218 lines.append(b"--" + boundary)
253 lines.append("")219 lines.append(b"Content-Disposition: form-data; name=\"" + key + b"\"; filename=\"" + filename + b"\"")
220 lines.append(b"Content-Type: " + content_type)
221 lines.append(b"Content-Length: " + str(length).encode("ascii"))
222 lines.append(b"")
254223
255 if hasattr(file, "seek"):224 if hasattr(file, "seek"):
256 file.seek(0)225 file.seek(0)
257 lines.append(file.read())226 lines.append(file.read())
258227
259 lines.append("--" + boundary + "--")228 lines.append(b"--" + boundary + b"--")
260 lines.append("")229 lines.append(b"")
261230
262 content_type = "multipart/form-data; boundary=%s" % boundary231 content_type = b"multipart/form-data; boundary=" + boundary
263 body = "\r\n".join(lines)232 body = b"\r\n".join(lines)
264233
265 return content_type, body234 return content_type, body
266235
@@ -268,33 +237,34 @@
268 fields = []237 fields = []
269 files = []238 files = []
270239
271 content_type = "application/octet-stream"240 content_type = b"application/octet-stream"
272 if body is not None and type(body) != str:241 if body is not None and type(body) != bytes:
273 if hasattr(body, "items"):242 if hasattr(body, "items"):
274 body = body.items()243 body = list(body.items())
275 else:244 else:
276 try:245 try:
277 if len(body) and not isinstance(body[0], tuple):246 if len(body) and not isinstance(body[0], tuple):
278 raise TypeError247 raise TypeError
279 except TypeError:248 except TypeError:
280 ty, va, tb = sys.exc_info()249 ty, va, tb = sys.exc_info()
281 raise TypeError, \250 raise TypeError("Invalid non-string sequence or mapping").with_traceback(tb)
282 "Invalid non-string sequence or mapping", tb
283251
284 for key, value in body:252 for key, value in body:
253 key = key.encode("ascii")
285 if hasattr(value, "read"):254 if hasattr(value, "read"):
286 files.append((key, value))255 files.append((key, value))
287 else:256 else:
257 value = value.encode("utf-8")
288 fields.append((key, value))258 fields.append((key, value))
289259
290 if files:260 if files:
291 content_type, body = self._encode_multipart_formdata(fields,261 content_type, body = self._encode_multipart_formdata(
292 files)262 fields, files)
293 elif fields:263 elif fields:
294 content_type = "application/x-www-form-urlencoded"264 content_type = b"application/x-www-form-urlencoded"
295 body = urllib.urlencode(fields)265 body = urllib.parse.urlencode(fields).encode("utf-8")
296 else:266 else:
297 body = ""267 body = b""
298268
299 return content_type, body269 return content_type, body
300270
@@ -325,10 +295,10 @@
325 else:295 else:
326 try:296 try:
327 response = connection.getresponse()297 response = connection.getresponse()
328 except httplib.BadStatusLine:298 except http.client.BadStatusLine:
329 logging.warning("Service unavailable on %s", self.url)299 logging.warning("Service unavailable on %s", self.url)
330 else:300 else:
331 if response.status == httplib.FOUND:301 if response.status == http.client.FOUND:
332 # TODO prevent infinite redirect loop302 # TODO prevent infinite redirect loop
333 self.url = response.getheader('location')303 self.url = response.getheader('location')
334 response = self.exchange(body, headers, timeout)304 response = self.exchange(body, headers, timeout)
335305
=== added file 'checkbox/lib/tz.py'
--- checkbox/lib/tz.py 1970-01-01 00:00:00 +0000
+++ checkbox/lib/tz.py 2012-06-23 00:59:17 +0000
@@ -0,0 +1,55 @@
1#
2# This file is part of Checkbox.
3#
4# Copyright 2012 Canonical Ltd.
5#
6# Checkbox is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 3 of the License, or
9# (at your option) any later version.
10#
11# Checkbox is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#
19__all__ = [
20 "tzutc",
21 ]
22
23from datetime import (
24 timedelta,
25 tzinfo,
26 )
27
28
29ZERO = timedelta(0)
30
31
32class _tzutc(tzinfo):
33
34 def utcoffset(self, dt):
35 return ZERO
36
37 def dst(self, dt):
38 return ZERO
39
40 def tzname(self, dt):
41 return "UTC"
42
43 def __eq__(self, other):
44 return isinstance(other, tzutc)
45
46 def __ne__(self, other):
47 return not self.__eq__(other)
48
49 def __repr__(self):
50 return "%s()" % self.__class__.__name__
51
52 __reduce__ = object.__reduce__
53
54
55tzutc = _tzutc()
056
=== modified file 'checkbox/lib/update.py'
--- checkbox/lib/update.py 2009-01-20 18:55:20 +0000
+++ checkbox/lib/update.py 2012-06-23 00:59:17 +0000
@@ -17,7 +17,7 @@
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19def recursive_update(dst, src):19def recursive_update(dst, src):
20 irecursive_update(dst, list(src.iteritems()))20 irecursive_update(dst, list(src.items()))
21 return dst21 return dst
2222
23def irecursive_update(a, blist):23def irecursive_update(a, blist):
@@ -37,6 +37,6 @@
37 while not blist:37 while not blist:
38 blist, a = stack.pop() # current <- parent38 blist, a = stack.pop() # current <- parent
39 continue39 continue
40 blist, a = list(bv.iteritems()), a[bk]40 blist, a = list(bv.items()), a[bk]
41 except IndexError:41 except IndexError:
42 pass42 pass
4343
=== modified file 'checkbox/lib/url.py'
--- checkbox/lib/url.py 2009-08-19 15:36:05 +0000
+++ checkbox/lib/url.py 2012-06-23 00:59:17 +0000
@@ -16,11 +16,11 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19import urlparse19import urllib.parse
2020
2121
22def parse_url(url):22def parse_url(url):
23 scheme, host, path, params, query, fragment = urlparse.urlparse(url)23 scheme, host, path, params, query, fragment = urllib.parse.urlparse(url)
2424
25 if "@" in host:25 if "@" in host:
26 username, host = host.rsplit("@", 1)26 username, host = host.rsplit("@", 1)
2727
=== modified file 'checkbox/message.py'
--- checkbox/message.py 2012-02-23 11:56:50 +0000
+++ checkbox/message.py 2012-06-23 00:59:17 +0000
@@ -38,7 +38,7 @@
38 self.filename = filename38 self.filename = filename
3939
4040
41class MessageStore(object):41class MessageStore:
42 """A message store which stores its messages in a file system hierarchy."""42 """A message store which stores its messages in a file system hierarchy."""
4343
44 #This caches everything but a message's data, making it manageable to keep in memory.44 #This caches everything but a message's data, making it manageable to keep in memory.
@@ -108,7 +108,7 @@
108 break108 break
109 try:109 try:
110 message = self._read_message(filename)110 message = self._read_message(filename)
111 except ValueError, e:111 except ValueError as e:
112 logging.exception(e)112 logging.exception(e)
113 self._add_flags(filename, BROKEN)113 self._add_flags(filename, BROKEN)
114 else:114 else:
@@ -219,7 +219,7 @@
219 return posixpath.join(self._directory, *args)219 return posixpath.join(self._directory, *args)
220220
221 def _get_content(self, filename):221 def _get_content(self, filename):
222 file = open(filename)222 file = open(filename, "rb")
223 try:223 try:
224 return file.read()224 return file.read()
225 finally:225 finally:
@@ -263,7 +263,7 @@
263263
264 message_data = self._dump_message(message)264 message_data = self._dump_message(message)
265265
266 file = open(filename + ".tmp", "w")266 file = open(filename + ".tmp", "wb")
267 file.write(message_data)267 file.write(message_data)
268 safe_close(file, safe=self.safe_file_closing)268 safe_close(file, safe=self.safe_file_closing)
269269
270270
=== modified file 'checkbox/parsers/cpuinfo.py'
--- checkbox/parsers/cpuinfo.py 2011-11-18 12:46:21 +0000
+++ checkbox/parsers/cpuinfo.py 2012-06-23 00:59:17 +0000
@@ -130,9 +130,9 @@
130 processor["count"] = attributes.get("count", 1)130 processor["count"] = attributes.get("count", 1)
131 bogompips_string = attributes.get("bogomips", "0.0")131 bogompips_string = attributes.get("bogomips", "0.0")
132 processor["bogomips"] = int(round(float(bogompips_string)))132 processor["bogomips"] = int(round(float(bogompips_string)))
133 for platform, conversion in platform_to_conversion.iteritems():133 for platform, conversion in platform_to_conversion.items():
134 if machine in platform:134 if machine in platform:
135 for pkey, ckey in conversion.iteritems():135 for pkey, ckey in conversion.items():
136 if isinstance(ckey, (list, tuple)):136 if isinstance(ckey, (list, tuple)):
137 processor[pkey] = "/".join([attributes[k]137 processor[pkey] = "/".join([attributes[k]
138 for k in ckey])138 for k in ckey])
@@ -141,9 +141,9 @@
141141
142 # Adjust platform142 # Adjust platform
143 if machine[0] == "i" and machine[-2:] == "86":143 if machine[0] == "i" and machine[-2:] == "86":
144 processor["platform"] = u"i386"144 processor["platform"] = "i386"
145 elif machine[:5] == "alpha":145 elif machine[:5] == "alpha":
146 processor["platform"] = u"alpha"146 processor["platform"] = "alpha"
147147
148 # Adjust cache148 # Adjust cache
149 if processor["cache"]:149 if processor["cache"]:
150150
=== modified file 'checkbox/parsers/device.py'
--- checkbox/parsers/device.py 2011-06-13 14:22:39 +0000
+++ checkbox/parsers/device.py 2012-06-23 00:59:17 +0000
@@ -18,7 +18,7 @@
18#18#
1919
2020
21class DeviceResult(object):21class DeviceResult:
2222
23 def addDevice(self, device):23 def addDevice(self, device):
24 pass24 pass
2525
=== modified file 'checkbox/parsers/dmidecode.py'
--- checkbox/parsers/dmidecode.py 2011-11-18 12:46:21 +0000
+++ checkbox/parsers/dmidecode.py 2012-06-23 00:59:17 +0000
@@ -20,7 +20,7 @@
2020
21from string import (21from string import (
22 hexdigits,22 hexdigits,
23 uppercase,23 ascii_uppercase,
24 )24 )
2525
26from checkbox.lib.dmi import (26from checkbox.lib.dmi import (
@@ -36,7 +36,7 @@
36 % hexdigits)36 % hexdigits)
37KEY_VALUE_RE = re.compile(37KEY_VALUE_RE = re.compile(
38 r"^\t(?P<key>[%s].+):( (?P<value>.+))?$"38 r"^\t(?P<key>[%s].+):( (?P<value>.+))?$"
39 % uppercase)39 % ascii_uppercase)
4040
4141
42class DmidecodeParser:42class DmidecodeParser:
4343
=== modified file 'checkbox/parsers/submission.py'
--- checkbox/parsers/submission.py 2012-02-10 11:19:05 +0000
+++ checkbox/parsers/submission.py 2012-06-23 00:59:17 +0000
@@ -21,7 +21,7 @@
21except ImportError:21except ImportError:
22 import cElementTree as etree22 import cElementTree as etree
2323
24from StringIO import StringIO24from io import StringIO
25from logging import getLogger25from logging import getLogger
26from pkg_resources import resource_string26from pkg_resources import resource_string
2727
@@ -103,7 +103,7 @@
103 }103 }
104 parser = parsers.get(command)104 parser = parsers.get(command)
105 if parser:105 if parser:
106 if not isinstance(text, unicode):106 if not isinstance(text, str):
107 text = text.decode("utf-8")107 text = text.decode("utf-8")
108 stream = StringIO(text)108 stream = StringIO(text)
109 p = parser(stream)109 p = parser(stream)
@@ -291,7 +291,7 @@
291 "Unexpected boolean value '%s' in <%s>" % (value, node.tag)291 "Unexpected boolean value '%s' in <%s>" % (value, node.tag)
292 return value == "True"292 return value == "True"
293 elif type_ in ("str",):293 elif type_ in ("str",):
294 return unicode(node.text.strip())294 return str(node.text.strip())
295 elif type_ in ("int", "long",):295 elif type_ in ("int", "long",):
296 return int(node.text.strip())296 return int(node.text.strip())
297 elif type_ in ("float",):297 elif type_ in ("float",):
@@ -320,7 +320,7 @@
320320
321 def _getValueAsString(self, node):321 def _getValueAsString(self, node):
322 """Return the value of the attribute "value"."""322 """Return the value of the attribute "value"."""
323 return unicode(node.attrib["value"])323 return str(node.attrib["value"])
324324
325 def parseContext(self, result, node):325 def parseContext(self, result, node):
326 """Parse the <context> part of a submission."""326 """Parse the <context> part of a submission."""
@@ -354,7 +354,7 @@
354 parser(result, child)354 parser(result, child)
355 else:355 else:
356 text = child.text356 text = child.text
357 if not isinstance(text, unicode):357 if not isinstance(text, str):
358 text = text.decode("utf-8")358 text = text.decode("utf-8")
359 stream = StringIO(text)359 stream = StringIO(text)
360 p = parser(stream)360 p = parser(stream)
@@ -389,11 +389,11 @@
389389
390 # Convert lists to space separated strings.390 # Convert lists to space separated strings.
391 properties = self._getProperties(child)391 properties = self._getProperties(child)
392 for key, value in properties.iteritems():392 for key, value in properties.items():
393 if key in ("bogomips", "cache", "count", "speed",):393 if key in ("bogomips", "cache", "count", "speed",):
394 properties[key] = int(value)394 properties[key] = int(float(value))
395 elif isinstance(value, list):395 elif isinstance(value, list):
396 properties[key] = u" ".join(value)396 properties[key] = " ".join(value)
397 processors.append(properties)397 processors.append(properties)
398398
399 # Check if /proc/cpuinfo was parsed already.399 # Check if /proc/cpuinfo was parsed already.
@@ -403,15 +403,15 @@
403 lines = []403 lines = []
404 for processor in processors:404 for processor in processors:
405 # Convert some keys with underscores to spaces instead.405 # Convert some keys with underscores to spaces instead.
406 for key, value in processor.iteritems():406 for key, value in processor.items():
407 if "_" in key and key != "vendor_id":407 if "_" in key and key != "vendor_id":
408 key = key.replace("_", " ")408 key = key.replace("_", " ")
409409
410 lines.append(u"%s: %s" % (key, value))410 lines.append("%s: %s" % (key, value))
411411
412 lines.append(u"")412 lines.append("")
413413
414 stream = StringIO(u"\n".join(lines))414 stream = StringIO("\n".join(lines))
415 parser = result.parseCpuinfo(stream)415 parser = result.parseCpuinfo(stream)
416 parser.run(result)416 parser.run(result)
417417
418418
=== modified file 'checkbox/parsers/tests/cputable.py'
--- checkbox/parsers/tests/cputable.py 2012-02-15 00:11:21 +0000
+++ checkbox/parsers/tests/cputable.py 2012-06-23 00:59:17 +0000
@@ -16,7 +16,7 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19from StringIO import StringIO19from io import StringIO
2020
21from unittest import TestCase21from unittest import TestCase
2222
2323
=== modified file 'checkbox/parsers/tests/description.py'
--- checkbox/parsers/tests/description.py 2012-02-15 00:11:21 +0000
+++ checkbox/parsers/tests/description.py 2012-06-23 00:59:17 +0000
@@ -17,7 +17,7 @@
17# You should have received a copy of the GNU General Public License17# You should have received a copy of the GNU General Public License
18# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.18# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
19#19#
20from StringIO import StringIO20from io import StringIO
2121
22from unittest import TestCase22from unittest import TestCase
2323
@@ -115,7 +115,7 @@
115 self.assertResult(result)115 self.assertResult(result)
116116
117 def test_es(self):117 def test_es(self):
118 result = self.getResult(u"""118 result = self.getResult("""
119PROPÓSITO:119PROPÓSITO:
120 Esta prueba verifica los diferentes modos de vídeo detectados120 Esta prueba verifica los diferentes modos de vídeo detectados
121PASOS:121PASOS:
@@ -131,7 +131,7 @@
131 self.assertEquals(result.info, "$output\n")131 self.assertEquals(result.info, "$output\n")
132132
133 def test_ru(self):133 def test_ru(self):
134 result = self.getResult(u"""134 result = self.getResult("""
135ЦЕЛЬ:135ЦЕЛЬ:
136 Эта проверка позволит убедиться в работоспособности штекера наушников136 Эта проверка позволит убедиться в работоспособности штекера наушников
137ДЕЙСТВИЯ:137ДЕЙСТВИЯ:
138138
=== modified file 'checkbox/parsers/tests/dmidecode.py'
--- checkbox/parsers/tests/dmidecode.py 2012-02-15 00:11:21 +0000
+++ checkbox/parsers/tests/dmidecode.py 2012-06-23 00:59:17 +0000
@@ -16,7 +16,7 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19from cStringIO import StringIO19from io import StringIO
2020
21from unittest import TestCase21from unittest import TestCase
2222
2323
=== modified file 'checkbox/parsers/tests/udevadm.py'
--- checkbox/parsers/tests/udevadm.py 2012-02-15 00:11:21 +0000
+++ checkbox/parsers/tests/udevadm.py 2012-06-23 00:59:17 +0000
@@ -16,7 +16,7 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19from cStringIO import StringIO19from io import StringIO
2020
21from unittest import TestCase21from unittest import TestCase
2222
2323
=== modified file 'checkbox/parsers/udevadm.py'
--- checkbox/parsers/udevadm.py 2012-03-07 19:46:29 +0000
+++ checkbox/parsers/udevadm.py 2012-06-23 00:59:17 +0000
@@ -42,7 +42,7 @@
42 r"^acpi:"42 r"^acpi:"
43 r"(?P<vendor_name>[%(upper)s]{3})"43 r"(?P<vendor_name>[%(upper)s]{3})"
44 r"(?P<product_id>[%(hex)s]{4}):"44 r"(?P<product_id>[%(hex)s]{4}):"
45 % {"upper": string.uppercase, "hex": string.hexdigits})45 % {"upper": string.ascii_uppercase, "hex": string.hexdigits})
46USB_RE = re.compile(46USB_RE = re.compile(
47 r"^usb:"47 r"^usb:"
48 r"v(?P<vendor_id>[%(hex)s]{4})"48 r"v(?P<vendor_id>[%(hex)s]{4})"
@@ -349,7 +349,7 @@
349349
350 # floppy350 # floppy
351 if self.driver == "floppy":351 if self.driver == "floppy":
352 return u"Platform Device"352 return "Platform Device"
353353
354 return None354 return None
355355
@@ -467,6 +467,4 @@
467467
468468
469def decode_id(id):469def decode_id(id):
470 encoded_id = id.encode("utf-8")470 return id.strip()
471 decoded_id = encoded_id.decode("string-escape").decode("utf-8")
472 return decoded_id.strip()
473471
=== modified file 'checkbox/plugin.py'
--- checkbox/plugin.py 2010-03-09 16:58:36 +0000
+++ checkbox/plugin.py 2012-06-23 00:59:17 +0000
@@ -40,7 +40,7 @@
40 module.register(self)40 module.register(self)
4141
4242
43class Plugin(object):43class Plugin:
44 """44 """
45 Plugin base class which should be inherited by each plugin45 Plugin base class which should be inherited by each plugin
46 implementation. This class extends the component to automatically46 implementation. This class extends the component to automatically
4747
=== modified file 'checkbox/properties.py'
--- checkbox/properties.py 2011-03-17 11:15:12 +0000
+++ checkbox/properties.py 2012-06-23 00:59:17 +0000
@@ -17,13 +17,13 @@
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19from checkbox.attribute import Attribute19from checkbox.attribute import Attribute
20from checkbox.variables import (ConstantVariable, BoolVariable, StringVariable,20from checkbox.variables import (ConstantVariable, BoolVariable, BytesVariable,
21 PathVariable, UnicodeVariable, IntVariable, FloatVariable, TimeVariable,21 StringVariable, PathVariable, IntVariable, FloatVariable, TimeVariable,
22 ListVariable, TupleVariable, AnyVariable, DictVariable, MapVariable,22 ListVariable, TupleVariable, AnyVariable, DictVariable, MapVariable,
23 FileVariable, VariableFactory, Variable, get_variable)23 FileVariable, VariableFactory, Variable, get_variable)
2424
2525
26class Property(object):26class Property:
2727
28 def __init__(self, variable_class=Variable, variable_kwargs={}):28 def __init__(self, variable_class=Variable, variable_kwargs={}):
29 self._variable_class = variable_class29 self._variable_class = variable_class
@@ -47,7 +47,7 @@
47 def _detect_name(self, used_cls):47 def _detect_name(self, used_cls):
48 self_id = id(self)48 self_id = id(self)
49 for cls in used_cls.__mro__:49 for cls in used_cls.__mro__:
50 for attr, prop in cls.__dict__.iteritems():50 for attr, prop in cls.__dict__.items():
51 if id(prop) == self_id:51 if id(prop) == self_id:
52 return attr52 return attr
53 raise RuntimeError("Property used in an unknown class")53 raise RuntimeError("Property used in an unknown class")
@@ -116,6 +116,11 @@
116 variable_class = BoolVariable116 variable_class = BoolVariable
117117
118118
119class Bytes(PropertyType):
120
121 variable_class = BytesVariable
122
123
119class String(PropertyType):124class String(PropertyType):
120125
121 variable_class = StringVariable126 variable_class = StringVariable
@@ -126,11 +131,6 @@
126 variable_class = PathVariable131 variable_class = PathVariable
127132
128133
129class Unicode(PropertyType):
130
131 variable_class = UnicodeVariable
132
133
134class Int(PropertyType):134class Int(PropertyType):
135135
136 variable_class = IntVariable136 variable_class = IntVariable
@@ -188,7 +188,7 @@
188 variable_class = MapVariable188 variable_class = MapVariable
189189
190 def __init__(self, schema={}, **kwargs):190 def __init__(self, schema={}, **kwargs):
191 for key, type in schema.iteritems():191 for key, type in schema.items():
192 schema[key] = VariableFactory(type._variable_class,192 schema[key] = VariableFactory(type._variable_class,
193 **type._variable_kwargs)193 **type._variable_kwargs)
194194
195195
=== modified file 'checkbox/reactor.py'
--- checkbox/reactor.py 2011-02-14 18:19:27 +0000
+++ checkbox/reactor.py 2012-06-23 00:59:17 +0000
@@ -22,7 +22,7 @@
22from checkbox.lib.log import format_object22from checkbox.lib.log import format_object
2323
2424
25class EventID(object):25class EventID:
2626
27 def __init__(self, event_type, pair):27 def __init__(self, event_type, pair):
28 self._event_type = event_type28 self._event_type = event_type
@@ -39,7 +39,7 @@
39 pass39 pass
4040
4141
42class Reactor(object):42class Reactor:
4343
44 def __init__(self):44 def __init__(self):
45 self._event_handlers = {}45 self._event_handlers = {}
@@ -99,7 +99,7 @@
99 if type(id) is EventID:99 if type(id) is EventID:
100 self._event_handlers[id._event_type].remove(id._pair)100 self._event_handlers[id._event_type].remove(id._pair)
101 else:101 else:
102 raise Exception, "EventID instance expected, received %r" % id102 raise Exception("EventID instance expected, received %r" % id)
103103
104 def cancel_all_calls(self, event_type):104 def cancel_all_calls(self, event_type):
105 del self._event_handlers[event_type]105 del self._event_handlers[event_type]
106106
=== modified file 'checkbox/report.py'
--- checkbox/report.py 2011-09-14 21:16:02 +0000
+++ checkbox/report.py 2012-06-23 00:59:17 +0000
@@ -16,13 +16,13 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19import libxml2
20import posixpath19import posixpath
2120
21from lxml import etree
22from xml.dom.minidom import Document, Element, parseString22from xml.dom.minidom import Document, Element, parseString
2323
2424
25class ReportManager(object):25class ReportManager:
26 """The central point for dumping and loading information.26 """The central point for dumping and loading information.
2727
28 This keeps references to all reports which have been added to the28 This keeps references to all reports which have been added to the
@@ -43,7 +43,7 @@
43 Call back method for reports to register dump handlers.43 Call back method for reports to register dump handlers.
44 """44 """
45 if type in self.dumps_table:45 if type in self.dumps_table:
46 raise Exception, "Dumps type already handled: %s" % type46 raise Exception("Dumps type already handled: %s" % type)
47 self.dumps_table[type] = handler47 self.dumps_table[type] = handler
4848
49 def handle_loads(self, type, handler):49 def handle_loads(self, type, handler):
@@ -51,7 +51,7 @@
51 Call back method for reports to register load handlers.51 Call back method for reports to register load handlers.
52 """52 """
53 if type in self.loads_table:53 if type in self.loads_table:
54 raise Exception, "Loads type already handled: %s" % type54 raise Exception("Loads type already handled: %s" % type)
55 self.loads_table[type] = handler55 self.loads_table[type] = handler
5656
57 def call_dumps(self, obj, node):57 def call_dumps(self, obj, node):
@@ -66,7 +66,7 @@
66 Convenience method for reports to call the load handler66 Convenience method for reports to call the load handler
67 corresponding to the content of the given node.67 corresponding to the content of the given node.
68 """68 """
69 if self.loads_table.has_key(node.localName):69 if node.localName in self.loads_table:
70 ret = self.loads_table[node.localName](node)70 ret = self.loads_table[node.localName](node)
71 elif isinstance(node, Element) and node.hasAttribute("type"):71 elif isinstance(node, Element) and node.hasAttribute("type"):
72 type = node.getAttribute("type")72 type = node.getAttribute("type")
@@ -103,30 +103,30 @@
103103
104 try:104 try:
105 self.call_dumps(obj, node)105 self.call_dumps(obj, node)
106 except KeyError, e:106 except KeyError as e:
107 raise ValueError, "Unsupported type: %s" % e107 raise ValueError("Unsupported type: %s" % e)
108108
109 return document109 return document
110110
111 def loads(self, str):111 def loads(self, string):
112 """112 """
113 Load the given string which may be a container of any nodes113 Load the given string which may be a container of any nodes
114 supported by the reports added to the manager.114 supported by the reports added to the manager.
115 """115 """
116 document = parseString(str)116 document = parseString(string)
117 node = document.childNodes[0]117 node = document.childNodes[0]
118 assert(node.localName == self.name)118 assert(node.localName == self.name)
119119
120 try:120 try:
121 ret = self.call_loads(document)121 ret = self.call_loads(document)
122 except KeyError, e:122 except KeyError as e:
123 raise ValueError, "Unsupported type: %s" % e123 raise ValueError("Unsupported type: %s" % e)
124124
125 return ret125 return ret
126126
127 def validate(self, str):127 def validate(self, string):
128 """128 """
129 Validate the given string 129 Validate the given string
130 """130 """
131 if not self.schema:131 if not self.schema:
132 return False132 return False
@@ -137,21 +137,14 @@
137 finally:137 finally:
138 file.close()138 file.close()
139139
140 rngParser = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))140 relaxng_doc = etree.fromstring(schema)
141 rngSchema = rngParser.relaxNGParse()141 relaxng = etree.RelaxNG(relaxng_doc)
142 ctxt = rngSchema.relaxNGNewValidCtxt()142
143 doc = libxml2.parseDoc(str)143 doc = etree.fromstring(string)
144 is_valid = doc.relaxNGValidateDoc(ctxt)144 return relaxng.validate(doc)
145145
146 # Clean up146
147 doc.freeDoc()147class Report:
148 del rngParser, rngSchema, ctxt
149 libxml2.relaxNGCleanupTypes()
150 libxml2.cleanupParser()
151 return is_valid == 0
152
153
154class Report(object):
155 """A convenience for writing reports.148 """A convenience for writing reports.
156149
157 This provides a register method which will set the manager attribute150 This provides a register method which will set the manager attribute
158151
=== modified file 'checkbox/reports/launchpad_report.py'
--- checkbox/reports/launchpad_report.py 2010-03-09 16:58:36 +0000
+++ checkbox/reports/launchpad_report.py 2012-06-23 00:59:17 +0000
@@ -109,7 +109,7 @@
109109
110 def dumps_lsbrelease(self, obj, parent):110 def dumps_lsbrelease(self, obj, parent):
111 logging.debug("Dumping lsbrelease")111 logging.debug("Dumping lsbrelease")
112 for key, value in obj.iteritems():112 for key, value in obj.items():
113 property = self._create_element("property", parent)113 property = self._create_element("property", parent)
114 property.setAttribute("name", key)114 property.setAttribute("name", key)
115 self._manager.call_dumps(value, property)115 self._manager.call_dumps(value, property)
116116
=== modified file 'checkbox/reports/xml_report.py'
--- checkbox/reports/xml_report.py 2010-03-09 16:58:36 +0000
+++ checkbox/reports/xml_report.py 2012-06-23 00:59:17 +0000
@@ -36,10 +36,9 @@
36 def register_dumps(self):36 def register_dumps(self):
37 for (dt, dh) in [(bool, self.dumps_bool),37 for (dt, dh) in [(bool, self.dumps_bool),
38 (int, self.dumps_int),38 (int, self.dumps_int),
39 (long, self.dumps_int),
40 (float, self.dumps_float),39 (float, self.dumps_float),
40 (bytes, self.dumps_bytes),
41 (str, self.dumps_str),41 (str, self.dumps_str),
42 (unicode, self.dumps_unicode),
43 (list, self.dumps_list),42 (list, self.dumps_list),
44 (tuple, self.dumps_list),43 (tuple, self.dumps_list),
45 (dict, self.dumps_dict),44 (dict, self.dumps_dict),
@@ -52,8 +51,8 @@
52 ("int", self.loads_int),51 ("int", self.loads_int),
53 ("long", self.loads_int),52 ("long", self.loads_int),
54 ("float", self.loads_float),53 ("float", self.loads_float),
54 ("bytes", self.loads_bytes),
55 ("str", self.loads_str),55 ("str", self.loads_str),
56 ("unicode", self.loads_str),
57 ("list", self.loads_list),56 ("list", self.loads_list),
58 ("value", self.loads_value),57 ("value", self.loads_value),
59 ("property", self.loads_property),58 ("property", self.loads_property),
@@ -78,12 +77,12 @@
78 def dumps_float(self, obj, parent):77 def dumps_float(self, obj, parent):
79 self._dumps_text(str(obj), parent, "float")78 self._dumps_text(str(obj), parent, "float")
8079
80 def dumps_bytes(self, obj, parent):
81 self._dumps_text(obj, parent, "bytes")
82
81 def dumps_str(self, obj, parent):83 def dumps_str(self, obj, parent):
82 self._dumps_text(obj, parent, "str")84 self._dumps_text(obj, parent, "str")
8385
84 def dumps_unicode(self, obj, parent):
85 self._dumps_text(obj, parent, "unicode")
86
87 def dumps_list(self, obj, parent):86 def dumps_list(self, obj, parent):
88 parent.setAttribute("type", "list")87 parent.setAttribute("type", "list")
89 for value in obj:88 for value in obj:
@@ -92,9 +91,9 @@
92 self._manager.call_dumps(value, element)91 self._manager.call_dumps(value, element)
9392
94 def dumps_dict(self, obj, parent):93 def dumps_dict(self, obj, parent):
95 for key in sorted(obj.iterkeys()):94 for key in sorted(obj.keys()):
96 value = obj[key]95 value = obj[key]
97 if self._manager.dumps_table.has_key(key):96 if key in self._manager.dumps_table:
98 # Custom dumps handler97 # Custom dumps handler
99 element = self._create_element(key, parent)98 element = self._create_element(key, parent)
100 self._manager.dumps_table[key](value, element)99 self._manager.dumps_table[key](value, element)
@@ -130,8 +129,11 @@
130 def loads_float(self, node):129 def loads_float(self, node):
131 return float(node.data)130 return float(node.data)
132131
132 def loads_bytes(self, node):
133 return node.data.strip().encode("utf-8")
134
133 def loads_str(self, node):135 def loads_str(self, node):
134 return str(node.data.strip())136 return node.data.strip()
135137
136 def loads_list(self, node):138 def loads_list(self, node):
137 nodes = []139 nodes = []
@@ -188,4 +190,4 @@
188 elif re.match('^(no|false|0)$', string, re.IGNORECASE):190 elif re.match('^(no|false|0)$', string, re.IGNORECASE):
189 return False191 return False
190 else:192 else:
191 raise Exception, "Invalid boolean type: %s" % string193 raise Exception("Invalid boolean type: %s" % string)
192194
=== modified file 'checkbox/resource.py'
--- checkbox/resource.py 2011-06-21 13:57:25 +0000
+++ checkbox/resource.py 2012-06-23 00:59:17 +0000
@@ -16,13 +16,13 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19import __builtin__19import builtins
2020
2121
22__all__ = ["ResourceMap"]22__all__ = ["ResourceMap"]
2323
2424
25class ResourceObject(object):25class ResourceObject:
26 __slots__ = ("_iterator", "_name", "_convert",)26 __slots__ = ("_iterator", "_name", "_convert",)
2727
28 def __init__(self, iterator, name, convert=lambda x: x):28 def __init__(self, iterator, name, convert=lambda x: x):
@@ -67,7 +67,7 @@
67 return until if found else default67 return until if found else default
6868
6969
70class ResourceIterator(object):70class ResourceIterator:
71 __slots__ = ("_map", "_values",)71 __slots__ = ("_map", "_values",)
7272
73 def __init__(self, map, values):73 def __init__(self, map, values):
@@ -91,7 +91,7 @@
91 return ResourceObject(self, name)91 return ResourceObject(self, name)
9292
9393
94class ResourceBuiltin(object):94class ResourceBuiltin:
95 __slots__ = ("_function",)95 __slots__ = ("_function",)
9696
97 def __init__(self, function):97 def __init__(self, function):
@@ -105,10 +105,9 @@
105105
106 def __init__(self, names, *args, **kwargs):106 def __init__(self, names, *args, **kwargs):
107 super(ResourceGlobals, self).__init__(*args, **kwargs)107 super(ResourceGlobals, self).__init__(*args, **kwargs)
108 self["__builtins__"] = None
109108
110 for name in names:109 for name in names:
111 function = getattr(__builtin__, name)110 function = getattr(builtins, name)
112 self[name] = ResourceBuiltin(function)111 self[name] = ResourceBuiltin(function)
113112
114113
@@ -128,7 +127,7 @@
128127
129 def eval(self, source):128 def eval(self, source):
130 self._results = []129 self._results = []
131 resource_globals = ResourceGlobals(["bool", "float", "int", "long", "str"])130 resource_globals = ResourceGlobals(["bool", "float", "int", "str"])
132 try:131 try:
133 value = eval(source, resource_globals, self)132 value = eval(source, resource_globals, self)
134 if (isinstance(value, (bool, int)) and value) \133 if (isinstance(value, (bool, int)) and value) \
135134
=== modified file 'checkbox/tests/report.py'
--- checkbox/tests/report.py 2011-09-14 21:16:02 +0000
+++ checkbox/tests/report.py 2012-06-23 00:59:17 +0000
@@ -105,5 +105,5 @@
105 self.assertTrue("test1" in str)105 self.assertTrue("test1" in str)
106106
107 data = rm.loads(str)107 data = rm.loads(str)
108 self.assertTrue(data.has_key("test"))108 self.assertTrue("test" in data)
109 self.assertTrue(data["test"] == "test1")109 self.assertTrue(data["test"] == "test1")
110110
=== modified file 'checkbox/user_interface.py'
--- checkbox/user_interface.py 2012-03-21 02:22:11 +0000
+++ checkbox/user_interface.py 2012-06-23 00:59:17 +0000
@@ -57,8 +57,12 @@
57 UNSUPPORTED: SKIP_ANSWER,57 UNSUPPORTED: SKIP_ANSWER,
58 UNTESTED: SKIP_ANSWER}58 UNTESTED: SKIP_ANSWER}
5959
6060CONTINUE_ANSWER = 'Continue'
61class UserInterface(object):61RERUN_ANSWER = 'Rerun'
62RESTART_ANSWER = 'Restart'
63
64
65class UserInterface:
62 """Abstract base class for encapsulating the workflow and common code for66 """Abstract base class for encapsulating the workflow and common code for
63 any user interface implementation (like GTK, Qt, or CLI).67 any user interface implementation (like GTK, Qt, or CLI).
6468
@@ -67,6 +71,7 @@
67 def __init__(self, title, data_path=None):71 def __init__(self, title, data_path=None):
68 self.title = title72 self.title = title
69 self.data_path = data_path73 self.data_path = data_path
74 self.progress = None
70 self.ui_flags = {}75 self.ui_flags = {}
7176
72 self.report_url = None77 self.report_url = None
@@ -78,9 +83,12 @@
78 logging.info(text)83 logging.info(text)
79 return default84 return default
8085
81 def show_error(self, text):86 def show_error(self, primary_text,
87 secondary_text=None, detailed_text=None):
88 text = filter(None, [primary_text, secondary_text, detailed_text])
89 text = '\n'.join(text)
82 logging.error(text)90 logging.error(text)
83 raise StopAllException, "Error: %s" % text91 raise StopAllException("Error: %s" % text)
8492
85 def show_progress(self, message, function, *args, **kwargs):93 def show_progress(self, message, function, *args, **kwargs):
86 self.show_progress_start(message)94 self.show_progress_start(message)
@@ -109,7 +117,7 @@
109 def show_text(self, text, previous=None, next=None):117 def show_text(self, text, previous=None, next=None):
110 return118 return
111119
112 def show_entry(self, text, value, previous=None, next=None):120 def show_entry(self, text, value, label=None, previous=None, next=None):
113 return value121 return value
114122
115 def show_check(self, text, options=[], default=[]):123 def show_check(self, text, options=[], default=[]):
@@ -118,7 +126,7 @@
118 def show_radio(self, text, options=[], default=None):126 def show_radio(self, text, options=[], default=None):
119 return default127 return default
120128
121 def show_tree(self, text, options={}, default={}):129 def show_tree(self, text, options={}, default={}, deselect_warning=""):
122 return default130 return default
123131
124 def show_test(self, test, runner):132 def show_test(self, test, runner):
@@ -194,7 +202,7 @@
194 webbrowser.open(url, new=True, autoraise=True)202 webbrowser.open(url, new=True, autoraise=True)
195 return203 return
196204
197 except Exception, e:205 except Exception as e:
198 pass206 pass
199207
200 def show_report(self, text, results):208 def show_report(self, text, results):
@@ -203,3 +211,13 @@
203 and make it possible to modify them211 and make it possible to modify them
204 """212 """
205 raise NotImplementedError213 raise NotImplementedError
214
215 def update_status(self, job):
216 """
217 If implemented, it will be called after each job finishes.
218 The passed Job object can be used to update in-UI status
219 about each job.
220 """
221 pass
222
223
206224
=== modified file 'checkbox/variables.py'
--- checkbox/variables.py 2011-09-14 21:16:02 +0000
+++ checkbox/variables.py 2012-06-23 00:59:17 +0000
@@ -19,7 +19,7 @@
19import re19import re
20import posixpath20import posixpath
2121
22from StringIO import StringIO22from io import StringIO
2323
24from checkbox.lib.text import split24from checkbox.lib.text import split
2525
@@ -47,7 +47,7 @@
47 pass47 pass
4848
4949
50class Variable(object):50class Variable:
5151
52 _value = None52 _value = None
53 _required = True53 _required = True
@@ -101,7 +101,7 @@
101 __slots__ = ()101 __slots__ = ()
102102
103 def coerce(self, value):103 def coerce(self, value):
104 if isinstance(value, (str, unicode)):104 if isinstance(value, str):
105 if re.match(r"(yes|true)", value, re.IGNORECASE):105 if re.match(r"(yes|true)", value, re.IGNORECASE):
106 value = True106 value = True
107 elif re.match(r"(no|false)", value, re.IGNORECASE):107 elif re.match(r"(no|false)", value, re.IGNORECASE):
@@ -114,12 +114,24 @@
114 return value114 return value
115115
116116
117class BytesVariable(Variable):
118 __slots__ = ()
119
120 def coerce(self, value):
121 if isinstance(value, str):
122 value = value.encode('utf-8')
123 elif not isinstance(value, bytes):
124 raise ValueError("%r is not bytes" % (value,))
125
126 return value
127
128
117class StringVariable(Variable):129class StringVariable(Variable):
118 __slots__ = ()130 __slots__ = ()
119131
120 def coerce(self, value):132 def coerce(self, value):
121 if isinstance(value, unicode):133 if isinstance(value, bytes):
122 value = str(value)134 value = value.decode("utf-8")
123 elif not isinstance(value, str):135 elif not isinstance(value, str):
124 raise ValueError("%r is not a str" % (value,))136 raise ValueError("%r is not a str" % (value,))
125137
@@ -134,25 +146,13 @@
134 return posixpath.expanduser(path)146 return posixpath.expanduser(path)
135147
136148
137class UnicodeVariable(Variable):
138 __slots__ = ()
139
140 def coerce(self, value):
141 if isinstance(value, str):
142 value = unicode(value, encoding="utf-8")
143 elif not isinstance(value, unicode):
144 raise ValueError("%r is not a unicode" % (value,))
145
146 return value
147
148
149class IntVariable(Variable):149class IntVariable(Variable):
150 __slots__ = ()150 __slots__ = ()
151151
152 def coerce(self, value):152 def coerce(self, value):
153 if isinstance(value, (str, unicode)):153 if isinstance(value, str):
154 value = int(value)154 value = int(value)
155 elif not isinstance(value, (int, long)):155 elif not isinstance(value, int):
156 raise ValueError("%r is not an int nor long" % (value,))156 raise ValueError("%r is not an int nor long" % (value,))
157157
158 return value158 return value
@@ -162,9 +162,9 @@
162 __slots__ = ()162 __slots__ = ()
163163
164 def coerce(self, value):164 def coerce(self, value):
165 if isinstance(value, (str, unicode)):165 if isinstance(value, str):
166 value = float(value)166 value = float(value)
167 elif not isinstance(value, (int, long, float)):167 elif not isinstance(value, (int, float)):
168 raise ValueError("%r is not a float" % (value,))168 raise ValueError("%r is not a float" % (value,))
169169
170 return value170 return value
@@ -186,7 +186,7 @@
186186
187 def coerce(self, values):187 def coerce(self, values):
188 item_factory = self._item_factory188 item_factory = self._item_factory
189 if isinstance(values, (str, unicode)):189 if isinstance(values, str):
190 values = split(values, self._separator) if values else []190 values = split(values, self._separator) if values else []
191 elif not isinstance(values, (list, tuple)):191 elif not isinstance(values, (list, tuple)):
192 raise ValueError("%r is not a list or tuple" % (values,))192 raise ValueError("%r is not a list or tuple" % (values,))
@@ -235,7 +235,7 @@
235 if not isinstance(value, dict):235 if not isinstance(value, dict):
236 raise ValueError("%r is not a dict." % (value,))236 raise ValueError("%r is not a dict." % (value,))
237237
238 for k, v in value.iteritems():238 for k, v in value.items():
239 value[self._key_schema(value=k).get()] = \239 value[self._key_schema(value=k).get()] = \
240 self._value_schema(value=v).get()240 self._value_schema(value=v).get()
241 return value241 return value
@@ -252,16 +252,16 @@
252 if not isinstance(value, dict):252 if not isinstance(value, dict):
253 raise ValueError("%r is not a dict." % (value,))253 raise ValueError("%r is not a dict." % (value,))
254254
255 for k, v in value.iteritems():255 for k, v in value.items():
256 if k not in self._schema:256 if k not in self._schema:
257 raise ValueError("%r is not a valid key as per %r"257 raise ValueError("%r is not a valid key as per %r"
258 % (k, self._schema))258 % (k, self._schema))
259259
260 for attribute, variable in self._schema.iteritems():260 for attribute, variable in self._schema.items():
261 old_value = value.get(attribute)261 old_value = value.get(attribute)
262 try:262 try:
263 new_value = variable(value=old_value).get()263 new_value = variable(value=old_value).get()
264 except ValueError, e:264 except ValueError as e:
265 raise ValueError(265 raise ValueError(
266 "Value of %r key of dict %r could not be converted: %s"266 "Value of %r key of dict %r could not be converted: %s"
267 % (attribute, value, e))267 % (attribute, value, e))
@@ -276,7 +276,7 @@
276 __slots__ = ()276 __slots__ = ()
277277
278 def coerce(self, value):278 def coerce(self, value):
279 if isinstance(value, basestring):279 if isinstance(value, str):
280 value = StringIO(value)280 value = StringIO(value)
281 elif not hasattr(value, "read"):281 elif not hasattr(value, "read"):
282 raise ValueError("%r is not a file" % (value,))282 raise ValueError("%r is not a file" % (value,))
@@ -295,7 +295,7 @@
295 else:295 else:
296 variables = {}296 variables = {}
297 cls = type(obj)297 cls = type(obj)
298 for attribute in get_attributes(cls).itervalues():298 for attribute in get_attributes(cls).values():
299 variable = attribute.variable_factory(attribute=attribute)299 variable = attribute.variable_factory(attribute=attribute)
300 variables[attribute] = variable300 variables[attribute] = variable
301301
302302
=== modified file 'checkbox_cli/cli_interface.py'
--- checkbox_cli/cli_interface.py 2012-02-23 11:56:50 +0000
+++ checkbox_cli/cli_interface.py 2012-06-23 00:59:17 +0000
@@ -35,7 +35,7 @@
35OPTION_TO_ANSWER = dict((o, a) for a, o in ANSWER_TO_OPTION.items())35OPTION_TO_ANSWER = dict((o, a) for a, o in ANSWER_TO_OPTION.items())
3636
3737
38class CLIDialog(object):38class CLIDialog:
39 """Command line dialog wrapper."""39 """Command line dialog wrapper."""
4040
41 def __init__(self, text):41 def __init__(self, text):
@@ -44,6 +44,7 @@
4444
45 def put(self, text):45 def put(self, text):
46 sys.stdout.write(text)46 sys.stdout.write(text)
47 sys.stdout.flush()
4748
48 def put_line(self, line):49 def put_line(self, line):
49 self.put("%s\n" % line)50 self.put("%s\n" % line)
@@ -59,7 +60,7 @@
59 fileno = sys.stdin.fileno()60 fileno = sys.stdin.fileno()
60 saved_attributes = termios.tcgetattr(fileno)61 saved_attributes = termios.tcgetattr(fileno)
61 attributes = termios.tcgetattr(fileno)62 attributes = termios.tcgetattr(fileno)
62 attributes[3] = attributes[3] & ~(termios.ICANON | termios.ECHO)63 attributes[3] &= ~(termios.ICANON | termios.ECHO)
63 attributes[6][termios.VMIN] = 164 attributes[6][termios.VMIN] = 1
64 attributes[6][termios.VTIME] = 065 attributes[6][termios.VTIME] = 0
65 termios.tcsetattr(fileno, termios.TCSANOW, attributes)66 termios.tcsetattr(fileno, termios.TCSANOW, attributes)
@@ -68,12 +69,12 @@
68 escape = 069 escape = 0
69 try:70 try:
70 while len(input) < limit:71 while len(input) < limit:
71 ch = str(sys.stdin.read(1))72 ch = sys.stdin.read(1)
72 if ord(ch) == separator:73 if ord(ch) == separator:
73 break74 break
74 elif ord(ch) == 033: # ESC75 elif ord(ch) == 0o33: # ESC
75 escape = 176 escape = 1
76 elif ord(ch) == termios.CERASE or ord(ch) == 010:77 elif ord(ch) == termios.CERASE or ord(ch) == 0o10:
77 if len(input):78 if len(input):
78 self.put("\010 \010")79 self.put("\010 \010")
79 del input[-1]80 del input[-1]
@@ -186,7 +187,7 @@
186 that is, a job containing other jobs187 that is, a job containing other jobs
187 """188 """
188 return all(issubclass(type(value), dict)189 return all(issubclass(type(value), dict)
189 for value in root.itervalues())190 for value in root.values())
190191
191 def _display(self, title, root):192 def _display(self, title, root):
192 """193 """
@@ -208,11 +209,11 @@
208 if not provided209 if not provided
209 """210 """
210 if key is None:211 if key is None:
211 key = string.lowercase[len(keys)]212 key = string.ascii_lowercase[len(keys)]
212 keys.append(key)213 keys.append(key)
213 options.append(option)214 options.append(option)
214215
215 for job_name, job_data in sorted(root.iteritems()):216 for job_name, job_data in sorted(root.items()):
216 if self._is_suite(job_data):217 if self._is_suite(job_data):
217 add_option(job_name)218 add_option(job_name)
218 self.put_line('{key}: {option}'219 self.put_line('{key}: {option}'
@@ -300,7 +301,7 @@
300 elif key in options:301 elif key in options:
301 if isinstance(options[key], dict):302 if isinstance(options[key], dict):
302 results[key] = {}303 results[key] = {}
303 elif isinstance(options[key], (list, tuple,)):304 elif isinstance(options[key], (list, tuple)):
304 results[key] = []305 results[key] = []
305 else:306 else:
306 results[key] = None307 results[key] = None
@@ -308,7 +309,7 @@
308 for k in options[key]:309 for k in options[key]:
309 self._toggle_results(k, options[key], results[key])310 self._toggle_results(k, options[key], results[key])
310311
311 elif isinstance(results, (list, tuple,)):312 elif isinstance(results, (list, tuple)):
312 if key in results:313 if key in results:
313 results.remove(key)314 results.remove(key)
314 elif key in options:315 elif key in options:
@@ -325,7 +326,7 @@
325 dialog = CLIChoiceDialog(text)326 dialog = CLIChoiceDialog(text)
326 dialog.run()327 dialog.run()
327328
328 def show_entry(self, text, value, previous=None, next=None):329 def show_entry(self, text, value, label=None, previous=None, next=None):
329 dialog = CLILineDialog(text)330 dialog = CLILineDialog(text)
330331
331 return dialog.run()332 return dialog.run()
@@ -357,7 +358,7 @@
357 response = dialog.run()358 response = dialog.run()
358 return options[response]359 return options[response]
359360
360 def show_tree(self, text, options={}, default={}):361 def show_tree(self, text, options={}, default={}, deselect_warning=""):
361 keys = sorted(options.keys())362 keys = sorted(options.keys())
362363
363 dialog = CLIChoiceDialog(text)364 dialog = CLIChoiceDialog(text)
@@ -453,6 +454,9 @@
453 def show_info(self, text, options=[], default=None):454 def show_info(self, text, options=[], default=None):
454 return self.show_radio(text, options, default)455 return self.show_radio(text, options, default)
455456
456 def show_error(self, text):457 def show_error(self, primary_text,
458 secondary_text=None, detailed_text=None):
459 text = filter(None, [primary_text, secondary_text, detailed_text])
460 text = '\n'.join(text)
457 dialog = CLIChoiceDialog("Error: %s" % text)461 dialog = CLIChoiceDialog("Error: %s" % text)
458 dialog.run()462 dialog.run()
459463
=== modified file 'checkbox_gtk/gtk_interface.py'
--- checkbox_gtk/gtk_interface.py 2012-02-23 11:56:50 +0000
+++ checkbox_gtk/gtk_interface.py 2012-06-23 00:59:17 +0000
@@ -47,7 +47,7 @@
4747
48# HACK: Setting and unsetting previous and next buttons to workaround48# HACK: Setting and unsetting previous and next buttons to workaround
49# for gnome bug #56070.49# for gnome bug #56070.
50class GTKHack(object):50class GTKHack:
51 def __init__(self, function):51 def __init__(self, function):
52 self._function = function52 self._function = function
5353
@@ -211,6 +211,19 @@
211 title += " - %s" % test_name211 title += " - %s" % test_name
212 self._get_widget("dialog_main").set_title(title)212 self._get_widget("dialog_main").set_title(title)
213213
214 def _set_progress(self,progress):
215 # Update progress bar
216 bar = self._get_widget("progressbar_test")
217 if not self.progress:
218 return
219 done, total = self.progress
220 bar.set_text("%(done)d/%(total)d" % {'done': done, 'total': total})
221 if total:
222 progress_fraction = float(done) / total
223 else:
224 progress_fraction=0
225 bar.set_fraction(progress_fraction)
226
214 def _run_dialog(self, dialog=None):227 def _run_dialog(self, dialog=None):
215 def on_dialog_response(dialog, response, self):228 def on_dialog_response(dialog, response, self):
216 # Keep dialog alive when the button that has been clicked229 # Keep dialog alive when the button that has been clicked
@@ -221,8 +234,16 @@
221 self.direction = response234 self.direction = response
222 Gtk.main_quit()235 Gtk.main_quit()
223236
237 def on_dialog_key_press(dialog, event, self):
238 # Ignore ESC key presses
239 key = Gdk.keyval_name(event.keyval)
240 if "Escape" in key:
241 return True
242 return False
243
224 dialog = dialog or self._dialog244 dialog = dialog or self._dialog
225 dialog.connect("response", on_dialog_response, self)245 dialog.connect("response", on_dialog_response, self)
246 dialog.connect("key-press-event", on_dialog_key_press, self)
226 dialog.set_default_response(NEXT)247 dialog.set_default_response(NEXT)
227 dialog.show()248 dialog.show()
228 Gtk.main()249 Gtk.main()
@@ -230,6 +251,7 @@
230 raise KeyboardInterrupt251 raise KeyboardInterrupt
231252
232 def show_progress_start(self, message):253 def show_progress_start(self, message):
254 self._set_progress(self.progress)
233 self._set_sensitive("button_previous", False)255 self._set_sensitive("button_previous", False)
234 self._set_sensitive("button_next", False)256 self._set_sensitive("button_next", False)
235257
@@ -266,7 +288,7 @@
266 self._set_button("button_next", next_state)288 self._set_button("button_next", next_state)
267289
268 @GTKHack290 @GTKHack
269 def show_entry(self, text, value, previous=None, next=None):291 def show_entry(self, text, value, label=None, previous=None, next=None):
270 #Reset window title292 #Reset window title
271 self._set_main_title()293 self._set_main_title()
272 # Set buttons294 # Set buttons
@@ -315,7 +337,7 @@
315337
316 # Set callbacks338 # Set callbacks
317 def click_button(widget, active):339 def click_button(widget, active):
318 for check_button in option_table.itervalues():340 for check_button in option_table.values():
319 check_button.set_active(active)341 check_button.set_active(active)
320342
321 for button_name in "button_select_all", "button_deselect_all":343 for button_name in "button_select_all", "button_deselect_all":
@@ -375,11 +397,11 @@
375 return result397 return result
376398
377 @GTKHack399 @GTKHack
378 def show_tree(self, text, options={}, default={}):400 def show_tree(self, text, options={}, default={}, deselect_warning=""):
379 #Reset window title401 #Reset window title
380 self._set_main_title()402 self._set_main_title()
381403
382 (COLUMN_TEXT, COLUMN_ACTIVE) = range(2)404 (COLUMN_TEXT, COLUMN_ACTIVE) = list(range(2))
383405
384 # Set buttons406 # Set buttons
385 self._notebook.set_current_page(1)407 self._notebook.set_current_page(1)
@@ -519,6 +541,7 @@
519 self._set_hyper_text_view("hyper_text_view_test",541 self._set_hyper_text_view("hyper_text_view_test",
520 test["description"])542 test["description"])
521543
544 self._set_progress(self.progress)
522 # Set buttons545 # Set buttons
523 if "command" in test:546 if "command" in test:
524 self._set_sensitive("button_test", True)547 self._set_sensitive("button_test", True)
@@ -566,15 +589,35 @@
566 self.direction = NEXT589 self.direction = NEXT
567 return options[response]590 return options[response]
568591
569 def show_error(self, text):592 def show_error(self, primary_text,
593 secondary_text=None, detailed_text=None):
570 message_dialog = Gtk.MessageDialog(parent=self._dialog,594 message_dialog = Gtk.MessageDialog(parent=self._dialog,
571 type=Gtk.MessageType.ERROR,595 type=Gtk.MessageType.ERROR,
572 buttons=Gtk.ButtonsType.NONE,596 buttons=Gtk.ButtonsType.NONE,
573 message_format=text)597 message_format=primary_text)
574 message_dialog.set_modal(True)598 message_dialog.set_modal(True)
575 message_dialog.set_title(_("Error"))599 message_dialog.set_title(_("Error"))
576 message_dialog.set_default_response(NEXT)600 message_dialog.set_default_response(NEXT)
577 message_dialog.add_buttons(Gtk.STOCK_CLOSE, NEXT)601 message_dialog.add_buttons(Gtk.STOCK_CLOSE, NEXT)
602 if secondary_text:
603 message_dialog.format_secondary_text(secondary_text)
604 if detailed_text:
605 content_area = message_dialog.get_content_area()
606
607 expander = Gtk.Expander(label=_('Detailed information...'))
608
609 def expanded_cb(expander, *args):
610 message_dialog.set_resizable(expander.get_expanded())
611 expander.connect("notify::expanded", expanded_cb)
612 scrolled_window = Gtk.ScrolledWindow()
613 textview = Gtk.TextView()
614 textview.set_editable(False)
615 textview.get_buffer().set_text(detailed_text)
616 scrolled_window.add(textview)
617 expander.add(scrolled_window)
618 content_area.pack_start(expander,
619 expand=True, fill=True, padding=0)
620 message_dialog.show_all()
578 self._run_dialog(message_dialog)621 self._run_dialog(message_dialog)
579 message_dialog.hide()622 message_dialog.hide()
580623
581624
=== modified file 'checkbox_gtk/hyper_text_view.py'
--- checkbox_gtk/hyper_text_view.py 2011-09-14 21:16:02 +0000
+++ checkbox_gtk/hyper_text_view.py 2012-06-23 00:59:17 +0000
@@ -32,13 +32,13 @@
32 try:32 try:
33 return getattr(self, prop.name)33 return getattr(self, prop.name)
34 except AttributeError:34 except AttributeError:
35 raise AttributeError, "unknown property %s" % prop.name35 raise AttributeError("unknown property %s" % prop.name)
3636
37 def do_set_property(self, prop, val):37 def do_set_property(self, prop, val):
38 if prop.name in self.__gproperties__.keys():38 if prop.name in list(self.__gproperties__.keys()):
39 setattr(self, prop.name, val)39 setattr(self, prop.name, val)
40 else:40 else:
41 raise AttributeError, "unknown property %s" % prop.name41 raise AttributeError("unknown property %s" % prop.name)
4242
43 def __init__(self, buffer=None):43 def __init__(self, buffer=None):
44 super(HyperTextView, self).__init__(buffer=buffer)44 super(HyperTextView, self).__init__(buffer=buffer)
@@ -55,12 +55,10 @@
55 self.connect("focus-out-event", lambda w, e: self.get_buffer().get_tag_table().foreach(self.__tag_reset, e.window))55 self.connect("focus-out-event", lambda w, e: self.get_buffer().get_tag_table().foreach(self.__tag_reset, e.window))
5656
57 def insert(self, text, _iter=None):57 def insert(self, text, _iter=None):
58 if not isinstance(text, unicode):
59 text = unicode(text, "utf-8")
60 b = self.get_buffer()58 b = self.get_buffer()
61 if _iter is None:59 if _iter is None:
62 _iter = b.get_end_iter()60 _iter = b.get_end_iter()
63 b.insert(_iter, text.encode("utf-8"))61 b.insert(_iter, text)
6462
65 def insert_with_anchor(self, text, anchor=None, _iter=None):63 def insert_with_anchor(self, text, anchor=None, _iter=None):
66 b = self.get_buffer()64 b = self.get_buffer()
@@ -109,7 +107,7 @@
109107
110 def __set_anchor(self, window, tag, cursor, prop):108 def __set_anchor(self, window, tag, cursor, prop):
111 window.set_cursor(cursor)109 window.set_cursor(cursor)
112 for key, val in prop.iteritems():110 for key, val in prop.items():
113 if val is not None:111 if val is not None:
114 tag.set_property(key, val)112 tag.set_property(key, val)
115113
116114
=== modified file 'checkbox_qt/qt_interface.py'
--- checkbox_qt/qt_interface.py 2012-04-11 17:20:37 +0000
+++ checkbox_qt/qt_interface.py 2012-06-23 00:59:17 +0000
@@ -16,20 +16,17 @@
16# You should have received a copy of the GNU General Public License16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18#18#
19import sys19import re
20import time20import time
21import posixpath
22import inspect
23from gi.repository import GObject21from gi.repository import GObject
24import os
2522
26from gettext import gettext as _23from gettext import gettext as _
27from string import Template24from string import Template
2825
29from checkbox.job import PASS 26from checkbox.job import PASS
30from checkbox.user_interface import (UserInterface,27from checkbox.user_interface import (UserInterface,
31 NEXT, PREV, YES_ANSWER, NO_ANSWER, SKIP_ANSWER,28 NEXT, PREV, YES_ANSWER, NO_ANSWER, SKIP_ANSWER,
32 ANSWER_TO_STATUS, STATUS_TO_ANSWER)29 ANSWER_TO_STATUS)
33import dbus30import dbus
34from dbus.mainloop.glib import DBusGMainLoop31from dbus.mainloop.glib import DBusGMainLoop
3532
@@ -40,30 +37,41 @@
4037
41OPTION_TO_ANSWER = dict((o, a)38OPTION_TO_ANSWER = dict((o, a)
42 for a, o in ANSWER_TO_OPTION.items())39 for a, o in ANSWER_TO_OPTION.items())
40def dummy_handle_reply(r=None):
41 return
42
43def dummy_handle_error(e=None):
44 return
4345
44class QTInterface(UserInterface):46class QTInterface(UserInterface):
45 def __init__(self, title, data_path):47 def __init__(self, title, data_path):
46 super(QTInterface, self).__init__(title, data_path)48 super(QTInterface, self).__init__(title, data_path)
47 self._app_title = title49 self._app_title = title
48 notReady = True50 notReady = True
51 infoResult = None
49 while notReady:52 while notReady:
50 try:53 try:
51 self.bus = dbus.SessionBus(mainloop=DBusGMainLoop())54 self.bus = dbus.SessionBus(mainloop=DBusGMainLoop())
52 self.qtfront = self.bus.get_object('com.canonical.QtCheckbox', '/QtCheckbox')55 self.qtfront = self.bus.get_object(
53 self.qtiface = dbus.Interface(self.qtfront, dbus_interface='com.canonical.QtCheckbox')56 'com.canonical.QtCheckbox', '/QtCheckbox')
57 self.qtiface = dbus.Interface(
58 self.qtfront, dbus_interface='com.canonical.QtCheckbox')
54 self.loop = GObject.MainLoop()59 self.loop = GObject.MainLoop()
55 notReady = False60 notReady = False
56 except:61 except:
57 time.sleep(0.5)62 time.sleep(0.5)
58 self.bus.add_signal_receiver(self.onClosedFrontend, "closedFrontend")63 self.bus.add_signal_receiver(
59 self.bus.add_signal_receiver(self.onReviewTestsClicked, "reviewTestsClicked")64 self.onClosedFrontend, "closedFrontend")
60 self.bus.add_signal_receiver(self.onWelcomeCheckboxToggled, "welcomeCheckboxToggled")65 self.bus.add_signal_receiver(
66 self.onReviewTestsClicked, "reviewTestsClicked")
67 self.bus.add_signal_receiver(
68 self.onWelcomeCheckboxToggled, "welcomeCheckboxToggled")
69 self.qtiface.setInitialState()
6170
62 self.qtiface.setInitialState();
63 self._set_main_title()71 self._set_main_title()
6472
65 def onReviewTestsClicked(self):73 def onReviewTestsClicked(self):
66 self.show_url(self.report_url) 74 self.show_url(self.report_url)
6775
68 def onWelcomeCheckboxToggled(self, checked):76 def onWelcomeCheckboxToggled(self, checked):
69 self.ui_flags["show_welcome_message"] = bool(checked)77 self.ui_flags["show_welcome_message"] = bool(checked)
@@ -95,8 +103,10 @@
95 def onFullTestsClicked():103 def onFullTestsClicked():
96 self.direction = NEXT104 self.direction = NEXT
97 self.loop.quit()105 self.loop.quit()
106
98 def onCustomTestsClicked():107 def onCustomTestsClicked():
99 self.loop.quit()108 self.loop.quit()
109
100 #Reset window title110 #Reset window title
101 self._set_main_title()111 self._set_main_title()
102112
@@ -106,13 +116,25 @@
106 self.qtiface.showText(text)116 self.qtiface.showText(text)
107 self.wait_on_signals(fullTestsClicked=onFullTestsClicked)117 self.wait_on_signals(fullTestsClicked=onFullTestsClicked)
108118
109 def show_entry(self, text, value, previous=None, next=None):119 def show_entry(self, text, value, label='', previous=None, next=None):
110 def onSubmitTestsClicked():120 def onSubmitTestsClicked():
111 self.loop.quit()121 self.loop.quit()
112122
113 self.qtiface.showEntry(text)123 # Replace links wiki style markup with html markup
124 text = '<html>{}</html>'.format(text)
125 text = text.replace('\n', '<br/>')
126 text = re.sub(r'\[\[([^|]*)\|([^\]]*)\]\]',
127 lambda m: '<a href="{}">{}</a>'
128 .format(m.group(1), m.group(2)),
129 text)
130
131 # Make sure that value is a string
132 if value is None:
133 value = ''
134
135 self.qtiface.showEntry(text, value, label)
114 self.wait_on_signals(submitTestsClicked=onSubmitTestsClicked)136 self.wait_on_signals(submitTestsClicked=onSubmitTestsClicked)
115 return self.qtiface.getEmailAddress()137 return self.qtiface.getSubmissionData()
116138
117 def show_check(self, text, options=[], default=[]):139 def show_check(self, text, options=[], default=[]):
118 return False140 return False
@@ -120,43 +142,57 @@
120 def show_radio(self, text, options=[], default=None):142 def show_radio(self, text, options=[], default=None):
121 return False143 return False
122144
123 def show_tree(self, text, options={}, default={}):145 def show_tree(self, text, options={}, default={}, deselect_warning=""):
146 indexedOptions = {}
147 indexedDefaults = {}
148
124 def onStartTestsClicked():149 def onStartTestsClicked():
125 self.direction = NEXT150 self.direction = NEXT
126 self.loop.quit()151 self.loop.quit()
127152
128 def onWelcomeClicked():153 def buildBranch(options, default, baseIndex="1"):
129 self.direction = PREV154 internalIndex = 1
130 self.loop.quit()155 for test, state in options.items():
156 active = test in default
157 if isinstance(state, dict):
158 indexedOptions[
159 baseIndex + "." + str(internalIndex)] = {test: ''}
160 indexedDefaults[
161 baseIndex + "." + str(internalIndex)] = {test: active}
162 buildBranch(state, default.get(test, {}), baseIndex + "." + str(internalIndex))
163 else:
164 indexedOptions[
165 baseIndex + "." + str(internalIndex)] = {test: state}
166 indexedDefaults[
167 baseIndex + "." + str(internalIndex)] = {test: active}
168 internalIndex += 1
169
170 def buildDict(options, baseIndex="1"):
171 internalIndex = 1
172 branch = {}
173 while True:
174 currentIndex = baseIndex + "." + str(internalIndex)
175 if currentIndex in options:
176 key = list(options[currentIndex].keys())[0]
177 value = list(options[currentIndex].values())[0]
178 if value == "menu":
179 branch[key] = buildDict(options, currentIndex)
180 else:
181 branch[key] = value
182 internalIndex += 1
183 else:
184 break
185 return branch
131186
132 self._set_main_title()187 self._set_main_title()
133 newOptions = {}188 buildBranch(options, default)
134 for section in options:189
135 newTests = {}190 self.qtiface.showTree(text, indexedOptions, indexedDefaults,
136 for test, state in options[section].iteritems():191 deselect_warning)
137 # TODO: add support for more than one level
138 if not isinstance(state, dict):
139 newTests[str(test)] = state
140
141 if newTests == {}:
142 newTests = {'': ''}
143
144 newOptions[section] = newTests
145
146 self.qtiface.showTree(text, newOptions)
147 self.wait_on_signals(192 self.wait_on_signals(
148 startTestsClicked=onStartTestsClicked)193 startTestsClicked=onStartTestsClicked)
149194
150 newOptions = {}195 return buildDict(self.qtiface.getTestsToRun())
151 testsFromInterface = self.qtiface.getTestsToRun()
152 for section in testsFromInterface:
153 newTests = {}
154 for test in testsFromInterface[section]:
155 if test != '':
156 newTests[str(test)] = {}
157 newOptions[str(section)] = newTests
158
159 return newOptions
160196
161 def _run_test(self, test, runner):197 def _run_test(self, test, runner):
162 self.qtiface.showTestControls(False)198 self.qtiface.showTestControls(False)
@@ -164,8 +200,12 @@
164 self.qtiface.setFocusTestYesNo(True if status == PASS else False)200 self.qtiface.setFocusTestYesNo(True if status == PASS else False)
165 self.qtiface.showTestControls(True)201 self.qtiface.showTestControls(True)
166202
167 return Template(test["info"]).substitute({203 if test["info"]:
168 "output": data.strip()})204 info = Template(test["info"]).substitute({"output": data.strip()})
205 else:
206 info = ""
207
208 return info
169209
170 def show_test(self, test, runner):210 def show_test(self, test, runner):
171 def onStartTestClicked():211 def onStartTestClicked():
@@ -200,7 +240,7 @@
200 if not "data" in test:240 if not "data" in test:
201 test["data"] = ""241 test["data"] = ""
202 if "command" in test:242 if "command" in test:
203 enableTestButton = True 243 enableTestButton = True
204244
205 self.qtiface.showTest(245 self.qtiface.showTest(
206 test["purpose"], test["steps"], test["verification"], info, test["data"],246 test["purpose"], test["steps"], test["verification"], info, test["data"],
@@ -217,33 +257,44 @@
217257
218 def show_info(self, text, options=[], default=None):258 def show_info(self, text, options=[], default=None):
219 def onInfoBoxResult(result):259 def onInfoBoxResult(result):
260 #result here will always be a dbus String
261 #it may not be convertable with str due to the fact that it
262 #may contain non-ascii characters, so we need to convert to
263 #internal Python unicode instead.
220 self.infoResult = str(result)264 self.infoResult = str(result)
221 self.loop.quit()265 self.loop.quit()
222266
223 self.qtiface.showInfo(text, options, default, 267 self.qtiface.showInfo(
268 text, options, default,
224 reply_handler=dummy_handle_reply,269 reply_handler=dummy_handle_reply,
225 error_handler=dummy_handle_error)270 error_handler=dummy_handle_error)
226 self.wait_on_signals(271 self.wait_on_signals(
227 infoBoxResult=onInfoBoxResult)272 infoBoxResult=onInfoBoxResult)
228 return self.infoResult273 return self.infoResult
229274
230 def show_error(self, text):275 def show_error(self, primary_text,
276 secondary_text=None, detailed_text=None):
231 def onErrorBoxClosed():277 def onErrorBoxClosed():
232 self.loop.quit()278 self.loop.quit()
233279
234 self.qtiface.showError(text,280 self.qtiface.showError(primary_text,
235 reply_handler=dummy_handle_reply,281 secondary_text, detailed_text,
236 error_handler=dummy_handle_error)282 reply_handler=dummy_handle_reply,
283 error_handler=dummy_handle_error)
237 self.wait_on_signals(284 self.wait_on_signals(
238 errorBoxClosed=onErrorBoxClosed)285 errorBoxClosed=onErrorBoxClosed)
239286
287 def update_status(self, job):
288 if 'type' in job and job["type"] == "test":
289 self.qtiface.updateAutoTestStatus(job["status"], job["name"])
290
240 def wait_on_signals(self, **signals):291 def wait_on_signals(self, **signals):
241 for name, function in signals.iteritems():292 for name, function in signals.items():
242 self.bus.add_signal_receiver(function, name)293 self.bus.add_signal_receiver(function, name)
243294
244 self.loop.run()295 self.loop.run()
245 if self.direction == KeyboardInterrupt:296 if self.direction == KeyboardInterrupt:
246 raise KeyboardInterrupt297 raise KeyboardInterrupt
247298
248 for name, function in signals.iteritems():299 for name, function in signals.items():
249 self.bus.remove_signal_receiver(function, name)300 self.bus.remove_signal_receiver(function, name)
250301
=== modified file 'checkbox_urwid/urwid_interface.py'
--- checkbox_urwid/urwid_interface.py 2012-02-23 11:56:50 +0000
+++ checkbox_urwid/urwid_interface.py 2012-06-23 00:59:17 +0000
@@ -27,7 +27,27 @@
27 ALL_ANSWERS, ANSWER_TO_STATUS)27 ALL_ANSWERS, ANSWER_TO_STATUS)
2828
2929
30class Dialog(object):30# HACK to workaround bug in urwid.container, line 1273
31class ComparableString(str):
32
33 def __init__(self, string):
34 self.string = string
35
36 def __getattr__(self, name):
37 return getattr(self.string, name)
38
39 def __lt__(self, other):
40 if not isinstance(other, str):
41 return False
42 return self.string < other
43
44 def __gt__(self, other):
45 if not isinstance(other, str):
46 return False
47 return self.string > other
48
49
50class Dialog:
31 """51 """
32 Basic dialog class that displays some text52 Basic dialog class that displays some text
33 """53 """
@@ -77,8 +97,10 @@
77 if not body:97 if not body:
78 text = urwid.Text(self.text)98 text = urwid.Text(self.text)
79 walker = urwid.SimpleListWalker([])99 walker = urwid.SimpleListWalker([])
100 list_box = urwid.ListBox(walker)
101 list_box.pref_col = ComparableString(list_box.pref_col)
80 body = urwid.Pile((('flow', text),102 body = urwid.Pile((('flow', text),
81 ('weight', 1, urwid.ListBox(walker))))103 ('weight', 1, list_box)))
82 self.walker = walker104 self.walker = walker
83105
84 frame = urwid.AttrMap(urwid.Frame(body, header, footer), 'body')106 frame = urwid.AttrMap(urwid.Frame(body, header, footer), 'body')
@@ -290,9 +312,9 @@
290 """312 """
291 Return the label of the selected radio button313 Return the label of the selected radio button
292 """314 """
293 label = (radio_button.get_label()315 label = next((radio_button.get_label()
294 for radio_button in self.radio_button_group316 for radio_button in self.radio_button_group
295 if radio_button.get_state()).next()317 if radio_button.get_state()))
296 return label318 return label
297319
298320
@@ -379,7 +401,7 @@
379 widget.changed_cb, self.walker)401 widget.changed_cb, self.walker)
380402
381 if isinstance(data, dict):403 if isinstance(data, dict):
382 items = sorted(data.iteritems(), key=itemgetter(0))404 items = sorted(iter(data.items()), key=itemgetter(0))
383 for children_name, children_data in items:405 for children_name, children_data in items:
384 child_widget = self.create_tree(children_name, children_data, widget)406 child_widget = self.create_tree(children_name, children_data, widget)
385 widget.append(child_widget)407 widget.append(child_widget)
@@ -392,7 +414,7 @@
392 Set selected nodes by default recursively414 Set selected nodes by default recursively
393 """415 """
394 if isinstance(default, dict):416 if isinstance(default, dict):
395 for name, default_children in default.iteritems():417 for name, default_children in default.items():
396 for widget in widgets:418 for widget in widgets:
397 if widget.name == name:419 if widget.name == name:
398 widget.state = True420 widget.state = True
@@ -408,7 +430,7 @@
408430
409 # Show tree431 # Show tree
410 self.option_widgets = []432 self.option_widgets = []
411 items = sorted(self.options.iteritems(),433 items = sorted(iter(self.options.items()),
412 key=itemgetter(0))434 key=itemgetter(0))
413 for name, data in items:435 for name, data in items:
414 widget = self.create_tree(name, data)436 widget = self.create_tree(name, data)
@@ -498,10 +520,10 @@
498 urwid.signals.connect_signal(widget, 'change',520 urwid.signals.connect_signal(widget, 'change',
499 widget.changed_cb, self.walker)521 widget.changed_cb, self.walker)
500522
501 items = sorted(data.iteritems(), key=itemgetter(0))523 items = sorted(iter(data.items()), key=itemgetter(0))
502 for child_name, child_data in items:524 for child_name, child_data in items:
503 is_suite = all(issubclass(type(value), dict)525 is_suite = all(issubclass(type(value), dict)
504 for value in child_data.itervalues())526 for value in child_data.values())
505527
506 if is_suite:528 if is_suite:
507 child_widget = self.create_tree(child_name,529 child_widget = self.create_tree(child_name,
@@ -533,7 +555,7 @@
533 Dialog.show(self)555 Dialog.show(self)
534556
535 # Show tree557 # Show tree
536 items = sorted(self.results.iteritems(),558 items = sorted(iter(self.results.items()),
537 key=itemgetter(0))559 key=itemgetter(0))
538 for name, data in items:560 for name, data in items:
539 widget = self.create_tree(name, data)561 widget = self.create_tree(name, data)
@@ -899,7 +921,7 @@
899 """921 """
900 Pulse progress bar922 Pulse progress bar
901 """923 """
902 start, end = self.progress_coordinates.next()924 start, end = next(self.progress_coordinates)
903 bar_data = [[0]]*start + [[1]]*(end-start) + [[0]]*(self.MAX_VALUE-end)925 bar_data = [[0]]*start + [[1]]*(end-start) + [[0]]*(self.MAX_VALUE-end)
904 self.progress_bar.set_data(bar_data, 1)926 self.progress_bar.set_data(bar_data, 1)
905 self.loop.draw_screen()927 self.loop.draw_screen()
@@ -955,7 +977,7 @@
955 return dialog.response977 return dialog.response
956978
957979
958 def show_entry(self, text, value, previous=None, next=None):980 def show_entry(self, text, value, label=None, previous=None, next=None):
959 dialog = InputDialog(text).run()981 dialog = InputDialog(text).run()
960 self.direction = dialog.direction982 self.direction = dialog.direction
961 return dialog.response983 return dialog.response
@@ -974,7 +996,7 @@
974 return dialog.response996 return dialog.response
975997
976998
977 def show_tree(self, text, options={}, default={}):999 def show_tree(self, text, options={}, default={}, deselect_warning=""):
978 """1000 """
979 Show some options in a tree hierarchy1001 Show some options in a tree hierarchy
980 and let the user choose between them1002 and let the user choose between them
@@ -1004,8 +1026,7 @@
1004 output = ''1026 output = ''
10051027
1006 # Get options1028 # Get options
1007 options = list([self.ANSWER_TO_OPTION[a]1029 options = [self.ANSWER_TO_OPTION[a] for a in ALL_ANSWERS]
1008 for a in ALL_ANSWERS])
10091030
1010 # Get buttons1031 # Get buttons
1011 buttons = []1032 buttons = []
@@ -1040,9 +1061,11 @@
1040 """1061 """
1041 return self.show_radio(text, options, default)1062 return self.show_radio(text, options, default)
10421063
10431064 def show_error(self, primary_text,
1044 def show_error(self, text):1065 secondary_text=None, detailed_text=None):
1045 """1066 """
1046 Show an error message1067 Show an error message
1047 """1068 """
1069 text = filter(None, [primary_text, secondary_text, detailed_text])
1070 text = '\n'.join(text)
1048 return self.show_radio(text)1071 return self.show_radio(text)
10491072
=== removed file 'data/audio/Ogg_Vorbis_Audio.oga'
1050Binary files data/audio/Ogg_Vorbis_Audio.oga 2010-08-13 16:23:16 +0000 and data/audio/Ogg_Vorbis_Audio.oga 1970-01-01 00:00:00 +0000 differ1073Binary files data/audio/Ogg_Vorbis_Audio.oga 2010-08-13 16:23:16 +0000 and data/audio/Ogg_Vorbis_Audio.oga 1970-01-01 00:00:00 +0000 differ
=== removed file 'data/documents/Derivatives_of_Ubuntu.doc'
1051Binary files data/documents/Derivatives_of_Ubuntu.doc 2010-08-13 16:23:16 +0000 and data/documents/Derivatives_of_Ubuntu.doc 1970-01-01 00:00:00 +0000 differ1074Binary files data/documents/Derivatives_of_Ubuntu.doc 2010-08-13 16:23:16 +0000 and data/documents/Derivatives_of_Ubuntu.doc 1970-01-01 00:00:00 +0000 differ
=== removed file 'data/documents/OpenOffice_Presentation_Test.odp'
1052Binary files data/documents/OpenOffice_Presentation_Test.odp 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Presentation_Test.odp 1970-01-01 00:00:00 +0000 differ1075Binary files data/documents/OpenOffice_Presentation_Test.odp 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Presentation_Test.odp 1970-01-01 00:00:00 +0000 differ
=== removed file 'data/documents/OpenOffice_Spreadsheet_Payment.ods'
1053Binary files data/documents/OpenOffice_Spreadsheet_Payment.ods 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Spreadsheet_Payment.ods 1970-01-01 00:00:00 +0000 differ1076Binary files data/documents/OpenOffice_Spreadsheet_Payment.ods 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Spreadsheet_Payment.ods 1970-01-01 00:00:00 +0000 differ
=== removed file 'data/documents/OpenOffice_Text_Test.odt'
1054Binary files data/documents/OpenOffice_Text_Test.odt 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Text_Test.odt 1970-01-01 00:00:00 +0000 differ1077Binary files data/documents/OpenOffice_Text_Test.odt 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Text_Test.odt 1970-01-01 00:00:00 +0000 differ
=== removed file 'data/documents/PDF_Test.pdf'
1055Binary files data/documents/PDF_Test.pdf 2010-08-13 16:23:16 +0000 and data/documents/PDF_Test.pdf 1970-01-01 00:00:00 +0000 differ1078Binary files data/documents/PDF_Test.pdf 2010-08-13 16:23:16 +0000 and data/documents/PDF_Test.pdf 1970-01-01 00:00:00 +0000 differ
=== removed file 'data/documents/RTF_Russian.rtf'
--- data/documents/RTF_Russian.rtf 2010-08-13 16:23:16 +0000
+++ data/documents/RTF_Russian.rtf 1970-01-01 00:00:00 +0000
@@ -1,51 +0,0 @@
1{\rtf1\ansi\deff1\adeflang1025
2{\fonttbl{\f0\froman\fprq2\fcharset0 Nimbus Roman No9 L{\*\falt Times New Roman};}{\f1\froman\fprq2\fcharset0 Nimbus Roman No9 L{\*\falt Times New Roman};}{\f2\fnil\fprq2\fcharset0 HG Mincho Light J{\*\falt msmincho};}{\f3\froman\fprq2\fcharset0 Nimbus Roman No9 L{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Nimbus Sans L{\*\falt Arial};}{\f5\fnil\fprq0\fcharset2 StarSymbol{\*\falt Arial Unicode MS};}}
3{\colortbl;\red0\green0\blue0;\red0\green0\blue128;\red128\green128\blue128;}
4{\stylesheet{\s1\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\snext1 Normal;}
5{\s2\sb240\sa120\keepn\rtlch\af1\afs28\lang255\ltrch\dbch\af2\langfe255\hich\f4\fs28\lang2057\loch\f4\fs28\lang2057\sbasedon1\snext3 Heading;}
6{\s3\sa120\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon1\snext3 Body Text;}
7{\s4\sa120\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon3\snext4 List;}
8{\s5\sb120\sa120\rtlch\af4\afs24\lang255\ai\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\i\loch\fs24\lang2057\i\sbasedon1\snext5 caption;}
9{\s6\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon1\snext6 Index;}
10{\s7\sb120\sa120\rtlch\af4\afs24\lang255\ai\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\i\loch\fs24\lang2057\i\sbasedon1\snext7 caption;}
11{\s8\sb240\sa120\keepn\rtlch\afs36\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs36\lang2057\b\loch\f1\fs36\lang2057\b\sbasedon2\snext3{\*\soutlvl1} heading 2;}
12{\s9\sb240\sa120\keepn\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b\sbasedon2\snext3{\*\soutlvl2} heading 3;}
13{\*\cs11\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 1;}
14{\*\cs12\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 2;}
15{\*\cs13\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 3;}
16{\*\cs14\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 4;}
17{\*\cs15\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 5;}
18{\*\cs16\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 6;}
19{\*\cs17\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 7;}
20{\*\cs18\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 8;}
21{\*\cs19\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 9;}
22{\*\cs20\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 10;}
23{\*\cs21\rtlch\af4\afs24\lang255\ab\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\b\loch\fs24\lang2057\b Strong Emphasis;}
24{\*\cs22\cf2\ul\ulc0\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 Internet link;}
25{\*\cs23\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 Bullet Symbols;}
26{\*\cs24\cf2\ul\ulc0\rtlch\af1\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang2057\loch\f1\fs24\lang2057 Internet link;}
27}
28{\info{\creatim\yr2006\mo3\dy8\hr21\min21}{\revtim\yr1601\mo1\dy1\hr0\min0}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab709
29{\*\pgdsctbl
30{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
31{\*\pgdscno0}\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
32\pard\plain \ltrpar\s8\sb240\sa120\keepn\ql\rtlch\afs36\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs36\lang2057\b\loch\f1\fs36\lang2057\b {\rtlch \ltrch\loch\f1\fs36\lang2057\i0\b {\*\bkmkstart head-3abc76a6b8f36bdd2210d781fb32b17aa137bd22}{\*\bkmkend head-3abc76a6b8f36bdd2210d781fb32b17aa137bd22}\u1054\'3f\u1073\'3f Ubuntu}
33\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 Ubuntu \u1101\'3f\u1090\'3f\u1086\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1080\'3f\u1073\'3f\u1091\'3f\u1090\'3f\u1080\'3f\u1074\'3f Linux \u1089\'3f\u1086\'3f\u1079\'3f\u1076\'3f\u1072\'3f\u1085\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1074\'3f \u1076\'3f\u1091\'3f\u1093\'3f\u1077\'3f Debian (\u1080\'3f \u1086\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1085\'3f\u1072\'3f \u1085\'3f\u1105\'3f\u1084\'3f), \u1082\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1088\'3f\u1099\'3f\u1081\'3f \u1080\'3f\u1084\'3f\u1077\'3f\u1077\'3f\u1090\'3f \u1095\'3f\u1105\'3f\u1090\'3f\u1082\'3f\u1080\'3f\u1081\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1082\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f\u1086\'3f\u1074\'3f (\u1085\'3f\u1086\'3f\u1074\'3f\u1099\'3f\u1081\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f \u1082\'3f\u1072\'3f\u1078\'3f\u1076\'3f\u1099\'3f\u1077\'3f \u1096\'3f\u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f) \u1080\'3f \u1086\'3f\u1088\'3f\u1080\'3f\u1077\'3f\u1085\'3f\u1090\'3f\u1080\'3f\u1088\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1085\'3f\u1072\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f\u1090\'3f\u1091\'3f \u1080\'3f\u1089\'3f\u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1080\'3f \u1091\'3f\u1076\'3f\u1086\'3f\u1073\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1086\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1099\'3f (\u1074\'3f\u1089\'3f\u1105\'3f \u1076\'3f\u1086\'3f\u1083\'3f\u1078\'3f\u1085\'3f\u1086\'3f "\u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1072\'3f\u1090\'3f\u1100\'3f" TM). \u1050\'3f\u1072\'3f\u1078\'3f\u1076\'3f\u1099\'3f\u1081\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f
34 Ubuntu \u1087\'3f\u1086\'3f\u1076\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f\u1084\'3f\u1080\'3f \u1073\'3f\u1077\'3f\u1079\'3f\u1086\'3f\u1087\'3f\u1072\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f (security updates) \u1074\'3f \u1090\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f 18 \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f. Ubuntu \u1087\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1074\'3f\u1083\'3f\u1103\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1089\'3f \u1089\'3f\u1072\'3f\u1084\'3f\u1086\'3f\u1081\'3f \u1089\'3f\u1074\'3f\u1077\'3f\u1078\'3f\u1077\'3f\u1081\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1077\'3f\u1081\'3f Gnome \u1080\'3f \u1089\'3f \u1090\'3f\u1072\'3f\u1082\'3f\u1086\'3f\u1081\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1073\'3f\u1086\'3f\u1088\'3f\u1082\'3f\u1086\'3f\u1081\'3f \u1089\'3f\u1077\'3f\u1088\'3f\u1074\'3f\u1077\'3f\u1088\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1080\'3f \u1076\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1090\'3f\u1086\'3f\u1087\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1075\'3f\u1088\'3f\u1072\'3f\u1084\'3f\u1084\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1086\'3f\u1073\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1082\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1088\'3f\u1072\'3f\u1103\'3f \u1087\'3f\u1086\'3f\u1079\'3f\u1074\'3f\u1086\'3f\u1083\'3f\u1103\'3f\u1077\'3f\u1090\'3f \u1089\'3f\u1086\'3f\u1079\'3f\u1076\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1091\'3f\u1076\'3f\u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1077\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1095\'3f\u1077\'3f\u1077\'3f \u1086\'3f\u1082\'3f\u1088\'3f\u1091\'3f\u1078\'3f
35\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f c \u1087\'3f\u1086\'3f\u1084\'3f\u1086\'3f\u1097\'3f\u1100\'3f\u1102\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1083\'3f\u1080\'3f\u1096\'3f\u1100\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1086\'3f\u1095\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f CD. }
36\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1063\'3f\u1090\'3f\u1086\'3f \u1078\'3f\u1077\'3f \u1076\'3f\u1077\'3f\u1083\'3f\u1072\'3f\u1077\'3f\u1090\'3f Ubuntu \u1086\'3f\u1089\'3f\u1086\'3f\u1073\'3f\u1099\'3f\u1084\'3f? \u1055\'3f\u1086\'3f\u1095\'3f\u1077\'3f\u1084\'3f\u1091\'3f \u1083\'3f\u1102\'3f\u1076\'3f\u1080\'3f \u1074\'3f\u1099\'3f\u1073\'3f\u1080\'3f\u1088\'3f\u1072\'3f\u1102\'3f\u1090\'3f Ubuntu \u1074\'3f \u1082\'3f\u1072\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1077\'3f \u1083\'3f\u1102\'3f\u1073\'3f\u1080\'3f\u1084\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1080\'3f\u1073\'3f\u1091\'3f\u1090\'3f\u1080\'3f\u1074\'3f\u1072\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1099\'3f \u1080\'3f \u1088\'3f\u1072\'3f\u1079\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f? }
37\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1056\'3f\u1077\'3f\u1075\'3f\u1091\'3f\u1083\'3f\u1103\'3f\u1088\'3f\u1085\'3f\u1099\'3f\u1077\'3f \u1080\'3f \u1087\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1089\'3f\u1082\'3f\u1072\'3f\u1079\'3f\u1091\'3f\u1077\'3f\u1084\'3f\u1099\'3f\u1077\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f\u1099\'3f}
38\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1050\'3f\u1086\'3f\u1084\'3f\u1072\'3f\u1085\'3f\u1076\'3f\u1072\'3f \u1088\'3f\u1072\'3f\u1079\'3f\u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1095\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1074\'3f Ubuntu \u1074\'3f\u1099\'3f\u1087\'3f\u1091\'3f\u1089\'3f\u1082\'3f\u1072\'3f\u1077\'3f\u1090\'3f \u1085\'3f\u1086\'3f\u1074\'3f\u1091\'3f\u1102\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1102\'3f Ubuntu \u1082\'3f\u1072\'3f\u1078\'3f\u1076\'3f\u1099\'3f\u1077\'3f \u1096\'3f\u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f. \u1054\'3f\u1085\'3f\u1072\'3f \u1089\'3f\u1086\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1090\'3f \u1087\'3f\u1086\'3f\u1089\'3f\u1083\'3f\u1077\'3f\u1076\'3f\u1085\'3f\u1102\'3f\u1102\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1102\'3f \u1103\'3f\u1076\'3f\u1088\'3f\u1072\'3f, X, Gnome \u1080\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1086\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f \u1080\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f\u1084\'3f\u1080\'3f \u1073\'3f\u1077\'3f\u1079\'3f\u1086\'3f\u1087\'3f\u1072\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f \u1074\'3f \u1090\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f 18 \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f. \u1055\'3f\u1077\'3f\u1088\'3f\u1074\'3f\u1099\'3f\u1084\'3f \u1087\'3f\u1091\'3f\u1073\'3f\u1083\'3f\u1080\'3f\u1095\'3f\u1085\'3f\u1099\'3f\u1084\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f\u1086\'3f\u1084\'3f Ubuntu \u1073\'3f\u1099\'3f\u1083\'3f
39**Ubuntu 4.10 Preview** (\u1082\'3f\u1086\'3f\u1076\'3f\u1086\'3f\u1074\'3f\u1086\'3f\u1077\'3f \u1085\'3f\u1072\'3f\u1079\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1077\'3f "the {\*\cs21\rtlch\ltrch\dbch\hich\fs24\lang2057\b\loch\fs24\lang2057\b Warty Warthog}" \u1080\'3f\u1083\'3f\u1080\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f "{\*\cs21\rtlch\ltrch\dbch\hich\fs24\lang2057\b\loch\fs24\lang2057\b Warty}"). \u1042\'3f\u1099\'3f \u1084\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1090\'3f\u1077\'3f \u1079\'3f\u1072\'3f\u1075\'3f\u1088\'3f\u1091\'3f\u1079\'3f\u1080\'3f\u1090\'3f\u1100\'3f \u1086\'3f\u1073\'3f\u1088\'3f\u1072\'3f\u1079\'3f CD \u1080\'3f \u1079\'3f\u1072\'3f\u1087\'3f\u1080\'3f\u1089\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1077\'3f\u1075\'3f\u1086\'3f \u1089\'3f\u1072\'3f\u1084\'3f\u1080\'3f \u1080\'3f\u1083\'3f\u1080\'3f \u1079\'3f\u1072\'3f\u1082\'3f\u1072\'3f\u1079\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1077\'3f\u1075\'3f\u1086\'3f \u1091\'3f \u1085\'3f\u1072\'3f\u1089\'3f. }
40\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1041\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1083\'3f\u1072\'3f\u1090\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1100\'3f}
41\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 Ubuntu \u1103\'3f\u1074\'3f\u1083\'3f\u1103\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1089\'3f\u1074\'3f\u1086\'3f\u1073\'3f\u1086\'3f\u1076\'3f\u1085\'3f\u1099\'3f\u1084\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1075\'3f\u1088\'3f\u1072\'3f\u1084\'3f\u1084\'3f\u1085\'3f\u1099\'3f\u1084\'3f \u1086\'3f\u1073\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f\u1084\'3f \u1080\'3f \u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1091\'3f\u1087\'3f\u1077\'3f\u1085\'3f \u1073\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1083\'3f\u1072\'3f\u1090\'3f\u1085\'3f\u1086\'3f. \u1042\'3f \u1086\'3f\u1090\'3f\u1083\'3f\u1080\'3f\u1095\'3f\u1080\'3f\u1077\'3f \u1086\'3f\u1090\'3f \u1084\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1084\'3f\u1077\'3f\u1088\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1080\'3f\u1093\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1080\'3f\u1073\'3f\u1091\'3f\u1090\'3f\u1080\'3f\u1074\'3f\u1086\'3f\u1074\'3f \u1080\'3f\u1079\'3f \u1084\'3f\u1080\'3f\u1088\'3f\u1072\'3f Linux (Libranet, Lindows, Xandros, Red Hat) \u1082\'3f\u1086\'3f\u1084\'3f\u1072\'3f\u1085\'3f\u1076\'3f\u1072\'3f \u1088\'3f\u1072\'3f\u1079\'3f\u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1095\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1074\'3f Ubuntu \u1076\'3f\u1077\'3f\u1081\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1080\'3f\u1090\'3f\u1077\'3f\u1083\'3f\u1100\'3f\u1085\'3f\u1086\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1080\'3f\u1090\'3f \u1074\'3f \u1090\'3f\u1086\'3f \u1095\'3f\u1090\'3f\u1086\'3f \u1057\'3f\u1074\'3f\u1086\'3f\u1073\'3f\u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1077\'3f \u1055\'3f\u1054\'3f \u1076\'3f\u1086\'3f\u1083\'3f\u1078\'3f\u1085\'3f\u1086\'3f
42 \u1073\'3f\u1099\'3f\u1090\'3f\u1100\'3f \u1089\'3f\u1074\'3f\u1086\'3f\u1073\'3f\u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f \u1086\'3f\u1090\'3f \u1079\'3f\u1072\'3f\u1090\'3f\u1088\'3f\u1072\'3f\u1090\'3f \u1085\'3f\u1072\'3f \u1083\'3f\u1080\'3f\u1094\'3f\u1077\'3f\u1085\'3f\u1079\'3f\u1080\'3f\u1088\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1077\'3f. }
43\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1055\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1103\'3f \u1080\'3f \u1073\'3f\u1099\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1072\'3f\u1103\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1082\'3f\u1072\'3f}
44\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1042\'3f Ubuntu \u1085\'3f\u1077\'3f\u1090\'3f \u1082\'3f\u1088\'3f\u1072\'3f\u1089\'3f\u1080\'3f\u1074\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1080\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1103\'3f\u1090\'3f\u1086\'3f\u1088\'3f\u1072\'3f, \u1074\'3f \u1085\'3f\u1105\'3f\u1084\'3f \u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1055\'3f\u1056\'3f\u1054\'3f\u1057\'3f\u1058\'3f\u1054\'3f\u1049\'3f \u1080\'3f \u1041\'3f\u1067\'3f\u1057\'3f\u1058\'3f\u1056\'3f\u1067\'3f\u1049\'3f \u1080\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1103\'3f\u1090\'3f\u1086\'3f\u1088\'3f. \u1051\'3f\u1072\'3f\u1076\'3f\u1085\'3f\u1086\'3f, \u1074\'3f \u1085\'3f\u1105\'3f\u1084\'3f \u1076\'3f\u1086\'3f \u1089\'3f\u1080\'3f\u1093\'3f \u1087\'3f\u1086\'3f\u1088\'3f \u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1085\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1082\'3f\u1086\'3f \u1084\'3f\u1077\'3f\u1089\'3f\u1090\'3f \u1075\'3f\u1076\'3f\u1077\'3f \u1074\'3f\u1099\'3f \u1076\'3f\u1086\'3f\u1083\'3f\u1078\'3f\u1085\'3f\u1099\'3f \u1079\'3f\u1085\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1095\'3f\u1090\'3f\u1086\'3f \u1074\'3f\u1099\'3f \u1076\'3f\u1077\'3f\u1083\'3f\u1072\'3f\u1077\'3f\u1090\'3f\u1077\'3f, \u1085\'3f\u1086\'3f \u1079\'3f\u1085\'3f\u1072\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1087\'3f\u1086\'3f \u1091\'3f\u1084\'3f\u1086\'3f\u1083\'3f\u1095\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1102\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1086\'3f\u1081\'3f\u1076\'3f\u1091\'3f\u1090\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1073\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1096\'3f\u1080\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1072\'3f \u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1077\'3f\u1083\'3f\u1077\'3f\u1081\'3f. \u1052\'3f\u1099\'3f \u1089\'3f\u1076\'3f\u1077\'3f\u1083\'3f\u1072\'3f\u1083\'3f\u1080\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1087\'3f\u1083\'3f\u1077\'3f\u1082\'3f\u1090\'3f \u1091\'3f
45\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1086\'3f\u1095\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1074\'3f \u1089\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f\u1103\'3f\u1097\'3f\u1080\'3f\u1081\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1083\'3f\u1080\'3f\u1096\'3f\u1100\'3f \u1080\'3f\u1079\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f CD, \u1074\'3f\u1089\'3f\u1105\'3f \u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1100\'3f\u1085\'3f\u1086\'3f\u1077\'3f \u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1091\'3f\u1087\'3f\u1085\'3f\u1086\'3f \u1087\'3f\u1086\'3f \u1089\'3f\u1077\'3f\u1090\'3f\u1080\'3f \u1074\'3f \u1089\'3f\u1083\'3f\u1091\'3f\u1095\'3f\u1072\'3f\u1077\'3f \u1085\'3f\u1077\'3f\u1086\'3f\u1073\'3f\u1093\'3f\u1086\'3f\u1076\'3f\u1080\'3f\u1084\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f. \u1053\'3f\u1072\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1087\'3f\u1100\'3f\u1102\'3f\u1090\'3f\u1077\'3f\u1088\'3f\u1077\'3f \u1089\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1085\'3f\u1077\'3f\u1081\'3f \u1082\'3f\u1086\'3f\u1085\'3f\u1092\'3f\u1080\'3f\u1075\'3f\u1091\'3f\u1088\'3f\u1072\'3f\u1094\'3f\u1080\'3f\u1080\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1082\'3f\u1072\'3f Ubuntu \u1087\'3f\u1088\'3f\u1086\'3f\u1080\'3f\u1079\'3f\u1074\'3f\u1086\'3f\u1076\'3f\u1080\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1084\'3f\u1077\'3f\u1085\'3f\u1077\'3f\u1077\'3f \u1095\'3f\u1077\'3f\u1084\'3f \u1079\'3f\u1072\'3f 25 \u1084\'3f\u1080\'3f\u1085\'3f\u1091\'3f\u1090\'3f. }
46\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1048\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1103\'3f\u1090\'3f\u1086\'3f\u1088\'3f \u1085\'3f\u1077\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1080\'3f\u1081\'3f, \u1085\'3f\u1086\'3f \u1074\'3f\u1072\'3f\u1084\'3f \u1085\'3f\u1091\'3f\u1078\'3f\u1085\'3f\u1086\'3f \u1073\'3f\u1091\'3f\u1076\'3f\u1077\'3f\u1090\'3f \u1080\'3f\u1089\'3f\u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1077\'3f\u1075\'3f\u1086\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1083\'3f\u1080\'3f\u1096\'3f\u1100\'3f \u1086\'3f\u1076\'3f\u1080\'3f\u1085\'3f \u1088\'3f\u1072\'3f\u1079\'3f \u1087\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1084\'3f\u1091\'3f \u1095\'3f\u1090\'3f\u1086\'3f \u1084\'3f\u1099\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1077\'3f\u1084\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f \u1089\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1081\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1080\'3f \u1085\'3f\u1072\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1091\'3f\u1102\'3f \u1087\'3f\u1086\'3f \u1089\'3f\u1077\'3f\u1090\'3f\u1080\'3f. \u1059\'3f \u1074\'3f\u1072\'3f\u1089\'3f \u1085\'3f\u1077\'3f\u1090\'3f \u1085\'3f\u1077\'3f\u1086\'3f\u1073\'3f\u1093\'3f\u1086\'3f\u1076\'3f\u1080\'3f\u1084\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f \u1087\'3f\u1077\'3f\u1088\'3f\u1077\'3f\u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1072\'3f\u1074\'3f\u1083\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1086\'3f\u1087\'3f\u1077\'3f\u1088\'3f\u1072\'3f\u1094\'3f\u1080\'3f\u1086\'3f\u1085\'3f\u1085\'3f\u1091\'3f\u1102\'3f \u1089\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1077\'3f\u1084\'3f\u1091\'3f, \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1080\'3f\u1090\'3f\u1077\'3f\u1089\'3f\u1100\'3f \u1089\'3f \u1090\'3f\u1077\'3f\u1082\'3f\u1091\'3f\u1097\'3f\u1077\'3f\u1081\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1080\'3f \u1085\'3f\u1072\'3f
47 \u1089\'3f\u1083\'3f\u1077\'3f\u1076\'3f\u1091\'3f\u1102\'3f\u1097\'3f\u1091\'3f\u1102\'3f \u1082\'3f\u1086\'3f\u1075\'3f\u1076\'3f\u1072\'3f \u1079\'3f\u1072\'3f\u1093\'3f\u1086\'3f\u1090\'3f\u1080\'3f\u1090\'3f\u1077\'3f. }
48\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1043\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1074\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1082\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1077\'3f}
49\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1050\'3f\u1072\'3f\u1082\'3f \u1090\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1082\'3f\u1086\'3f \u1074\'3f\u1099\'3f \u1079\'3f\u1072\'3f\u1074\'3f\u1077\'3f\u1088\'3f\u1096\'3f\u1080\'3f\u1090\'3f\u1077\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1082\'3f\u1091\'3f \u1074\'3f\u1072\'3f\u1096\'3f\u1072\'3f \u1089\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1077\'3f\u1084\'3f\u1072\'3f \u1089\'3f\u1088\'3f\u1072\'3f\u1079\'3f\u1091\'3f \u1078\'3f\u1077\'3f \u1075\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1074\'3f\u1072\'3f \u1082\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1077\'3f. \u1042\'3f\u1099\'3f \u1080\'3f\u1084\'3f\u1077\'3f\u1077\'3f\u1090\'3f\u1077\'3f \u1087\'3f\u1086\'3f\u1083\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1087\'3f\u1083\'3f\u1077\'3f\u1082\'3f\u1090\'3f \u1073\'3f\u1080\'3f\u1079\'3f\u1085\'3f\u1077\'3f\u1089\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f, \u1080\'3f\u1085\'3f\u1090\'3f\u1077\'3f\u1088\'3f\u1085\'3f\u1077\'3f\u1090\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f, \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1099\'3f \u1089\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1081\'3f \u1080\'3f \u1080\'3f\u1075\'3f\u1088\'3f\u1099\'3f. \u1054\'3f\u1076\'3f\u1080\'3f\u1085\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1082\'3f \u1087\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1074\'3f\u1080\'3f\u1090\'3f \u1074\'3f\u1072\'3f\u1084\'3f \u1093\'3f\u1086\'3f\u1088\'3f\u1086\'3f\u1096\'3f\u1077\'3f\u1077\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1095\'3f\u1077\'3f\u1077\'3f \u1086\'3f\u1082\'3f\u1088\'3f\u1091\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f "\u1080\'3f\u1079\'3f \u1082\'3f\u1086\'3f\u1088\'3f\u1086\'3f\u1073\'3f\u1082\'3f\u1080\'3f" \u1089\'3f\u1086\'3f \u1084\'3f\u1085\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1089\'3f\u1090\'3f
50\u1074\'3f\u1086\'3f\u1084\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1076\'3f\u1086\'3f\u1084\'3f\u1072\'3f\u1096\'3f\u1085\'3f\u1080\'3f\u1093\'3f \u1080\'3f \u1073\'3f\u1080\'3f\u1079\'3f\u1085\'3f\u1077\'3f\u1089\'3f \u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1077\'3f\u1083\'3f\u1077\'3f\u1081\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1087\'3f\u1086\'3f \u1091\'3f\u1084\'3f\u1086\'3f\u1083\'3f\u1095\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1102\'3f. \u1045\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1090\'3f\u1099\'3f\u1089\'3f\u1103\'3f\u1095\'3f\u1080\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1075\'3f\u1088\'3f\u1072\'3f\u1084\'3f\u1084\'3f \u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1091\'3f\u1087\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1089\'3f \u1087\'3f\u1086\'3f\u1084\'3f\u1086\'3f\u1097\'3f\u1100\'3f\u1102\'3f \u1085\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1082\'3f\u1080\'3f\u1093\'3f \u1082\'3f\u1083\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1074\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1072\'3f\u1082\'3f\u1086\'3f \u1084\'3f\u1099\'3f \u1090\'3f\u1103\'3f\u1078\'3f\u1077\'3f\u1083\'3f\u1086\'3f \u1087\'3f\u1086\'3f\u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1080\'3f \u1095\'3f\u1090\'3f\u1086\'3f\u1073\'3f\u1099\'3f \u1087\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1074\'3f\u1080\'3f\u1090\'3f\u1100\'3f \u1086\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1085\'3f\u1099\'3f\u1077\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f \u1080\'3f \u1101\'3f\u1092\'3f\u1092\'3f\u1077\'3f\u1082\'3f\u1090\'3f\u1080\'3f\u1074\'3f\u1085\'3f\u1086\'3f. }
51\par }
52\ No newline at end of file0\ No newline at end of file
531
=== removed file 'data/documents/Trigonometric_functions.xls'
54Binary files data/documents/Trigonometric_functions.xls 2010-08-13 16:23:16 +0000 and data/documents/Trigonometric_functions.xls 1970-01-01 00:00:00 +0000 differ2Binary files data/documents/Trigonometric_functions.xls 2010-08-13 16:23:16 +0000 and data/documents/Trigonometric_functions.xls 1970-01-01 00:00:00 +0000 differ
=== removed file 'data/images/SVG_Color_Image_Xubuntu.svg'
--- data/images/SVG_Color_Image_Xubuntu.svg 2010-08-13 16:23:16 +0000
+++ data/images/SVG_Color_Image_Xubuntu.svg 1970-01-01 00:00:00 +0000
@@ -1,109 +0,0 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg
4 xmlns:svg="http://www.w3.org/2000/svg"
5 xmlns="http://www.w3.org/2000/svg"
6 version="1.0"
7 width="350.09"
8 height="112.48"
9 id="svg2381">
10 <defs
11 id="defs2383" />
12 <g
13 transform="translate(12.587294,0.2745725)"
14 id="layer1">
15 <g
16 transform="translate(-4,0)"
17 id="g3608"
18 style="fill:#033c71;fill-opacity:1">
19 <path
20 d="M 132.72462,38.685525 C 133.7806,38.68556 134.7406,39.069557 135.6046,39.837519 C 136.37259,40.605547 136.75659,41.565541 136.7566,42.717503 L 136.7566,59.133413 C 136.75659,60.477418 136.99658,61.58141 137.47659,62.445394 C 138.14858,63.693397 138.96457,64.509391 139.92458,64.893381 C 140.78856,65.181387 141.74855,65.325386 142.80456,65.325378 C 145.20453,65.325386 146.83652,64.605391 147.70054,63.16539 L 148.13253,62.445394 C 148.61251,61.389412 148.85251,60.285419 148.85253,59.133413 L 148.85253,42.717503 C 148.85251,41.181543 149.5245,40.029551 150.86852,39.261522 C 152.21248,38.493561 153.46048,38.493561 154.6125,39.261522 C 155.95646,40.029551 156.62846,41.181543 156.62849,42.717503 L 156.62849,59.133413 C 156.05246,65.757383 153.07648,70.077355 147.70054,72.093341 C 146.16452,72.669338 144.53253,72.957336 142.80456,72.957336 C 138.19658,72.957336 134.5966,71.229348 132.00462,67.773365 C 131.52462,67.197374 131.09262,66.573378 130.70863,65.901375 C 129.55663,63.693397 128.98064,61.437411 128.98064,59.133413 L 128.98064,42.717503 C 128.98064,40.989545 129.70063,39.789552 131.14063,39.117523 C 131.62062,38.829559 132.14862,38.68556 132.72462,38.685525 M 177.11687,72.957336 L 177.69287,72.957336 L 177.69287,72.957336 C 179.99684,72.861337 182.20482,72.093342 184.31683,70.653349 C 187.77279,68.349366 189.88477,64.557391 190.6528,59.277412 C 190.84477,58.221432 190.94076,57.06944 190.9408,55.821431 C 190.94076,49.773487 189.11678,45.213517 185.46883,42.141506 C 182.97282,39.933551 180.18883,38.829559 177.11687,38.829524 C 174.81287,39.117557 172.79688,39.597554 171.06891,40.269517 L 171.06891,29.469576 C 171.06889,28.317627 170.6849,27.405633 169.91691,26.733591 C 169.14891,25.869643 168.23691,25.437646 167.18093,25.437598 C 165.54893,25.437646 164.44494,26.205641 163.86895,27.741586 C 163.58094,28.221628 163.43694,28.797624 163.43695,29.469576 L 163.43695,57.261423 C 163.43694,64.077394 165.78893,68.829363 170.49291,71.517344 C 172.70088,72.669338 174.90887,73.149335 177.11687,72.957336 M 171.06891,57.261423 L 171.06891,52.509449 C 171.06889,50.205485 171.74089,48.621495 173.08489,47.757475 C 173.27688,47.661501 173.56488,47.517502 173.94889,47.325478 C 175.00487,46.749507 176.06086,46.461509 177.11687,46.461482 C 178.26885,46.653508 179.22884,46.989505 179.99686,47.469477 C 182.20482,48.909493 183.30881,51.693475 183.30884,55.821431 C 183.30881,59.949421 182.20482,62.781403 179.99686,64.317384 C 179.03684,64.989388 178.07685,65.373386 177.11687,65.469378 L 176.68487,65.469378 C 173.51688,65.469385 171.69289,63.645397 171.2129,59.997408 C 171.11689,59.133426 171.06889,58.221432 171.06891,57.261423 M 201.06799,38.685525 C 202.12397,38.68556 203.08397,39.069557 203.94797,39.837519 C 204.71596,40.605547 205.09995,41.565541 205.09996,42.717503 L 205.09996,59.133413 C 205.09995,60.477418 205.33995,61.58141 205.81996,62.445394 C 206.49194,63.693397 207.30794,64.509391 208.26795,64.893381 C 209.13193,65.181387 210.09192,65.325386 211.14793,65.325378 C 213.5479,65.325386 215.17989,64.605391 216.0439,63.16539 L 216.4759,62.445394 C 216.95588,61.389412 217.19587,60.285419 217.1959,59.133413 L 217.1959,42.717503 C 217.19587,41.181543 217.86787,40.029551 219.21189,39.261522 C 220.55585,38.493561 221.80384,38.493561 222.95587,39.261522 C 224.29983,40.029551 224.97182,41.181543 224.97186,42.717503 L 224.97186,59.133413 C 224.39583,65.757383 221.41985,70.077355 216.0439,72.093341 C 214.50789,72.669338 212.8759,72.957336 211.14793,72.957336 C 206.53994,72.957336 202.93997,71.229348 200.34799,67.773365 C 199.86799,67.197374 199.43599,66.573378 199.052,65.901375 C 197.9,63.693397 197.324,61.437411 197.32401,59.133413 L 197.32401,42.717503 C 197.324,40.989545 198.044,39.789552 199.484,39.117523 C 199.96399,38.829559 200.49198,38.68556 201.06799,38.685525 M 231.63632,52.797448 C 231.63632,49.43749 232.64431,46.509509 234.66031,44.013496 C 237.06029,40.941545 240.56426,39.405555 245.17225,39.405521 C 252.08419,40.07755 256.35616,43.19753 257.98818,48.76547 C 258.27615,50.013486 258.46815,51.357477 258.56418,52.797448 L 258.56418,69.213357 C 258.56415,70.749351 257.84415,71.853344 256.40419,72.525339 C 255.82816,72.813337 255.30017,72.957336 254.8202,72.957336 C 253.18818,72.957336 252.08419,72.189341 251.50822,70.653349 C 251.31619,70.173355 251.22019,69.693358 251.22022,69.213357 L 251.22022,52.797448 C 251.02819,49.245491 249.01221,47.277504 245.17225,46.89348 C 241.90825,46.893506 239.94027,48.429496 239.26828,51.501455 C 239.17227,51.981473 239.12427,52.41347 239.12428,52.797448 L 239.12428,69.213357 C 239.12427,70.749351 238.35628,71.853344 236.8203,72.525339 C 236.43629,72.813337 235.95629,72.957336 235.3803,72.957336 C 233.74831,72.957336 232.59631,72.189341 231.92432,70.653349 C 231.73232,70.173355 231.63632,69.693358 231.63632,69.213357 L 231.63632,52.797448 M 272.44546,25.1496 C 273.59744,25.149648 274.55744,25.533645 275.32545,26.301594 C 276.09343,27.069635 276.42942,27.981629 276.33344,29.037578 L 276.33344,38.973524 L 281.08541,38.973524 C 282.62138,38.973558 283.77338,39.645553 284.54139,40.989513 C 285.30937,42.141537 285.30937,43.389529 284.54139,44.733492 C 283.77338,46.077511 282.62138,46.701507 281.08541,46.605482 L 276.33344,46.605482 L 276.33344,61.581399 C 276.33343,63.021401 276.57342,63.981395 277.05344,64.461383 C 277.34142,64.845389 277.82142,65.085388 278.49343,65.181379 C 279.26141,65.469385 280.2214,65.421385 281.37341,65.03738 C 282.90938,64.557391 284.25337,64.893389 285.40539,66.045375 C 286.36536,67.005375 286.65336,68.253367 286.26939,69.789354 C 285.88536,71.229348 284.97337,72.141342 283.5334,72.525339 L 280.79742,72.957336 C 276.57342,73.245335 273.40544,72.093342 271.29347,69.501355 C 269.56547,67.485372 268.70148,64.845389 268.70148,61.581399 L 268.70148,46.605482 L 266.39749,46.605482 C 264.8615,46.701507 263.75751,46.077511 263.08551,44.733492 C 262.31752,43.389529 262.31752,42.141537 263.08551,40.989513 C 263.75751,39.645553 264.8615,38.973558 266.39749,38.973524 L 268.70148,38.973524 L 268.70148,29.037578 C 268.70148,27.501632 269.37347,26.30164 270.71747,25.437598 C 271.29346,25.245647 271.86945,25.149648 272.44546,25.1496 M 293.87998,38.685525 C 294.93597,38.68556 295.89596,39.069557 296.75997,39.837519 C 297.52795,40.605547 297.91195,41.565541 297.91196,42.717503 L 297.91196,59.133413 C 297.91195,60.477418 298.15195,61.58141 298.63196,62.445394 C 299.30394,63.693397 300.11994,64.509391 301.07994,64.893381 C 301.94392,65.181387 302.90392,65.325386 303.95993,65.325378 C 306.3599,65.325386 307.99188,64.605391 308.8559,63.16539 L 309.2879,62.445394 C 309.76787,61.389412 310.00787,60.285419 310.00789,59.133413 L 310.00789,42.717503 C 310.00787,41.181543 310.67987,40.029551 312.02388,39.261522 C 313.36785,38.493561 314.61584,38.493561 315.76786,39.261522 C 317.11183,40.029551 317.78382,41.181543 317.78385,42.717503 L 317.78385,59.133413 C 317.20782,65.757383 314.23184,70.077355 308.8559,72.093341 C 307.31989,72.669338 305.6879,72.957336 303.95993,72.957336 C 299.35194,72.957336 295.75196,71.229348 293.15999,67.773365 C 292.67998,67.197374 292.24799,66.573378 291.86399,65.901375 C 290.712,63.693397 290.136,61.437411 290.136,59.133413 L 290.136,42.717503 C 290.136,40.989545 290.856,39.789552 292.29599,39.117523 C 292.77598,38.829559 293.30398,38.68556 293.87998,38.685525"
21 id="text2284"
22 style="font-size:39.99980164px;font-style:normal;font-weight:normal;fill:#033c71;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Ubuntu-Title" />
23 <path
24 d="M 98.383398,38.829522 C 99.631385,38.829557 100.63938,39.309554 101.40738,40.269515 L 109.18334,49.917461 L 116.9593,40.269515 C 117.91927,39.117555 119.11926,38.637558 120.55928,38.829522 C 121.99924,39.117555 123.00723,39.93355 123.58326,41.277509 C 124.06323,42.621532 123.82323,43.869524 122.86326,45.021488 L 114.07931,55.965428 L 122.86326,66.765369 C 123.82323,67.917367 124.06323,69.213359 123.58326,70.653347 C 123.00723,71.997341 121.99924,72.765336 120.55928,72.957334 C 119.11926,73.245333 117.91927,72.813335 116.9593,71.661342 L 109.18334,62.013395 L 101.40738,71.661342 C 100.44738,72.813335 99.247387,73.245333 97.807401,72.957334 C 96.367406,72.765336 95.359413,71.997341 94.783418,70.653347 C 94.303419,69.213359 94.543418,67.917367 95.503414,66.765369 L 104.28737,55.965428 L 95.503414,45.021488 C 94.447418,43.773525 94.25542,42.429533 94.927417,40.989511 C 95.599411,39.549552 96.751403,38.829557 98.383398,38.829522"
25 id="text3378"
26 style="font-size:39.99980164px;font-style:normal;font-weight:normal;fill:#033c71;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Ubuntu-Title" />
27 </g>
28 <path
29 d="M 48.170328,38.523239 C 56.951238,38.523239 64.234688,45.042968 65.440648,53.494696 L 77.521798,53.494696 C 76.972658,46.853448 74.219248,40.663667 69.616138,35.7806 C 66.667378,37.283437 63.041798,37.311894 59.962288,35.533716 C 56.880478,33.75477 55.092298,30.59835 54.920788,27.290416 C 52.732678,26.780498 50.472268,26.515156 48.170328,26.515156 C 43.762568,26.515156 39.502478,27.47731 35.629248,29.302403 L 41.676748,39.778423 C 43.684888,38.969322 45.876848,38.523239 48.170328,38.523239 z"
30 id="path2111"
31 style="fill:#639ad2;fill-opacity:1;stroke:none;stroke-opacity:1" />
32 <path
33 d="M 65.442188,58.439291 C 64.238528,66.894864 56.952768,73.418438 48.170328,73.418438 C 45.874538,73.418438 43.683348,72.971587 41.673668,72.162485 L 35.626178,82.638503 C 39.500178,84.465135 43.761028,85.427289 48.170328,85.427289 C 50.474578,85.427289 52.737288,85.162716 54.926938,84.651259 C 55.096148,81.340251 56.883548,78.179217 59.969218,76.397963 C 63.048718,74.619016 66.675838,74.648242 69.625368,76.151848 C 74.225398,71.268781 76.975728,65.079769 77.523338,58.44006 L 65.442188,58.44006 L 65.442188,58.439291 z"
34 id="path2113"
35 style="fill:#23507b;fill-opacity:1" />
36 <circle
37 cx="98.936996"
38 cy="9.1700001"
39 r="9.1680002"
40 transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)"
41 id="circle2117"
42 style="fill:#10518b;fill-opacity:1" />
43 <circle
44 cx="33.206001"
45 cy="47.130001"
46 r="9.1680002"
47 transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)"
48 id="circle2107"
49 style="fill:#4b9aeb;fill-opacity:1" />
50 <path
51 d="M 30.723108,55.971223 C 30.723108,50.412111 33.335768,45.452902 37.397428,42.25572 L 31.350698,31.782008 C 29.932468,32.772619 28.590378,33.894747 27.342111,35.14301 C 23.84267,38.64322 21.332301,42.868699 19.951753,47.479502 C 22.734385,49.281522 24.577168,52.410253 24.577168,55.971992 C 24.577168,59.533732 22.734385,62.662463 19.951753,64.463714 C 21.332301,69.076054 23.84267,73.300765 27.342111,76.799437 C 28.589608,78.048468 29.930928,79.169059 31.347628,80.15967 L 37.395898,69.684419 C 33.334228,66.486468 30.723108,61.528029 30.723108,55.971223 z"
52 id="path2115"
53 style="fill:#b4d1ea;fill-opacity:1" />
54 <circle
55 cx="98.945"
56 cy="85.073997"
57 r="9.1689997"
58 transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)"
59 id="circle3484"
60 style="fill:#83bef1;fill-opacity:1" />
61 <path
62 d="M 48.170328,38.523239 C 56.951238,38.523239 64.234688,45.042968 65.440648,53.494696 L 77.521798,53.494696 C 76.972658,46.853448 74.219248,40.663667 69.616138,35.7806 C 66.667378,37.283437 63.041798,37.311894 59.962288,35.533716 C 56.880478,33.75477 55.092298,30.59835 54.920788,27.290416 C 52.732678,26.780498 50.472268,26.515156 48.170328,26.515156 C 43.762568,26.515156 39.502478,27.47731 35.629248,29.302403 L 41.676748,39.778423 C 43.684888,38.969322 45.876848,38.523239 48.170328,38.523239 z"
63 id="path3679"
64 style="fill:#639ad2;fill-opacity:0;stroke:none;stroke-opacity:1" />
65 <path
66 d="M 30.723108,55.971223 C 30.723108,50.412111 33.335768,45.452902 37.397428,42.25572 L 31.350698,31.782008 C 29.932468,32.772619 28.590378,33.894747 27.342111,35.14301 C 23.84267,38.64322 21.332301,42.868699 19.951753,47.479502 C 22.734385,49.281522 24.577168,52.410253 24.577168,55.971992 C 24.577168,59.533732 22.734385,62.662463 19.951753,64.463714 C 21.332301,69.076054 23.84267,73.300765 27.342111,76.799437 C 28.589608,78.048468 29.930928,79.169059 31.347628,80.15967 L 37.395898,69.684419 C 33.334228,66.486468 30.723108,61.528029 30.723108,55.971223 z"
67 id="path3691"
68 style="fill:#b4d1ea;fill-opacity:0" />
69 <path
70 d="M 65.442188,58.439291 C 64.238528,66.894864 56.952768,73.418438 48.170328,73.418438 C 45.874538,73.418438 43.683348,72.971587 41.673668,72.162485 L 35.626178,82.638503 C 39.500178,84.465135 43.761028,85.427289 48.170328,85.427289 C 50.474578,85.427289 52.737288,85.162716 54.926938,84.651259 C 55.096148,81.340251 56.883548,78.179217 59.969218,76.397963 C 63.048718,74.619016 66.675838,74.648242 69.625368,76.151848 C 74.225398,71.268781 76.975728,65.079769 77.523338,58.44006 L 65.442188,58.44006 L 65.442188,58.439291 z"
71 id="path3719"
72 style="fill:#23507b;fill-opacity:0" />
73 <g
74 id="g3583">
75 <path
76 d="M 24.061618,45.222977 C 24.182455,45.202763 27.195524,46.793186 29.220781,47.342794 C 32.832196,48.265693 36.128715,51.043377 37.72206,52.638967 C 37.840199,52.775526 39.090573,51.702815 40.399121,51.780079 C 42.18652,51.888338 47.717183,53.4435 48.456125,52.38449 C 48.904214,51.762784 48.872098,51.000028 49.431138,50.687603 C 49.732108,50.603377 48.312384,48.006724 49.821276,47.17479 C 50.897132,46.637087 51.808803,49.64746 52.085062,49.984816 C 52.208817,50.13575 52.865338,50.172585 52.787627,49.828716 C 52.703401,49.455199 51.641465,46.566561 52.943724,46.081865 C 55.058825,45.244315 54.683962,49.777955 54.738985,49.906878 C 54.85601,50.181345 62.105337,50.392922 62.54489,53.653729 C 62.799141,55.448318 56.737069,57.767808 56.144115,58.18108 C 55.551386,58.594353 55.600792,59.255363 55.831913,59.664368 C 56.097621,60.107962 57.863686,61.605175 57.627398,62.318293 C 57.465011,62.730218 54.168945,61.220427 53.958491,61.537793 C 53.478511,62.144001 56.357938,63.661428 55.363614,64.738182 C 54.969432,64.996028 50.434216,62.839376 50.445673,62.864756 C 50.323939,62.911025 44.03726,64.013158 39.205118,62.552332 C 39.034868,62.504266 36.103784,65.383695 35.770472,65.284644 C 35.314749,65.117539 36.442263,62.780305 36.316933,62.318293 C 36.112094,62.060897 34.239119,63.363378 34.131308,62.708657 C 34.002385,61.848197 35.774963,60.859038 35.692533,60.288768 C 35.235463,57.049074 35.896698,55.157231 37.019494,53.575791 C 37.393915,52.993616 32.619046,49.387817 29.16216,47.964724 C 25.705498,46.54163 23.856105,45.335504 24.061618,45.222977 z"
77 id="path14"
78 style="fill:#0a2a49;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.22460442pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
79 <path
80 d="M 55.12719,56.055065 C 55.089224,55.922549 57.486208,54.472727 57.833223,54.80604 C 58.457844,55.032441 55.149197,56.223293 55.12719,56.055065 z"
81 id="path7"
82 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
83 <path
84 d="M 56.271995,57.373493 C 56.060868,57.245917 57.706995,55.326448 58.110829,55.534657 C 58.700414,56.120425 56.244372,57.419087 56.271995,57.373493 z"
85 id="path8"
86 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
87 <path
88 d="M 62.759692,48.49196 C 62.559572,48.326427 60.990258,50.802466 61.337271,51.059413 C 61.545928,51.215514 62.849085,48.58023 62.759692,48.49196 z"
89 id="path13"
90 style="fill:#0a2a49;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
91 <ellipse
92 cx="288.86475"
93 cy="374.58655"
94 rx="3.012037"
95 ry="3.398196"
96 transform="matrix(0.2078264,0,0,0.2097329,-4.371806,-26.527264)"
97 id="ellipse17"
98 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.6pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
99 <path
100 d="M 60.955646,48.14503 C 60.856601,48.030032 60.331025,50.698332 60.574044,50.816474 C 60.7827,50.972575 61.146114,48.283835 60.955646,48.14503 z"
101 id="path18"
102 style="fill:#0a2a49;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
103 <path
104 d="M 54.25687,51.756136 C 53.634487,52.196137 54.598493,54.686101 56.183974,53.232237 C 54.938318,53.268847 54.522794,52.904089 54.25687,51.756136 z"
105 id="path21"
106 style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
107 </g>
108 </g>
109</svg>
1100
=== modified file 'data/whitelists/default.whitelist'
--- data/whitelists/default.whitelist 2012-02-15 00:11:21 +0000
+++ data/whitelists/default.whitelist 2012-06-23 00:59:17 +0000
@@ -12,11 +12,17 @@
12sleep12sleep
13display13display
14optical_drive14optical_drive
15block_device
15__audio__16__audio__
16audio/alsa_record_playback_external17audio/alsa_record_playback_external
17audio/alsa_record_playback_internal18audio/alsa_record_playback_internal
18audio/alsa_record_playback_usb19audio/alsa_record_playback_usb
19audio/playback_auto20audio/playback_auto
21__benchmarks__
22benchmarks/disk/hdparm-read
23benchmarks/disk/hdparm-read_.*
24benchmarks/disk/hdparm-cache-read
25benchmarks/disk/hdparm-cache-read_.*
20__bluetooth__26__bluetooth__
21bluetooth/detect-output27bluetooth/detect-output
22__camera__28__camera__
@@ -28,8 +34,6 @@
28cpu/topology34cpu/topology
29cpu/clocktest35cpu/clocktest
30__disk__36__disk__
31disk/benchmarks
32disk/benchmark_sd\w
33disk/detect37disk/detect
34__firewire__38__firewire__
35firewire/insert39firewire/insert
@@ -59,6 +63,7 @@
59input/keyboard63input/keyboard
60input/mouse64input/mouse
61__keys__65__keys__
66keys/super
62keys/battery-info67keys/battery-info
63keys/brightness68keys/brightness
64keys/media-control69keys/media-control
6570
=== added file 'data/whitelists/smoke.whitelist'
--- data/whitelists/smoke.whitelist 1970-01-01 00:00:00 +0000
+++ data/whitelists/smoke.whitelist 2012-06-23 00:59:17 +0000
@@ -0,0 +1,25 @@
1## This is an example whitelist to start from.
2## To use, copy this file and add the jobs you want to run to the copy. Delete
3## these comments. DO NOT delete the first 9 jobs in tis file. They are resource
4## gathering jobs and are necessary to do any testing at all.
5# Resource Jobs (listed in jobs/resource.txt)
6cpuinfo
7cdimage
8dmi
9dpkg
10gconf
11lsb
12meminfo
13module
14package
15device
16uname
17# Smoke test cases
18__smoke__
19smoke/true
20smoke/false
21smoke/dependency/good
22smoke/dependency/bad
23smoke/requirement/good
24smoke/requirement/bad
25smoke/manual
026
=== added file 'data/whitelists/sniff.whitelist'
--- data/whitelists/sniff.whitelist 1970-01-01 00:00:00 +0000
+++ data/whitelists/sniff.whitelist 2012-06-23 00:59:17 +0000
@@ -0,0 +1,25 @@
1## This is an example whitelist to start from.
2## To use, copy this file and add the jobs you want to run to the copy. Delete
3## these comments. DO NOT delete the first 9 jobs in tis file. They are resource
4## gathering jobs and are necessary to do any testing at all.
5# Resource Jobs (listed in jobs/resource.txt)
6cpuinfo
7cdimage
8dmi
9dpkg
10gconf
11lsb
12meminfo
13module
14package
15device
16uname
17# Smoke sniffcases
18__sniff__
19sniff/sniff7
20sniff/sniff6
21sniff/sniff5
22sniff/sniff4
23sniff/sniff3
24sniff/sniff2
25sniff/sniff1
026
=== modified file 'debian/changelog'
--- debian/changelog 2012-04-11 17:20:37 +0000
+++ debian/changelog 2012-06-23 00:59:17 +0000
@@ -1,3 +1,218 @@
1checkbox (0.14) quantal; urgency=low
2
3 * New upstream release (LP: #1016746):
4
5 [Aurelien Gateau]
6 * lib/template.py, lib/template_i18n.py, plugins/jobs_info.py,
7 plugins/suites_prompt.py: Add a "sortkey" attribute to jobs, the sortkey
8 order matches the order in which they appear in jobfiles.
9 * checkbox_gtk/gtk_interface.py: Shows jobs and suites in sortkey order
10 (that is, as they appear in job definition files, rather than
11 alphabetically).
12 * checkbox_gtk/gtk_interface.py, gtk/checkbox-gtk.ui,
13 plugins/jobs_prompt.py: Added a progress bar showing tests completed and
14 total.
15
16 [Brendan Donegan]
17 * jobs/suspend.txt.in: Fixed dependencies on wireless and suspend_advanced
18 jobs.
19 * Changed screenshot jobs to use /dev/external_webcam which will be set by
20 a udev rule (LP: #956885)
21 * [FEATURE] Added touchpad tests from CE QA Checkbox to allow touchpad
22 testing to be performed
23 * [FEATURE] Python 2 to 3 conversion:
24 * scripts/create_connection - switched to using argparse and fixed
25 representation of octal literal
26 * scripts/internet_test - ran 2to3 tool and decoded result of
27 check_output. Also replaced optparse with argparse
28 * scripts/memory_info
29 * scripts/removable_storage_test - ran 2to3 tool and fixed some
30 encoding issues
31 * scripts/removable_storage_watcher - ran 2to3 tool and swapped
32 use of gobject with gi.repository.GObject
33 * scripts/xrandr_cycle - ran 2to3 tool and fixed encoding issue
34 * scripts/obex_send - ran 2to3 tool and swapped
35 use of gobject with gi.repository.GObject
36 * Update touchpad.py to use gsettings instead of deprecated gconf
37 (LP: #1004212)
38 * Instead of checking output of nmcli con up in create_connection,
39 check the return code is success instead (LP: #1013537)
40 * base64 encode the after suspend screenshot attachement so that it can
41 be uploaded properly (LP: #1016126)
42 * Fixed simple type in xorg_memory_test, introduced by Python3
43 conversion (LP: #1016387)
44 * [FEATURE] Add suspend/bluetooth_obex_after_suspend_auto test to be
45 used during fully automated SRU testing
46
47 [Daniel Manrique]
48 * Tweaks to internet_test: don't try to ping an IP that's unreachable from
49 the specified interface (or at all), try to find something pingable via
50 other means.
51 * Reverted feature to keep tests ordered, as the sortkey attribute causes
52 undesirable secondary effects.
53 * New version 0.14 for Quantal Quetzal development.
54 * Set the correct user (root) for fwts-wakealarm test (LP: #1004102)
55 * Set correct user (root) for usb/storage-preinserted, so it works correctly
56 on servers (LP: #1004131)
57 * Log (at level INFO) name of each message we execute, so the currently
58 running job can be determined by looking at the logfile, rather than
59 hunting through process lists.
60 * [FEATURE] Added script and jobs to collect and attach output from
61 alsa-info.sh.
62 * Assume utf-8 encoding always, when opening template files.
63 (LP: #1015174)
64 * [FEATURE] Replaced the context menu in the selection tree with explicit
65 "select/deselect all" buttons.
66
67 [Javier Collado]
68 * Updated camera_test script to use better tool for capturing the image
69 and allow specifying a device to use, plus other improvements. Create a
70 job which takes a capture from the webcam of the desktop.
71 * Added jobs to take screenshots after suspend and attach the resulting jpg
72 * [FEATURE] Added smoke test jobs, whitelist and local job to use for
73 checkbox development purposes.
74 * Fixed "camera_test detect" problem with missing args attributes (LP:
75 #967419)
76 * Submission screen in Qt interface updated to support certification client:
77 - customize contents depending on the upload target (launchpad or certification)
78 - display links to the report properly in the show_entry method
79 * Fixed qt interface show_entry method preopulates widget that gets
80 user input (LP: #1000451)
81 * Added customizable deselect_warning message in qt show_tree method (LP: #1000443)
82 * show_error method shows long text properly in gtk/qt interfaces (LP:
83 #1012052)
84
85 [Jeff Lane]
86 * Created automated version of optical/read for server testing
87 Fixed issues with optical_read_test script:
88 - test could pass if /dev/cdrom did not exist
89 - test could pass if /dev/cdrom was inaccessible
90 - test could pass if no optical device was passed in (LP: #945178)
91 * Removed hard coded paths from scripts (LP: #949435)
92 * Removed files in /data that are not used in any job descriptions
93 (LP: #957396)
94 * [FEATURE] Modified stress jobs so that they are all automated per decision
95 made during the cert sprint.
96 * [FEATURE] Changes to Power Management testing in Checkbox:
97 * scripts/pm_test: added a slightly modified version of OEM team's pm.py
98 script for reboot/poweroff testing
99 * jobs/hibernate.txt.in: modified hibernate test to use fwts and added new
100 jobs to attach log files from hibernate testing.
101 * jobs/power-management.txt.in: added new poweroff and reboot jobs using pm_test
102 script. Added jobs to attach logs from reboot and poweroff tests to
103 results.
104 * jobs/stress.txt.in: modified suspend_30_cycles and hibernate_30_cycles to
105 use fwts. Added jobs to attach logs from 30 cycle tests to results.
106 * jobs/suspend.txt.in: Modified suspend_advanced and suspend_advanced_auto to use
107 fwts. Added job to attach log from suspend_advanced and suspend_advanced_auto
108 to results.
109 * [FEATURE] jobs/miscellanea.txt.in: added a job to gather tester info for
110 certification purposes. Not to be used for UF.
111 * [FEATURE] Python 2 to 3 conversion:
112 * scripts/cpu_topology: ran 2to3, made modificates based on code review and
113 tested script to verify functionality.
114 * scripts/disk_smart: ported to Python 3. Inserted bits to decode byte
115 data returned by Popen. Fixed list_handler to decode bytes types to clean
116 up debug output. Added bits to improve debug output. Migrated from
117 optparse to argparse.
118 * scripts/network_check: ran 2to3 and that was all that was needed. Also
119 took the liberty of migrating from optparse to ArgParse sine we're
120 Python3 only now.
121 * scripts/network_device_info: ran 2to3 and changed shebang.
122 * scripts/network_info: ran 2to3 and changed shebang. Fixed encoding issue
123 with interface[:15] (needed to be a bytes object).
124 * scripts/fwts_test: ran 2to3 and changed shebang, fixed an encoding bug
125 with Popen output. Cleaned up the final output to be more useful for
126 debugging test failures.
127 * scripts/keyboard_test: nothing to do for conversion beyond changing shebang.
128 * scripts/network_ntp_test: 2to3 changed nothing, so modified shebang.
129 Fixed an encoding issue with Popen output in. Re-inserted a call to
130 SilentCall() that was removed from TimeSkew() by someone in a previous
131 revision, which made the TimeSkew() function do nothing. Fixed an
132 unbuffered I/O error in SilentCall() discovered while testing Python3
133 changes.
134 * scripts/optical_detect, scripts/optical_read_test: ran 2to3 and changed
135 shebang. Changes were minimal.
136 * scripts/xorg_memory_test: 2to3 made minimal changes, modifed shebang.
137 Converted optparse code to argparse code and replaced sys.argv[] stuff
138 with more useful positional arguments. Removed a redundant import that
139 2to3 injected.
140 * scripts/resolution_test: ran 2to3 with minimal changes. Changed shebang.
141 Converted optparse to argparse and removed unnecessary calls to
142 sys.argv[]
143 * scripts/pm_log_check: ran 2to3 and changed shebang.
144 * scripts/pm_test: ran 2to3 and changed shebang. After a lot of trial and
145 error, changed the way xinput is called to avoid confusing bytecode
146 embedded in the command output that was causing problems with
147 bytes.decode() on the "after reboot" hardware checks.
148
149 [Jeff Marcom]
150 * [FEATURE] Python 2 to 3 conversion:
151 * scripts/memory_info
152 * scripts/memory_test
153 * scripts/touchpad_test
154 * Deprecated: wake_on_lan_test
155 * Update touchpad.py to use gsettings instead of deprecated gconf
156 (LP: #1004212)
157
158 [Marc Tardif]
159 * [FEATURE] Reworked media_keys_test into key_test, making it more generic
160 and able to test for any key that sends an scancode. Used it to implement
161 a test for the Super key.
162 * [FEATURE] Added new interactive and auto-verifying touchpad scrolling
163 test.
164 * [FEATURE] Python 2 to 3 conversion:
165 * scripts/ansi_parser
166 * scripts/cking_suite
167 * scripts/floppy_test
168 * scripts/network_bandwidth_test
169 * scripts/cpu_scaling_test
170 * Removed sleep_test script no longer used by any test definition.
171 * [FEATURE] Deprecated scripts:
172 * scripts/autotest_filter and scripts/autotest_suite
173 * scripts/ltp_filter and scripts/ltp_suite
174 * scripts/mago_filter and scripts/mago_suite
175 * scripts/qa_regression_suite
176 * [FEATURE] Reworked media_keys_test into key_test, making it more generic
177 and able to test for any key that sends an scancode. Used it to implement
178 a test for the Super key.
179 * [FEATURE] Added new interactive and auto-verifying touchpad scrolling
180 test.
181 * Removed sleep_test script no longer used by any test definition.
182 * Migrated project minus scripts to Python 3.
183
184 [Sylvain Pineau]
185 * Updated gst_pipeline_test to add a --fullscreen option for video playback.
186 * Add python-gtk2 dependency, Gst from gi.repository don't work well with
187 messages (See https://bugzilla.gnome.org/show_bug.cgi?id=631901).
188 * Add a new job to capture screen during fullscreen video playback.
189 * qt/frontend/qtfront.cpp, qt/frontend/qtfront.h, plugins/suites_prompt.py,
190 checkbox_qt/qt_interface.py, plugins/jobs_prompt.py: The selection tree is
191 now updated when recovering from a previous run (LP: #937696)
192 * [FEATURE] Python 2 to 3 conversion:
193 * scripts/gst_pipeline_test. Migrated to PyGI.
194 * scripts/removable_resource: Add a resource job to identify removable
195 block devices. __disks__ jobs updated to run only on internal drives.
196 * [FEATURE] jobs/benchmarks.txt.in, scripts/pts_run: Add a reworked launcher
197 for phoronix-test-suite tests.
198 * [FEATURE] Python 2 to 3 conversion:
199 * jobs/stress.txt.in: add OEM team's stress tests (including reboot and poweroff)
200 and log analysis jobs
201
202 [Tiago Salem Herrmann]
203 * checkbox_qt/qt_interface.py, qt/frontend/qtfront.cpp,
204 qt/frontend/qtfront.h, qt/frontend/treemodel.cpp, qt/frontend/treemodel.h:
205 Makes it possible for the job selection tree to have more than 2 levels of
206 children nodes.
207 * checkbox/user_interface.py, checkbox_qt/qt_interface.py,
208 plugins/user_interface.py, qt/frontend/qtfront.cpp, qt/frontend/qtfront.h:
209 Correctly update automated test execution status in the Selection tab
210 (LP: #950105).
211 * qt/frontend/qtfront.cpp: Avoid QDBusArgument warnings when running
212 checkbox-qt from a terminal (LP: #957476)
213
214 -- Marc Tardif <marc@ubuntu.com> Fri, 22 Jun 2012 17:04:14 -0400
215
1checkbox (0.13.7) precise; urgency=low216checkbox (0.13.7) precise; urgency=low
2217
3 * New upstream release (LP: #980063)218 * New upstream release (LP: #980063)
4219
=== modified file 'debian/checkbox.dirs'
--- debian/checkbox.dirs 2009-03-17 09:46:16 +0000
+++ debian/checkbox.dirs 2012-06-23 00:59:17 +0000
@@ -1,2 +1,3 @@
1etc/checkbox.d1etc/checkbox.d
2usr/share/icons
2usr/share/locale3usr/share/locale
34
=== modified file 'debian/control'
--- debian/control 2012-03-07 19:46:29 +0000
+++ debian/control 2012-06-23 00:59:17 +0000
@@ -3,24 +3,58 @@
3Priority: optional3Priority: optional
4Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>4Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
5Standards-Version: 3.9.25Standards-Version: 3.9.2
6X-Python-Version: >= 2.66X-Python3-Version: >= 3.2
7Build-Depends: debhelper (>= 7.0.50~), dh-translations, libqt4-dev, python (>= 2.6.6-3~), po-debconf, python-distutils-extra, qt4-qmake7Build-Depends: debhelper (>= 9.2),
8 dh-translations,
9 libqt4-dev,
10 po-debconf,
11 python3 (>= 3.2),
12 python3-distutils-extra,
13 qt4-qmake
8Vcs-Bzr: https://code.launchpad.net/~hardware-certification/checkbox/trunk14Vcs-Bzr: https://code.launchpad.net/~hardware-certification/checkbox/trunk
915
10Package: checkbox16Package: checkbox
11Section: python17Section: python
12Architecture: any18Architecture: any
13Depends: ${misc:Depends}, ${python:Depends}, debconf, python-libxml2, udev19Depends: debconf, python3-lxml, udev, ${misc:Depends}, ${python3:Depends}
14Recommends: dpkg (>= 1.13), gstreamer0.10-gconf, lsb-release, perl, pm-utils, python-apport, python-apt, python-dateutil, python-gst0.1020Recommends: dpkg (>= 1.13),
15Suggests: checkbox-cli | checkbox-gtk, bonnie++, bootchart, bzr, cvs, ethtool, flex, fwts, git-core, hdparm, lshw, make, nmap, obexd-client, python-pexpect, smartmontools, sox, stress, wodim21 gir1.2-gst-plugins-base-0.10 | gir1.2-gst-plugins-base-1.0,
16Description: System testing application 22 gstreamer0.10-gconf | gstreamer1.0-plugins-good,
23 lsb-release,
24 perl,
25 pm-utils,
26 python-apport,
27 python-apt,
28 python3-dbus,
29 python3-gi
30Suggests: bonnie++,
31 bootchart,
32 checkbox-cli | checkbox-gtk,
33 ethtool,
34 fwts,
35 git-core,
36 glmark2,
37 glmark2-es2,
38 hdparm,
39 lshw,
40 mesa-utils,
41 nmap,
42 obexd-client,
43 render-bench,
44 smartmontools,
45 sox,
46 stress,
47 sysstat,
48 wmctrl,
49 wodim
50Description: System testing application
17 This project provides an extensible interface for system testing. The51 This project provides an extensible interface for system testing. The
18 results can then be sent to Launchpad.52 results can then be sent to Launchpad.
1953
20Package: checkbox-cli54Package: checkbox-cli
21Architecture: all55Architecture: all
22Depends: checkbox (>= ${source:Version}), ${misc:Depends}56Depends: checkbox (>= ${source:Version}), ${misc:Depends}
23Description: Command line interface for checkbox 57Description: Command line interface for checkbox
24 This project provides an extensible interface for system testing. The58 This project provides an extensible interface for system testing. The
25 results can then be sent to Launchpad.59 results can then be sent to Launchpad.
26 .60 .
@@ -28,18 +62,23 @@
2862
29Package: checkbox-urwid63Package: checkbox-urwid
30Architecture: all64Architecture: all
31Depends: checkbox (>= ${source:Version}), python-urwid, ${misc:Depends}65Depends: checkbox (>= ${source:Version}), python3-urwid, ${misc:Depends}
32Description: Urwid interface for checkbox 66Description: Urwid interface for checkbox
33 This project provides an extensible interface for system testing. The67 This project provides an extensible interface for system testing. The
34 results can then be sent to Launchpad.68 results can then be sent to Launchpad.
35 .69 .
36 This package provides a command line interface (urwid version) for 70 This package provides a command line interface (urwid version) for
37 answering tests.71 answering tests.
3872
39Package: checkbox-gtk73Package: checkbox-gtk
40Section: gnome74Section: gnome
41Architecture: all75Architecture: all
42Depends: checkbox (>= ${source:Version}), gksu, python-gobject (>= 2.28), gir1.2-gtk-3.0, python-cairo, ${misc:Depends}76Depends: checkbox (>= ${source:Version}),
77 gir1.2-gtk-3.0,
78 gksu,
79 python3-gi,
80 python3-gi-cairo,
81 ${misc:Depends}
43Description: GTK interface for checkbox82Description: GTK interface for checkbox
44 This project provides an extensible interface for system testing. The83 This project provides an extensible interface for system testing. The
45 results can then be sent to Launchpad.84 results can then be sent to Launchpad.
@@ -48,7 +87,11 @@
4887
49Package: checkbox-qt88Package: checkbox-qt
50Architecture: any89Architecture: any
51Depends: checkbox (>= ${source:Version}), libqtgui4, libqt4-dbus, ${misc:Depends}90Depends: checkbox (>= ${source:Version}),
91 libqt4-dbus,
92 libqtgui4,
93 python3-dbus,
94 ${misc:Depends}
52Description: QT4 interface for checkbox95Description: QT4 interface for checkbox
53 This project provides an extensible interface for system testing. The96 This project provides an extensible interface for system testing. The
54 results can then be sent to Launchpad.97 results can then be sent to Launchpad.
5598
=== modified file 'debian/po/ast.po'
--- debian/po/ast.po 2012-04-02 15:22:05 +0000
+++ debian/po/ast.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-22 04:43+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14981)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/cs.po'
--- debian/po/cs.po 2012-03-21 02:22:11 +0000
+++ debian/po/cs.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/de.po'
--- debian/po/de.po 2012-03-21 02:22:11 +0000
+++ debian/po/de.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/en_AU.po'
--- debian/po/en_AU.po 2012-03-21 02:22:11 +0000
+++ debian/po/en_AU.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/en_GB.po'
--- debian/po/en_GB.po 2012-03-21 02:22:11 +0000
+++ debian/po/en_GB.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/es.po'
--- debian/po/es.po 2012-04-11 17:20:37 +0000
+++ debian/po/es.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-04-07 04:33+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 15060)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
@@ -75,8 +75,7 @@
75#. Description75#. Description
76#: ../checkbox.templates:400176#: ../checkbox.templates:4001
77msgid "List of jobs to run when testing with checkbox."77msgid "List of jobs to run when testing with checkbox."
78msgstr ""78msgstr "Lista de tareas a ejecutar mientras se realizan pruebas con checkbox."
79"Lista de tareas a ejecutar mientras se realizan pruebas con checkbox."
8079
81#. Type: string80#. Type: string
82#. Description81#. Description
8382
=== modified file 'debian/po/fr.po'
--- debian/po/fr.po 2012-03-21 02:22:11 +0000
+++ debian/po/fr.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/he.po'
--- debian/po/he.po 2012-03-21 02:22:11 +0000
+++ debian/po/he.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/hu.po'
--- debian/po/hu.po 2012-03-21 02:22:11 +0000
+++ debian/po/hu.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/it.po'
--- debian/po/it.po 2012-03-21 02:22:11 +0000
+++ debian/po/it.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/ja.po'
--- debian/po/ja.po 2012-03-21 02:22:11 +0000
+++ debian/po/ja.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
@@ -31,8 +31,9 @@
31"If this option is set to Yes, then checkbox will ask if the user wants to "31"If this option is set to Yes, then checkbox will ask if the user wants to "
32"file a bug for failing tests, even if apport is not enabled."32"file a bug for failing tests, even if apport is not enabled."
33msgstr ""33msgstr ""
34"このオプションが有効になっていると、テストに失敗した際にバグ報告を行うかどうか、checkboxが確認するようになります。これはapportが有効になって"34"このオプションが有効になっていると、テストに失敗した際にバグ報告を行うかどう"
35"いなくても機能します。"35"か、checkboxが確認するようになります。これはapportが有効になっていなくても機"
36"能します。"
3637
37#. Type: string38#. Type: string
38#. Description39#. Description
@@ -46,7 +47,9 @@
46msgid ""47msgid ""
47"When filing a new bug through checkbox, if it does not guess the package, "48"When filing a new bug through checkbox, if it does not guess the package, "
48"the default package that the bug will be file against."49"the default package that the bug will be file against."
49msgstr "checkbox経由でバグ報告を行う場合、パッケージ名を推定できなかったときは、デフォルトのパッケージ名を用いて報告します。"50msgstr ""
51"checkbox経由でバグ報告を行う場合、パッケージ名を推定できなかったときは、デ"
52"フォルトのパッケージ名を用いて報告します。"
5053
51#. Type: string54#. Type: string
52#. Description55#. Description
5356
=== modified file 'debian/po/nl.po'
--- debian/po/nl.po 2012-03-21 02:22:11 +0000
+++ debian/po/nl.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/oc.po'
--- debian/po/oc.po 2012-03-21 02:22:11 +0000
+++ debian/po/oc.po 2012-06-23 00:59:17 +0000
@@ -11,12 +11,12 @@
11"PO-Revision-Date: 2012-02-24 07:45+0000\n"11"PO-Revision-Date: 2012-02-24 07:45+0000\n"
12"Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary@yahoo.fr>\n"12"Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary@yahoo.fr>\n"
13"Language-Team: Occitan (post 1500) <oc@li.org>\n"13"Language-Team: Occitan (post 1500) <oc@li.org>\n"
14"Language: oc\n"14"Language: \n"
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/pl.po'
--- debian/po/pl.po 2012-03-21 02:22:11 +0000
+++ debian/po/pl.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/pt_BR.po'
--- debian/po/pt_BR.po 2012-03-21 02:22:11 +0000
+++ debian/po/pt_BR.po 2012-06-23 00:59:17 +0000
@@ -8,15 +8,15 @@
8"Project-Id-Version: checkbox\n"8"Project-Id-Version: checkbox\n"
9"Report-Msgid-Bugs-To: checkbox@packages.debian.org\n"9"Report-Msgid-Bugs-To: checkbox@packages.debian.org\n"
10"POT-Creation-Date: 2011-03-29 15:19+0200\n"10"POT-Creation-Date: 2011-03-29 15:19+0200\n"
11"PO-Revision-Date: 2011-09-16 19:04+0000\n"11"PO-Revision-Date: 2012-05-12 03:33+0000\n"
12"Last-Translator: André Gondim <Unknown>\n"12"Last-Translator: eniomarconcini <Unknown>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14"Language: pt_BR\n"14"Language: pt_BR\n"
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
@@ -31,15 +31,15 @@
31"If this option is set to Yes, then checkbox will ask if the user wants to "31"If this option is set to Yes, then checkbox will ask if the user wants to "
32"file a bug for failing tests, even if apport is not enabled."32"file a bug for failing tests, even if apport is not enabled."
33msgstr ""33msgstr ""
34"Se esta opção está definido como Sim, então a caixa de verificação irá "34"Se esta opção for definida como Sim, então o Checkbox irá perguntar se o "
35"perguntar se o usuário quer relatar o erro no teste falho, mesmo se o apport "35"usuário quer relatar o erro dos testes que falharam, mesmo que o Apport não "
36"não estiver habilitado."36"esteja habilitado."
3737
38#. Type: string38#. Type: string
39#. Description39#. Description
40#: ../checkbox.templates:200140#: ../checkbox.templates:2001
41msgid "Default package to report bugs against:"41msgid "Default package to report bugs against:"
42msgstr ""42msgstr "Pacote padrão para relatar erros:"
4343
44#. Type: string44#. Type: string
45#. Description45#. Description
@@ -48,42 +48,48 @@
48"When filing a new bug through checkbox, if it does not guess the package, "48"When filing a new bug through checkbox, if it does not guess the package, "
49"the default package that the bug will be file against."49"the default package that the bug will be file against."
50msgstr ""50msgstr ""
51"Quando estiver registrando um novo erro através do Checkbox, se ele não "
52"adivinhar o pacote, o pacote padrão do qual o erro será relatado."
5153
52#. Type: string54#. Type: string
53#. Description55#. Description
54#: ../checkbox.templates:300156#: ../checkbox.templates:3001
55msgid "Test suite blacklist:"57msgid "Test suite blacklist:"
56msgstr ""58msgstr "Lista negra da suíte de testes:"
5759
58#. Type: string60#. Type: string
59#. Description61#. Description
60#: ../checkbox.templates:300162#: ../checkbox.templates:3001
61msgid "List of job files to never run when testing with checkbox."63msgid "List of job files to never run when testing with checkbox."
62msgstr ""64msgstr ""
65"Lista de arquivos de trabalho para nunca serem executados quando estiver "
66"testando com checkbox."
6367
64#. Type: string68#. Type: string
65#. Description69#. Description
66#: ../checkbox.templates:400170#: ../checkbox.templates:4001
67msgid "Test suite whitelist:"71msgid "Test suite whitelist:"
68msgstr ""72msgstr "Lista branca da suíte de testes:"
6973
70#. Type: string74#. Type: string
71#. Description75#. Description
72#: ../checkbox.templates:400176#: ../checkbox.templates:4001
73msgid "List of jobs to run when testing with checkbox."77msgid "List of jobs to run when testing with checkbox."
74msgstr ""78msgstr ""
79"Lista de arquivos de trabalho para executar enquanto estiver testando com "
80"checkbox."
7581
76#. Type: string82#. Type: string
77#. Description83#. Description
78#: ../checkbox.templates:500184#: ../checkbox.templates:5001
79msgid "Transport URL:"85msgid "Transport URL:"
80msgstr ""86msgstr "Transportar URL:"
8187
82#. Type: string88#. Type: string
83#. Description89#. Description
84#: ../checkbox.templates:500190#: ../checkbox.templates:5001
85msgid "URL where to send submissions."91msgid "URL where to send submissions."
86msgstr "URL para enviar submissões"92msgstr "URL para enviar relatórios."
8793
88#. Type: string94#. Type: string
89#. Description95#. Description
@@ -95,7 +101,7 @@
95#. Description101#. Description
96#: ../checkbox.templates:6001102#: ../checkbox.templates:6001
97msgid "E-mail address used to sign in to Launchpad."103msgid "E-mail address used to sign in to Launchpad."
98msgstr ""104msgstr "Endereço de e-mail usado para entrar no Launchpad."
99105
100#. Type: string106#. Type: string
101#. Description107#. Description
@@ -107,16 +113,16 @@
107#. Description113#. Description
108#: ../checkbox.templates:7001114#: ../checkbox.templates:7001
109msgid "HTTP proxy to use instead of the one specified in environment."115msgid "HTTP proxy to use instead of the one specified in environment."
110msgstr ""116msgstr "Proxy HTTP para usar em vez do especificado pelo ambiente."
111117
112#. Type: string118#. Type: string
113#. Description119#. Description
114#: ../checkbox.templates:8001120#: ../checkbox.templates:8001
115msgid "HTTPS Proxy:"121msgid "HTTPS Proxy:"
116msgstr "HTTPS Proxy:"122msgstr "Proxy HTTPS:"
117123
118#. Type: string124#. Type: string
119#. Description125#. Description
120#: ../checkbox.templates:8001126#: ../checkbox.templates:8001
121msgid "HTTPS proxy to use instead of the one specified in environment."127msgid "HTTPS proxy to use instead of the one specified in environment."
122msgstr ""128msgstr "Proxy HTTPS para usar em vez do especificado pelo ambiente."
123129
=== modified file 'debian/po/ro.po'
--- debian/po/ro.po 2012-03-21 02:22:11 +0000
+++ debian/po/ro.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== modified file 'debian/po/ru.po'
--- debian/po/ru.po 2012-03-21 02:22:11 +0000
+++ debian/po/ru.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== added file 'debian/po/tr.po'
--- debian/po/tr.po 1970-01-01 00:00:00 +0000
+++ debian/po/tr.po 2012-06-23 00:59:17 +0000
@@ -0,0 +1,119 @@
1# Turkish translation for checkbox
2# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
3# This file is distributed under the same license as the checkbox package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
5#
6msgid ""
7msgstr ""
8"Project-Id-Version: checkbox\n"
9"Report-Msgid-Bugs-To: checkbox@packages.debian.org\n"
10"POT-Creation-Date: 2011-03-29 15:19+0200\n"
11"PO-Revision-Date: 2012-05-18 12:51+0000\n"
12"Last-Translator: Hasan Yılmaz <iletisim@hasanyilmaz.net>\n"
13"Language-Team: Turkish <tr@li.org>\n"
14"Language: tr\n"
15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 15316)\n"
20
21#. Type: boolean
22#. Description
23#: ../checkbox.templates:1001
24msgid "Enable bug reporting by default? "
25msgstr ""
26
27#. Type: boolean
28#. Description
29#: ../checkbox.templates:1001
30msgid ""
31"If this option is set to Yes, then checkbox will ask if the user wants to "
32"file a bug for failing tests, even if apport is not enabled."
33msgstr ""
34
35#. Type: string
36#. Description
37#: ../checkbox.templates:2001
38msgid "Default package to report bugs against:"
39msgstr ""
40
41#. Type: string
42#. Description
43#: ../checkbox.templates:2001
44msgid ""
45"When filing a new bug through checkbox, if it does not guess the package, "
46"the default package that the bug will be file against."
47msgstr ""
48
49#. Type: string
50#. Description
51#: ../checkbox.templates:3001
52msgid "Test suite blacklist:"
53msgstr ""
54
55#. Type: string
56#. Description
57#: ../checkbox.templates:3001
58msgid "List of job files to never run when testing with checkbox."
59msgstr ""
60
61#. Type: string
62#. Description
63#: ../checkbox.templates:4001
64msgid "Test suite whitelist:"
65msgstr ""
66
67#. Type: string
68#. Description
69#: ../checkbox.templates:4001
70msgid "List of jobs to run when testing with checkbox."
71msgstr ""
72
73#. Type: string
74#. Description
75#: ../checkbox.templates:5001
76msgid "Transport URL:"
77msgstr ""
78
79#. Type: string
80#. Description
81#: ../checkbox.templates:5001
82msgid "URL where to send submissions."
83msgstr ""
84
85#. Type: string
86#. Description
87#: ../checkbox.templates:6001
88msgid "Launchpad E-mail:"
89msgstr "Launchpad E-posta:"
90
91#. Type: string
92#. Description
93#: ../checkbox.templates:6001
94msgid "E-mail address used to sign in to Launchpad."
95msgstr ""
96
97#. Type: string
98#. Description
99#: ../checkbox.templates:7001
100msgid "HTTP Proxy:"
101msgstr ""
102
103#. Type: string
104#. Description
105#: ../checkbox.templates:7001
106msgid "HTTP proxy to use instead of the one specified in environment."
107msgstr ""
108
109#. Type: string
110#. Description
111#: ../checkbox.templates:8001
112msgid "HTTPS Proxy:"
113msgstr ""
114
115#. Type: string
116#. Description
117#: ../checkbox.templates:8001
118msgid "HTTPS proxy to use instead of the one specified in environment."
119msgstr ""
0120
=== modified file 'debian/po/uk.po'
--- debian/po/uk.po 2012-03-21 02:22:11 +0000
+++ debian/po/uk.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
2323
=== added file 'debian/po/zh_CN.po'
--- debian/po/zh_CN.po 1970-01-01 00:00:00 +0000
+++ debian/po/zh_CN.po 2012-06-23 00:59:17 +0000
@@ -0,0 +1,119 @@
1# Chinese (Simplified) translation for checkbox
2# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
3# This file is distributed under the same license as the checkbox package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
5#
6msgid ""
7msgstr ""
8"Project-Id-Version: checkbox\n"
9"Report-Msgid-Bugs-To: checkbox@packages.debian.org\n"
10"POT-Creation-Date: 2011-03-29 15:19+0200\n"
11"PO-Revision-Date: 2012-05-09 02:09+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
14"Language: \n"
15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 15316)\n"
20
21#. Type: boolean
22#. Description
23#: ../checkbox.templates:1001
24msgid "Enable bug reporting by default? "
25msgstr ""
26
27#. Type: boolean
28#. Description
29#: ../checkbox.templates:1001
30msgid ""
31"If this option is set to Yes, then checkbox will ask if the user wants to "
32"file a bug for failing tests, even if apport is not enabled."
33msgstr ""
34
35#. Type: string
36#. Description
37#: ../checkbox.templates:2001
38msgid "Default package to report bugs against:"
39msgstr ""
40
41#. Type: string
42#. Description
43#: ../checkbox.templates:2001
44msgid ""
45"When filing a new bug through checkbox, if it does not guess the package, "
46"the default package that the bug will be file against."
47msgstr ""
48
49#. Type: string
50#. Description
51#: ../checkbox.templates:3001
52msgid "Test suite blacklist:"
53msgstr ""
54
55#. Type: string
56#. Description
57#: ../checkbox.templates:3001
58msgid "List of job files to never run when testing with checkbox."
59msgstr ""
60
61#. Type: string
62#. Description
63#: ../checkbox.templates:4001
64msgid "Test suite whitelist:"
65msgstr ""
66
67#. Type: string
68#. Description
69#: ../checkbox.templates:4001
70msgid "List of jobs to run when testing with checkbox."
71msgstr ""
72
73#. Type: string
74#. Description
75#: ../checkbox.templates:5001
76msgid "Transport URL:"
77msgstr ""
78
79#. Type: string
80#. Description
81#: ../checkbox.templates:5001
82msgid "URL where to send submissions."
83msgstr ""
84
85#. Type: string
86#. Description
87#: ../checkbox.templates:6001
88msgid "Launchpad E-mail:"
89msgstr ""
90
91#. Type: string
92#. Description
93#: ../checkbox.templates:6001
94msgid "E-mail address used to sign in to Launchpad."
95msgstr ""
96
97#. Type: string
98#. Description
99#: ../checkbox.templates:7001
100msgid "HTTP Proxy:"
101msgstr ""
102
103#. Type: string
104#. Description
105#: ../checkbox.templates:7001
106msgid "HTTP proxy to use instead of the one specified in environment."
107msgstr ""
108
109#. Type: string
110#. Description
111#: ../checkbox.templates:8001
112msgid "HTTPS Proxy:"
113msgstr ""
114
115#. Type: string
116#. Description
117#: ../checkbox.templates:8001
118msgid "HTTPS proxy to use instead of the one specified in environment."
119msgstr ""
0120
=== modified file 'debian/po/zh_TW.po'
--- debian/po/zh_TW.po 2012-03-21 02:22:11 +0000
+++ debian/po/zh_TW.po 2012-06-23 00:59:17 +0000
@@ -15,8 +15,8 @@
15"MIME-Version: 1.0\n"15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"X-Launchpad-Export-Date: 2012-03-15 04:35+0000\n"18"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n"
19"X-Generator: Launchpad (build 14933)\n"19"X-Generator: Launchpad (build 15316)\n"
2020
21#. Type: boolean21#. Type: boolean
22#. Description22#. Description
@@ -30,7 +30,9 @@
30msgid ""30msgid ""
31"If this option is set to Yes, then checkbox will ask if the user wants to "31"If this option is set to Yes, then checkbox will ask if the user wants to "
32"file a bug for failing tests, even if apport is not enabled."32"file a bug for failing tests, even if apport is not enabled."
33msgstr "若這個選項設為「是」,checkbox 會詢問使用者是否要不管 apport 有沒有啟用,都提交失敗測試的臭蟲回報。"33msgstr ""
34"若這個選項設為「是」,checkbox 會詢問使用者是否要不管 apport 有沒有啟用,都提"
35"交失敗測試的臭蟲回報。"
3436
35#. Type: string37#. Type: string
36#. Description38#. Description
3739
=== modified file 'debian/rules'
--- debian/rules 2012-02-15 00:11:21 +0000
+++ debian/rules 2012-06-23 00:59:17 +0000
@@ -1,11 +1,18 @@
1#!/usr/bin/make -f1#!/usr/bin/make -f
22
3%:3%:
4 dh "$@" --with translations,python24 dh "$@" --with translations,python3
55
6override_dh_auto_build:6override_dh_auto_build:
7 (cd qt/frontend; qmake-qt4; make)7 (cd qt/frontend; qmake-qt4; make)
8 dh_auto_build8 set -ex; for python in $(shell py3versions -r); do \
9 $$python setup.py build; \
10 done;
11
12override_dh_auto_install:
13 set -ex; for python in $(shell py3versions -r); do \
14 $$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \
15 done;
916
10override_dh_installdeb:17override_dh_installdeb:
11 cp debian/checkbox.postrm debian/checkbox-cli.postrm18 cp debian/checkbox.postrm debian/checkbox-cli.postrm
1219
=== modified file 'examples/checkbox-qt.ini'
--- examples/checkbox-qt.ini 2012-02-15 00:11:21 +0000
+++ examples/checkbox-qt.ini 2012-06-23 00:59:17 +0000
@@ -12,5 +12,5 @@
12# Class implementing the UserInterface interface.12# Class implementing the UserInterface interface.
13interface_class = QTInterface13interface_class = QTInterface
1414
15# Path where GTK files are stored.15# Path where qt files are stored.
16data_path = %(checkbox_share)s/qt16data_path = %(checkbox_share)s/qt
1717
=== modified file 'examples/checkbox.ini'
--- examples/checkbox.ini 2011-11-18 12:46:21 +0000
+++ examples/checkbox.ini 2012-06-23 00:59:17 +0000
@@ -21,6 +21,4 @@
2121
22[checkbox/plugins/jobs_info]22[checkbox/plugins/jobs_info]
2323
24# Blacklist of jobs that are potentially dangerous24# Required section so that checkbox.application can match .*/jobs_info/.*
25blacklist = autotest/full_suite ltp phoronix qa-regression-testing
26 clone06.1 ioctl03.1 lchown02.* swapon03.1
2725
=== modified file 'gtk/checkbox-gtk.ui'
--- gtk/checkbox-gtk.ui 2011-11-18 12:46:21 +0000
+++ gtk/checkbox-gtk.ui 2012-06-23 00:59:17 +0000
@@ -165,10 +165,22 @@
165 </packing>165 </packing>
166 </child>166 </child>
167 <child>167 <child>
168 <object class="GtkHButtonBox" id="hbuttonbox_test">168 <object class="GtkBox" id="hbuttonbox_test">
169 <property name="visible">True</property>169 <property name="visible">True</property>
170 <property name="layout_style">end</property>170 <property name="layout_style">end</property>
171 <child>171 <child>
172 <object class="GtkProgressBar" id="progressbar_test">
173 <property name="visible">True</property>
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: