Merge lp:~cr3/ubuntu/quantal/checkbox/0.14 into lp:ubuntu/quantal/checkbox
- Quantal (12.10)
- 0.14
- Merge into quantal
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu branches | Pending | ||
Review via email: mp+111701@code.launchpad.net |
Commit message
Description of the change
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
1 | === modified file 'backend' | |||
2 | --- backend 2011-08-10 21:09:56 +0000 | |||
3 | +++ backend 2012-06-23 00:59:17 +0000 | |||
4 | @@ -1,4 +1,4 @@ | |||
6 | 1 | #!/usr/bin/python | 1 | #!/usr/bin/python3 |
7 | 2 | 2 | ||
8 | 3 | import os | 3 | import os |
9 | 4 | import sys | 4 | import sys |
10 | @@ -19,9 +19,16 @@ | |||
11 | 19 | if len(args) < 2: | 19 | if len(args) < 2: |
12 | 20 | parser.error("Missing INPUT and OUTPUT") | 20 | parser.error("Missing INPUT and OUTPUT") |
13 | 21 | 21 | ||
14 | 22 | # Set PATH | ||
15 | 22 | if options.path: | 23 | if options.path: |
16 | 23 | os.environ["PATH"] = options.path | 24 | os.environ["PATH"] = options.path |
17 | 24 | 25 | ||
18 | 26 | # Set PYTHONPATH | ||
19 | 27 | pythonpath = sys.path[0] | ||
20 | 28 | if "PYTHONPATH" in os.environ: | ||
21 | 29 | pythonpath = ":".join([pythonpath, os.environ["PYTHONPATH"]]) | ||
22 | 30 | os.environ["PYTHONPATH"] = pythonpath | ||
23 | 31 | |||
24 | 25 | reader = FifoReader(args[0]) | 32 | reader = FifoReader(args[0]) |
25 | 26 | writer = FifoWriter(args[1]) | 33 | writer = FifoWriter(args[1]) |
26 | 27 | 34 | ||
27 | @@ -36,12 +43,16 @@ | |||
28 | 36 | if isinstance(message, dict) and "command" in message: | 43 | if isinstance(message, dict) and "command" in message: |
29 | 37 | job = Job(message["command"], message.get("environ"), | 44 | job = Job(message["command"], message.get("environ"), |
30 | 38 | message.get("timeout")) | 45 | message.get("timeout")) |
32 | 39 | result = job.execute() | 46 | status, data, duration = job.execute() |
33 | 47 | try: | ||
34 | 48 | data = data.decode("utf-8") | ||
35 | 49 | except UnicodeDecodeError: | ||
36 | 50 | status, data, duration = (FAIL, "Decode error", 0,) | ||
37 | 40 | else: | 51 | else: |
39 | 41 | result = (FAIL, "", 0,) | 52 | status, data, duration = (FAIL, "", 0,) |
40 | 42 | 53 | ||
43 | 43 | writer.write_object(result) | 54 | writer.write_object((status, data, duration,)) |
44 | 44 | except IOError, e: | 55 | except IOError: |
45 | 45 | break | 56 | break |
46 | 46 | 57 | ||
47 | 47 | return 0 | 58 | return 0 |
48 | 48 | 59 | ||
49 | === modified file 'bin/checkbox-cli' | |||
50 | --- bin/checkbox-cli 2012-02-10 11:19:05 +0000 | |||
51 | +++ bin/checkbox-cli 2012-06-23 00:59:17 +0000 | |||
52 | @@ -15,4 +15,4 @@ | |||
53 | 15 | fi | 15 | fi |
54 | 16 | fi | 16 | fi |
55 | 17 | 17 | ||
57 | 18 | python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini | 18 | python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
58 | 19 | 19 | ||
59 | === modified file 'bin/checkbox-gtk' | |||
60 | --- bin/checkbox-gtk 2012-02-10 11:19:05 +0000 | |||
61 | +++ bin/checkbox-gtk 2012-06-23 00:59:17 +0000 | |||
62 | @@ -15,4 +15,4 @@ | |||
63 | 15 | fi | 15 | fi |
64 | 16 | fi | 16 | fi |
65 | 17 | 17 | ||
67 | 18 | python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini | 18 | python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
68 | 19 | 19 | ||
69 | === modified file 'bin/checkbox-qt' | |||
70 | --- bin/checkbox-qt 2012-03-21 02:22:11 +0000 | |||
71 | +++ bin/checkbox-qt 2012-06-23 00:59:17 +0000 | |||
72 | @@ -23,4 +23,4 @@ | |||
73 | 23 | (cd $CHECKBOX_FRONTEND; qmake; make; ./checkbox-qt-service &) | 23 | (cd $CHECKBOX_FRONTEND; qmake; make; ./checkbox-qt-service &) |
74 | 24 | fi | 24 | fi |
75 | 25 | 25 | ||
77 | 26 | python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini | 26 | python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
78 | 27 | 27 | ||
79 | === modified file 'bin/checkbox-urwid' | |||
80 | --- bin/checkbox-urwid 2012-02-10 11:19:05 +0000 | |||
81 | +++ bin/checkbox-urwid 2012-06-23 00:59:17 +0000 | |||
82 | @@ -15,4 +15,4 @@ | |||
83 | 15 | fi | 15 | fi |
84 | 16 | fi | 16 | fi |
85 | 17 | 17 | ||
87 | 18 | python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini | 18 | python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
88 | 19 | 19 | ||
89 | === modified file 'checkbox/application.py' | |||
90 | --- checkbox/application.py 2012-03-21 02:22:11 +0000 | |||
91 | +++ checkbox/application.py 2012-06-23 00:59:17 +0000 | |||
92 | @@ -35,7 +35,7 @@ | |||
93 | 35 | from checkbox.reactor import Reactor | 35 | from checkbox.reactor import Reactor |
94 | 36 | 36 | ||
95 | 37 | 37 | ||
97 | 38 | class Application(object): | 38 | class Application: |
98 | 39 | 39 | ||
99 | 40 | reactor_factory = Reactor | 40 | reactor_factory = Reactor |
100 | 41 | 41 | ||
101 | @@ -55,7 +55,7 @@ | |||
102 | 55 | raise | 55 | raise |
103 | 56 | 56 | ||
104 | 57 | 57 | ||
106 | 58 | class ApplicationManager(object): | 58 | class ApplicationManager: |
107 | 59 | 59 | ||
108 | 60 | application_factory = Application | 60 | application_factory = Application |
109 | 61 | 61 | ||
110 | @@ -130,7 +130,7 @@ | |||
111 | 130 | 130 | ||
112 | 131 | # Check options | 131 | # Check options |
113 | 132 | if options.version: | 132 | if options.version: |
115 | 133 | print config.get_defaults().version | 133 | print(config.get_defaults().version) |
116 | 134 | sys.exit(0) | 134 | sys.exit(0) |
117 | 135 | 135 | ||
118 | 136 | return self.application_factory(config) | 136 | return self.application_factory(config) |
119 | 137 | 137 | ||
120 | === modified file 'checkbox/arguments.py' | |||
121 | --- checkbox/arguments.py 2009-08-19 15:36:05 +0000 | |||
122 | +++ checkbox/arguments.py 2012-06-23 00:59:17 +0000 | |||
123 | @@ -21,7 +21,7 @@ | |||
124 | 21 | from checkbox.lib.decorator import merge_function_metadata | 21 | from checkbox.lib.decorator import merge_function_metadata |
125 | 22 | 22 | ||
126 | 23 | 23 | ||
128 | 24 | class ArgumentReplacer(object): | 24 | class ArgumentReplacer: |
129 | 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. |
130 | 26 | 26 | ||
131 | 27 | Create one with the original function and a function to replace | 27 | Create one with the original function and a function to replace |
132 | 28 | 28 | ||
133 | === modified file 'checkbox/attribute.py' | |||
134 | --- checkbox/attribute.py 2009-01-20 18:55:20 +0000 | |||
135 | +++ checkbox/attribute.py 2012-06-23 00:59:17 +0000 | |||
136 | @@ -19,7 +19,7 @@ | |||
137 | 19 | from checkbox.variables import Variable | 19 | from checkbox.variables import Variable |
138 | 20 | 20 | ||
139 | 21 | 21 | ||
141 | 22 | class Attribute(object): | 22 | class Attribute: |
142 | 23 | 23 | ||
143 | 24 | def __init__(self, name, cls, variable_factory=None): | 24 | def __init__(self, name, cls, variable_factory=None): |
144 | 25 | self.name = name | 25 | self.name = name |
145 | 26 | 26 | ||
146 | === modified file 'checkbox/component.py' | |||
147 | --- checkbox/component.py 2010-03-09 16:58:36 +0000 | |||
148 | +++ checkbox/component.py 2012-06-23 00:59:17 +0000 | |||
149 | @@ -29,7 +29,7 @@ | |||
150 | 29 | from checkbox.variables import get_variables | 29 | from checkbox.variables import get_variables |
151 | 30 | 30 | ||
152 | 31 | 31 | ||
154 | 32 | class ComponentSection(object): | 32 | class ComponentSection: |
155 | 33 | """ | 33 | """ |
156 | 34 | Component section which is essentially a container of modules. These | 34 | Component section which is essentially a container of modules. These |
157 | 35 | map to the modules referenced in the configuration passed as argument | 35 | map to the modules referenced in the configuration passed as argument |
158 | @@ -99,7 +99,7 @@ | |||
159 | 99 | name, self.name) | 99 | name, self.name) |
160 | 100 | 100 | ||
161 | 101 | if not self.has_module(name): | 101 | if not self.has_module(name): |
163 | 102 | raise Exception, "No such such module: %s" % name | 102 | raise Exception("No such such module: %s" % name) |
164 | 103 | 103 | ||
165 | 104 | filenames = itertools.chain(*[path_expand_recursive(m) | 104 | filenames = itertools.chain(*[path_expand_recursive(m) |
166 | 105 | for m in self.modules]) | 105 | for m in self.modules]) |
167 | @@ -109,10 +109,10 @@ | |||
168 | 109 | basename = basename.replace(".py", "") | 109 | basename = basename.replace(".py", "") |
169 | 110 | if basename == name: | 110 | if basename == name: |
170 | 111 | globals = {} | 111 | globals = {} |
172 | 112 | exec open(filename) in globals | 112 | exec(open(filename).read(), globals) |
173 | 113 | if "factory" not in globals: | 113 | if "factory" not in globals: |
176 | 114 | raise Exception, "Variable 'factory' not found in: %s" \ | 114 | raise Exception("Variable 'factory' not found in: %s" \ |
177 | 115 | % filename | 115 | % filename) |
178 | 116 | 116 | ||
179 | 117 | module = globals["factory"]() | 117 | module = globals["factory"]() |
180 | 118 | module.__module__ = name | 118 | module.__module__ = name |
181 | @@ -122,14 +122,14 @@ | |||
182 | 122 | 122 | ||
183 | 123 | # Set configuration values | 123 | # Set configuration values |
184 | 124 | variables = get_variables(module) | 124 | variables = get_variables(module) |
187 | 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()]) |
188 | 126 | for attribute, variable in variables.iteritems(): | 126 | for attribute, variable in variables.items(): |
189 | 127 | if config and attribute.name in config: | 127 | if config and attribute.name in config: |
190 | 128 | value = config.get(attribute.name) | 128 | value = config.get(attribute.name) |
191 | 129 | variable.set(value) | 129 | variable.set(value) |
192 | 130 | else: | 130 | else: |
193 | 131 | value = variable.get() | 131 | value = variable.get() |
195 | 132 | if isinstance(value, basestring): | 132 | if isinstance(value, str): |
196 | 133 | value = value % environ | 133 | value = value % environ |
197 | 134 | variable.set(value) | 134 | variable.set(value) |
198 | 135 | elif isinstance(value, list): | 135 | elif isinstance(value, list): |
199 | @@ -137,16 +137,16 @@ | |||
200 | 137 | variable.set(value) | 137 | variable.set(value) |
201 | 138 | 138 | ||
202 | 139 | # Check required attributes | 139 | # Check required attributes |
204 | 140 | for attribute, variable in variables.iteritems(): | 140 | for attribute, variable in variables.items(): |
205 | 141 | value = variable.get() | 141 | value = variable.get() |
206 | 142 | if value is None and variable._required: | 142 | if value is None and variable._required: |
208 | 143 | raise Exception, "Configuration '%s' missing " \ | 143 | raise Exception("Configuration '%s' missing " \ |
209 | 144 | "required attribute: %s" \ | 144 | "required attribute: %s" \ |
211 | 145 | % (config_name, attribute.name) | 145 | % (config_name, attribute.name)) |
212 | 146 | 146 | ||
213 | 147 | return module | 147 | return module |
214 | 148 | 148 | ||
216 | 149 | raise Exception, "Failed to find module '%s' in: %s" % (name, filenames) | 149 | raise Exception("Failed to find module '%s' in: %s" % (name, filenames)) |
217 | 150 | 150 | ||
218 | 151 | def load_modules(self): | 151 | def load_modules(self): |
219 | 152 | """ | 152 | """ |
220 | @@ -160,7 +160,7 @@ | |||
221 | 160 | return modules | 160 | return modules |
222 | 161 | 161 | ||
223 | 162 | 162 | ||
225 | 163 | class ComponentManager(object): | 163 | class ComponentManager: |
226 | 164 | """ | 164 | """ |
227 | 165 | Component manager which is essentially a container of sections. | 165 | Component manager which is essentially a container of sections. |
228 | 166 | """ | 166 | """ |
229 | 167 | 167 | ||
230 | === modified file 'checkbox/contrib/REThread.py' | |||
231 | --- checkbox/contrib/REThread.py 2009-01-20 16:46:15 +0000 | |||
232 | +++ checkbox/contrib/REThread.py 2012-06-23 00:59:17 +0000 | |||
233 | @@ -60,7 +60,7 @@ | |||
234 | 60 | Does nothing if no exception was caught.''' | 60 | Does nothing if no exception was caught.''' |
235 | 61 | 61 | ||
236 | 62 | if self._exception: | 62 | if self._exception: |
238 | 63 | raise self._exception[0], self._exception[1], self._exception[2] | 63 | raise self._exception[0](self._exception[1]).with_traceback(self._exception[2]) |
239 | 64 | 64 | ||
240 | 65 | # | 65 | # |
241 | 66 | # Unit test | 66 | # Unit test |
242 | 67 | 67 | ||
243 | === modified file 'checkbox/contrib/bpickle.py' | |||
244 | --- checkbox/contrib/bpickle.py 2010-03-09 16:58:36 +0000 | |||
245 | +++ checkbox/contrib/bpickle.py 2012-06-23 00:59:17 +0000 | |||
246 | @@ -39,129 +39,150 @@ | |||
247 | 39 | 39 | ||
248 | 40 | type_names = [type(obj)] | 40 | type_names = [type(obj)] |
249 | 41 | for type_name in type_names: | 41 | for type_name in type_names: |
251 | 42 | if _dt.has_key(type_name): | 42 | if type_name in _dt: |
252 | 43 | return _dt[type_name](obj) | 43 | return _dt[type_name](obj) |
253 | 44 | 44 | ||
254 | 45 | type_names.extend(type_name.__bases__) | 45 | type_names.extend(type_name.__bases__) |
255 | 46 | 46 | ||
257 | 47 | raise ValueError, "Unsupported type: %s" % type(obj) | 47 | raise ValueError("Unsupported type: %s" % type(obj)) |
258 | 48 | 48 | ||
259 | 49 | 49 | ||
260 | 50 | def loads(str, _lt=loads_table): | 50 | def loads(str, _lt=loads_table): |
261 | 51 | if not str: | 51 | if not str: |
263 | 52 | raise ValueError, "Can't load empty string" | 52 | raise ValueError("Can't load empty string") |
264 | 53 | try: | 53 | try: |
265 | 54 | return _lt[str[0]](str, 0)[0] | 54 | return _lt[str[0]](str, 0)[0] |
268 | 55 | except KeyError, e: | 55 | except KeyError as e: |
269 | 56 | raise ValueError, "Unknown type character: %s" % e | 56 | raise ValueError("Unknown type character: %s" % e) |
270 | 57 | except IndexError: | 57 | except IndexError: |
272 | 58 | raise ValueError, "Corrupted data" | 58 | raise ValueError("Corrupted data") |
273 | 59 | |||
274 | 59 | 60 | ||
275 | 60 | def dumps_bool(obj): | 61 | def dumps_bool(obj): |
277 | 61 | return "b%d" % int(obj) | 62 | return ("b%d" % int(obj)).encode("ascii") |
278 | 63 | |||
279 | 62 | 64 | ||
280 | 63 | def dumps_int(obj): | 65 | def dumps_int(obj): |
282 | 64 | return "i%s;" % obj | 66 | return ("i%s;" % obj).encode("ascii") |
283 | 67 | |||
284 | 65 | 68 | ||
285 | 66 | def dumps_float(obj): | 69 | def dumps_float(obj): |
287 | 67 | return "f%r;" % obj | 70 | return ("f%r;" % obj).encode("ascii") |
288 | 71 | |||
289 | 72 | |||
290 | 73 | def dumps_bytes(obj): | ||
291 | 74 | return ("c%s:" % len(obj)).encode("ascii") + obj | ||
292 | 75 | |||
293 | 68 | 76 | ||
294 | 69 | def dumps_str(obj): | 77 | def dumps_str(obj): |
295 | 70 | return "s%s:%s" % (len(obj), obj) | ||
296 | 71 | |||
297 | 72 | def dumps_unicode(obj): | ||
298 | 73 | obj = obj.encode("utf-8") | 78 | obj = obj.encode("utf-8") |
300 | 74 | return "u%s:%s" % (len(obj), obj) | 79 | return ("s%s:" % len(obj)).encode("ascii") + obj |
301 | 80 | |||
302 | 75 | 81 | ||
303 | 76 | def dumps_list(obj, _dt=None): | 82 | def dumps_list(obj, _dt=None): |
305 | 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";" |
306 | 84 | |||
307 | 78 | 85 | ||
308 | 79 | def dumps_tuple(obj, _dt=None): | 86 | def dumps_tuple(obj, _dt=None): |
310 | 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";" |
311 | 88 | |||
312 | 81 | 89 | ||
313 | 82 | def dumps_dict(obj, _dt=None): | 90 | def dumps_dict(obj, _dt=None): |
314 | 83 | res = [] | 91 | res = [] |
316 | 84 | keys = sorted(obj.iterkeys()) | 92 | keys = sorted(obj.keys()) |
317 | 85 | append = res.append | 93 | append = res.append |
318 | 86 | for key in keys: | 94 | for key in keys: |
319 | 87 | val = obj[key] | 95 | val = obj[key] |
320 | 88 | append(dumps(key, _dt)) | 96 | append(dumps(key, _dt)) |
321 | 89 | append(dumps(val, _dt)) | 97 | append(dumps(val, _dt)) |
323 | 90 | return "d%s;" % "".join(res) | 98 | return b"d" + b"".join(res) + b";" |
324 | 99 | |||
325 | 91 | 100 | ||
326 | 92 | def dumps_none(obj): | 101 | def dumps_none(obj): |
328 | 93 | return "n" | 102 | return b"n" |
329 | 103 | |||
330 | 94 | 104 | ||
331 | 95 | def loads_bool(str, pos): | 105 | def loads_bool(str, pos): |
333 | 96 | return bool(int(str[pos+1])), pos+2 | 106 | return bool(int(chr(str[pos + 1]))), pos + 2 |
334 | 107 | |||
335 | 97 | 108 | ||
336 | 98 | def loads_int(str, pos): | 109 | def loads_int(str, pos): |
339 | 99 | endpos = str.index(";", pos) | 110 | endpos = str.index(b";", pos) |
340 | 100 | return int(str[pos+1:endpos]), endpos+1 | 111 | return int(str[pos + 1:endpos]), endpos + 1 |
341 | 112 | |||
342 | 101 | 113 | ||
343 | 102 | def loads_float(str, pos): | 114 | def loads_float(str, pos): |
346 | 103 | endpos = str.index(";", pos) | 115 | endpos = str.index(b";", pos) |
347 | 104 | return float(str[pos+1:endpos]), endpos+1 | 116 | return float(str[pos + 1:endpos]), endpos + 1 |
348 | 117 | |||
349 | 118 | |||
350 | 119 | def loads_bytes(str, pos): | ||
351 | 120 | startpos = str.index(b":", pos) + 1 | ||
352 | 121 | endpos = startpos + int(str[pos + 1:startpos - 1]) | ||
353 | 122 | return str[startpos:endpos], endpos | ||
354 | 123 | |||
355 | 105 | 124 | ||
356 | 106 | def loads_str(str, pos): | 125 | def loads_str(str, pos): |
364 | 107 | startpos = str.index(":", pos)+1 | 126 | startpos = str.index(b":", pos) + 1 |
365 | 108 | endpos = startpos+int(str[pos+1:startpos-1]) | 127 | endpos = startpos + int(str[pos + 1:startpos - 1]) |
359 | 109 | return str[startpos:endpos], endpos | ||
360 | 110 | |||
361 | 111 | def loads_unicode(str, pos): | ||
362 | 112 | startpos = str.index(":", pos)+1 | ||
363 | 113 | endpos = startpos+int(str[pos+1:startpos-1]) | ||
366 | 114 | return str[startpos:endpos].decode("utf-8"), endpos | 128 | return str[startpos:endpos].decode("utf-8"), endpos |
367 | 115 | 129 | ||
368 | 130 | |||
369 | 116 | def loads_list(str, pos, _lt=loads_table): | 131 | def loads_list(str, pos, _lt=loads_table): |
370 | 117 | pos += 1 | 132 | pos += 1 |
371 | 118 | res = [] | 133 | res = [] |
372 | 119 | append = res.append | 134 | append = res.append |
374 | 120 | while str[pos] != ";": | 135 | while str[pos] != ord(";"): |
375 | 121 | obj, pos = _lt[str[pos]](str, pos) | 136 | obj, pos = _lt[str[pos]](str, pos) |
376 | 122 | append(obj) | 137 | append(obj) |
378 | 123 | return res, pos+1 | 138 | return res, pos + 1 |
379 | 139 | |||
380 | 124 | 140 | ||
381 | 125 | def loads_tuple(str, pos, _lt=loads_table): | 141 | def loads_tuple(str, pos, _lt=loads_table): |
382 | 126 | pos += 1 | 142 | pos += 1 |
383 | 127 | res = [] | 143 | res = [] |
384 | 128 | append = res.append | 144 | append = res.append |
386 | 129 | while str[pos] != ";": | 145 | while str[pos] != ord(";"): |
387 | 130 | obj, pos = _lt[str[pos]](str, pos) | 146 | obj, pos = _lt[str[pos]](str, pos) |
388 | 131 | append(obj) | 147 | append(obj) |
390 | 132 | return tuple(res), pos+1 | 148 | return tuple(res), pos + 1 |
391 | 149 | |||
392 | 133 | 150 | ||
393 | 134 | def loads_dict(str, pos, _lt=loads_table): | 151 | def loads_dict(str, pos, _lt=loads_table): |
394 | 135 | pos += 1 | 152 | pos += 1 |
395 | 136 | res = {} | 153 | res = {} |
397 | 137 | while str[pos] != ";": | 154 | while str[pos] != ord(";"): |
398 | 138 | key, pos = _lt[str[pos]](str, pos) | 155 | key, pos = _lt[str[pos]](str, pos) |
399 | 139 | val, pos = _lt[str[pos]](str, pos) | 156 | val, pos = _lt[str[pos]](str, pos) |
400 | 140 | res[key] = val | 157 | res[key] = val |
402 | 141 | return res, pos+1 | 158 | return res, pos + 1 |
403 | 159 | |||
404 | 142 | 160 | ||
405 | 143 | def loads_none(str, pos): | 161 | def loads_none(str, pos): |
430 | 144 | return None, pos+1 | 162 | return None, pos + 1 |
431 | 145 | 163 | ||
432 | 146 | 164 | ||
433 | 147 | dumps_table.update({ bool: dumps_bool, | 165 | dumps_table.update({ |
434 | 148 | int: dumps_int, | 166 | bool: dumps_bool, |
435 | 149 | long: dumps_int, | 167 | int: dumps_int, |
436 | 150 | float: dumps_float, | 168 | float: dumps_float, |
437 | 151 | str: dumps_str, | 169 | bytes: dumps_bytes, |
438 | 152 | unicode: dumps_unicode, | 170 | str: dumps_str, |
439 | 153 | list: dumps_list, | 171 | list: dumps_list, |
440 | 154 | tuple: dumps_tuple, | 172 | tuple: dumps_tuple, |
441 | 155 | dict: dumps_dict, | 173 | dict: dumps_dict, |
442 | 156 | type(None): dumps_none }) | 174 | type(None): dumps_none, |
443 | 157 | 175 | }) | |
444 | 158 | loads_table.update({ "b": loads_bool, | 176 | |
445 | 159 | "i": loads_int, | 177 | loads_table.update({ |
446 | 160 | "f": loads_float, | 178 | ord("b"): loads_bool, |
447 | 161 | "s": loads_str, | 179 | ord("i"): loads_int, |
448 | 162 | "u": loads_unicode, | 180 | ord("f"): loads_float, |
449 | 163 | "l": loads_list, | 181 | ord("c"): loads_str, |
450 | 164 | "t": loads_tuple, | 182 | ord("s"): loads_str, |
451 | 165 | "d": loads_dict, | 183 | ord("u"): loads_str, |
452 | 166 | "n": loads_none }) | 184 | ord("l"): loads_list, |
453 | 167 | 185 | ord("t"): loads_tuple, | |
454 | 186 | ord("d"): loads_dict, | ||
455 | 187 | ord("n"): loads_none, | ||
456 | 188 | }) | ||
457 | 168 | 189 | ||
458 | === modified file 'checkbox/contrib/glock.py' | |||
459 | --- checkbox/contrib/glock.py 2010-03-09 16:58:36 +0000 | |||
460 | +++ checkbox/contrib/glock.py 2012-06-23 00:59:17 +0000 | |||
461 | @@ -1,4 +1,4 @@ | |||
463 | 1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python3 |
464 | 2 | # -*- coding: latin1 -*- | 2 | # -*- coding: latin1 -*- |
465 | 3 | #---------------------------------------------------------------------------- | 3 | #---------------------------------------------------------------------------- |
466 | 4 | # glock.py: Global mutex | 4 | # glock.py: Global mutex |
467 | @@ -70,11 +70,6 @@ | |||
468 | 70 | pass | 70 | pass |
469 | 71 | 71 | ||
470 | 72 | 72 | ||
471 | 73 | # Constants | ||
472 | 74 | # ---------: | ||
473 | 75 | if sys.version[:3] < '2.2': | ||
474 | 76 | True, False = 1, 0 # built-in in Python 2.2+ | ||
475 | 77 | |||
476 | 78 | #---------------------------------------------------------------------------- | 73 | #---------------------------------------------------------------------------- |
477 | 79 | class GlobalLock: | 74 | class GlobalLock: |
478 | 80 | #---------------------------------------------------------------------------- | 75 | #---------------------------------------------------------------------------- |
479 | @@ -177,7 +172,7 @@ | |||
480 | 177 | options = fcntl.LOCK_EX|fcntl.LOCK_NB | 172 | options = fcntl.LOCK_EX|fcntl.LOCK_NB |
481 | 178 | try: | 173 | try: |
482 | 179 | fcntl.flock(self.fdlock, options) | 174 | fcntl.flock(self.fdlock, options) |
484 | 180 | except IOError, message: #(errno 13: perm. denied, | 175 | except IOError as message: #(errno 13: perm. denied, |
485 | 181 | # 36: Resource deadlock avoided) | 176 | # 36: Resource deadlock avoided) |
486 | 182 | if not blocking and self._errnoOf (message) == errno.EWOULDBLOCK: | 177 | if not blocking and self._errnoOf (message) == errno.EWOULDBLOCK: |
487 | 183 | raise LockAlreadyAcquired('Lock %s already acquired by ' | 178 | raise LockAlreadyAcquired('Lock %s already acquired by ' |
488 | @@ -230,7 +225,7 @@ | |||
489 | 230 | try: | 225 | try: |
490 | 231 | win32event.ReleaseMutex(self.mutex) | 226 | win32event.ReleaseMutex(self.mutex) |
491 | 232 | #print "released mutex" | 227 | #print "released mutex" |
493 | 233 | except pywintypes.error, e: | 228 | except pywintypes.error as e: |
494 | 234 | errCode, fctName, errMsg = e.args | 229 | errCode, fctName, errMsg = e.args |
495 | 235 | if errCode == 288: | 230 | if errCode == 288: |
496 | 236 | raise NotOwner("Attempt to release somebody else's lock") | 231 | raise NotOwner("Attempt to release somebody else's lock") |
497 | @@ -264,7 +259,7 @@ | |||
498 | 264 | #---------------------------------------------------------------------------- | 259 | #---------------------------------------------------------------------------- |
499 | 265 | ##TODO: a more serious test with distinct processes ! | 260 | ##TODO: a more serious test with distinct processes ! |
500 | 266 | 261 | ||
502 | 267 | print 'Testing glock.py...' | 262 | print('Testing glock.py...') |
503 | 268 | 263 | ||
504 | 269 | # unfortunately can't test inter-process lock here! | 264 | # unfortunately can't test inter-process lock here! |
505 | 270 | lockName = 'myFirstLock' | 265 | lockName = 'myFirstLock' |
506 | @@ -283,31 +278,31 @@ | |||
507 | 283 | # Check that <> threads of same process do block: | 278 | # Check that <> threads of same process do block: |
508 | 284 | import threading, time | 279 | import threading, time |
509 | 285 | thread = threading.Thread(target=threadMain, args=(l,)) | 280 | thread = threading.Thread(target=threadMain, args=(l,)) |
511 | 286 | print 'main: locking...', | 281 | print('main: locking...', end=' ') |
512 | 287 | l.acquire() | 282 | l.acquire() |
514 | 288 | print ' done.' | 283 | print(' done.') |
515 | 289 | thread.start() | 284 | thread.start() |
516 | 290 | time.sleep(3) | 285 | time.sleep(3) |
518 | 291 | print '\nmain: unlocking...', | 286 | print('\nmain: unlocking...', end=' ') |
519 | 292 | l.release() | 287 | l.release() |
521 | 293 | print ' done.' | 288 | print(' done.') |
522 | 294 | time.sleep(0.1) | 289 | time.sleep(0.1) |
523 | 295 | 290 | ||
525 | 296 | print '=> Test of glock.py passed.' | 291 | print('=> Test of glock.py passed.') |
526 | 297 | return l | 292 | return l |
527 | 298 | 293 | ||
528 | 299 | def threadMain(lock): | 294 | def threadMain(lock): |
530 | 300 | print 'thread started(%s).' % lock | 295 | print('thread started(%s).' % lock) |
531 | 301 | try: lock.acquire(blocking=False) | 296 | try: lock.acquire(blocking=False) |
532 | 302 | except LockAlreadyAcquired: pass | 297 | except LockAlreadyAcquired: pass |
533 | 303 | else: raise Exception('should have raised LockAlreadyAcquired') | 298 | else: raise Exception('should have raised LockAlreadyAcquired') |
535 | 304 | print 'thread: locking (should stay blocked for ~ 3 sec)...', | 299 | print('thread: locking (should stay blocked for ~ 3 sec)...', end=' ') |
536 | 305 | lock.acquire() | 300 | lock.acquire() |
539 | 306 | print 'thread: locking done.' | 301 | print('thread: locking done.') |
540 | 307 | print 'thread: unlocking...', | 302 | print('thread: unlocking...', end=' ') |
541 | 308 | lock.release() | 303 | lock.release() |
544 | 309 | print ' done.' | 304 | print(' done.') |
545 | 310 | print 'thread ended.' | 305 | print('thread ended.') |
546 | 311 | 306 | ||
547 | 312 | #---------------------------------------------------------------------------- | 307 | #---------------------------------------------------------------------------- |
548 | 313 | # M A I N | 308 | # M A I N |
549 | 314 | 309 | ||
550 | === modified file 'checkbox/contrib/persist.py' | |||
551 | --- checkbox/contrib/persist.py 2012-02-23 11:56:50 +0000 | |||
552 | +++ checkbox/contrib/persist.py 2012-06-23 00:59:17 +0000 | |||
553 | @@ -41,7 +41,7 @@ | |||
554 | 41 | pass | 41 | pass |
555 | 42 | 42 | ||
556 | 43 | 43 | ||
558 | 44 | class Persist(object): | 44 | class Persist: |
559 | 45 | """Persistence handler. | 45 | """Persistence handler. |
560 | 46 | 46 | ||
561 | 47 | There are three different kinds of opition maps, regarding the | 47 | There are three different kinds of opition maps, regarding the |
562 | @@ -257,7 +257,7 @@ | |||
563 | 257 | current = self._traverse(map, path) | 257 | current = self._traverse(map, path) |
564 | 258 | if type(current) is list and value in current: | 258 | if type(current) is list and value in current: |
565 | 259 | return | 259 | return |
567 | 260 | path = path+(sys.maxint,) | 260 | path = path+(sys.maxsize,) |
568 | 261 | self._traverse(map, path, setvalue=value) | 261 | self._traverse(map, path, setvalue=value) |
569 | 262 | 262 | ||
570 | 263 | def remove(self, path, value=NOTHING, soft=False, weak=False): | 263 | def remove(self, path, value=NOTHING, soft=False, weak=False): |
571 | @@ -317,7 +317,7 @@ | |||
572 | 317 | return RootedPersist(self, path) | 317 | return RootedPersist(self, path) |
573 | 318 | 318 | ||
574 | 319 | 319 | ||
576 | 320 | class RootedPersist(object): | 320 | class RootedPersist: |
577 | 321 | 321 | ||
578 | 322 | def __init__(self, parent, root): | 322 | def __init__(self, parent, root): |
579 | 323 | self.parent = parent | 323 | self.parent = parent |
580 | @@ -408,7 +408,7 @@ | |||
581 | 408 | return ".".join(result) | 408 | return ".".join(result) |
582 | 409 | 409 | ||
583 | 410 | 410 | ||
585 | 411 | class Backend(object): | 411 | class Backend: |
586 | 412 | 412 | ||
587 | 413 | def new(self): | 413 | def new(self): |
588 | 414 | return {} | 414 | return {} |
589 | @@ -491,7 +491,7 @@ | |||
590 | 491 | if keys: | 491 | if keys: |
591 | 492 | return keys() | 492 | return keys() |
592 | 493 | elif type(obj) is list: | 493 | elif type(obj) is list: |
594 | 494 | return range(len(obj)) | 494 | return list(range(len(obj))) |
595 | 495 | return NotImplemented | 495 | return NotImplemented |
596 | 496 | 496 | ||
597 | 497 | 497 | ||
598 | @@ -513,18 +513,18 @@ | |||
599 | 513 | class PickleBackend(DiskBackend): | 513 | class PickleBackend(DiskBackend): |
600 | 514 | 514 | ||
601 | 515 | def __init__(self): | 515 | def __init__(self): |
603 | 516 | import cPickle | 516 | import pickle |
604 | 517 | self._pickle = cPickle | 517 | self._pickle = cPickle |
605 | 518 | 518 | ||
606 | 519 | def load(self, filepath): | 519 | def load(self, filepath): |
608 | 520 | file = open(filepath) | 520 | file = open(filepath, "rb") |
609 | 521 | try: | 521 | try: |
610 | 522 | return self._pickle.load(file) | 522 | return self._pickle.load(file) |
611 | 523 | finally: | 523 | finally: |
612 | 524 | safe_close(file, self.safe_file_closing) | 524 | safe_close(file, self.safe_file_closing) |
613 | 525 | 525 | ||
614 | 526 | def save(self, filepath, map): | 526 | def save(self, filepath, map): |
616 | 527 | file = open(filepath, "w") | 527 | file = open(filepath, "wb") |
617 | 528 | try: | 528 | try: |
618 | 529 | self._pickle.dump(map, file, 2) | 529 | self._pickle.dump(map, file, 2) |
619 | 530 | finally: | 530 | finally: |
620 | @@ -538,14 +538,14 @@ | |||
621 | 538 | self._bpickle = bpickle | 538 | self._bpickle = bpickle |
622 | 539 | 539 | ||
623 | 540 | def load(self, filepath): | 540 | def load(self, filepath): |
625 | 541 | file = open(filepath) | 541 | file = open(filepath, "rb") |
626 | 542 | try: | 542 | try: |
627 | 543 | return self._bpickle.loads(file.read()) | 543 | return self._bpickle.loads(file.read()) |
628 | 544 | finally: | 544 | finally: |
629 | 545 | safe_close(file, self.safe_file_closing) | 545 | safe_close(file, self.safe_file_closing) |
630 | 546 | 546 | ||
631 | 547 | def save(self, filepath, map): | 547 | def save(self, filepath, map): |
633 | 548 | file = open(filepath, "w") | 548 | file = open(filepath, "wb") |
634 | 549 | try: | 549 | try: |
635 | 550 | file.write(self._bpickle.dumps(map)) | 550 | file.write(self._bpickle.dumps(map)) |
636 | 551 | finally: | 551 | finally: |
637 | 552 | 552 | ||
638 | === modified file 'checkbox/dispatcher.py' | |||
639 | --- checkbox/dispatcher.py 2011-11-18 12:46:21 +0000 | |||
640 | +++ checkbox/dispatcher.py 2012-06-23 00:59:17 +0000 | |||
641 | @@ -83,9 +83,9 @@ | |||
642 | 83 | # then behaves like a list using the latest events. | 83 | # then behaves like a list using the latest events. |
643 | 84 | if self.event_types.issubset(self.kwargs): | 84 | if self.event_types.issubset(self.kwargs): |
644 | 85 | self.notify = notify = super(ListenerQueue, self).notify | 85 | self.notify = notify = super(ListenerQueue, self).notify |
648 | 86 | keys = self.kwargs.keys() | 86 | keys = list(self.kwargs.keys()) |
649 | 87 | for values in product(*self.kwargs.values()): | 87 | for values in product(*list(self.kwargs.values())): |
650 | 88 | self.kwargs = dict(zip(keys, values)) | 88 | self.kwargs = dict(list(zip(keys, values))) |
651 | 89 | notify(event) | 89 | notify(event) |
652 | 90 | 90 | ||
653 | 91 | 91 | ||
654 | @@ -171,7 +171,7 @@ | |||
655 | 171 | 171 | ||
656 | 172 | def registerHandler(self, event_types, handler, count=None): | 172 | def registerHandler(self, event_types, handler, count=None): |
657 | 173 | """See Dispatcher.""" | 173 | """See Dispatcher.""" |
659 | 174 | if not isinstance(event_types, (list, tuple,)): | 174 | if not isinstance(event_types, (list, tuple)): |
660 | 175 | event_types = (event_types,) | 175 | event_types = (event_types,) |
661 | 176 | 176 | ||
662 | 177 | listener = self.listener_factory(event_types, handler, count) | 177 | listener = self.listener_factory(event_types, handler, count) |
663 | 178 | 178 | ||
664 | === modified file 'checkbox/job.py' | |||
665 | --- checkbox/job.py 2012-02-15 00:11:21 +0000 | |||
666 | +++ checkbox/job.py 2012-06-23 00:59:17 +0000 | |||
667 | @@ -39,7 +39,7 @@ | |||
668 | 39 | 39 | ||
669 | 40 | DEFAULT_JOB_TIMEOUT = 30 # used in case a job specifies invalid timeout | 40 | DEFAULT_JOB_TIMEOUT = 30 # used in case a job specifies invalid timeout |
670 | 41 | 41 | ||
672 | 42 | class Job(object): | 42 | class Job: |
673 | 43 | 43 | ||
674 | 44 | def __init__(self, command, environ=None, timeout=None): | 44 | def __init__(self, command, environ=None, timeout=None): |
675 | 45 | if environ is None: | 45 | if environ is None: |
676 | @@ -93,8 +93,8 @@ | |||
677 | 93 | (signal_to_name(term_signal), | 93 | (signal_to_name(term_signal), |
678 | 94 | signal_to_description(term_signal)) | 94 | signal_to_description(term_signal)) |
679 | 95 | else: | 95 | else: |
682 | 96 | raise Exception, "Command not terminated: %s" \ | 96 | raise Exception("Command not terminated: %s" \ |
683 | 97 | % self.command | 97 | % self.command) |
684 | 98 | 98 | ||
685 | 99 | duration = process.endtime - process.starttime | 99 | duration = process.endtime - process.starttime |
686 | 100 | 100 | ||
687 | @@ -133,7 +133,7 @@ | |||
688 | 133 | def _find_matching_messages(self, **kwargs): | 133 | def _find_matching_messages(self, **kwargs): |
689 | 134 | for filename in self._walk_messages(): | 134 | for filename in self._walk_messages(): |
690 | 135 | message = self._read_message(filename,cache=True) | 135 | message = self._read_message(filename,cache=True) |
692 | 136 | for key, value in kwargs.iteritems(): | 136 | for key, value in kwargs.items(): |
693 | 137 | if message.get(key) != value: | 137 | if message.get(key) != value: |
694 | 138 | break | 138 | break |
695 | 139 | else: | 139 | else: |
696 | 140 | 140 | ||
697 | === modified file 'checkbox/lib/cache.py' | |||
698 | --- checkbox/lib/cache.py 2009-01-20 18:55:20 +0000 | |||
699 | +++ checkbox/lib/cache.py 2012-06-23 00:59:17 +0000 | |||
700 | @@ -16,7 +16,7 @@ | |||
701 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
702 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
703 | 18 | # | 18 | # |
705 | 19 | class Cache(object): | 19 | class Cache: |
706 | 20 | 20 | ||
707 | 21 | def __init__(self, function): | 21 | def __init__(self, function): |
708 | 22 | self._cache = {} | 22 | self._cache = {} |
709 | @@ -27,7 +27,7 @@ | |||
710 | 27 | return self | 27 | return self |
711 | 28 | 28 | ||
712 | 29 | def __call__(self, *args): | 29 | def __call__(self, *args): |
714 | 30 | if not self._cache.has_key((self._instance,) + args): | 30 | if (self._instance,) + args not in self._cache: |
715 | 31 | self._cache[(self._instance,) + args] = self._function(self._instance, *args) | 31 | self._cache[(self._instance,) + args] = self._function(self._instance, *args) |
716 | 32 | 32 | ||
717 | 33 | return self._cache[(self._instance,) + args] | 33 | return self._cache[(self._instance,) + args] |
718 | 34 | 34 | ||
719 | === modified file 'checkbox/lib/config.py' | |||
720 | --- checkbox/lib/config.py 2012-02-10 11:19:05 +0000 | |||
721 | +++ checkbox/lib/config.py 2012-06-23 00:59:17 +0000 | |||
722 | @@ -19,9 +19,8 @@ | |||
723 | 19 | import os | 19 | import os |
724 | 20 | import re | 20 | import re |
725 | 21 | import logging | 21 | import logging |
726 | 22 | import posixpath | ||
727 | 23 | 22 | ||
729 | 24 | from ConfigParser import ConfigParser | 23 | from configparser import ConfigParser |
730 | 25 | 24 | ||
731 | 26 | from checkbox.lib.text import split | 25 | from checkbox.lib.text import split |
732 | 27 | 26 | ||
733 | @@ -32,7 +31,7 @@ | |||
734 | 32 | super(IncludeDict, self).__init__() | 31 | super(IncludeDict, self).__init__() |
735 | 33 | self._parser = parser | 32 | self._parser = parser |
736 | 34 | 33 | ||
738 | 35 | for (key, value) in os.environ.iteritems(): | 34 | for (key, value) in os.environ.items(): |
739 | 36 | if key.startswith("CHECKBOX"): | 35 | if key.startswith("CHECKBOX"): |
740 | 37 | super(IncludeDict, self).__setitem__(key.lower(), value) | 36 | super(IncludeDict, self).__setitem__(key.lower(), value) |
741 | 38 | 37 | ||
742 | @@ -41,20 +40,18 @@ | |||
743 | 41 | if isinstance(value, list): | 40 | if isinstance(value, list): |
744 | 42 | value = value[0] | 41 | value = value[0] |
745 | 43 | for path in split(value): | 42 | for path in split(value): |
751 | 44 | path = self._parser._interpolate("DEFAULT", None, path, self) | 43 | path = self._parser._interpolation.before_get( |
752 | 45 | path = posixpath.expanduser(path) | 44 | self._parser, "DEFAULT", None, path, self) |
753 | 46 | if not posixpath.exists(path): | 45 | path = os.path.expanduser(path) |
754 | 47 | raise Exception, "No such configuration file: %s" % path | 46 | if not os.path.exists(path): |
755 | 48 | if posixpath.isdir(path): | 47 | raise Exception("No such configuration file: %s" % path) |
756 | 48 | if os.path.isdir(path): | ||
757 | 49 | logging.info("Parsing config filenames from directory: %s", | 49 | logging.info("Parsing config filenames from directory: %s", |
758 | 50 | path) | 50 | path) |
766 | 51 | def walk_func(arg, directory, names): | 51 | for dirpath, dirnames, filenames in os.walk(path): |
767 | 52 | for name in names: | 52 | for filename in filenames: |
768 | 53 | path = posixpath.join(directory, name) | 53 | path = os.path.join(dirpath, filename) |
769 | 54 | if not posixpath.isdir(path): | 54 | self._parser.read(path) |
763 | 55 | arg._parser.read(path) | ||
764 | 56 | |||
765 | 57 | posixpath.walk(path, walk_func, self) | ||
770 | 58 | else: | 55 | else: |
771 | 59 | logging.info("Parsing config filename: %s", path) | 56 | logging.info("Parsing config filename: %s", path) |
772 | 60 | self._parser.read(path) | 57 | self._parser.read(path) |
773 | @@ -64,20 +61,20 @@ | |||
774 | 64 | super(IncludeDict, self).__setitem__(key, value) | 61 | super(IncludeDict, self).__setitem__(key, value) |
775 | 65 | 62 | ||
776 | 66 | 63 | ||
778 | 67 | class ConfigSection(object): | 64 | class ConfigSection: |
779 | 68 | 65 | ||
780 | 69 | def __init__(self, parent, name, attributes={}): | 66 | def __init__(self, parent, name, attributes={}): |
781 | 70 | self.parent = parent | 67 | self.parent = parent |
782 | 71 | self.name = name | 68 | self.name = name |
783 | 72 | self.attributes = {} | 69 | self.attributes = {} |
785 | 73 | for key, value in attributes.iteritems(): | 70 | for key, value in attributes.items(): |
786 | 74 | self.attributes[key] = re.sub("\n\.\n", "\n\n", value) | 71 | self.attributes[key] = re.sub("\n\.\n", "\n\n", value) |
787 | 75 | 72 | ||
788 | 76 | def __getattr__(self, name): | 73 | def __getattr__(self, name): |
789 | 77 | if name in self.attributes: | 74 | if name in self.attributes: |
790 | 78 | return self.get(name) | 75 | return self.get(name) |
791 | 79 | 76 | ||
793 | 80 | raise AttributeError, name | 77 | raise AttributeError(name) |
794 | 81 | 78 | ||
795 | 82 | def __contains__(self, name): | 79 | def __contains__(self, name): |
796 | 83 | return name in self.attributes | 80 | return name in self.attributes |
797 | @@ -96,7 +93,7 @@ | |||
798 | 96 | if name in self.attributes: | 93 | if name in self.attributes: |
799 | 97 | return self.get(name) | 94 | return self.get(name) |
800 | 98 | 95 | ||
802 | 99 | raise AttributeError, name | 96 | raise AttributeError(name) |
803 | 100 | 97 | ||
804 | 101 | def get(self, name): | 98 | def get(self, name): |
805 | 102 | name_upper = name.upper() | 99 | name_upper = name.upper() |
806 | @@ -106,10 +103,10 @@ | |||
807 | 106 | return os.environ[name_upper] | 103 | return os.environ[name_upper] |
808 | 107 | 104 | ||
809 | 108 | 105 | ||
811 | 109 | class Config(object): | 106 | class Config: |
812 | 110 | 107 | ||
813 | 111 | def __init__(self): | 108 | def __init__(self): |
815 | 112 | self._parser = ConfigParser() | 109 | self._parser = ConfigParser(empty_lines_in_values=False) |
816 | 113 | self._parser._defaults = IncludeDict(self._parser) | 110 | self._parser._defaults = IncludeDict(self._parser) |
817 | 114 | 111 | ||
818 | 115 | # Copy attributes from the parser to avoid one additional | 112 | # Copy attributes from the parser to avoid one additional |
819 | @@ -121,7 +118,7 @@ | |||
820 | 121 | for config in configs: | 118 | for config in configs: |
821 | 122 | match = re.match("(.*)/([^/]+)=(.*)", config) | 119 | match = re.match("(.*)/([^/]+)=(.*)", config) |
822 | 123 | if not match: | 120 | if not match: |
824 | 124 | raise Exception, "Invalid config string: %s" % config | 121 | raise Exception("Invalid config string: %s" % config) |
825 | 125 | 122 | ||
826 | 126 | (name, option, value) = match.groups() | 123 | (name, option, value) = match.groups() |
827 | 127 | 124 | ||
828 | @@ -145,11 +142,11 @@ | |||
829 | 145 | def read_file(self, file, filename="<stream>"): | 142 | def read_file(self, file, filename="<stream>"): |
830 | 146 | logging.info("Reading configurations from: %s", filename) | 143 | logging.info("Reading configurations from: %s", filename) |
831 | 147 | 144 | ||
833 | 148 | self._parser.readfp(file, filename) | 145 | self._parser.read_file(file, filename) |
834 | 149 | 146 | ||
835 | 150 | def read_filename(self, filename): | 147 | def read_filename(self, filename): |
838 | 151 | if not posixpath.exists(filename): | 148 | if not os.path.exists(filename): |
839 | 152 | raise Exception, "No such configuration file: %s" % filename | 149 | raise Exception("No such configuration file: %s" % filename) |
840 | 153 | 150 | ||
841 | 154 | file = open(filename, "r") | 151 | file = open(filename, "r") |
842 | 155 | return self.read_file(file, filename) | 152 | return self.read_file(file, filename) |
843 | 156 | 153 | ||
844 | === modified file 'checkbox/lib/conversion.py' | |||
845 | --- checkbox/lib/conversion.py 2011-11-18 12:46:21 +0000 | |||
846 | +++ checkbox/lib/conversion.py 2012-06-23 00:59:17 +0000 | |||
847 | @@ -18,12 +18,13 @@ | |||
848 | 18 | # | 18 | # |
849 | 19 | import re | 19 | import re |
850 | 20 | 20 | ||
851 | 21 | from dateutil import tz | ||
852 | 22 | from datetime import ( | 21 | from datetime import ( |
853 | 23 | datetime, | 22 | datetime, |
854 | 24 | timedelta, | 23 | timedelta, |
855 | 25 | ) | 24 | ) |
856 | 26 | 25 | ||
857 | 26 | from checkbox.lib.tz import tzutc | ||
858 | 27 | |||
859 | 27 | 28 | ||
860 | 28 | DATETIME_RE = re.compile(r""" | 29 | DATETIME_RE = re.compile(r""" |
861 | 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) |
862 | @@ -108,8 +109,7 @@ | |||
863 | 108 | milliseconds = 999999 | 109 | milliseconds = 999999 |
864 | 109 | 110 | ||
865 | 110 | dt = datetime( | 111 | dt = datetime( |
868 | 111 | year, month, day, hour, minute, second, milliseconds, | 112 | year, month, day, hour, minute, second, milliseconds, tzinfo=tzutc) |
867 | 112 | tzinfo=tz.tzutc()) | ||
869 | 113 | 113 | ||
870 | 114 | tz_sign = time_parts['tz_sign'] | 114 | tz_sign = time_parts['tz_sign'] |
871 | 115 | tz_hour = time_parts['tz_hour'] | 115 | tz_hour = time_parts['tz_hour'] |
872 | @@ -150,7 +150,7 @@ | |||
873 | 150 | 150 | ||
874 | 151 | :param string: The string representation. | 151 | :param string: The string representation. |
875 | 152 | """ | 152 | """ |
877 | 153 | if isinstance(string, basestring): | 153 | if isinstance(string, str): |
878 | 154 | for regex, formatter in TYPE_FORMATS: | 154 | for regex, formatter in TYPE_FORMATS: |
879 | 155 | match = regex.match(string) | 155 | match = regex.match(string) |
880 | 156 | if match: | 156 | if match: |
881 | 157 | 157 | ||
882 | === modified file 'checkbox/lib/enum.py' | |||
883 | --- checkbox/lib/enum.py 2011-06-13 14:22:39 +0000 | |||
884 | +++ checkbox/lib/enum.py 2012-06-23 00:59:17 +0000 | |||
885 | @@ -25,7 +25,7 @@ | |||
886 | 25 | pass | 25 | pass |
887 | 26 | 26 | ||
888 | 27 | 27 | ||
890 | 28 | class Enum(object): | 28 | class Enum: |
891 | 29 | 29 | ||
892 | 30 | def __init__(self, *names): | 30 | def __init__(self, *names): |
893 | 31 | value = 0 | 31 | value = 0 |
894 | @@ -44,7 +44,7 @@ | |||
895 | 44 | "enum value does not define: %s" % value) | 44 | "enum value does not define: %s" % value) |
896 | 45 | value = getattr(self, value) | 45 | value = getattr(self, value) |
897 | 46 | 46 | ||
899 | 47 | if not isinstance(value, (int, long)): | 47 | if not isinstance(value, int): |
900 | 48 | raise EnumException( | 48 | raise EnumException( |
901 | 49 | "enum value is not an integer: %s" % value) | 49 | "enum value is not an integer: %s" % value) |
902 | 50 | 50 | ||
903 | 51 | 51 | ||
904 | === modified file 'checkbox/lib/fifo.py' | |||
905 | --- checkbox/lib/fifo.py 2011-06-13 14:22:39 +0000 | |||
906 | +++ checkbox/lib/fifo.py 2012-06-23 00:59:17 +0000 | |||
907 | @@ -22,26 +22,27 @@ | |||
908 | 22 | from checkbox.contrib.bpickle import dumps, loads | 22 | from checkbox.contrib.bpickle import dumps, loads |
909 | 23 | from checkbox.lib.selector import Selector, SelectorIO | 23 | from checkbox.lib.selector import Selector, SelectorIO |
910 | 24 | 24 | ||
914 | 25 | class FifoBase(object): | 25 | |
915 | 26 | 26 | class FifoBase: | |
916 | 27 | mode = None | 27 | |
917 | 28 | flags = None | ||
918 | 28 | 29 | ||
919 | 29 | def __init__(self, path, timeout=None): | 30 | def __init__(self, path, timeout=None): |
920 | 30 | self.path = path | 31 | self.path = path |
922 | 31 | self.file = open(path, self.mode) | 32 | self.fileno = os.open(path, self.flags) |
923 | 32 | self._timeout = timeout | 33 | self._timeout = timeout |
924 | 33 | 34 | ||
925 | 34 | def __del__(self): | 35 | def __del__(self): |
926 | 35 | self.close() | 36 | self.close() |
927 | 36 | 37 | ||
928 | 37 | def close(self): | 38 | def close(self): |
930 | 38 | self.file.close() | 39 | os.close(self.fileno) |
931 | 39 | 40 | ||
932 | 40 | def wait_for(self, operation): | 41 | def wait_for(self, operation): |
933 | 41 | if self._timeout is not None: | 42 | if self._timeout is not None: |
934 | 42 | selector = Selector() | 43 | selector = Selector() |
935 | 43 | selector.set_timeout(self._timeout) | 44 | selector.set_timeout(self._timeout) |
937 | 44 | selector.add_fd(self.file.fileno(), operation) | 45 | selector.add_fd(self.fileno, operation) |
938 | 45 | 46 | ||
939 | 46 | selector.execute() | 47 | selector.execute() |
940 | 47 | 48 | ||
941 | @@ -49,57 +50,53 @@ | |||
942 | 49 | return False | 50 | return False |
943 | 50 | return True | 51 | return True |
944 | 51 | 52 | ||
945 | 53 | |||
946 | 52 | class FifoReader(FifoBase): | 54 | class FifoReader(FifoBase): |
947 | 53 | 55 | ||
951 | 54 | #on Linux, opening a FIFO in read-write mode is non-blocking and | 56 | flags = os.O_RDWR |
949 | 55 | #succeeds even if other end is not open as per FIFO(7) | ||
950 | 56 | mode = "w+" | ||
952 | 57 | 57 | ||
954 | 58 | def read_string(self): | 58 | def read_bytes(self): |
955 | 59 | # Check if a connection arrived within the timeout | 59 | # Check if a connection arrived within the timeout |
956 | 60 | if not self.wait_for(SelectorIO.READ): | 60 | if not self.wait_for(SelectorIO.READ): |
957 | 61 | return None | 61 | return None |
958 | 62 | 62 | ||
959 | 63 | size = struct.calcsize("i") | 63 | size = struct.calcsize("i") |
963 | 64 | length_string = self.file.read(size) | 64 | length_bytes = os.read(self.fileno, size) |
964 | 65 | if not length_string: | 65 | if not length_bytes: |
965 | 66 | return "" | 66 | return b"" |
966 | 67 | 67 | ||
969 | 68 | length = struct.unpack(">i", length_string)[0] | 68 | length = struct.unpack(">i", length_bytes)[0] |
970 | 69 | return self.file.read(length) | 69 | return os.read(self.fileno, length) |
971 | 70 | 70 | ||
972 | 71 | def read_object(self): | 71 | def read_object(self): |
975 | 72 | string = self.read_string() | 72 | _bytes = self.read_bytes() |
976 | 73 | if not string: | 73 | if not _bytes: |
977 | 74 | return None | 74 | return None |
978 | 75 | 75 | ||
980 | 76 | return loads(string) | 76 | return loads(_bytes) |
981 | 77 | 77 | ||
982 | 78 | 78 | ||
983 | 79 | class FifoWriter(FifoBase): | 79 | class FifoWriter(FifoBase): |
984 | 80 | 80 | ||
992 | 81 | #on Linux, opening a FIFO in read-write mode is non-blocking and | 81 | flags = os.O_RDWR | os.O_CREAT | os.O_TRUNC |
993 | 82 | #succeeds even if other end is not open as per FIFO(7) | 82 | |
994 | 83 | mode = "w+" | 83 | def write_bytes(self, _bytes): |
995 | 84 | 84 | ||
996 | 85 | def write_string(self, string): | 85 | # Wait until I can write |
990 | 86 | |||
991 | 87 | # Wait until I can write | ||
997 | 88 | if not self.wait_for(SelectorIO.WRITE): | 86 | if not self.wait_for(SelectorIO.WRITE): |
999 | 89 | return None | 87 | return None |
1000 | 90 | 88 | ||
1006 | 91 | length = len(string) | 89 | length = len(_bytes) |
1007 | 92 | length_string = struct.pack(">i", length) | 90 | length_bytes = struct.pack(">i", length) |
1008 | 93 | self.file.write(length_string) | 91 | os.write(self.fileno, length_bytes) |
1009 | 94 | self.file.write(string) | 92 | os.write(self.fileno, _bytes) |
1005 | 95 | self.file.flush() | ||
1010 | 96 | return length | 93 | return length |
1011 | 97 | 94 | ||
1012 | 98 | def write_object(self, object): | 95 | def write_object(self, object): |
1018 | 99 | string = dumps(object) | 96 | _bytes = dumps(object) |
1019 | 100 | return self.write_string(string) | 97 | return self.write_bytes(_bytes) |
1020 | 101 | 98 | ||
1021 | 102 | 99 | ||
1022 | 103 | def create_fifo(path, mode=0666): | 100 | def create_fifo(path, mode=0o666): |
1023 | 104 | os.mkfifo(path, mode) | 101 | os.mkfifo(path, mode) |
1024 | 105 | return path | 102 | return path |
1025 | 106 | 103 | ||
1026 | === modified file 'checkbox/lib/log.py' | |||
1027 | --- checkbox/lib/log.py 2011-07-01 11:37:27 +0000 | |||
1028 | +++ checkbox/lib/log.py 2012-06-23 00:59:17 +0000 | |||
1029 | @@ -36,7 +36,7 @@ | |||
1030 | 36 | if kwargs: | 36 | if kwargs: |
1031 | 37 | args_string += ", " | 37 | args_string += ", " |
1032 | 38 | if kwargs: | 38 | if kwargs: |
1034 | 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()]) |
1035 | 40 | 40 | ||
1036 | 41 | module = object.__module__ if object.__module__ else inspect.getfile(object) | 41 | module = object.__module__ if object.__module__ else inspect.getfile(object) |
1037 | 42 | if inspect.ismethod(object): | 42 | if inspect.ismethod(object): |
1038 | 43 | 43 | ||
1039 | === modified file 'checkbox/lib/path.py' | |||
1040 | --- checkbox/lib/path.py 2009-01-20 18:55:20 +0000 | |||
1041 | +++ checkbox/lib/path.py 2012-06-23 00:59:17 +0000 | |||
1042 | @@ -16,13 +16,13 @@ | |||
1043 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
1044 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1045 | 18 | # | 18 | # |
1047 | 19 | import posixpath | 19 | import os |
1048 | 20 | 20 | ||
1049 | 21 | from glob import glob | 21 | from glob import glob |
1050 | 22 | 22 | ||
1051 | 23 | 23 | ||
1052 | 24 | def path_split(path): | 24 | def path_split(path): |
1054 | 25 | return path.split(posixpath.sep) | 25 | return path.split(os.path.sep) |
1055 | 26 | 26 | ||
1056 | 27 | def path_common(l1, l2, common=[]): | 27 | def path_common(l1, l2, common=[]): |
1057 | 28 | if len(l1) < 1: | 28 | if len(l1) < 1: |
1058 | @@ -40,26 +40,22 @@ | |||
1059 | 40 | (common, l1, l2) = path_common(path_split(p1), path_split(p2)) | 40 | (common, l1, l2) = path_common(path_split(p1), path_split(p2)) |
1060 | 41 | p = [] | 41 | p = [] |
1061 | 42 | if len(l1) > 0: | 42 | if len(l1) > 0: |
1063 | 43 | p = ["..%s" % posixpath.sep * len(l1)] | 43 | p = ["..%s" % os.path.sep * len(l1)] |
1064 | 44 | 44 | ||
1065 | 45 | p = p + l2 | 45 | p = p + l2 |
1067 | 46 | return posixpath.join( *p ) | 46 | return os.path.join( *p ) |
1068 | 47 | 47 | ||
1069 | 48 | def path_expand(path): | 48 | def path_expand(path): |
1071 | 49 | path = posixpath.expanduser(path) | 49 | path = os.path.expanduser(path) |
1072 | 50 | return glob(path) | 50 | return glob(path) |
1073 | 51 | 51 | ||
1074 | 52 | def path_expand_recursive(path): | 52 | def path_expand_recursive(path): |
1075 | 53 | paths = [] | 53 | paths = [] |
1076 | 54 | for path in path_expand(path): | 54 | for path in path_expand(path): |
1085 | 55 | if posixpath.isdir(path): | 55 | if os.path.isdir(path): |
1086 | 56 | def walk_func(arg, directory, names): | 56 | for dirpath, dirnames, filenames in os.walk(path): |
1087 | 57 | for name in names: | 57 | for filename in filenames: |
1088 | 58 | path = posixpath.join(directory, name) | 58 | paths.append(os.path.join(dirpath, filename)) |
1081 | 59 | if not posixpath.isdir(path): | ||
1082 | 60 | arg.append(path) | ||
1083 | 61 | |||
1084 | 62 | posixpath.walk(path, walk_func, paths) | ||
1089 | 63 | else: | 59 | else: |
1090 | 64 | paths.append(path) | 60 | paths.append(path) |
1091 | 65 | 61 | ||
1092 | 66 | 62 | ||
1093 | === modified file 'checkbox/lib/process.py' | |||
1094 | --- checkbox/lib/process.py 2012-03-07 19:46:29 +0000 | |||
1095 | +++ checkbox/lib/process.py 2012-06-23 00:59:17 +0000 | |||
1096 | @@ -16,7 +16,7 @@ | |||
1097 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
1098 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1099 | 18 | # | 18 | # |
1101 | 19 | from __future__ import absolute_import | 19 | |
1102 | 20 | 20 | ||
1103 | 21 | import os | 21 | import os |
1104 | 22 | import time | 22 | import time |
1105 | @@ -56,7 +56,7 @@ | |||
1106 | 56 | # that it would block waiting for a full BUFSIZ unless we explicitly | 56 | # that it would block waiting for a full BUFSIZ unless we explicitly |
1107 | 57 | # set the files non blocking, and there would be extra uneeded | 57 | # set the files non blocking, and there would be extra uneeded |
1108 | 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() |
1110 | 59 | self.outdata = self.errdata = "" | 59 | self.outdata = self.errdata = b"" |
1111 | 60 | self.starttime = self.endtime = None | 60 | self.starttime = self.endtime = None |
1112 | 61 | self._outeof = self._erreof = False | 61 | self._outeof = self._erreof = False |
1113 | 62 | 62 | ||
1114 | @@ -77,7 +77,8 @@ | |||
1115 | 77 | os.dup2(self.outw, STDOUT_FILENO) | 77 | os.dup2(self.outw, STDOUT_FILENO) |
1116 | 78 | os.dup2(self.errw, STDERR_FILENO) | 78 | os.dup2(self.errw, STDERR_FILENO) |
1117 | 79 | # stdout and stderr connected to pipe, so close all other files | 79 | # stdout and stderr connected to pipe, so close all other files |
1119 | 80 | map(os.close, [self.outr, self.outw, self.errr, self.errw]) | 80 | for fileno in self.outr, self.outw, self.errr, self.errw: |
1120 | 81 | os.close(fileno) | ||
1121 | 81 | try: | 82 | try: |
1122 | 82 | cmd = ["/bin/bash", "-c", cmd] | 83 | cmd = ["/bin/bash", "-c", cmd] |
1123 | 83 | os.execve(cmd[0], cmd, env) | 84 | os.execve(cmd[0], cmd, env) |
1124 | @@ -103,12 +104,12 @@ | |||
1125 | 103 | else: | 104 | else: |
1126 | 104 | if self.outr in ready[0]: | 105 | if self.outr in ready[0]: |
1127 | 105 | outchunk = os.read(self.outr, self.BUFSIZ) | 106 | outchunk = os.read(self.outr, self.BUFSIZ) |
1129 | 106 | if outchunk == "": | 107 | if outchunk == b"": |
1130 | 107 | self._outeof = True | 108 | self._outeof = True |
1131 | 108 | self.outdata += outchunk | 109 | self.outdata += outchunk |
1132 | 109 | if self.errr in ready[0]: | 110 | if self.errr in ready[0]: |
1133 | 110 | errchunk = os.read(self.errr, self.BUFSIZ) | 111 | errchunk = os.read(self.errr, self.BUFSIZ) |
1135 | 111 | if errchunk == "": | 112 | if errchunk == b"": |
1136 | 112 | self._erreof = True | 113 | self._erreof = True |
1137 | 113 | self.errdata += errchunk | 114 | self.errdata += errchunk |
1138 | 114 | if self._outeof and self._erreof: | 115 | if self._outeof and self._erreof: |
1139 | 115 | 116 | ||
1140 | === modified file 'checkbox/lib/redirect.py' | |||
1141 | --- checkbox/lib/redirect.py 2010-03-09 16:58:36 +0000 | |||
1142 | +++ checkbox/lib/redirect.py 2012-06-23 00:59:17 +0000 | |||
1143 | @@ -52,28 +52,28 @@ | |||
1144 | 52 | file = _file_write(file) | 52 | file = _file_write(file) |
1145 | 53 | sys.stdout, file = file, sys.stdout | 53 | sys.stdout, file = file, sys.stdout |
1146 | 54 | try: | 54 | try: |
1148 | 55 | ret = apply(func, args) | 55 | ret = func(*args) |
1149 | 56 | finally: | 56 | finally: |
1151 | 57 | print ret | 57 | print(ret) |
1152 | 58 | sys.stdout, file = file, sys.stdout | 58 | sys.stdout, file = file, sys.stdout |
1153 | 59 | return ret | 59 | return ret |
1154 | 60 | 60 | ||
1155 | 61 | def redirect_to_string(func, *args): | 61 | def redirect_to_string(func, *args): |
1156 | 62 | # apply func(*args) with stdout redirected to return string. | 62 | # apply func(*args) with stdout redirected to return string. |
1157 | 63 | file = tempfile.TemporaryFile() | 63 | file = tempfile.TemporaryFile() |
1159 | 64 | apply(redirect_to_file, (file, func) + args) | 64 | redirect_to_file(*(file, func) + args) |
1160 | 65 | file.seek(0) | 65 | file.seek(0) |
1161 | 66 | return file.read() | 66 | return file.read() |
1162 | 67 | 67 | ||
1163 | 68 | def redirect_to_lines(func, *args): | 68 | def redirect_to_lines(func, *args): |
1164 | 69 | # apply func(*args), returning a list of redirected stdout lines. | 69 | # apply func(*args), returning a list of redirected stdout lines. |
1165 | 70 | file = tempfile.TemporaryFile() | 70 | file = tempfile.TemporaryFile() |
1167 | 71 | apply(redirect_to_file, (file, func) + args) | 71 | redirect_to_file(*(file, func) + args) |
1168 | 72 | file.seek(0) | 72 | file.seek(0) |
1169 | 73 | return file.readlines() | 73 | return file.readlines() |
1170 | 74 | 74 | ||
1171 | 75 | 75 | ||
1173 | 76 | class RedirectTee(object): | 76 | class RedirectTee: |
1174 | 77 | 77 | ||
1175 | 78 | def __init__(self, *optargs): | 78 | def __init__(self, *optargs): |
1176 | 79 | self._files = [] | 79 | self._files = [] |
1177 | @@ -114,7 +114,7 @@ | |||
1178 | 114 | return 0 | 114 | return 0 |
1179 | 115 | 115 | ||
1180 | 116 | 116 | ||
1182 | 117 | class RedirectEcho(object): | 117 | class RedirectEcho: |
1183 | 118 | 118 | ||
1184 | 119 | def __init__(self, input, *output): | 119 | def __init__(self, input, *output): |
1185 | 120 | self._infile = _file_read(input) | 120 | self._infile = _file_read(input) |
1186 | @@ -124,7 +124,7 @@ | |||
1187 | 124 | self._output = None | 124 | self._output = None |
1188 | 125 | 125 | ||
1189 | 126 | def read(self, *howmuch): | 126 | def read(self, *howmuch): |
1191 | 127 | stuff = apply(self._infile.read, howmuch) | 127 | stuff = self._infile.read(*howmuch) |
1192 | 128 | if self._output: | 128 | if self._output: |
1193 | 129 | self._output.write(stuff) | 129 | self._output.write(stuff) |
1194 | 130 | return stuff | 130 | return stuff |
1195 | 131 | 131 | ||
1196 | === modified file 'checkbox/lib/resolver.py' | |||
1197 | --- checkbox/lib/resolver.py 2010-03-09 16:58:36 +0000 | |||
1198 | +++ checkbox/lib/resolver.py 2012-06-23 00:59:17 +0000 | |||
1199 | @@ -21,13 +21,10 @@ | |||
1200 | 21 | Main class. Instantiate with the root directory of your items. | 21 | Main class. Instantiate with the root directory of your items. |
1201 | 22 | """ | 22 | """ |
1202 | 23 | 23 | ||
1206 | 24 | def __init__(self, compare=None, key=None): | 24 | def __init__(self, key=None): |
1204 | 25 | if compare is None: | ||
1205 | 26 | compare = lambda a, b: cmp(a, b) | ||
1207 | 27 | if key is None: | 25 | if key is None: |
1208 | 28 | key = lambda k: k | 26 | key = lambda k: k |
1209 | 29 | 27 | ||
1210 | 30 | self.compare = compare | ||
1211 | 31 | self.key = key | 28 | self.key = key |
1212 | 32 | 29 | ||
1213 | 33 | # detect repeated resolution attempts - these indicate some circular dependency | 30 | # detect repeated resolution attempts - these indicate some circular dependency |
1214 | @@ -43,7 +40,7 @@ | |||
1215 | 43 | def add(self, item, *dependencies): | 40 | def add(self, item, *dependencies): |
1216 | 44 | key = self.key(item) | 41 | key = self.key(item) |
1217 | 45 | if key in self.items: | 42 | if key in self.items: |
1219 | 46 | raise Exception, "%s: key already exists" % key | 43 | raise Exception("%s: key already exists" % key) |
1220 | 47 | self.items[key] = item | 44 | self.items[key] = item |
1221 | 48 | 45 | ||
1222 | 49 | dependency_keys = [self.key(d) for d in dependencies] | 46 | dependency_keys = [self.key(d) for d in dependencies] |
1223 | @@ -69,7 +66,7 @@ | |||
1224 | 69 | msg = "no dependencies found for %s" % key | 66 | msg = "no dependencies found for %s" % key |
1225 | 70 | if found: | 67 | if found: |
1226 | 71 | msg += " while resolving %s" % found | 68 | msg += " while resolving %s" % found |
1228 | 72 | raise Exception, msg | 69 | raise Exception(msg) |
1229 | 73 | 70 | ||
1230 | 74 | dependencies = self.dependencies.get(key, set()) | 71 | dependencies = self.dependencies.get(key, set()) |
1231 | 75 | resolved = set() | 72 | resolved = set() |
1232 | @@ -81,7 +78,7 @@ | |||
1233 | 81 | scapegoat = found | 78 | scapegoat = found |
1234 | 82 | else: | 79 | else: |
1235 | 83 | scapegoat = dependency | 80 | scapegoat = dependency |
1237 | 84 | raise Exception, "circular dependency involving %s and %s" % (key, scapegoat) | 81 | raise Exception("circular dependency involving %s and %s" % (key, scapegoat)) |
1238 | 85 | # add resolution | 82 | # add resolution |
1239 | 86 | self.reentrant_resolution.add(resolution_step) | 83 | self.reentrant_resolution.add(resolution_step) |
1240 | 87 | # and its dependencies, if any | 84 | # and its dependencies, if any |
1241 | @@ -104,18 +101,14 @@ | |||
1242 | 104 | if item: | 101 | if item: |
1243 | 105 | # Immediate dependents | 102 | # Immediate dependents |
1244 | 106 | key = self.key(item) | 103 | key = self.key(item) |
1251 | 107 | all_dependents = filter( | 104 | all_dependents = [x for x in iter(self.items.values()) if key in self.resolve(x)[:-1]] |
1252 | 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] |
1247 | 109 | self.items.itervalues()) | ||
1248 | 110 | dependents = filter( | ||
1249 | 111 | lambda x: self.key(self.get_dependencies(x)[-2]) == key, | ||
1250 | 112 | all_dependents) | ||
1253 | 113 | else: | 106 | else: |
1254 | 114 | # First level of dependents | 107 | # First level of dependents |
1256 | 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] |
1257 | 116 | 109 | ||
1258 | 117 | index = 0 | 110 | index = 0 |
1260 | 118 | dependents = sorted(dependents, self.compare) | 111 | dependents = sorted(dependents) |
1261 | 119 | while index < len(dependents): | 112 | while index < len(dependents): |
1262 | 120 | sub_dependents = self.get_dependents(dependents[index]) | 113 | sub_dependents = self.get_dependents(dependents[index]) |
1263 | 121 | if sub_dependents: | 114 | if sub_dependents: |
1264 | 122 | 115 | ||
1265 | === modified file 'checkbox/lib/safe.py' | |||
1266 | --- checkbox/lib/safe.py 2012-02-23 11:56:50 +0000 | |||
1267 | +++ checkbox/lib/safe.py 2012-06-23 00:59:17 +0000 | |||
1268 | @@ -17,72 +17,70 @@ | |||
1269 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1270 | 18 | # | 18 | # |
1271 | 19 | import os | 19 | import os |
1273 | 20 | import posixpath | 20 | import hashlib |
1274 | 21 | import shutil | 21 | import shutil |
1275 | 22 | 22 | ||
1276 | 23 | from stat import ST_MODE, S_IMODE, S_ISFIFO | 23 | from stat import ST_MODE, S_IMODE, S_ISFIFO |
1277 | 24 | 24 | ||
1278 | 25 | 25 | ||
1279 | 26 | def safe_change_mode(path, mode): | 26 | def safe_change_mode(path, mode): |
1282 | 27 | if not posixpath.exists(path): | 27 | if not os.path.exists(path): |
1283 | 28 | raise Exception, "Path does not exist: %s" % path | 28 | raise Exception("Path does not exist: %s" % path) |
1284 | 29 | 29 | ||
1285 | 30 | old_mode = os.stat(path)[ST_MODE] | 30 | old_mode = os.stat(path)[ST_MODE] |
1286 | 31 | if mode != S_IMODE(old_mode): | 31 | if mode != S_IMODE(old_mode): |
1287 | 32 | os.chmod(path, mode) | 32 | os.chmod(path, mode) |
1288 | 33 | 33 | ||
1293 | 34 | def safe_make_directory(path, mode=0755): | 34 | def safe_make_directory(path, mode=0o755): |
1294 | 35 | if posixpath.exists(path): | 35 | if os.path.exists(path): |
1295 | 36 | if not posixpath.isdir(path): | 36 | if not os.path.isdir(path): |
1296 | 37 | raise Exception, "Path is not a directory: %s" % path | 37 | raise Exception("Path is not a directory: %s" % path) |
1297 | 38 | else: | 38 | else: |
1298 | 39 | os.makedirs(path, mode) | 39 | os.makedirs(path, mode) |
1299 | 40 | 40 | ||
1302 | 41 | def safe_make_fifo(path, mode=0666): | 41 | def safe_make_fifo(path, mode=0o666): |
1303 | 42 | if posixpath.exists(path): | 42 | if os.path.exists(path): |
1304 | 43 | mode = os.stat(path)[ST_MODE] | 43 | mode = os.stat(path)[ST_MODE] |
1305 | 44 | if not S_ISFIFO(mode): | 44 | if not S_ISFIFO(mode): |
1307 | 45 | raise Exception, "Path is not a FIFO: %s" % path | 45 | raise Exception("Path is not a FIFO: %s" % path) |
1308 | 46 | else: | 46 | else: |
1309 | 47 | os.mkfifo(path, mode) | 47 | os.mkfifo(path, mode) |
1310 | 48 | 48 | ||
1311 | 49 | def safe_remove_directory(path): | 49 | def safe_remove_directory(path): |
1315 | 50 | if posixpath.exists(path): | 50 | if os.path.exists(path): |
1316 | 51 | if not posixpath.isdir(path): | 51 | if not os.path.isdir(path): |
1317 | 52 | raise Exception, "Path is not a directory: %s" % path | 52 | raise Exception("Path is not a directory: %s" % path) |
1318 | 53 | 53 | ||
1319 | 54 | shutil.rmtree(path) | 54 | shutil.rmtree(path) |
1320 | 55 | 55 | ||
1321 | 56 | def safe_remove_file(path): | 56 | def safe_remove_file(path): |
1325 | 57 | if posixpath.exists(path): | 57 | if os.path.exists(path): |
1326 | 58 | if not posixpath.isfile(path): | 58 | if not os.path.isfile(path): |
1327 | 59 | raise Exception, "Path is not a file: %s" % path | 59 | raise Exception("Path is not a file: %s" % path) |
1328 | 60 | 60 | ||
1329 | 61 | os.remove(path) | 61 | os.remove(path) |
1330 | 62 | 62 | ||
1331 | 63 | def safe_rename(old, new): | 63 | def safe_rename(old, new): |
1332 | 64 | if old != new: | 64 | if old != new: |
1337 | 65 | if not posixpath.exists(old): | 65 | if not os.path.exists(old): |
1338 | 66 | raise Exception, "Old path does not exist: %s" % old | 66 | raise Exception("Old path does not exist: %s" % old) |
1339 | 67 | if posixpath.exists(new): | 67 | if os.path.exists(new): |
1340 | 68 | raise Exception, "New path exists already: %s" % new | 68 | raise Exception("New path exists already: %s" % new) |
1341 | 69 | 69 | ||
1342 | 70 | os.rename(old, new) | 70 | os.rename(old, new) |
1343 | 71 | 71 | ||
1354 | 72 | def safe_md5sum(): | 72 | class safe_md5sum: |
1355 | 73 | try: | 73 | |
1356 | 74 | import hashlib | 74 | def __init__(self): |
1357 | 75 | digest = hashlib.md5() | 75 | self.digest = hashlib.md5() |
1358 | 76 | except ImportError: | 76 | self.hexdigest = self.digest.hexdigest |
1359 | 77 | # for Python << 2.5 | 77 | |
1360 | 78 | import md5 | 78 | def update(self, string): |
1361 | 79 | digest = md5.new() | 79 | self.digest.update(string.encode("utf-8")) |
1352 | 80 | |||
1353 | 81 | return digest | ||
1362 | 82 | 80 | ||
1363 | 83 | def safe_md5sum_file(name): | 81 | def safe_md5sum_file(name): |
1364 | 84 | md5sum = None | 82 | md5sum = None |
1366 | 85 | if posixpath.exists(name): | 83 | if os.path.exists(name): |
1367 | 86 | file = open(name) | 84 | file = open(name) |
1368 | 87 | digest = safe_md5sum() | 85 | digest = safe_md5sum() |
1369 | 88 | while 1: | 86 | while 1: |
1370 | 89 | 87 | ||
1371 | === modified file 'checkbox/lib/script.py' | |||
1372 | --- checkbox/lib/script.py 2009-01-20 18:55:20 +0000 | |||
1373 | +++ checkbox/lib/script.py 2012-06-23 00:59:17 +0000 | |||
1374 | @@ -26,8 +26,8 @@ | |||
1375 | 26 | if not posixpath.exists(path): | 26 | if not posixpath.exists(path): |
1376 | 27 | path = get_path(script) | 27 | path = get_path(script) |
1377 | 28 | if not path: | 28 | if not path: |
1379 | 29 | raise Exception, "Script not found in PATH: %s" % script | 29 | raise Exception("Script not found in PATH: %s" % script) |
1380 | 30 | 30 | ||
1381 | 31 | globals = {} | 31 | globals = {} |
1383 | 32 | execfile(path, globals) | 32 | exec(compile(open(path).read(), path, 'exec'), globals) |
1384 | 33 | return globals | 33 | return globals |
1385 | 34 | 34 | ||
1386 | === modified file 'checkbox/lib/selector.py' | |||
1387 | --- checkbox/lib/selector.py 2011-06-13 14:22:39 +0000 | |||
1388 | +++ checkbox/lib/selector.py 2012-06-23 00:59:17 +0000 | |||
1389 | @@ -39,7 +39,7 @@ | |||
1390 | 39 | "FAILED") | 39 | "FAILED") |
1391 | 40 | 40 | ||
1392 | 41 | 41 | ||
1394 | 42 | class Selector(object): | 42 | class Selector: |
1395 | 43 | __slots__ = ("_read_fds", "_write_fds", "_except_fds", | 43 | __slots__ = ("_read_fds", "_write_fds", "_except_fds", |
1396 | 44 | "_save_read_fds", "_save_write_fds", "_save_except_fds", | 44 | "_save_read_fds", "_save_write_fds", "_save_except_fds", |
1397 | 45 | "_fd_set_size", "_timeout", "_state", "_errno") | 45 | "_fd_set_size", "_timeout", "_state", "_errno") |
1398 | @@ -166,7 +166,7 @@ | |||
1399 | 166 | self._read_fds, self._write_fds, self._except_fds = select.select( | 166 | self._read_fds, self._write_fds, self._except_fds = select.select( |
1400 | 167 | self._save_read_fds, self._save_write_fds, | 167 | self._save_read_fds, self._save_write_fds, |
1401 | 168 | self._save_except_fds, self._timeout) | 168 | self._save_except_fds, self._timeout) |
1403 | 169 | except select.error, e: | 169 | except select.error as e: |
1404 | 170 | self._errno = e.errno | 170 | self._errno = e.errno |
1405 | 171 | if e.errno == errno.EINTR: | 171 | if e.errno == errno.EINTR: |
1406 | 172 | self._state = SelectorState.SIGNALED | 172 | self._state = SelectorState.SIGNALED |
1407 | 173 | 173 | ||
1408 | === modified file 'checkbox/lib/signal.py' | |||
1409 | --- checkbox/lib/signal.py 2009-03-31 13:54:12 +0000 | |||
1410 | +++ checkbox/lib/signal.py 2012-06-23 00:59:17 +0000 | |||
1411 | @@ -72,7 +72,7 @@ | |||
1412 | 72 | signal -- number of the signal as returned by wait | 72 | signal -- number of the signal as returned by wait |
1413 | 73 | """ | 73 | """ |
1414 | 74 | 74 | ||
1416 | 75 | if signal_name_table.has_key(signal): | 75 | if signal in signal_name_table: |
1417 | 76 | return signal_name_table[signal] | 76 | return signal_name_table[signal] |
1418 | 77 | return _("UNKNOWN") | 77 | return _("UNKNOWN") |
1419 | 78 | 78 | ||
1420 | @@ -84,6 +84,6 @@ | |||
1421 | 84 | """ | 84 | """ |
1422 | 85 | 85 | ||
1423 | 86 | name = signal_to_name(signal) | 86 | name = signal_to_name(signal) |
1425 | 87 | if signal_description_table.has_key(name): | 87 | if name in signal_description_table: |
1426 | 88 | return signal_description_table[name] | 88 | return signal_description_table[name] |
1427 | 89 | return _("Unknown signal") | 89 | return _("Unknown signal") |
1428 | 90 | 90 | ||
1429 | === modified file 'checkbox/lib/template.py' | |||
1430 | --- checkbox/lib/template.py 2011-11-18 12:46:21 +0000 | |||
1431 | +++ checkbox/lib/template.py 2012-06-23 00:59:17 +0000 | |||
1432 | @@ -23,7 +23,7 @@ | |||
1433 | 23 | EXTENDED_STRING = "_extended" | 23 | EXTENDED_STRING = "_extended" |
1434 | 24 | 24 | ||
1435 | 25 | 25 | ||
1437 | 26 | class Template(object): | 26 | class Template: |
1438 | 27 | 27 | ||
1439 | 28 | def _reader(self, file, size=4096, delimiter=r"\n{2,}"): | 28 | def _reader(self, file, size=4096, delimiter=r"\n{2,}"): |
1440 | 29 | buffer_old = "" | 29 | buffer_old = "" |
1441 | @@ -42,7 +42,7 @@ | |||
1442 | 42 | 42 | ||
1443 | 43 | def dump_file(self, elements, file, filename="<stream>"): | 43 | def dump_file(self, elements, file, filename="<stream>"): |
1444 | 44 | for element in elements: | 44 | for element in elements: |
1446 | 45 | for long_key in element.keys(): | 45 | for long_key in list(element.keys()): |
1447 | 46 | if long_key.endswith(EXTENDED_STRING): | 46 | if long_key.endswith(EXTENDED_STRING): |
1448 | 47 | short_key = long_key.replace(EXTENDED_STRING, "") | 47 | short_key = long_key.replace(EXTENDED_STRING, "") |
1449 | 48 | del element[short_key] | 48 | del element[short_key] |
1450 | @@ -79,11 +79,10 @@ | |||
1451 | 79 | def _save(field, value, extended): | 79 | def _save(field, value, extended): |
1452 | 80 | extended = extended.rstrip("\n") | 80 | extended = extended.rstrip("\n") |
1453 | 81 | if field: | 81 | if field: |
1457 | 82 | if element.has_key(field): | 82 | if field in element: |
1458 | 83 | raise Exception, \ | 83 | raise Exception("Template %s has a duplicate field '%s'" \ |
1456 | 84 | "Template %s has a duplicate field '%s'" \ | ||
1459 | 85 | " with a new value '%s'." \ | 84 | " with a new value '%s'." \ |
1461 | 86 | % (filename, field, value) | 85 | % (filename, field, value)) |
1462 | 87 | element[field] = value | 86 | element[field] = value |
1463 | 88 | if extended: | 87 | if extended: |
1464 | 89 | element["%s%s" % (field, EXTENDED_STRING)] = extended | 88 | element["%s%s" % (field, EXTENDED_STRING)] = extended |
1465 | @@ -128,8 +127,8 @@ | |||
1466 | 128 | extended += bit | 127 | extended += bit |
1467 | 129 | continue | 128 | continue |
1468 | 130 | 129 | ||
1471 | 131 | raise Exception, "Template %s parse error at: %s" \ | 130 | raise Exception("Template %s parse error at: %s" \ |
1472 | 132 | % (filename, line) | 131 | % (filename, line)) |
1473 | 133 | 132 | ||
1474 | 134 | _save(field, value, extended) | 133 | _save(field, value, extended) |
1475 | 135 | 134 | ||
1476 | @@ -140,5 +139,5 @@ | |||
1477 | 140 | def load_filename(self, filename): | 139 | def load_filename(self, filename): |
1478 | 141 | logging.info("Loading elements from filename: %s", filename) | 140 | logging.info("Loading elements from filename: %s", filename) |
1479 | 142 | 141 | ||
1481 | 143 | file = open(filename, "r") | 142 | file = open(filename, "r", encoding="utf-8") |
1482 | 144 | return self.load_file(file, filename) | 143 | return self.load_file(file, filename) |
1483 | 145 | 144 | ||
1484 | === modified file 'checkbox/lib/template_i18n.py' | |||
1485 | --- checkbox/lib/template_i18n.py 2012-02-10 11:19:05 +0000 | |||
1486 | +++ checkbox/lib/template_i18n.py 2012-06-23 00:59:17 +0000 | |||
1487 | @@ -53,7 +53,7 @@ | |||
1488 | 53 | 53 | ||
1489 | 54 | language_match = re.match(r"([^_@.]+)(_[^_@.]+)?(\..+)?", language) | 54 | language_match = re.match(r"([^_@.]+)(_[^_@.]+)?(\..+)?", language) |
1490 | 55 | if not language_match: | 55 | if not language_match: |
1492 | 56 | raise Exception, "Unknown language format: %s" % language | 56 | raise Exception("Unknown language format: %s" % language) |
1493 | 57 | 57 | ||
1494 | 58 | ret = [language_match.group(1)] | 58 | ret = [language_match.group(1)] |
1495 | 59 | if modifier_match: | 59 | if modifier_match: |
1496 | @@ -75,7 +75,7 @@ | |||
1497 | 75 | 75 | ||
1498 | 76 | def _get_languages(self): | 76 | def _get_languages(self): |
1499 | 77 | languages = [] | 77 | languages = [] |
1501 | 78 | if environ.has_key("LANGUAGE") and environ["LANGUAGE"]: | 78 | if "LANGUAGE" in environ and environ["LANGUAGE"]: |
1502 | 79 | for language in environ["LANGUAGE"].split(":"): | 79 | for language in environ["LANGUAGE"].split(":"): |
1503 | 80 | if language: | 80 | if language: |
1504 | 81 | languages.extend(self._get_language_list(language)) | 81 | languages.extend(self._get_language_list(language)) |
1505 | @@ -96,11 +96,11 @@ | |||
1506 | 96 | def _filter_languages(self, element): | 96 | def _filter_languages(self, element): |
1507 | 97 | filter = {} | 97 | filter = {} |
1508 | 98 | basekeys = {} | 98 | basekeys = {} |
1510 | 99 | for key in element.iterkeys(): | 99 | for key in element.keys(): |
1511 | 100 | basekey = re.sub(r"^_?([^-]+).*$", "\\1", key) | 100 | basekey = re.sub(r"^_?([^-]+).*$", "\\1", key) |
1512 | 101 | basekeys[basekey] = None | 101 | basekeys[basekey] = None |
1513 | 102 | 102 | ||
1515 | 103 | for key in basekeys.iterkeys(): | 103 | for key in basekeys.keys(): |
1516 | 104 | if self._languages: | 104 | if self._languages: |
1517 | 105 | for language in self._languages: | 105 | for language in self._languages: |
1518 | 106 | field = "%s-%s" % (key, language) | 106 | field = "%s-%s" % (key, language) |
1519 | @@ -124,7 +124,7 @@ | |||
1520 | 124 | filter[key] = self._filter_field(element[field]) | 124 | filter[key] = self._filter_field(element[field]) |
1521 | 125 | continue | 125 | continue |
1522 | 126 | 126 | ||
1524 | 127 | raise Exception, "No language found for key: %s" % key | 127 | raise Exception("No language found for key: %s" % key) |
1525 | 128 | 128 | ||
1526 | 129 | return filter | 129 | return filter |
1527 | 130 | 130 | ||
1528 | 131 | 131 | ||
1529 | === modified file 'checkbox/lib/tests/resolver.py' | |||
1530 | --- checkbox/lib/tests/resolver.py 2009-08-19 15:36:05 +0000 | |||
1531 | +++ checkbox/lib/tests/resolver.py 2012-06-23 00:59:17 +0000 | |||
1532 | @@ -26,7 +26,7 @@ | |||
1533 | 26 | resolver = Resolver() | 26 | resolver = Resolver() |
1534 | 27 | try: | 27 | try: |
1535 | 28 | resolver.get_dependencies('a') | 28 | resolver.get_dependencies('a') |
1537 | 29 | except Exception, error: | 29 | except Exception as error: |
1538 | 30 | self.assertTrue(error.args[0].startswith('no dependencies')) | 30 | self.assertTrue(error.args[0].startswith('no dependencies')) |
1539 | 31 | else: | 31 | else: |
1540 | 32 | self.fail('non existing element accepted by resolver') | 32 | self.fail('non existing element accepted by resolver') |
1541 | @@ -67,7 +67,7 @@ | |||
1542 | 67 | resolver.add('b', 'a') | 67 | resolver.add('b', 'a') |
1543 | 68 | try: | 68 | try: |
1544 | 69 | resolver.get_dependencies('a') | 69 | resolver.get_dependencies('a') |
1546 | 70 | except Exception, error: | 70 | except Exception as error: |
1547 | 71 | self.assertTrue(error.args[0].startswith('circular dependency')) | 71 | self.assertTrue(error.args[0].startswith('circular dependency')) |
1548 | 72 | else: | 72 | else: |
1549 | 73 | self.fail('circular dependency not detected') | 73 | self.fail('circular dependency not detected') |
1550 | 74 | 74 | ||
1551 | === modified file 'checkbox/lib/transport.py' | |||
1552 | --- checkbox/lib/transport.py 2011-09-29 13:12:01 +0000 | |||
1553 | +++ checkbox/lib/transport.py 2012-06-23 00:59:17 +0000 | |||
1554 | @@ -22,101 +22,67 @@ | |||
1555 | 22 | import re | 22 | import re |
1556 | 23 | import stat | 23 | import stat |
1557 | 24 | import sys | 24 | import sys |
1558 | 25 | import posixpath | ||
1559 | 26 | 25 | ||
1561 | 27 | import mimetools | 26 | import email.generator |
1562 | 27 | import http.client | ||
1563 | 28 | import mimetypes | 28 | import mimetypes |
1564 | 29 | import socket | 29 | import socket |
1608 | 30 | import httplib | 30 | import ssl |
1609 | 31 | import urllib | 31 | import urllib.request, urllib.parse, urllib.error |
1610 | 32 | 32 | ||
1611 | 33 | 33 | ||
1612 | 34 | # Build the appropriate socket wrapper for ssl | 34 | class ProxyHTTPConnection(http.client.HTTPConnection): |
1613 | 35 | try: | 35 | |
1614 | 36 | # Python 2.6 introduced a better ssl package | 36 | _ports = {"http": http.client.HTTP_PORT, "https": http.client.HTTPS_PORT} |
1572 | 37 | import ssl | ||
1573 | 38 | _ssl_wrap_socket = ssl.wrap_socket | ||
1574 | 39 | except ImportError: | ||
1575 | 40 | # Python versions prior to 2.6 don't have ssl and ssl.wrap_socket instead | ||
1576 | 41 | # they use httplib.FakeSocket | ||
1577 | 42 | def _ssl_wrap_socket(sock, key_file, cert_file): | ||
1578 | 43 | ssl_sock = socket.ssl(sock, key_file, cert_file) | ||
1579 | 44 | return httplib.FakeSocket(sock, ssl_sock) | ||
1580 | 45 | |||
1581 | 46 | try: | ||
1582 | 47 | # Python 2.6 introduced create_connection convenience function | ||
1583 | 48 | create_connection = socket.create_connection | ||
1584 | 49 | except AttributeError: | ||
1585 | 50 | def create_connection(address, timeout=None): | ||
1586 | 51 | msg = "getaddrinfo returns an empty list" | ||
1587 | 52 | host, port = address | ||
1588 | 53 | for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): | ||
1589 | 54 | af, socktype, proto, canonname, sa = res | ||
1590 | 55 | sock = None | ||
1591 | 56 | try: | ||
1592 | 57 | sock = socket.socket(af, socktype, proto) | ||
1593 | 58 | if timeout is not None: | ||
1594 | 59 | sock.settimeout(timeout) | ||
1595 | 60 | sock.connect(sa) | ||
1596 | 61 | return sock | ||
1597 | 62 | |||
1598 | 63 | except socket.error, msg: | ||
1599 | 64 | if sock is not None: | ||
1600 | 65 | sock.close() | ||
1601 | 66 | |||
1602 | 67 | raise socket.error, msg | ||
1603 | 68 | |||
1604 | 69 | |||
1605 | 70 | class ProxyHTTPConnection(httplib.HTTPConnection): | ||
1606 | 71 | |||
1607 | 72 | _ports = {"http" : httplib.HTTP_PORT, "https" : httplib.HTTPS_PORT} | ||
1615 | 73 | 37 | ||
1616 | 74 | def request(self, method, url, body=None, headers={}): | 38 | def request(self, method, url, body=None, headers={}): |
1617 | 75 | #request is called before connect, so can interpret url and get | 39 | #request is called before connect, so can interpret url and get |
1618 | 76 | #real host/port to be used to make CONNECT request to proxy | 40 | #real host/port to be used to make CONNECT request to proxy |
1620 | 77 | scheme, rest = urllib.splittype(url) | 41 | scheme, rest = urllib.parse.splittype(url) |
1621 | 78 | if scheme is None: | 42 | if scheme is None: |
1623 | 79 | raise ValueError, "unknown URL type: %s" % url | 43 | raise ValueError("unknown URL type: %s" % url) |
1624 | 80 | #get host | 44 | #get host |
1626 | 81 | host, rest = urllib.splithost(rest) | 45 | host, rest = urllib.parse.splithost(rest) |
1627 | 82 | #try to get port | 46 | #try to get port |
1629 | 83 | host, port = urllib.splitport(host) | 47 | host, port = urllib.parse.splitport(host) |
1630 | 84 | #if port is not defined try to get from scheme | 48 | #if port is not defined try to get from scheme |
1631 | 85 | if port is None: | 49 | if port is None: |
1632 | 86 | try: | 50 | try: |
1633 | 87 | port = self._ports[scheme] | 51 | port = self._ports[scheme] |
1634 | 88 | except KeyError: | 52 | except KeyError: |
1636 | 89 | raise ValueError, "unknown protocol for: %s" % url | 53 | raise ValueError("unknown protocol for: %s" % url) |
1637 | 90 | else: | 54 | else: |
1638 | 91 | port = int(port) | 55 | port = int(port) |
1639 | 92 | 56 | ||
1640 | 93 | self._real_host = host | 57 | self._real_host = host |
1641 | 94 | self._real_port = port | 58 | self._real_port = port |
1643 | 95 | httplib.HTTPConnection.request(self, method, url, body, headers) | 59 | http.client.HTTPConnection.request(self, method, url, body, headers) |
1644 | 96 | 60 | ||
1645 | 97 | def connect(self): | 61 | def connect(self): |
1647 | 98 | httplib.HTTPConnection.connect(self) | 62 | http.client.HTTPConnection.connect(self) |
1648 | 99 | #send proxy CONNECT request | 63 | #send proxy CONNECT request |
1650 | 100 | self.send("CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self._real_host, self._real_port)) | 64 | self.send(( |
1651 | 65 | "CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self._real_host, self._real_port) | ||
1652 | 66 | ).encode("ascii")) | ||
1653 | 101 | #expect a HTTP/1.0 200 Connection established | 67 | #expect a HTTP/1.0 200 Connection established |
1655 | 102 | response = self.response_class(self.sock, strict=self.strict, method=self._method) | 68 | response = self.response_class(self.sock, method=self._method) |
1656 | 103 | (version, code, message) = response._read_status() | 69 | (version, code, message) = response._read_status() |
1657 | 104 | #probably here we can handle auth requests... | 70 | #probably here we can handle auth requests... |
1658 | 105 | if code != 200: | 71 | if code != 200: |
1659 | 106 | #proxy returned and error, abort connection, and raise exception | 72 | #proxy returned and error, abort connection, and raise exception |
1660 | 107 | self.close() | 73 | self.close() |
1662 | 108 | raise socket.error, "Proxy connection failed: %d %s" % (code, message.strip()) | 74 | raise socket.error("Proxy connection failed: %d %s" % (code, message.strip())) |
1663 | 109 | #eat up header block from proxy.... | 75 | #eat up header block from proxy.... |
1664 | 110 | while True: | 76 | while True: |
1666 | 111 | #should not use directly fp probablu | 77 | #should not use directly fp probably |
1667 | 112 | line = response.fp.readline() | 78 | line = response.fp.readline() |
1669 | 113 | if line == "\r\n": | 79 | if line == b"\r\n": |
1670 | 114 | break | 80 | break |
1671 | 115 | 81 | ||
1672 | 116 | 82 | ||
1673 | 117 | class ProxyHTTPSConnection(ProxyHTTPConnection): | 83 | class ProxyHTTPSConnection(ProxyHTTPConnection): |
1674 | 118 | 84 | ||
1676 | 119 | default_port = httplib.HTTPS_PORT | 85 | default_port = http.client.HTTPS_PORT |
1677 | 120 | 86 | ||
1678 | 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): |
1679 | 122 | ProxyHTTPConnection.__init__(self, host, port) | 88 | ProxyHTTPConnection.__init__(self, host, port) |
1680 | @@ -125,10 +91,10 @@ | |||
1681 | 125 | 91 | ||
1682 | 126 | def connect(self): | 92 | def connect(self): |
1683 | 127 | ProxyHTTPConnection.connect(self) | 93 | ProxyHTTPConnection.connect(self) |
1688 | 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) |
1689 | 129 | 95 | ||
1690 | 130 | 96 | ||
1691 | 131 | class VerifiedHTTPSConnection(httplib.HTTPSConnection): | 97 | class VerifiedHTTPSConnection(http.client.HTTPSConnection): |
1692 | 132 | 98 | ||
1693 | 133 | # Compatibility layer with Python 2.5 | 99 | # Compatibility layer with Python 2.5 |
1694 | 134 | timeout = None | 100 | timeout = None |
1695 | @@ -163,14 +129,14 @@ | |||
1696 | 163 | def connect(self): | 129 | def connect(self): |
1697 | 164 | # overrides the version in httplib so that we do | 130 | # overrides the version in httplib so that we do |
1698 | 165 | # certificate verification | 131 | # certificate verification |
1700 | 166 | sock = create_connection((self.host, self.port), self.timeout) | 132 | sock = socket.create_connection((self.host, self.port), self.timeout) |
1701 | 167 | if self._tunnel_host: | 133 | if self._tunnel_host: |
1702 | 168 | self.sock = sock | 134 | self.sock = sock |
1703 | 169 | self._tunnel() | 135 | self._tunnel() |
1704 | 170 | 136 | ||
1705 | 171 | # wrap the socket using verification with the root | 137 | # wrap the socket using verification with the root |
1706 | 172 | # certs in trusted_root_certs | 138 | # certs in trusted_root_certs |
1708 | 173 | self.sock = _ssl_wrap_socket(sock, | 139 | self.sock = ssl.wrap_socket(sock, |
1709 | 174 | self.key_file, | 140 | self.key_file, |
1710 | 175 | self.cert_file, | 141 | self.cert_file, |
1711 | 176 | cert_reqs=ssl.CERT_REQUIRED, | 142 | cert_reqs=ssl.CERT_REQUIRED, |
1712 | @@ -181,20 +147,20 @@ | |||
1713 | 181 | "Failed to verify cert for hostname: %s" % self.host) | 147 | "Failed to verify cert for hostname: %s" % self.host) |
1714 | 182 | 148 | ||
1715 | 183 | 149 | ||
1717 | 184 | class HTTPTransport(object): | 150 | class HTTPTransport: |
1718 | 185 | """Transport makes a request to exchange message data over HTTP.""" | 151 | """Transport makes a request to exchange message data over HTTP.""" |
1719 | 186 | 152 | ||
1720 | 187 | def __init__(self, url): | 153 | def __init__(self, url): |
1721 | 188 | self.url = url | 154 | self.url = url |
1722 | 189 | 155 | ||
1724 | 190 | proxies = urllib.getproxies() | 156 | proxies = urllib.request.getproxies() |
1725 | 191 | self.http_proxy = proxies.get("http") | 157 | self.http_proxy = proxies.get("http") |
1726 | 192 | self.https_proxy = proxies.get("https") | 158 | self.https_proxy = proxies.get("https") |
1727 | 193 | 159 | ||
1728 | 194 | def _unpack_host_and_port(self, string): | 160 | def _unpack_host_and_port(self, string): |
1732 | 195 | scheme, rest = urllib.splittype(string) | 161 | scheme, rest = urllib.parse.splittype(string) |
1733 | 196 | host, rest = urllib.splithost(rest) | 162 | host, rest = urllib.parse.splithost(rest) |
1734 | 197 | host, port = urllib.splitport(host) | 163 | host, port = urllib.parse.splitport(host) |
1735 | 198 | if port is not None: | 164 | if port is not None: |
1736 | 199 | port = int(port) | 165 | port = int(port) |
1737 | 200 | 166 | ||
1738 | @@ -204,14 +170,14 @@ | |||
1739 | 204 | if timeout: | 170 | if timeout: |
1740 | 205 | socket.setdefaulttimeout(timeout) | 171 | socket.setdefaulttimeout(timeout) |
1741 | 206 | 172 | ||
1743 | 207 | scheme, rest = urllib.splittype(self.url) | 173 | scheme, rest = urllib.parse.splittype(self.url) |
1744 | 208 | if scheme == "http": | 174 | if scheme == "http": |
1745 | 209 | if self.http_proxy: | 175 | if self.http_proxy: |
1746 | 210 | host, port = self._unpack_host_and_port(self.http_proxy) | 176 | host, port = self._unpack_host_and_port(self.http_proxy) |
1747 | 211 | else: | 177 | else: |
1748 | 212 | host, port = self._unpack_host_and_port(self.url) | 178 | host, port = self._unpack_host_and_port(self.url) |
1749 | 213 | 179 | ||
1751 | 214 | connection = httplib.HTTPConnection(host, port) | 180 | connection = http.client.HTTPConnection(host, port) |
1752 | 215 | elif scheme == "https": | 181 | elif scheme == "https": |
1753 | 216 | if self.https_proxy: | 182 | if self.https_proxy: |
1754 | 217 | host, port = self._unpack_host_and_port(self.https_proxy) | 183 | host, port = self._unpack_host_and_port(self.https_proxy) |
1755 | @@ -220,18 +186,18 @@ | |||
1756 | 220 | host, port = self._unpack_host_and_port(self.url) | 186 | host, port = self._unpack_host_and_port(self.url) |
1757 | 221 | connection = VerifiedHTTPSConnection(host, port) | 187 | connection = VerifiedHTTPSConnection(host, port) |
1758 | 222 | else: | 188 | else: |
1760 | 223 | raise Exception, "Unknown URL scheme: %s" % scheme | 189 | raise Exception("Unknown URL scheme: %s" % scheme) |
1761 | 224 | 190 | ||
1762 | 225 | return connection | 191 | return connection |
1763 | 226 | 192 | ||
1764 | 227 | def _encode_multipart_formdata(self, fields=[], files=[]): | 193 | def _encode_multipart_formdata(self, fields=[], files=[]): |
1766 | 228 | boundary = mimetools.choose_boundary() | 194 | boundary = email.generator._make_boundary().encode("ascii") |
1767 | 229 | 195 | ||
1768 | 230 | lines = [] | 196 | lines = [] |
1769 | 231 | for (key, value) in fields: | 197 | for (key, value) in fields: |
1773 | 232 | lines.append("--" + boundary) | 198 | lines.append(b"--" + boundary) |
1774 | 233 | lines.append("Content-Disposition: form-data; name=\"%s\"" % key) | 199 | lines.append(b"Content-Disposition: form-data; name=\"" + key + b"\"") |
1775 | 234 | lines.append("") | 200 | lines.append(b"") |
1776 | 235 | lines.append(value) | 201 | lines.append(value) |
1777 | 236 | 202 | ||
1778 | 237 | for (key, file) in files: | 203 | for (key, file) in files: |
1779 | @@ -240,27 +206,30 @@ | |||
1780 | 240 | else: | 206 | else: |
1781 | 241 | length = os.fstat(file.fileno())[stat.ST_SIZE] | 207 | length = os.fstat(file.fileno())[stat.ST_SIZE] |
1782 | 242 | 208 | ||
1794 | 243 | filename = posixpath.basename(file.name) | 209 | content_type = mimetypes.guess_type(file.name)[0] |
1795 | 244 | if isinstance(filename, unicode): | 210 | if content_type: |
1796 | 245 | filename = filename.encode("UTF-8") | 211 | content_type = content_type.encode("ascii") |
1797 | 246 | 212 | else: | |
1798 | 247 | lines.append("--" + boundary) | 213 | content_type = b"application/octet-stream" |
1799 | 248 | lines.append("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"" | 214 | |
1800 | 249 | % (key, filename)) | 215 | filename = os.path.basename(file.name) |
1801 | 250 | lines.append("Content-Type: %s" | 216 | filename = filename.encode("utf-8") |
1802 | 251 | % mimetypes.guess_type(filename)[0] or "application/octet-stream") | 217 | |
1803 | 252 | lines.append("Content-Length: %s" % length) | 218 | lines.append(b"--" + boundary) |
1804 | 253 | lines.append("") | 219 | lines.append(b"Content-Disposition: form-data; name=\"" + key + b"\"; filename=\"" + filename + b"\"") |
1805 | 220 | lines.append(b"Content-Type: " + content_type) | ||
1806 | 221 | lines.append(b"Content-Length: " + str(length).encode("ascii")) | ||
1807 | 222 | lines.append(b"") | ||
1808 | 254 | 223 | ||
1809 | 255 | if hasattr(file, "seek"): | 224 | if hasattr(file, "seek"): |
1810 | 256 | file.seek(0) | 225 | file.seek(0) |
1811 | 257 | lines.append(file.read()) | 226 | lines.append(file.read()) |
1812 | 258 | 227 | ||
1815 | 259 | lines.append("--" + boundary + "--") | 228 | lines.append(b"--" + boundary + b"--") |
1816 | 260 | lines.append("") | 229 | lines.append(b"") |
1817 | 261 | 230 | ||
1820 | 262 | content_type = "multipart/form-data; boundary=%s" % boundary | 231 | content_type = b"multipart/form-data; boundary=" + boundary |
1821 | 263 | body = "\r\n".join(lines) | 232 | body = b"\r\n".join(lines) |
1822 | 264 | 233 | ||
1823 | 265 | return content_type, body | 234 | return content_type, body |
1824 | 266 | 235 | ||
1825 | @@ -268,33 +237,34 @@ | |||
1826 | 268 | fields = [] | 237 | fields = [] |
1827 | 269 | files = [] | 238 | files = [] |
1828 | 270 | 239 | ||
1831 | 271 | content_type = "application/octet-stream" | 240 | content_type = b"application/octet-stream" |
1832 | 272 | if body is not None and type(body) != str: | 241 | if body is not None and type(body) != bytes: |
1833 | 273 | if hasattr(body, "items"): | 242 | if hasattr(body, "items"): |
1835 | 274 | body = body.items() | 243 | body = list(body.items()) |
1836 | 275 | else: | 244 | else: |
1837 | 276 | try: | 245 | try: |
1838 | 277 | if len(body) and not isinstance(body[0], tuple): | 246 | if len(body) and not isinstance(body[0], tuple): |
1839 | 278 | raise TypeError | 247 | raise TypeError |
1840 | 279 | except TypeError: | 248 | except TypeError: |
1841 | 280 | ty, va, tb = sys.exc_info() | 249 | ty, va, tb = sys.exc_info() |
1844 | 281 | raise TypeError, \ | 250 | raise TypeError("Invalid non-string sequence or mapping").with_traceback(tb) |
1843 | 282 | "Invalid non-string sequence or mapping", tb | ||
1845 | 283 | 251 | ||
1846 | 284 | for key, value in body: | 252 | for key, value in body: |
1847 | 253 | key = key.encode("ascii") | ||
1848 | 285 | if hasattr(value, "read"): | 254 | if hasattr(value, "read"): |
1849 | 286 | files.append((key, value)) | 255 | files.append((key, value)) |
1850 | 287 | else: | 256 | else: |
1851 | 257 | value = value.encode("utf-8") | ||
1852 | 288 | fields.append((key, value)) | 258 | fields.append((key, value)) |
1853 | 289 | 259 | ||
1854 | 290 | if files: | 260 | if files: |
1857 | 291 | content_type, body = self._encode_multipart_formdata(fields, | 261 | content_type, body = self._encode_multipart_formdata( |
1858 | 292 | files) | 262 | fields, files) |
1859 | 293 | elif fields: | 263 | elif fields: |
1862 | 294 | content_type = "application/x-www-form-urlencoded" | 264 | content_type = b"application/x-www-form-urlencoded" |
1863 | 295 | body = urllib.urlencode(fields) | 265 | body = urllib.parse.urlencode(fields).encode("utf-8") |
1864 | 296 | else: | 266 | else: |
1866 | 297 | body = "" | 267 | body = b"" |
1867 | 298 | 268 | ||
1868 | 299 | return content_type, body | 269 | return content_type, body |
1869 | 300 | 270 | ||
1870 | @@ -325,10 +295,10 @@ | |||
1871 | 325 | else: | 295 | else: |
1872 | 326 | try: | 296 | try: |
1873 | 327 | response = connection.getresponse() | 297 | response = connection.getresponse() |
1875 | 328 | except httplib.BadStatusLine: | 298 | except http.client.BadStatusLine: |
1876 | 329 | logging.warning("Service unavailable on %s", self.url) | 299 | logging.warning("Service unavailable on %s", self.url) |
1877 | 330 | else: | 300 | else: |
1879 | 331 | if response.status == httplib.FOUND: | 301 | if response.status == http.client.FOUND: |
1880 | 332 | # TODO prevent infinite redirect loop | 302 | # TODO prevent infinite redirect loop |
1881 | 333 | self.url = response.getheader('location') | 303 | self.url = response.getheader('location') |
1882 | 334 | response = self.exchange(body, headers, timeout) | 304 | response = self.exchange(body, headers, timeout) |
1883 | 335 | 305 | ||
1884 | === added file 'checkbox/lib/tz.py' | |||
1885 | --- checkbox/lib/tz.py 1970-01-01 00:00:00 +0000 | |||
1886 | +++ checkbox/lib/tz.py 2012-06-23 00:59:17 +0000 | |||
1887 | @@ -0,0 +1,55 @@ | |||
1888 | 1 | # | ||
1889 | 2 | # This file is part of Checkbox. | ||
1890 | 3 | # | ||
1891 | 4 | # Copyright 2012 Canonical Ltd. | ||
1892 | 5 | # | ||
1893 | 6 | # Checkbox is free software: you can redistribute it and/or modify | ||
1894 | 7 | # it under the terms of the GNU General Public License as published by | ||
1895 | 8 | # the Free Software Foundation, either version 3 of the License, or | ||
1896 | 9 | # (at your option) any later version. | ||
1897 | 10 | # | ||
1898 | 11 | # Checkbox is distributed in the hope that it will be useful, | ||
1899 | 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1900 | 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1901 | 14 | # GNU General Public License for more details. | ||
1902 | 15 | # | ||
1903 | 16 | # You should have received a copy of the GNU General Public License | ||
1904 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | ||
1905 | 18 | # | ||
1906 | 19 | __all__ = [ | ||
1907 | 20 | "tzutc", | ||
1908 | 21 | ] | ||
1909 | 22 | |||
1910 | 23 | from datetime import ( | ||
1911 | 24 | timedelta, | ||
1912 | 25 | tzinfo, | ||
1913 | 26 | ) | ||
1914 | 27 | |||
1915 | 28 | |||
1916 | 29 | ZERO = timedelta(0) | ||
1917 | 30 | |||
1918 | 31 | |||
1919 | 32 | class _tzutc(tzinfo): | ||
1920 | 33 | |||
1921 | 34 | def utcoffset(self, dt): | ||
1922 | 35 | return ZERO | ||
1923 | 36 | |||
1924 | 37 | def dst(self, dt): | ||
1925 | 38 | return ZERO | ||
1926 | 39 | |||
1927 | 40 | def tzname(self, dt): | ||
1928 | 41 | return "UTC" | ||
1929 | 42 | |||
1930 | 43 | def __eq__(self, other): | ||
1931 | 44 | return isinstance(other, tzutc) | ||
1932 | 45 | |||
1933 | 46 | def __ne__(self, other): | ||
1934 | 47 | return not self.__eq__(other) | ||
1935 | 48 | |||
1936 | 49 | def __repr__(self): | ||
1937 | 50 | return "%s()" % self.__class__.__name__ | ||
1938 | 51 | |||
1939 | 52 | __reduce__ = object.__reduce__ | ||
1940 | 53 | |||
1941 | 54 | |||
1942 | 55 | tzutc = _tzutc() | ||
1943 | 0 | 56 | ||
1944 | === modified file 'checkbox/lib/update.py' | |||
1945 | --- checkbox/lib/update.py 2009-01-20 18:55:20 +0000 | |||
1946 | +++ checkbox/lib/update.py 2012-06-23 00:59:17 +0000 | |||
1947 | @@ -17,7 +17,7 @@ | |||
1948 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1949 | 18 | # | 18 | # |
1950 | 19 | def recursive_update(dst, src): | 19 | def recursive_update(dst, src): |
1952 | 20 | irecursive_update(dst, list(src.iteritems())) | 20 | irecursive_update(dst, list(src.items())) |
1953 | 21 | return dst | 21 | return dst |
1954 | 22 | 22 | ||
1955 | 23 | def irecursive_update(a, blist): | 23 | def irecursive_update(a, blist): |
1956 | @@ -37,6 +37,6 @@ | |||
1957 | 37 | while not blist: | 37 | while not blist: |
1958 | 38 | blist, a = stack.pop() # current <- parent | 38 | blist, a = stack.pop() # current <- parent |
1959 | 39 | continue | 39 | continue |
1961 | 40 | blist, a = list(bv.iteritems()), a[bk] | 40 | blist, a = list(bv.items()), a[bk] |
1962 | 41 | except IndexError: | 41 | except IndexError: |
1963 | 42 | pass | 42 | pass |
1964 | 43 | 43 | ||
1965 | === modified file 'checkbox/lib/url.py' | |||
1966 | --- checkbox/lib/url.py 2009-08-19 15:36:05 +0000 | |||
1967 | +++ checkbox/lib/url.py 2012-06-23 00:59:17 +0000 | |||
1968 | @@ -16,11 +16,11 @@ | |||
1969 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
1970 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1971 | 18 | # | 18 | # |
1973 | 19 | import urlparse | 19 | import urllib.parse |
1974 | 20 | 20 | ||
1975 | 21 | 21 | ||
1976 | 22 | def parse_url(url): | 22 | def parse_url(url): |
1978 | 23 | scheme, host, path, params, query, fragment = urlparse.urlparse(url) | 23 | scheme, host, path, params, query, fragment = urllib.parse.urlparse(url) |
1979 | 24 | 24 | ||
1980 | 25 | if "@" in host: | 25 | if "@" in host: |
1981 | 26 | username, host = host.rsplit("@", 1) | 26 | username, host = host.rsplit("@", 1) |
1982 | 27 | 27 | ||
1983 | === modified file 'checkbox/message.py' | |||
1984 | --- checkbox/message.py 2012-02-23 11:56:50 +0000 | |||
1985 | +++ checkbox/message.py 2012-06-23 00:59:17 +0000 | |||
1986 | @@ -38,7 +38,7 @@ | |||
1987 | 38 | self.filename = filename | 38 | self.filename = filename |
1988 | 39 | 39 | ||
1989 | 40 | 40 | ||
1991 | 41 | class MessageStore(object): | 41 | class MessageStore: |
1992 | 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.""" |
1993 | 43 | 43 | ||
1994 | 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. |
1995 | @@ -108,7 +108,7 @@ | |||
1996 | 108 | break | 108 | break |
1997 | 109 | try: | 109 | try: |
1998 | 110 | message = self._read_message(filename) | 110 | message = self._read_message(filename) |
2000 | 111 | except ValueError, e: | 111 | except ValueError as e: |
2001 | 112 | logging.exception(e) | 112 | logging.exception(e) |
2002 | 113 | self._add_flags(filename, BROKEN) | 113 | self._add_flags(filename, BROKEN) |
2003 | 114 | else: | 114 | else: |
2004 | @@ -219,7 +219,7 @@ | |||
2005 | 219 | return posixpath.join(self._directory, *args) | 219 | return posixpath.join(self._directory, *args) |
2006 | 220 | 220 | ||
2007 | 221 | def _get_content(self, filename): | 221 | def _get_content(self, filename): |
2009 | 222 | file = open(filename) | 222 | file = open(filename, "rb") |
2010 | 223 | try: | 223 | try: |
2011 | 224 | return file.read() | 224 | return file.read() |
2012 | 225 | finally: | 225 | finally: |
2013 | @@ -263,7 +263,7 @@ | |||
2014 | 263 | 263 | ||
2015 | 264 | message_data = self._dump_message(message) | 264 | message_data = self._dump_message(message) |
2016 | 265 | 265 | ||
2018 | 266 | file = open(filename + ".tmp", "w") | 266 | file = open(filename + ".tmp", "wb") |
2019 | 267 | file.write(message_data) | 267 | file.write(message_data) |
2020 | 268 | safe_close(file, safe=self.safe_file_closing) | 268 | safe_close(file, safe=self.safe_file_closing) |
2021 | 269 | 269 | ||
2022 | 270 | 270 | ||
2023 | === modified file 'checkbox/parsers/cpuinfo.py' | |||
2024 | --- checkbox/parsers/cpuinfo.py 2011-11-18 12:46:21 +0000 | |||
2025 | +++ checkbox/parsers/cpuinfo.py 2012-06-23 00:59:17 +0000 | |||
2026 | @@ -130,9 +130,9 @@ | |||
2027 | 130 | processor["count"] = attributes.get("count", 1) | 130 | processor["count"] = attributes.get("count", 1) |
2028 | 131 | bogompips_string = attributes.get("bogomips", "0.0") | 131 | bogompips_string = attributes.get("bogomips", "0.0") |
2029 | 132 | processor["bogomips"] = int(round(float(bogompips_string))) | 132 | processor["bogomips"] = int(round(float(bogompips_string))) |
2031 | 133 | for platform, conversion in platform_to_conversion.iteritems(): | 133 | for platform, conversion in platform_to_conversion.items(): |
2032 | 134 | if machine in platform: | 134 | if machine in platform: |
2034 | 135 | for pkey, ckey in conversion.iteritems(): | 135 | for pkey, ckey in conversion.items(): |
2035 | 136 | if isinstance(ckey, (list, tuple)): | 136 | if isinstance(ckey, (list, tuple)): |
2036 | 137 | processor[pkey] = "/".join([attributes[k] | 137 | processor[pkey] = "/".join([attributes[k] |
2037 | 138 | for k in ckey]) | 138 | for k in ckey]) |
2038 | @@ -141,9 +141,9 @@ | |||
2039 | 141 | 141 | ||
2040 | 142 | # Adjust platform | 142 | # Adjust platform |
2041 | 143 | if machine[0] == "i" and machine[-2:] == "86": | 143 | if machine[0] == "i" and machine[-2:] == "86": |
2043 | 144 | processor["platform"] = u"i386" | 144 | processor["platform"] = "i386" |
2044 | 145 | elif machine[:5] == "alpha": | 145 | elif machine[:5] == "alpha": |
2046 | 146 | processor["platform"] = u"alpha" | 146 | processor["platform"] = "alpha" |
2047 | 147 | 147 | ||
2048 | 148 | # Adjust cache | 148 | # Adjust cache |
2049 | 149 | if processor["cache"]: | 149 | if processor["cache"]: |
2050 | 150 | 150 | ||
2051 | === modified file 'checkbox/parsers/device.py' | |||
2052 | --- checkbox/parsers/device.py 2011-06-13 14:22:39 +0000 | |||
2053 | +++ checkbox/parsers/device.py 2012-06-23 00:59:17 +0000 | |||
2054 | @@ -18,7 +18,7 @@ | |||
2055 | 18 | # | 18 | # |
2056 | 19 | 19 | ||
2057 | 20 | 20 | ||
2059 | 21 | class DeviceResult(object): | 21 | class DeviceResult: |
2060 | 22 | 22 | ||
2061 | 23 | def addDevice(self, device): | 23 | def addDevice(self, device): |
2062 | 24 | pass | 24 | pass |
2063 | 25 | 25 | ||
2064 | === modified file 'checkbox/parsers/dmidecode.py' | |||
2065 | --- checkbox/parsers/dmidecode.py 2011-11-18 12:46:21 +0000 | |||
2066 | +++ checkbox/parsers/dmidecode.py 2012-06-23 00:59:17 +0000 | |||
2067 | @@ -20,7 +20,7 @@ | |||
2068 | 20 | 20 | ||
2069 | 21 | from string import ( | 21 | from string import ( |
2070 | 22 | hexdigits, | 22 | hexdigits, |
2072 | 23 | uppercase, | 23 | ascii_uppercase, |
2073 | 24 | ) | 24 | ) |
2074 | 25 | 25 | ||
2075 | 26 | from checkbox.lib.dmi import ( | 26 | from checkbox.lib.dmi import ( |
2076 | @@ -36,7 +36,7 @@ | |||
2077 | 36 | % hexdigits) | 36 | % hexdigits) |
2078 | 37 | KEY_VALUE_RE = re.compile( | 37 | KEY_VALUE_RE = re.compile( |
2079 | 38 | r"^\t(?P<key>[%s].+):( (?P<value>.+))?$" | 38 | r"^\t(?P<key>[%s].+):( (?P<value>.+))?$" |
2081 | 39 | % uppercase) | 39 | % ascii_uppercase) |
2082 | 40 | 40 | ||
2083 | 41 | 41 | ||
2084 | 42 | class DmidecodeParser: | 42 | class DmidecodeParser: |
2085 | 43 | 43 | ||
2086 | === modified file 'checkbox/parsers/submission.py' | |||
2087 | --- checkbox/parsers/submission.py 2012-02-10 11:19:05 +0000 | |||
2088 | +++ checkbox/parsers/submission.py 2012-06-23 00:59:17 +0000 | |||
2089 | @@ -21,7 +21,7 @@ | |||
2090 | 21 | except ImportError: | 21 | except ImportError: |
2091 | 22 | import cElementTree as etree | 22 | import cElementTree as etree |
2092 | 23 | 23 | ||
2094 | 24 | from StringIO import StringIO | 24 | from io import StringIO |
2095 | 25 | from logging import getLogger | 25 | from logging import getLogger |
2096 | 26 | from pkg_resources import resource_string | 26 | from pkg_resources import resource_string |
2097 | 27 | 27 | ||
2098 | @@ -103,7 +103,7 @@ | |||
2099 | 103 | } | 103 | } |
2100 | 104 | parser = parsers.get(command) | 104 | parser = parsers.get(command) |
2101 | 105 | if parser: | 105 | if parser: |
2103 | 106 | if not isinstance(text, unicode): | 106 | if not isinstance(text, str): |
2104 | 107 | text = text.decode("utf-8") | 107 | text = text.decode("utf-8") |
2105 | 108 | stream = StringIO(text) | 108 | stream = StringIO(text) |
2106 | 109 | p = parser(stream) | 109 | p = parser(stream) |
2107 | @@ -291,7 +291,7 @@ | |||
2108 | 291 | "Unexpected boolean value '%s' in <%s>" % (value, node.tag) | 291 | "Unexpected boolean value '%s' in <%s>" % (value, node.tag) |
2109 | 292 | return value == "True" | 292 | return value == "True" |
2110 | 293 | elif type_ in ("str",): | 293 | elif type_ in ("str",): |
2112 | 294 | return unicode(node.text.strip()) | 294 | return str(node.text.strip()) |
2113 | 295 | elif type_ in ("int", "long",): | 295 | elif type_ in ("int", "long",): |
2114 | 296 | return int(node.text.strip()) | 296 | return int(node.text.strip()) |
2115 | 297 | elif type_ in ("float",): | 297 | elif type_ in ("float",): |
2116 | @@ -320,7 +320,7 @@ | |||
2117 | 320 | 320 | ||
2118 | 321 | def _getValueAsString(self, node): | 321 | def _getValueAsString(self, node): |
2119 | 322 | """Return the value of the attribute "value".""" | 322 | """Return the value of the attribute "value".""" |
2121 | 323 | return unicode(node.attrib["value"]) | 323 | return str(node.attrib["value"]) |
2122 | 324 | 324 | ||
2123 | 325 | def parseContext(self, result, node): | 325 | def parseContext(self, result, node): |
2124 | 326 | """Parse the <context> part of a submission.""" | 326 | """Parse the <context> part of a submission.""" |
2125 | @@ -354,7 +354,7 @@ | |||
2126 | 354 | parser(result, child) | 354 | parser(result, child) |
2127 | 355 | else: | 355 | else: |
2128 | 356 | text = child.text | 356 | text = child.text |
2130 | 357 | if not isinstance(text, unicode): | 357 | if not isinstance(text, str): |
2131 | 358 | text = text.decode("utf-8") | 358 | text = text.decode("utf-8") |
2132 | 359 | stream = StringIO(text) | 359 | stream = StringIO(text) |
2133 | 360 | p = parser(stream) | 360 | p = parser(stream) |
2134 | @@ -389,11 +389,11 @@ | |||
2135 | 389 | 389 | ||
2136 | 390 | # Convert lists to space separated strings. | 390 | # Convert lists to space separated strings. |
2137 | 391 | properties = self._getProperties(child) | 391 | properties = self._getProperties(child) |
2139 | 392 | for key, value in properties.iteritems(): | 392 | for key, value in properties.items(): |
2140 | 393 | if key in ("bogomips", "cache", "count", "speed",): | 393 | if key in ("bogomips", "cache", "count", "speed",): |
2142 | 394 | properties[key] = int(value) | 394 | properties[key] = int(float(value)) |
2143 | 395 | elif isinstance(value, list): | 395 | elif isinstance(value, list): |
2145 | 396 | properties[key] = u" ".join(value) | 396 | properties[key] = " ".join(value) |
2146 | 397 | processors.append(properties) | 397 | processors.append(properties) |
2147 | 398 | 398 | ||
2148 | 399 | # Check if /proc/cpuinfo was parsed already. | 399 | # Check if /proc/cpuinfo was parsed already. |
2149 | @@ -403,15 +403,15 @@ | |||
2150 | 403 | lines = [] | 403 | lines = [] |
2151 | 404 | for processor in processors: | 404 | for processor in processors: |
2152 | 405 | # Convert some keys with underscores to spaces instead. | 405 | # Convert some keys with underscores to spaces instead. |
2154 | 406 | for key, value in processor.iteritems(): | 406 | for key, value in processor.items(): |
2155 | 407 | if "_" in key and key != "vendor_id": | 407 | if "_" in key and key != "vendor_id": |
2156 | 408 | key = key.replace("_", " ") | 408 | key = key.replace("_", " ") |
2157 | 409 | 409 | ||
2163 | 410 | lines.append(u"%s: %s" % (key, value)) | 410 | lines.append("%s: %s" % (key, value)) |
2164 | 411 | 411 | ||
2165 | 412 | lines.append(u"") | 412 | lines.append("") |
2166 | 413 | 413 | ||
2167 | 414 | stream = StringIO(u"\n".join(lines)) | 414 | stream = StringIO("\n".join(lines)) |
2168 | 415 | parser = result.parseCpuinfo(stream) | 415 | parser = result.parseCpuinfo(stream) |
2169 | 416 | parser.run(result) | 416 | parser.run(result) |
2170 | 417 | 417 | ||
2171 | 418 | 418 | ||
2172 | === modified file 'checkbox/parsers/tests/cputable.py' | |||
2173 | --- checkbox/parsers/tests/cputable.py 2012-02-15 00:11:21 +0000 | |||
2174 | +++ checkbox/parsers/tests/cputable.py 2012-06-23 00:59:17 +0000 | |||
2175 | @@ -16,7 +16,7 @@ | |||
2176 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
2177 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2178 | 18 | # | 18 | # |
2180 | 19 | from StringIO import StringIO | 19 | from io import StringIO |
2181 | 20 | 20 | ||
2182 | 21 | from unittest import TestCase | 21 | from unittest import TestCase |
2183 | 22 | 22 | ||
2184 | 23 | 23 | ||
2185 | === modified file 'checkbox/parsers/tests/description.py' | |||
2186 | --- checkbox/parsers/tests/description.py 2012-02-15 00:11:21 +0000 | |||
2187 | +++ checkbox/parsers/tests/description.py 2012-06-23 00:59:17 +0000 | |||
2188 | @@ -17,7 +17,7 @@ | |||
2189 | 17 | # You should have received a copy of the GNU General Public License | 17 | # You should have received a copy of the GNU General Public License |
2190 | 18 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 18 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2191 | 19 | # | 19 | # |
2193 | 20 | from StringIO import StringIO | 20 | from io import StringIO |
2194 | 21 | 21 | ||
2195 | 22 | from unittest import TestCase | 22 | from unittest import TestCase |
2196 | 23 | 23 | ||
2197 | @@ -115,7 +115,7 @@ | |||
2198 | 115 | self.assertResult(result) | 115 | self.assertResult(result) |
2199 | 116 | 116 | ||
2200 | 117 | def test_es(self): | 117 | def test_es(self): |
2202 | 118 | result = self.getResult(u""" | 118 | result = self.getResult(""" |
2203 | 119 | PROPÓSITO: | 119 | PROPÓSITO: |
2204 | 120 | Esta prueba verifica los diferentes modos de vídeo detectados | 120 | Esta prueba verifica los diferentes modos de vídeo detectados |
2205 | 121 | PASOS: | 121 | PASOS: |
2206 | @@ -131,7 +131,7 @@ | |||
2207 | 131 | self.assertEquals(result.info, "$output\n") | 131 | self.assertEquals(result.info, "$output\n") |
2208 | 132 | 132 | ||
2209 | 133 | def test_ru(self): | 133 | def test_ru(self): |
2211 | 134 | result = self.getResult(u""" | 134 | result = self.getResult(""" |
2212 | 135 | ЦЕЛЬ: | 135 | ЦЕЛЬ: |
2213 | 136 | Эта проверка позволит убедиться в работоспособности штекера наушников | 136 | Эта проверка позволит убедиться в работоспособности штекера наушников |
2214 | 137 | ДЕЙСТВИЯ: | 137 | ДЕЙСТВИЯ: |
2215 | 138 | 138 | ||
2216 | === modified file 'checkbox/parsers/tests/dmidecode.py' | |||
2217 | --- checkbox/parsers/tests/dmidecode.py 2012-02-15 00:11:21 +0000 | |||
2218 | +++ checkbox/parsers/tests/dmidecode.py 2012-06-23 00:59:17 +0000 | |||
2219 | @@ -16,7 +16,7 @@ | |||
2220 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
2221 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2222 | 18 | # | 18 | # |
2224 | 19 | from cStringIO import StringIO | 19 | from io import StringIO |
2225 | 20 | 20 | ||
2226 | 21 | from unittest import TestCase | 21 | from unittest import TestCase |
2227 | 22 | 22 | ||
2228 | 23 | 23 | ||
2229 | === modified file 'checkbox/parsers/tests/udevadm.py' | |||
2230 | --- checkbox/parsers/tests/udevadm.py 2012-02-15 00:11:21 +0000 | |||
2231 | +++ checkbox/parsers/tests/udevadm.py 2012-06-23 00:59:17 +0000 | |||
2232 | @@ -16,7 +16,7 @@ | |||
2233 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
2234 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2235 | 18 | # | 18 | # |
2237 | 19 | from cStringIO import StringIO | 19 | from io import StringIO |
2238 | 20 | 20 | ||
2239 | 21 | from unittest import TestCase | 21 | from unittest import TestCase |
2240 | 22 | 22 | ||
2241 | 23 | 23 | ||
2242 | === modified file 'checkbox/parsers/udevadm.py' | |||
2243 | --- checkbox/parsers/udevadm.py 2012-03-07 19:46:29 +0000 | |||
2244 | +++ checkbox/parsers/udevadm.py 2012-06-23 00:59:17 +0000 | |||
2245 | @@ -42,7 +42,7 @@ | |||
2246 | 42 | r"^acpi:" | 42 | r"^acpi:" |
2247 | 43 | r"(?P<vendor_name>[%(upper)s]{3})" | 43 | r"(?P<vendor_name>[%(upper)s]{3})" |
2248 | 44 | r"(?P<product_id>[%(hex)s]{4}):" | 44 | r"(?P<product_id>[%(hex)s]{4}):" |
2250 | 45 | % {"upper": string.uppercase, "hex": string.hexdigits}) | 45 | % {"upper": string.ascii_uppercase, "hex": string.hexdigits}) |
2251 | 46 | USB_RE = re.compile( | 46 | USB_RE = re.compile( |
2252 | 47 | r"^usb:" | 47 | r"^usb:" |
2253 | 48 | r"v(?P<vendor_id>[%(hex)s]{4})" | 48 | r"v(?P<vendor_id>[%(hex)s]{4})" |
2254 | @@ -349,7 +349,7 @@ | |||
2255 | 349 | 349 | ||
2256 | 350 | # floppy | 350 | # floppy |
2257 | 351 | if self.driver == "floppy": | 351 | if self.driver == "floppy": |
2259 | 352 | return u"Platform Device" | 352 | return "Platform Device" |
2260 | 353 | 353 | ||
2261 | 354 | return None | 354 | return None |
2262 | 355 | 355 | ||
2263 | @@ -467,6 +467,4 @@ | |||
2264 | 467 | 467 | ||
2265 | 468 | 468 | ||
2266 | 469 | def decode_id(id): | 469 | def decode_id(id): |
2270 | 470 | encoded_id = id.encode("utf-8") | 470 | return id.strip() |
2268 | 471 | decoded_id = encoded_id.decode("string-escape").decode("utf-8") | ||
2269 | 472 | return decoded_id.strip() | ||
2271 | 473 | 471 | ||
2272 | === modified file 'checkbox/plugin.py' | |||
2273 | --- checkbox/plugin.py 2010-03-09 16:58:36 +0000 | |||
2274 | +++ checkbox/plugin.py 2012-06-23 00:59:17 +0000 | |||
2275 | @@ -40,7 +40,7 @@ | |||
2276 | 40 | module.register(self) | 40 | module.register(self) |
2277 | 41 | 41 | ||
2278 | 42 | 42 | ||
2280 | 43 | class Plugin(object): | 43 | class Plugin: |
2281 | 44 | """ | 44 | """ |
2282 | 45 | Plugin base class which should be inherited by each plugin | 45 | Plugin base class which should be inherited by each plugin |
2283 | 46 | implementation. This class extends the component to automatically | 46 | implementation. This class extends the component to automatically |
2284 | 47 | 47 | ||
2285 | === modified file 'checkbox/properties.py' | |||
2286 | --- checkbox/properties.py 2011-03-17 11:15:12 +0000 | |||
2287 | +++ checkbox/properties.py 2012-06-23 00:59:17 +0000 | |||
2288 | @@ -17,13 +17,13 @@ | |||
2289 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2290 | 18 | # | 18 | # |
2291 | 19 | from checkbox.attribute import Attribute | 19 | from checkbox.attribute import Attribute |
2294 | 20 | from checkbox.variables import (ConstantVariable, BoolVariable, StringVariable, | 20 | from checkbox.variables import (ConstantVariable, BoolVariable, BytesVariable, |
2295 | 21 | PathVariable, UnicodeVariable, IntVariable, FloatVariable, TimeVariable, | 21 | StringVariable, PathVariable, IntVariable, FloatVariable, TimeVariable, |
2296 | 22 | ListVariable, TupleVariable, AnyVariable, DictVariable, MapVariable, | 22 | ListVariable, TupleVariable, AnyVariable, DictVariable, MapVariable, |
2297 | 23 | FileVariable, VariableFactory, Variable, get_variable) | 23 | FileVariable, VariableFactory, Variable, get_variable) |
2298 | 24 | 24 | ||
2299 | 25 | 25 | ||
2301 | 26 | class Property(object): | 26 | class Property: |
2302 | 27 | 27 | ||
2303 | 28 | def __init__(self, variable_class=Variable, variable_kwargs={}): | 28 | def __init__(self, variable_class=Variable, variable_kwargs={}): |
2304 | 29 | self._variable_class = variable_class | 29 | self._variable_class = variable_class |
2305 | @@ -47,7 +47,7 @@ | |||
2306 | 47 | def _detect_name(self, used_cls): | 47 | def _detect_name(self, used_cls): |
2307 | 48 | self_id = id(self) | 48 | self_id = id(self) |
2308 | 49 | for cls in used_cls.__mro__: | 49 | for cls in used_cls.__mro__: |
2310 | 50 | for attr, prop in cls.__dict__.iteritems(): | 50 | for attr, prop in cls.__dict__.items(): |
2311 | 51 | if id(prop) == self_id: | 51 | if id(prop) == self_id: |
2312 | 52 | return attr | 52 | return attr |
2313 | 53 | raise RuntimeError("Property used in an unknown class") | 53 | raise RuntimeError("Property used in an unknown class") |
2314 | @@ -116,6 +116,11 @@ | |||
2315 | 116 | variable_class = BoolVariable | 116 | variable_class = BoolVariable |
2316 | 117 | 117 | ||
2317 | 118 | 118 | ||
2318 | 119 | class Bytes(PropertyType): | ||
2319 | 120 | |||
2320 | 121 | variable_class = BytesVariable | ||
2321 | 122 | |||
2322 | 123 | |||
2323 | 119 | class String(PropertyType): | 124 | class String(PropertyType): |
2324 | 120 | 125 | ||
2325 | 121 | variable_class = StringVariable | 126 | variable_class = StringVariable |
2326 | @@ -126,11 +131,6 @@ | |||
2327 | 126 | variable_class = PathVariable | 131 | variable_class = PathVariable |
2328 | 127 | 132 | ||
2329 | 128 | 133 | ||
2330 | 129 | class Unicode(PropertyType): | ||
2331 | 130 | |||
2332 | 131 | variable_class = UnicodeVariable | ||
2333 | 132 | |||
2334 | 133 | |||
2335 | 134 | class Int(PropertyType): | 134 | class Int(PropertyType): |
2336 | 135 | 135 | ||
2337 | 136 | variable_class = IntVariable | 136 | variable_class = IntVariable |
2338 | @@ -188,7 +188,7 @@ | |||
2339 | 188 | variable_class = MapVariable | 188 | variable_class = MapVariable |
2340 | 189 | 189 | ||
2341 | 190 | def __init__(self, schema={}, **kwargs): | 190 | def __init__(self, schema={}, **kwargs): |
2343 | 191 | for key, type in schema.iteritems(): | 191 | for key, type in schema.items(): |
2344 | 192 | schema[key] = VariableFactory(type._variable_class, | 192 | schema[key] = VariableFactory(type._variable_class, |
2345 | 193 | **type._variable_kwargs) | 193 | **type._variable_kwargs) |
2346 | 194 | 194 | ||
2347 | 195 | 195 | ||
2348 | === modified file 'checkbox/reactor.py' | |||
2349 | --- checkbox/reactor.py 2011-02-14 18:19:27 +0000 | |||
2350 | +++ checkbox/reactor.py 2012-06-23 00:59:17 +0000 | |||
2351 | @@ -22,7 +22,7 @@ | |||
2352 | 22 | from checkbox.lib.log import format_object | 22 | from checkbox.lib.log import format_object |
2353 | 23 | 23 | ||
2354 | 24 | 24 | ||
2356 | 25 | class EventID(object): | 25 | class EventID: |
2357 | 26 | 26 | ||
2358 | 27 | def __init__(self, event_type, pair): | 27 | def __init__(self, event_type, pair): |
2359 | 28 | self._event_type = event_type | 28 | self._event_type = event_type |
2360 | @@ -39,7 +39,7 @@ | |||
2361 | 39 | pass | 39 | pass |
2362 | 40 | 40 | ||
2363 | 41 | 41 | ||
2365 | 42 | class Reactor(object): | 42 | class Reactor: |
2366 | 43 | 43 | ||
2367 | 44 | def __init__(self): | 44 | def __init__(self): |
2368 | 45 | self._event_handlers = {} | 45 | self._event_handlers = {} |
2369 | @@ -99,7 +99,7 @@ | |||
2370 | 99 | if type(id) is EventID: | 99 | if type(id) is EventID: |
2371 | 100 | self._event_handlers[id._event_type].remove(id._pair) | 100 | self._event_handlers[id._event_type].remove(id._pair) |
2372 | 101 | else: | 101 | else: |
2374 | 102 | raise Exception, "EventID instance expected, received %r" % id | 102 | raise Exception("EventID instance expected, received %r" % id) |
2375 | 103 | 103 | ||
2376 | 104 | def cancel_all_calls(self, event_type): | 104 | def cancel_all_calls(self, event_type): |
2377 | 105 | del self._event_handlers[event_type] | 105 | del self._event_handlers[event_type] |
2378 | 106 | 106 | ||
2379 | === modified file 'checkbox/report.py' | |||
2380 | --- checkbox/report.py 2011-09-14 21:16:02 +0000 | |||
2381 | +++ checkbox/report.py 2012-06-23 00:59:17 +0000 | |||
2382 | @@ -16,13 +16,13 @@ | |||
2383 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
2384 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2385 | 18 | # | 18 | # |
2386 | 19 | import libxml2 | ||
2387 | 20 | import posixpath | 19 | import posixpath |
2388 | 21 | 20 | ||
2389 | 21 | from lxml import etree | ||
2390 | 22 | from xml.dom.minidom import Document, Element, parseString | 22 | from xml.dom.minidom import Document, Element, parseString |
2391 | 23 | 23 | ||
2392 | 24 | 24 | ||
2394 | 25 | class ReportManager(object): | 25 | class ReportManager: |
2395 | 26 | """The central point for dumping and loading information. | 26 | """The central point for dumping and loading information. |
2396 | 27 | 27 | ||
2397 | 28 | This keeps references to all reports which have been added to the | 28 | This keeps references to all reports which have been added to the |
2398 | @@ -43,7 +43,7 @@ | |||
2399 | 43 | Call back method for reports to register dump handlers. | 43 | Call back method for reports to register dump handlers. |
2400 | 44 | """ | 44 | """ |
2401 | 45 | if type in self.dumps_table: | 45 | if type in self.dumps_table: |
2403 | 46 | raise Exception, "Dumps type already handled: %s" % type | 46 | raise Exception("Dumps type already handled: %s" % type) |
2404 | 47 | self.dumps_table[type] = handler | 47 | self.dumps_table[type] = handler |
2405 | 48 | 48 | ||
2406 | 49 | def handle_loads(self, type, handler): | 49 | def handle_loads(self, type, handler): |
2407 | @@ -51,7 +51,7 @@ | |||
2408 | 51 | Call back method for reports to register load handlers. | 51 | Call back method for reports to register load handlers. |
2409 | 52 | """ | 52 | """ |
2410 | 53 | if type in self.loads_table: | 53 | if type in self.loads_table: |
2412 | 54 | raise Exception, "Loads type already handled: %s" % type | 54 | raise Exception("Loads type already handled: %s" % type) |
2413 | 55 | self.loads_table[type] = handler | 55 | self.loads_table[type] = handler |
2414 | 56 | 56 | ||
2415 | 57 | def call_dumps(self, obj, node): | 57 | def call_dumps(self, obj, node): |
2416 | @@ -66,7 +66,7 @@ | |||
2417 | 66 | Convenience method for reports to call the load handler | 66 | Convenience method for reports to call the load handler |
2418 | 67 | corresponding to the content of the given node. | 67 | corresponding to the content of the given node. |
2419 | 68 | """ | 68 | """ |
2421 | 69 | if self.loads_table.has_key(node.localName): | 69 | if node.localName in self.loads_table: |
2422 | 70 | ret = self.loads_table[node.localName](node) | 70 | ret = self.loads_table[node.localName](node) |
2423 | 71 | elif isinstance(node, Element) and node.hasAttribute("type"): | 71 | elif isinstance(node, Element) and node.hasAttribute("type"): |
2424 | 72 | type = node.getAttribute("type") | 72 | type = node.getAttribute("type") |
2425 | @@ -103,30 +103,30 @@ | |||
2426 | 103 | 103 | ||
2427 | 104 | try: | 104 | try: |
2428 | 105 | self.call_dumps(obj, node) | 105 | self.call_dumps(obj, node) |
2431 | 106 | except KeyError, e: | 106 | except KeyError as e: |
2432 | 107 | raise ValueError, "Unsupported type: %s" % e | 107 | raise ValueError("Unsupported type: %s" % e) |
2433 | 108 | 108 | ||
2434 | 109 | return document | 109 | return document |
2435 | 110 | 110 | ||
2437 | 111 | def loads(self, str): | 111 | def loads(self, string): |
2438 | 112 | """ | 112 | """ |
2439 | 113 | Load the given string which may be a container of any nodes | 113 | Load the given string which may be a container of any nodes |
2440 | 114 | supported by the reports added to the manager. | 114 | supported by the reports added to the manager. |
2441 | 115 | """ | 115 | """ |
2443 | 116 | document = parseString(str) | 116 | document = parseString(string) |
2444 | 117 | node = document.childNodes[0] | 117 | node = document.childNodes[0] |
2445 | 118 | assert(node.localName == self.name) | 118 | assert(node.localName == self.name) |
2446 | 119 | 119 | ||
2447 | 120 | try: | 120 | try: |
2448 | 121 | ret = self.call_loads(document) | 121 | ret = self.call_loads(document) |
2451 | 122 | except KeyError, e: | 122 | except KeyError as e: |
2452 | 123 | raise ValueError, "Unsupported type: %s" % e | 123 | raise ValueError("Unsupported type: %s" % e) |
2453 | 124 | 124 | ||
2454 | 125 | return ret | 125 | return ret |
2455 | 126 | 126 | ||
2457 | 127 | def validate(self, str): | 127 | def validate(self, string): |
2458 | 128 | """ | 128 | """ |
2460 | 129 | Validate the given string | 129 | Validate the given string |
2461 | 130 | """ | 130 | """ |
2462 | 131 | if not self.schema: | 131 | if not self.schema: |
2463 | 132 | return False | 132 | return False |
2464 | @@ -137,21 +137,14 @@ | |||
2465 | 137 | finally: | 137 | finally: |
2466 | 138 | file.close() | 138 | file.close() |
2467 | 139 | 139 | ||
2483 | 140 | rngParser = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) | 140 | relaxng_doc = etree.fromstring(schema) |
2484 | 141 | rngSchema = rngParser.relaxNGParse() | 141 | relaxng = etree.RelaxNG(relaxng_doc) |
2485 | 142 | ctxt = rngSchema.relaxNGNewValidCtxt() | 142 | |
2486 | 143 | doc = libxml2.parseDoc(str) | 143 | doc = etree.fromstring(string) |
2487 | 144 | is_valid = doc.relaxNGValidateDoc(ctxt) | 144 | return relaxng.validate(doc) |
2488 | 145 | 145 | ||
2489 | 146 | # Clean up | 146 | |
2490 | 147 | doc.freeDoc() | 147 | class Report: |
2476 | 148 | del rngParser, rngSchema, ctxt | ||
2477 | 149 | libxml2.relaxNGCleanupTypes() | ||
2478 | 150 | libxml2.cleanupParser() | ||
2479 | 151 | return is_valid == 0 | ||
2480 | 152 | |||
2481 | 153 | |||
2482 | 154 | class Report(object): | ||
2491 | 155 | """A convenience for writing reports. | 148 | """A convenience for writing reports. |
2492 | 156 | 149 | ||
2493 | 157 | This provides a register method which will set the manager attribute | 150 | This provides a register method which will set the manager attribute |
2494 | 158 | 151 | ||
2495 | === modified file 'checkbox/reports/launchpad_report.py' | |||
2496 | --- checkbox/reports/launchpad_report.py 2010-03-09 16:58:36 +0000 | |||
2497 | +++ checkbox/reports/launchpad_report.py 2012-06-23 00:59:17 +0000 | |||
2498 | @@ -109,7 +109,7 @@ | |||
2499 | 109 | 109 | ||
2500 | 110 | def dumps_lsbrelease(self, obj, parent): | 110 | def dumps_lsbrelease(self, obj, parent): |
2501 | 111 | logging.debug("Dumping lsbrelease") | 111 | logging.debug("Dumping lsbrelease") |
2503 | 112 | for key, value in obj.iteritems(): | 112 | for key, value in obj.items(): |
2504 | 113 | property = self._create_element("property", parent) | 113 | property = self._create_element("property", parent) |
2505 | 114 | property.setAttribute("name", key) | 114 | property.setAttribute("name", key) |
2506 | 115 | self._manager.call_dumps(value, property) | 115 | self._manager.call_dumps(value, property) |
2507 | 116 | 116 | ||
2508 | === modified file 'checkbox/reports/xml_report.py' | |||
2509 | --- checkbox/reports/xml_report.py 2010-03-09 16:58:36 +0000 | |||
2510 | +++ checkbox/reports/xml_report.py 2012-06-23 00:59:17 +0000 | |||
2511 | @@ -36,10 +36,9 @@ | |||
2512 | 36 | def register_dumps(self): | 36 | def register_dumps(self): |
2513 | 37 | for (dt, dh) in [(bool, self.dumps_bool), | 37 | for (dt, dh) in [(bool, self.dumps_bool), |
2514 | 38 | (int, self.dumps_int), | 38 | (int, self.dumps_int), |
2515 | 39 | (long, self.dumps_int), | ||
2516 | 40 | (float, self.dumps_float), | 39 | (float, self.dumps_float), |
2517 | 40 | (bytes, self.dumps_bytes), | ||
2518 | 41 | (str, self.dumps_str), | 41 | (str, self.dumps_str), |
2519 | 42 | (unicode, self.dumps_unicode), | ||
2520 | 43 | (list, self.dumps_list), | 42 | (list, self.dumps_list), |
2521 | 44 | (tuple, self.dumps_list), | 43 | (tuple, self.dumps_list), |
2522 | 45 | (dict, self.dumps_dict), | 44 | (dict, self.dumps_dict), |
2523 | @@ -52,8 +51,8 @@ | |||
2524 | 52 | ("int", self.loads_int), | 51 | ("int", self.loads_int), |
2525 | 53 | ("long", self.loads_int), | 52 | ("long", self.loads_int), |
2526 | 54 | ("float", self.loads_float), | 53 | ("float", self.loads_float), |
2527 | 54 | ("bytes", self.loads_bytes), | ||
2528 | 55 | ("str", self.loads_str), | 55 | ("str", self.loads_str), |
2529 | 56 | ("unicode", self.loads_str), | ||
2530 | 57 | ("list", self.loads_list), | 56 | ("list", self.loads_list), |
2531 | 58 | ("value", self.loads_value), | 57 | ("value", self.loads_value), |
2532 | 59 | ("property", self.loads_property), | 58 | ("property", self.loads_property), |
2533 | @@ -78,12 +77,12 @@ | |||
2534 | 78 | def dumps_float(self, obj, parent): | 77 | def dumps_float(self, obj, parent): |
2535 | 79 | self._dumps_text(str(obj), parent, "float") | 78 | self._dumps_text(str(obj), parent, "float") |
2536 | 80 | 79 | ||
2537 | 80 | def dumps_bytes(self, obj, parent): | ||
2538 | 81 | self._dumps_text(obj, parent, "bytes") | ||
2539 | 82 | |||
2540 | 81 | def dumps_str(self, obj, parent): | 83 | def dumps_str(self, obj, parent): |
2541 | 82 | self._dumps_text(obj, parent, "str") | 84 | self._dumps_text(obj, parent, "str") |
2542 | 83 | 85 | ||
2543 | 84 | def dumps_unicode(self, obj, parent): | ||
2544 | 85 | self._dumps_text(obj, parent, "unicode") | ||
2545 | 86 | |||
2546 | 87 | def dumps_list(self, obj, parent): | 86 | def dumps_list(self, obj, parent): |
2547 | 88 | parent.setAttribute("type", "list") | 87 | parent.setAttribute("type", "list") |
2548 | 89 | for value in obj: | 88 | for value in obj: |
2549 | @@ -92,9 +91,9 @@ | |||
2550 | 92 | self._manager.call_dumps(value, element) | 91 | self._manager.call_dumps(value, element) |
2551 | 93 | 92 | ||
2552 | 94 | def dumps_dict(self, obj, parent): | 93 | def dumps_dict(self, obj, parent): |
2554 | 95 | for key in sorted(obj.iterkeys()): | 94 | for key in sorted(obj.keys()): |
2555 | 96 | value = obj[key] | 95 | value = obj[key] |
2557 | 97 | if self._manager.dumps_table.has_key(key): | 96 | if key in self._manager.dumps_table: |
2558 | 98 | # Custom dumps handler | 97 | # Custom dumps handler |
2559 | 99 | element = self._create_element(key, parent) | 98 | element = self._create_element(key, parent) |
2560 | 100 | self._manager.dumps_table[key](value, element) | 99 | self._manager.dumps_table[key](value, element) |
2561 | @@ -130,8 +129,11 @@ | |||
2562 | 130 | def loads_float(self, node): | 129 | def loads_float(self, node): |
2563 | 131 | return float(node.data) | 130 | return float(node.data) |
2564 | 132 | 131 | ||
2565 | 132 | def loads_bytes(self, node): | ||
2566 | 133 | return node.data.strip().encode("utf-8") | ||
2567 | 134 | |||
2568 | 133 | def loads_str(self, node): | 135 | def loads_str(self, node): |
2570 | 134 | return str(node.data.strip()) | 136 | return node.data.strip() |
2571 | 135 | 137 | ||
2572 | 136 | def loads_list(self, node): | 138 | def loads_list(self, node): |
2573 | 137 | nodes = [] | 139 | nodes = [] |
2574 | @@ -188,4 +190,4 @@ | |||
2575 | 188 | elif re.match('^(no|false|0)$', string, re.IGNORECASE): | 190 | elif re.match('^(no|false|0)$', string, re.IGNORECASE): |
2576 | 189 | return False | 191 | return False |
2577 | 190 | else: | 192 | else: |
2579 | 191 | raise Exception, "Invalid boolean type: %s" % string | 193 | raise Exception("Invalid boolean type: %s" % string) |
2580 | 192 | 194 | ||
2581 | === modified file 'checkbox/resource.py' | |||
2582 | --- checkbox/resource.py 2011-06-21 13:57:25 +0000 | |||
2583 | +++ checkbox/resource.py 2012-06-23 00:59:17 +0000 | |||
2584 | @@ -16,13 +16,13 @@ | |||
2585 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
2586 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2587 | 18 | # | 18 | # |
2589 | 19 | import __builtin__ | 19 | import builtins |
2590 | 20 | 20 | ||
2591 | 21 | 21 | ||
2592 | 22 | __all__ = ["ResourceMap"] | 22 | __all__ = ["ResourceMap"] |
2593 | 23 | 23 | ||
2594 | 24 | 24 | ||
2596 | 25 | class ResourceObject(object): | 25 | class ResourceObject: |
2597 | 26 | __slots__ = ("_iterator", "_name", "_convert",) | 26 | __slots__ = ("_iterator", "_name", "_convert",) |
2598 | 27 | 27 | ||
2599 | 28 | def __init__(self, iterator, name, convert=lambda x: x): | 28 | def __init__(self, iterator, name, convert=lambda x: x): |
2600 | @@ -67,7 +67,7 @@ | |||
2601 | 67 | return until if found else default | 67 | return until if found else default |
2602 | 68 | 68 | ||
2603 | 69 | 69 | ||
2605 | 70 | class ResourceIterator(object): | 70 | class ResourceIterator: |
2606 | 71 | __slots__ = ("_map", "_values",) | 71 | __slots__ = ("_map", "_values",) |
2607 | 72 | 72 | ||
2608 | 73 | def __init__(self, map, values): | 73 | def __init__(self, map, values): |
2609 | @@ -91,7 +91,7 @@ | |||
2610 | 91 | return ResourceObject(self, name) | 91 | return ResourceObject(self, name) |
2611 | 92 | 92 | ||
2612 | 93 | 93 | ||
2614 | 94 | class ResourceBuiltin(object): | 94 | class ResourceBuiltin: |
2615 | 95 | __slots__ = ("_function",) | 95 | __slots__ = ("_function",) |
2616 | 96 | 96 | ||
2617 | 97 | def __init__(self, function): | 97 | def __init__(self, function): |
2618 | @@ -105,10 +105,9 @@ | |||
2619 | 105 | 105 | ||
2620 | 106 | def __init__(self, names, *args, **kwargs): | 106 | def __init__(self, names, *args, **kwargs): |
2621 | 107 | super(ResourceGlobals, self).__init__(*args, **kwargs) | 107 | super(ResourceGlobals, self).__init__(*args, **kwargs) |
2622 | 108 | self["__builtins__"] = None | ||
2623 | 109 | 108 | ||
2624 | 110 | for name in names: | 109 | for name in names: |
2626 | 111 | function = getattr(__builtin__, name) | 110 | function = getattr(builtins, name) |
2627 | 112 | self[name] = ResourceBuiltin(function) | 111 | self[name] = ResourceBuiltin(function) |
2628 | 113 | 112 | ||
2629 | 114 | 113 | ||
2630 | @@ -128,7 +127,7 @@ | |||
2631 | 128 | 127 | ||
2632 | 129 | def eval(self, source): | 128 | def eval(self, source): |
2633 | 130 | self._results = [] | 129 | self._results = [] |
2635 | 131 | resource_globals = ResourceGlobals(["bool", "float", "int", "long", "str"]) | 130 | resource_globals = ResourceGlobals(["bool", "float", "int", "str"]) |
2636 | 132 | try: | 131 | try: |
2637 | 133 | value = eval(source, resource_globals, self) | 132 | value = eval(source, resource_globals, self) |
2638 | 134 | if (isinstance(value, (bool, int)) and value) \ | 133 | if (isinstance(value, (bool, int)) and value) \ |
2639 | 135 | 134 | ||
2640 | === modified file 'checkbox/tests/report.py' | |||
2641 | --- checkbox/tests/report.py 2011-09-14 21:16:02 +0000 | |||
2642 | +++ checkbox/tests/report.py 2012-06-23 00:59:17 +0000 | |||
2643 | @@ -105,5 +105,5 @@ | |||
2644 | 105 | self.assertTrue("test1" in str) | 105 | self.assertTrue("test1" in str) |
2645 | 106 | 106 | ||
2646 | 107 | data = rm.loads(str) | 107 | data = rm.loads(str) |
2648 | 108 | self.assertTrue(data.has_key("test")) | 108 | self.assertTrue("test" in data) |
2649 | 109 | self.assertTrue(data["test"] == "test1") | 109 | self.assertTrue(data["test"] == "test1") |
2650 | 110 | 110 | ||
2651 | === modified file 'checkbox/user_interface.py' | |||
2652 | --- checkbox/user_interface.py 2012-03-21 02:22:11 +0000 | |||
2653 | +++ checkbox/user_interface.py 2012-06-23 00:59:17 +0000 | |||
2654 | @@ -57,8 +57,12 @@ | |||
2655 | 57 | UNSUPPORTED: SKIP_ANSWER, | 57 | UNSUPPORTED: SKIP_ANSWER, |
2656 | 58 | UNTESTED: SKIP_ANSWER} | 58 | UNTESTED: SKIP_ANSWER} |
2657 | 59 | 59 | ||
2660 | 60 | 60 | CONTINUE_ANSWER = 'Continue' | |
2661 | 61 | class UserInterface(object): | 61 | RERUN_ANSWER = 'Rerun' |
2662 | 62 | RESTART_ANSWER = 'Restart' | ||
2663 | 63 | |||
2664 | 64 | |||
2665 | 65 | class UserInterface: | ||
2666 | 62 | """Abstract base class for encapsulating the workflow and common code for | 66 | """Abstract base class for encapsulating the workflow and common code for |
2667 | 63 | any user interface implementation (like GTK, Qt, or CLI). | 67 | any user interface implementation (like GTK, Qt, or CLI). |
2668 | 64 | 68 | ||
2669 | @@ -67,6 +71,7 @@ | |||
2670 | 67 | def __init__(self, title, data_path=None): | 71 | def __init__(self, title, data_path=None): |
2671 | 68 | self.title = title | 72 | self.title = title |
2672 | 69 | self.data_path = data_path | 73 | self.data_path = data_path |
2673 | 74 | self.progress = None | ||
2674 | 70 | self.ui_flags = {} | 75 | self.ui_flags = {} |
2675 | 71 | 76 | ||
2676 | 72 | self.report_url = None | 77 | self.report_url = None |
2677 | @@ -78,9 +83,12 @@ | |||
2678 | 78 | logging.info(text) | 83 | logging.info(text) |
2679 | 79 | return default | 84 | return default |
2680 | 80 | 85 | ||
2682 | 81 | def show_error(self, text): | 86 | def show_error(self, primary_text, |
2683 | 87 | secondary_text=None, detailed_text=None): | ||
2684 | 88 | text = filter(None, [primary_text, secondary_text, detailed_text]) | ||
2685 | 89 | text = '\n'.join(text) | ||
2686 | 82 | logging.error(text) | 90 | logging.error(text) |
2688 | 83 | raise StopAllException, "Error: %s" % text | 91 | raise StopAllException("Error: %s" % text) |
2689 | 84 | 92 | ||
2690 | 85 | def show_progress(self, message, function, *args, **kwargs): | 93 | def show_progress(self, message, function, *args, **kwargs): |
2691 | 86 | self.show_progress_start(message) | 94 | self.show_progress_start(message) |
2692 | @@ -109,7 +117,7 @@ | |||
2693 | 109 | def show_text(self, text, previous=None, next=None): | 117 | def show_text(self, text, previous=None, next=None): |
2694 | 110 | return | 118 | return |
2695 | 111 | 119 | ||
2697 | 112 | def show_entry(self, text, value, previous=None, next=None): | 120 | def show_entry(self, text, value, label=None, previous=None, next=None): |
2698 | 113 | return value | 121 | return value |
2699 | 114 | 122 | ||
2700 | 115 | def show_check(self, text, options=[], default=[]): | 123 | def show_check(self, text, options=[], default=[]): |
2701 | @@ -118,7 +126,7 @@ | |||
2702 | 118 | def show_radio(self, text, options=[], default=None): | 126 | def show_radio(self, text, options=[], default=None): |
2703 | 119 | return default | 127 | return default |
2704 | 120 | 128 | ||
2706 | 121 | def show_tree(self, text, options={}, default={}): | 129 | def show_tree(self, text, options={}, default={}, deselect_warning=""): |
2707 | 122 | return default | 130 | return default |
2708 | 123 | 131 | ||
2709 | 124 | def show_test(self, test, runner): | 132 | def show_test(self, test, runner): |
2710 | @@ -194,7 +202,7 @@ | |||
2711 | 194 | webbrowser.open(url, new=True, autoraise=True) | 202 | webbrowser.open(url, new=True, autoraise=True) |
2712 | 195 | return | 203 | return |
2713 | 196 | 204 | ||
2715 | 197 | except Exception, e: | 205 | except Exception as e: |
2716 | 198 | pass | 206 | pass |
2717 | 199 | 207 | ||
2718 | 200 | def show_report(self, text, results): | 208 | def show_report(self, text, results): |
2719 | @@ -203,3 +211,13 @@ | |||
2720 | 203 | and make it possible to modify them | 211 | and make it possible to modify them |
2721 | 204 | """ | 212 | """ |
2722 | 205 | raise NotImplementedError | 213 | raise NotImplementedError |
2723 | 214 | |||
2724 | 215 | def update_status(self, job): | ||
2725 | 216 | """ | ||
2726 | 217 | If implemented, it will be called after each job finishes. | ||
2727 | 218 | The passed Job object can be used to update in-UI status | ||
2728 | 219 | about each job. | ||
2729 | 220 | """ | ||
2730 | 221 | pass | ||
2731 | 222 | |||
2732 | 223 | |||
2733 | 206 | 224 | ||
2734 | === modified file 'checkbox/variables.py' | |||
2735 | --- checkbox/variables.py 2011-09-14 21:16:02 +0000 | |||
2736 | +++ checkbox/variables.py 2012-06-23 00:59:17 +0000 | |||
2737 | @@ -19,7 +19,7 @@ | |||
2738 | 19 | import re | 19 | import re |
2739 | 20 | import posixpath | 20 | import posixpath |
2740 | 21 | 21 | ||
2742 | 22 | from StringIO import StringIO | 22 | from io import StringIO |
2743 | 23 | 23 | ||
2744 | 24 | from checkbox.lib.text import split | 24 | from checkbox.lib.text import split |
2745 | 25 | 25 | ||
2746 | @@ -47,7 +47,7 @@ | |||
2747 | 47 | pass | 47 | pass |
2748 | 48 | 48 | ||
2749 | 49 | 49 | ||
2751 | 50 | class Variable(object): | 50 | class Variable: |
2752 | 51 | 51 | ||
2753 | 52 | _value = None | 52 | _value = None |
2754 | 53 | _required = True | 53 | _required = True |
2755 | @@ -101,7 +101,7 @@ | |||
2756 | 101 | __slots__ = () | 101 | __slots__ = () |
2757 | 102 | 102 | ||
2758 | 103 | def coerce(self, value): | 103 | def coerce(self, value): |
2760 | 104 | if isinstance(value, (str, unicode)): | 104 | if isinstance(value, str): |
2761 | 105 | if re.match(r"(yes|true)", value, re.IGNORECASE): | 105 | if re.match(r"(yes|true)", value, re.IGNORECASE): |
2762 | 106 | value = True | 106 | value = True |
2763 | 107 | elif re.match(r"(no|false)", value, re.IGNORECASE): | 107 | elif re.match(r"(no|false)", value, re.IGNORECASE): |
2764 | @@ -114,12 +114,24 @@ | |||
2765 | 114 | return value | 114 | return value |
2766 | 115 | 115 | ||
2767 | 116 | 116 | ||
2768 | 117 | class BytesVariable(Variable): | ||
2769 | 118 | __slots__ = () | ||
2770 | 119 | |||
2771 | 120 | def coerce(self, value): | ||
2772 | 121 | if isinstance(value, str): | ||
2773 | 122 | value = value.encode('utf-8') | ||
2774 | 123 | elif not isinstance(value, bytes): | ||
2775 | 124 | raise ValueError("%r is not bytes" % (value,)) | ||
2776 | 125 | |||
2777 | 126 | return value | ||
2778 | 127 | |||
2779 | 128 | |||
2780 | 117 | class StringVariable(Variable): | 129 | class StringVariable(Variable): |
2781 | 118 | __slots__ = () | 130 | __slots__ = () |
2782 | 119 | 131 | ||
2783 | 120 | def coerce(self, value): | 132 | def coerce(self, value): |
2786 | 121 | if isinstance(value, unicode): | 133 | if isinstance(value, bytes): |
2787 | 122 | value = str(value) | 134 | value = value.decode("utf-8") |
2788 | 123 | elif not isinstance(value, str): | 135 | elif not isinstance(value, str): |
2789 | 124 | raise ValueError("%r is not a str" % (value,)) | 136 | raise ValueError("%r is not a str" % (value,)) |
2790 | 125 | 137 | ||
2791 | @@ -134,25 +146,13 @@ | |||
2792 | 134 | return posixpath.expanduser(path) | 146 | return posixpath.expanduser(path) |
2793 | 135 | 147 | ||
2794 | 136 | 148 | ||
2795 | 137 | class UnicodeVariable(Variable): | ||
2796 | 138 | __slots__ = () | ||
2797 | 139 | |||
2798 | 140 | def coerce(self, value): | ||
2799 | 141 | if isinstance(value, str): | ||
2800 | 142 | value = unicode(value, encoding="utf-8") | ||
2801 | 143 | elif not isinstance(value, unicode): | ||
2802 | 144 | raise ValueError("%r is not a unicode" % (value,)) | ||
2803 | 145 | |||
2804 | 146 | return value | ||
2805 | 147 | |||
2806 | 148 | |||
2807 | 149 | class IntVariable(Variable): | 149 | class IntVariable(Variable): |
2808 | 150 | __slots__ = () | 150 | __slots__ = () |
2809 | 151 | 151 | ||
2810 | 152 | def coerce(self, value): | 152 | def coerce(self, value): |
2812 | 153 | if isinstance(value, (str, unicode)): | 153 | if isinstance(value, str): |
2813 | 154 | value = int(value) | 154 | value = int(value) |
2815 | 155 | elif not isinstance(value, (int, long)): | 155 | elif not isinstance(value, int): |
2816 | 156 | raise ValueError("%r is not an int nor long" % (value,)) | 156 | raise ValueError("%r is not an int nor long" % (value,)) |
2817 | 157 | 157 | ||
2818 | 158 | return value | 158 | return value |
2819 | @@ -162,9 +162,9 @@ | |||
2820 | 162 | __slots__ = () | 162 | __slots__ = () |
2821 | 163 | 163 | ||
2822 | 164 | def coerce(self, value): | 164 | def coerce(self, value): |
2824 | 165 | if isinstance(value, (str, unicode)): | 165 | if isinstance(value, str): |
2825 | 166 | value = float(value) | 166 | value = float(value) |
2827 | 167 | elif not isinstance(value, (int, long, float)): | 167 | elif not isinstance(value, (int, float)): |
2828 | 168 | raise ValueError("%r is not a float" % (value,)) | 168 | raise ValueError("%r is not a float" % (value,)) |
2829 | 169 | 169 | ||
2830 | 170 | return value | 170 | return value |
2831 | @@ -186,7 +186,7 @@ | |||
2832 | 186 | 186 | ||
2833 | 187 | def coerce(self, values): | 187 | def coerce(self, values): |
2834 | 188 | item_factory = self._item_factory | 188 | item_factory = self._item_factory |
2836 | 189 | if isinstance(values, (str, unicode)): | 189 | if isinstance(values, str): |
2837 | 190 | values = split(values, self._separator) if values else [] | 190 | values = split(values, self._separator) if values else [] |
2838 | 191 | elif not isinstance(values, (list, tuple)): | 191 | elif not isinstance(values, (list, tuple)): |
2839 | 192 | raise ValueError("%r is not a list or tuple" % (values,)) | 192 | raise ValueError("%r is not a list or tuple" % (values,)) |
2840 | @@ -235,7 +235,7 @@ | |||
2841 | 235 | if not isinstance(value, dict): | 235 | if not isinstance(value, dict): |
2842 | 236 | raise ValueError("%r is not a dict." % (value,)) | 236 | raise ValueError("%r is not a dict." % (value,)) |
2843 | 237 | 237 | ||
2845 | 238 | for k, v in value.iteritems(): | 238 | for k, v in value.items(): |
2846 | 239 | value[self._key_schema(value=k).get()] = \ | 239 | value[self._key_schema(value=k).get()] = \ |
2847 | 240 | self._value_schema(value=v).get() | 240 | self._value_schema(value=v).get() |
2848 | 241 | return value | 241 | return value |
2849 | @@ -252,16 +252,16 @@ | |||
2850 | 252 | if not isinstance(value, dict): | 252 | if not isinstance(value, dict): |
2851 | 253 | raise ValueError("%r is not a dict." % (value,)) | 253 | raise ValueError("%r is not a dict." % (value,)) |
2852 | 254 | 254 | ||
2854 | 255 | for k, v in value.iteritems(): | 255 | for k, v in value.items(): |
2855 | 256 | if k not in self._schema: | 256 | if k not in self._schema: |
2856 | 257 | raise ValueError("%r is not a valid key as per %r" | 257 | raise ValueError("%r is not a valid key as per %r" |
2857 | 258 | % (k, self._schema)) | 258 | % (k, self._schema)) |
2858 | 259 | 259 | ||
2860 | 260 | for attribute, variable in self._schema.iteritems(): | 260 | for attribute, variable in self._schema.items(): |
2861 | 261 | old_value = value.get(attribute) | 261 | old_value = value.get(attribute) |
2862 | 262 | try: | 262 | try: |
2863 | 263 | new_value = variable(value=old_value).get() | 263 | new_value = variable(value=old_value).get() |
2865 | 264 | except ValueError, e: | 264 | except ValueError as e: |
2866 | 265 | raise ValueError( | 265 | raise ValueError( |
2867 | 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" |
2868 | 267 | % (attribute, value, e)) | 267 | % (attribute, value, e)) |
2869 | @@ -276,7 +276,7 @@ | |||
2870 | 276 | __slots__ = () | 276 | __slots__ = () |
2871 | 277 | 277 | ||
2872 | 278 | def coerce(self, value): | 278 | def coerce(self, value): |
2874 | 279 | if isinstance(value, basestring): | 279 | if isinstance(value, str): |
2875 | 280 | value = StringIO(value) | 280 | value = StringIO(value) |
2876 | 281 | elif not hasattr(value, "read"): | 281 | elif not hasattr(value, "read"): |
2877 | 282 | raise ValueError("%r is not a file" % (value,)) | 282 | raise ValueError("%r is not a file" % (value,)) |
2878 | @@ -295,7 +295,7 @@ | |||
2879 | 295 | else: | 295 | else: |
2880 | 296 | variables = {} | 296 | variables = {} |
2881 | 297 | cls = type(obj) | 297 | cls = type(obj) |
2883 | 298 | for attribute in get_attributes(cls).itervalues(): | 298 | for attribute in get_attributes(cls).values(): |
2884 | 299 | variable = attribute.variable_factory(attribute=attribute) | 299 | variable = attribute.variable_factory(attribute=attribute) |
2885 | 300 | variables[attribute] = variable | 300 | variables[attribute] = variable |
2886 | 301 | 301 | ||
2887 | 302 | 302 | ||
2888 | === modified file 'checkbox_cli/cli_interface.py' | |||
2889 | --- checkbox_cli/cli_interface.py 2012-02-23 11:56:50 +0000 | |||
2890 | +++ checkbox_cli/cli_interface.py 2012-06-23 00:59:17 +0000 | |||
2891 | @@ -35,7 +35,7 @@ | |||
2892 | 35 | OPTION_TO_ANSWER = dict((o, a) for a, o in ANSWER_TO_OPTION.items()) | 35 | OPTION_TO_ANSWER = dict((o, a) for a, o in ANSWER_TO_OPTION.items()) |
2893 | 36 | 36 | ||
2894 | 37 | 37 | ||
2896 | 38 | class CLIDialog(object): | 38 | class CLIDialog: |
2897 | 39 | """Command line dialog wrapper.""" | 39 | """Command line dialog wrapper.""" |
2898 | 40 | 40 | ||
2899 | 41 | def __init__(self, text): | 41 | def __init__(self, text): |
2900 | @@ -44,6 +44,7 @@ | |||
2901 | 44 | 44 | ||
2902 | 45 | def put(self, text): | 45 | def put(self, text): |
2903 | 46 | sys.stdout.write(text) | 46 | sys.stdout.write(text) |
2904 | 47 | sys.stdout.flush() | ||
2905 | 47 | 48 | ||
2906 | 48 | def put_line(self, line): | 49 | def put_line(self, line): |
2907 | 49 | self.put("%s\n" % line) | 50 | self.put("%s\n" % line) |
2908 | @@ -59,7 +60,7 @@ | |||
2909 | 59 | fileno = sys.stdin.fileno() | 60 | fileno = sys.stdin.fileno() |
2910 | 60 | saved_attributes = termios.tcgetattr(fileno) | 61 | saved_attributes = termios.tcgetattr(fileno) |
2911 | 61 | attributes = termios.tcgetattr(fileno) | 62 | attributes = termios.tcgetattr(fileno) |
2913 | 62 | attributes[3] = attributes[3] & ~(termios.ICANON | termios.ECHO) | 63 | attributes[3] &= ~(termios.ICANON | termios.ECHO) |
2914 | 63 | attributes[6][termios.VMIN] = 1 | 64 | attributes[6][termios.VMIN] = 1 |
2915 | 64 | attributes[6][termios.VTIME] = 0 | 65 | attributes[6][termios.VTIME] = 0 |
2916 | 65 | termios.tcsetattr(fileno, termios.TCSANOW, attributes) | 66 | termios.tcsetattr(fileno, termios.TCSANOW, attributes) |
2917 | @@ -68,12 +69,12 @@ | |||
2918 | 68 | escape = 0 | 69 | escape = 0 |
2919 | 69 | try: | 70 | try: |
2920 | 70 | while len(input) < limit: | 71 | while len(input) < limit: |
2922 | 71 | ch = str(sys.stdin.read(1)) | 72 | ch = sys.stdin.read(1) |
2923 | 72 | if ord(ch) == separator: | 73 | if ord(ch) == separator: |
2924 | 73 | break | 74 | break |
2926 | 74 | elif ord(ch) == 033: # ESC | 75 | elif ord(ch) == 0o33: # ESC |
2927 | 75 | escape = 1 | 76 | escape = 1 |
2929 | 76 | elif ord(ch) == termios.CERASE or ord(ch) == 010: | 77 | elif ord(ch) == termios.CERASE or ord(ch) == 0o10: |
2930 | 77 | if len(input): | 78 | if len(input): |
2931 | 78 | self.put("\010 \010") | 79 | self.put("\010 \010") |
2932 | 79 | del input[-1] | 80 | del input[-1] |
2933 | @@ -186,7 +187,7 @@ | |||
2934 | 186 | that is, a job containing other jobs | 187 | that is, a job containing other jobs |
2935 | 187 | """ | 188 | """ |
2936 | 188 | return all(issubclass(type(value), dict) | 189 | return all(issubclass(type(value), dict) |
2938 | 189 | for value in root.itervalues()) | 190 | for value in root.values()) |
2939 | 190 | 191 | ||
2940 | 191 | def _display(self, title, root): | 192 | def _display(self, title, root): |
2941 | 192 | """ | 193 | """ |
2942 | @@ -208,11 +209,11 @@ | |||
2943 | 208 | if not provided | 209 | if not provided |
2944 | 209 | """ | 210 | """ |
2945 | 210 | if key is None: | 211 | if key is None: |
2947 | 211 | key = string.lowercase[len(keys)] | 212 | key = string.ascii_lowercase[len(keys)] |
2948 | 212 | keys.append(key) | 213 | keys.append(key) |
2949 | 213 | options.append(option) | 214 | options.append(option) |
2950 | 214 | 215 | ||
2952 | 215 | for job_name, job_data in sorted(root.iteritems()): | 216 | for job_name, job_data in sorted(root.items()): |
2953 | 216 | if self._is_suite(job_data): | 217 | if self._is_suite(job_data): |
2954 | 217 | add_option(job_name) | 218 | add_option(job_name) |
2955 | 218 | self.put_line('{key}: {option}' | 219 | self.put_line('{key}: {option}' |
2956 | @@ -300,7 +301,7 @@ | |||
2957 | 300 | elif key in options: | 301 | elif key in options: |
2958 | 301 | if isinstance(options[key], dict): | 302 | if isinstance(options[key], dict): |
2959 | 302 | results[key] = {} | 303 | results[key] = {} |
2961 | 303 | elif isinstance(options[key], (list, tuple,)): | 304 | elif isinstance(options[key], (list, tuple)): |
2962 | 304 | results[key] = [] | 305 | results[key] = [] |
2963 | 305 | else: | 306 | else: |
2964 | 306 | results[key] = None | 307 | results[key] = None |
2965 | @@ -308,7 +309,7 @@ | |||
2966 | 308 | for k in options[key]: | 309 | for k in options[key]: |
2967 | 309 | self._toggle_results(k, options[key], results[key]) | 310 | self._toggle_results(k, options[key], results[key]) |
2968 | 310 | 311 | ||
2970 | 311 | elif isinstance(results, (list, tuple,)): | 312 | elif isinstance(results, (list, tuple)): |
2971 | 312 | if key in results: | 313 | if key in results: |
2972 | 313 | results.remove(key) | 314 | results.remove(key) |
2973 | 314 | elif key in options: | 315 | elif key in options: |
2974 | @@ -325,7 +326,7 @@ | |||
2975 | 325 | dialog = CLIChoiceDialog(text) | 326 | dialog = CLIChoiceDialog(text) |
2976 | 326 | dialog.run() | 327 | dialog.run() |
2977 | 327 | 328 | ||
2979 | 328 | def show_entry(self, text, value, previous=None, next=None): | 329 | def show_entry(self, text, value, label=None, previous=None, next=None): |
2980 | 329 | dialog = CLILineDialog(text) | 330 | dialog = CLILineDialog(text) |
2981 | 330 | 331 | ||
2982 | 331 | return dialog.run() | 332 | return dialog.run() |
2983 | @@ -357,7 +358,7 @@ | |||
2984 | 357 | response = dialog.run() | 358 | response = dialog.run() |
2985 | 358 | return options[response] | 359 | return options[response] |
2986 | 359 | 360 | ||
2988 | 360 | def show_tree(self, text, options={}, default={}): | 361 | def show_tree(self, text, options={}, default={}, deselect_warning=""): |
2989 | 361 | keys = sorted(options.keys()) | 362 | keys = sorted(options.keys()) |
2990 | 362 | 363 | ||
2991 | 363 | dialog = CLIChoiceDialog(text) | 364 | dialog = CLIChoiceDialog(text) |
2992 | @@ -453,6 +454,9 @@ | |||
2993 | 453 | def show_info(self, text, options=[], default=None): | 454 | def show_info(self, text, options=[], default=None): |
2994 | 454 | return self.show_radio(text, options, default) | 455 | return self.show_radio(text, options, default) |
2995 | 455 | 456 | ||
2997 | 456 | def show_error(self, text): | 457 | def show_error(self, primary_text, |
2998 | 458 | secondary_text=None, detailed_text=None): | ||
2999 | 459 | text = filter(None, [primary_text, secondary_text, detailed_text]) | ||
3000 | 460 | text = '\n'.join(text) | ||
3001 | 457 | dialog = CLIChoiceDialog("Error: %s" % text) | 461 | dialog = CLIChoiceDialog("Error: %s" % text) |
3002 | 458 | dialog.run() | 462 | dialog.run() |
3003 | 459 | 463 | ||
3004 | === modified file 'checkbox_gtk/gtk_interface.py' | |||
3005 | --- checkbox_gtk/gtk_interface.py 2012-02-23 11:56:50 +0000 | |||
3006 | +++ checkbox_gtk/gtk_interface.py 2012-06-23 00:59:17 +0000 | |||
3007 | @@ -47,7 +47,7 @@ | |||
3008 | 47 | 47 | ||
3009 | 48 | # HACK: Setting and unsetting previous and next buttons to workaround | 48 | # HACK: Setting and unsetting previous and next buttons to workaround |
3010 | 49 | # for gnome bug #56070. | 49 | # for gnome bug #56070. |
3012 | 50 | class GTKHack(object): | 50 | class GTKHack: |
3013 | 51 | def __init__(self, function): | 51 | def __init__(self, function): |
3014 | 52 | self._function = function | 52 | self._function = function |
3015 | 53 | 53 | ||
3016 | @@ -211,6 +211,19 @@ | |||
3017 | 211 | title += " - %s" % test_name | 211 | title += " - %s" % test_name |
3018 | 212 | self._get_widget("dialog_main").set_title(title) | 212 | self._get_widget("dialog_main").set_title(title) |
3019 | 213 | 213 | ||
3020 | 214 | def _set_progress(self,progress): | ||
3021 | 215 | # Update progress bar | ||
3022 | 216 | bar = self._get_widget("progressbar_test") | ||
3023 | 217 | if not self.progress: | ||
3024 | 218 | return | ||
3025 | 219 | done, total = self.progress | ||
3026 | 220 | bar.set_text("%(done)d/%(total)d" % {'done': done, 'total': total}) | ||
3027 | 221 | if total: | ||
3028 | 222 | progress_fraction = float(done) / total | ||
3029 | 223 | else: | ||
3030 | 224 | progress_fraction=0 | ||
3031 | 225 | bar.set_fraction(progress_fraction) | ||
3032 | 226 | |||
3033 | 214 | def _run_dialog(self, dialog=None): | 227 | def _run_dialog(self, dialog=None): |
3034 | 215 | def on_dialog_response(dialog, response, self): | 228 | def on_dialog_response(dialog, response, self): |
3035 | 216 | # Keep dialog alive when the button that has been clicked | 229 | # Keep dialog alive when the button that has been clicked |
3036 | @@ -221,8 +234,16 @@ | |||
3037 | 221 | self.direction = response | 234 | self.direction = response |
3038 | 222 | Gtk.main_quit() | 235 | Gtk.main_quit() |
3039 | 223 | 236 | ||
3040 | 237 | def on_dialog_key_press(dialog, event, self): | ||
3041 | 238 | # Ignore ESC key presses | ||
3042 | 239 | key = Gdk.keyval_name(event.keyval) | ||
3043 | 240 | if "Escape" in key: | ||
3044 | 241 | return True | ||
3045 | 242 | return False | ||
3046 | 243 | |||
3047 | 224 | dialog = dialog or self._dialog | 244 | dialog = dialog or self._dialog |
3048 | 225 | dialog.connect("response", on_dialog_response, self) | 245 | dialog.connect("response", on_dialog_response, self) |
3049 | 246 | dialog.connect("key-press-event", on_dialog_key_press, self) | ||
3050 | 226 | dialog.set_default_response(NEXT) | 247 | dialog.set_default_response(NEXT) |
3051 | 227 | dialog.show() | 248 | dialog.show() |
3052 | 228 | Gtk.main() | 249 | Gtk.main() |
3053 | @@ -230,6 +251,7 @@ | |||
3054 | 230 | raise KeyboardInterrupt | 251 | raise KeyboardInterrupt |
3055 | 231 | 252 | ||
3056 | 232 | def show_progress_start(self, message): | 253 | def show_progress_start(self, message): |
3057 | 254 | self._set_progress(self.progress) | ||
3058 | 233 | self._set_sensitive("button_previous", False) | 255 | self._set_sensitive("button_previous", False) |
3059 | 234 | self._set_sensitive("button_next", False) | 256 | self._set_sensitive("button_next", False) |
3060 | 235 | 257 | ||
3061 | @@ -266,7 +288,7 @@ | |||
3062 | 266 | self._set_button("button_next", next_state) | 288 | self._set_button("button_next", next_state) |
3063 | 267 | 289 | ||
3064 | 268 | @GTKHack | 290 | @GTKHack |
3066 | 269 | def show_entry(self, text, value, previous=None, next=None): | 291 | def show_entry(self, text, value, label=None, previous=None, next=None): |
3067 | 270 | #Reset window title | 292 | #Reset window title |
3068 | 271 | self._set_main_title() | 293 | self._set_main_title() |
3069 | 272 | # Set buttons | 294 | # Set buttons |
3070 | @@ -315,7 +337,7 @@ | |||
3071 | 315 | 337 | ||
3072 | 316 | # Set callbacks | 338 | # Set callbacks |
3073 | 317 | def click_button(widget, active): | 339 | def click_button(widget, active): |
3075 | 318 | for check_button in option_table.itervalues(): | 340 | for check_button in option_table.values(): |
3076 | 319 | check_button.set_active(active) | 341 | check_button.set_active(active) |
3077 | 320 | 342 | ||
3078 | 321 | for button_name in "button_select_all", "button_deselect_all": | 343 | for button_name in "button_select_all", "button_deselect_all": |
3079 | @@ -375,11 +397,11 @@ | |||
3080 | 375 | return result | 397 | return result |
3081 | 376 | 398 | ||
3082 | 377 | @GTKHack | 399 | @GTKHack |
3084 | 378 | def show_tree(self, text, options={}, default={}): | 400 | def show_tree(self, text, options={}, default={}, deselect_warning=""): |
3085 | 379 | #Reset window title | 401 | #Reset window title |
3086 | 380 | self._set_main_title() | 402 | self._set_main_title() |
3087 | 381 | 403 | ||
3089 | 382 | (COLUMN_TEXT, COLUMN_ACTIVE) = range(2) | 404 | (COLUMN_TEXT, COLUMN_ACTIVE) = list(range(2)) |
3090 | 383 | 405 | ||
3091 | 384 | # Set buttons | 406 | # Set buttons |
3092 | 385 | self._notebook.set_current_page(1) | 407 | self._notebook.set_current_page(1) |
3093 | @@ -519,6 +541,7 @@ | |||
3094 | 519 | self._set_hyper_text_view("hyper_text_view_test", | 541 | self._set_hyper_text_view("hyper_text_view_test", |
3095 | 520 | test["description"]) | 542 | test["description"]) |
3096 | 521 | 543 | ||
3097 | 544 | self._set_progress(self.progress) | ||
3098 | 522 | # Set buttons | 545 | # Set buttons |
3099 | 523 | if "command" in test: | 546 | if "command" in test: |
3100 | 524 | self._set_sensitive("button_test", True) | 547 | self._set_sensitive("button_test", True) |
3101 | @@ -566,15 +589,35 @@ | |||
3102 | 566 | self.direction = NEXT | 589 | self.direction = NEXT |
3103 | 567 | return options[response] | 590 | return options[response] |
3104 | 568 | 591 | ||
3106 | 569 | def show_error(self, text): | 592 | def show_error(self, primary_text, |
3107 | 593 | secondary_text=None, detailed_text=None): | ||
3108 | 570 | message_dialog = Gtk.MessageDialog(parent=self._dialog, | 594 | message_dialog = Gtk.MessageDialog(parent=self._dialog, |
3109 | 571 | type=Gtk.MessageType.ERROR, | 595 | type=Gtk.MessageType.ERROR, |
3110 | 572 | buttons=Gtk.ButtonsType.NONE, | 596 | buttons=Gtk.ButtonsType.NONE, |
3112 | 573 | message_format=text) | 597 | message_format=primary_text) |
3113 | 574 | message_dialog.set_modal(True) | 598 | message_dialog.set_modal(True) |
3114 | 575 | message_dialog.set_title(_("Error")) | 599 | message_dialog.set_title(_("Error")) |
3115 | 576 | message_dialog.set_default_response(NEXT) | 600 | message_dialog.set_default_response(NEXT) |
3116 | 577 | message_dialog.add_buttons(Gtk.STOCK_CLOSE, NEXT) | 601 | message_dialog.add_buttons(Gtk.STOCK_CLOSE, NEXT) |
3117 | 602 | if secondary_text: | ||
3118 | 603 | message_dialog.format_secondary_text(secondary_text) | ||
3119 | 604 | if detailed_text: | ||
3120 | 605 | content_area = message_dialog.get_content_area() | ||
3121 | 606 | |||
3122 | 607 | expander = Gtk.Expander(label=_('Detailed information...')) | ||
3123 | 608 | |||
3124 | 609 | def expanded_cb(expander, *args): | ||
3125 | 610 | message_dialog.set_resizable(expander.get_expanded()) | ||
3126 | 611 | expander.connect("notify::expanded", expanded_cb) | ||
3127 | 612 | scrolled_window = Gtk.ScrolledWindow() | ||
3128 | 613 | textview = Gtk.TextView() | ||
3129 | 614 | textview.set_editable(False) | ||
3130 | 615 | textview.get_buffer().set_text(detailed_text) | ||
3131 | 616 | scrolled_window.add(textview) | ||
3132 | 617 | expander.add(scrolled_window) | ||
3133 | 618 | content_area.pack_start(expander, | ||
3134 | 619 | expand=True, fill=True, padding=0) | ||
3135 | 620 | message_dialog.show_all() | ||
3136 | 578 | self._run_dialog(message_dialog) | 621 | self._run_dialog(message_dialog) |
3137 | 579 | message_dialog.hide() | 622 | message_dialog.hide() |
3138 | 580 | 623 | ||
3139 | 581 | 624 | ||
3140 | === modified file 'checkbox_gtk/hyper_text_view.py' | |||
3141 | --- checkbox_gtk/hyper_text_view.py 2011-09-14 21:16:02 +0000 | |||
3142 | +++ checkbox_gtk/hyper_text_view.py 2012-06-23 00:59:17 +0000 | |||
3143 | @@ -32,13 +32,13 @@ | |||
3144 | 32 | try: | 32 | try: |
3145 | 33 | return getattr(self, prop.name) | 33 | return getattr(self, prop.name) |
3146 | 34 | except AttributeError: | 34 | except AttributeError: |
3148 | 35 | raise AttributeError, "unknown property %s" % prop.name | 35 | raise AttributeError("unknown property %s" % prop.name) |
3149 | 36 | 36 | ||
3150 | 37 | def do_set_property(self, prop, val): | 37 | def do_set_property(self, prop, val): |
3152 | 38 | if prop.name in self.__gproperties__.keys(): | 38 | if prop.name in list(self.__gproperties__.keys()): |
3153 | 39 | setattr(self, prop.name, val) | 39 | setattr(self, prop.name, val) |
3154 | 40 | else: | 40 | else: |
3156 | 41 | raise AttributeError, "unknown property %s" % prop.name | 41 | raise AttributeError("unknown property %s" % prop.name) |
3157 | 42 | 42 | ||
3158 | 43 | def __init__(self, buffer=None): | 43 | def __init__(self, buffer=None): |
3159 | 44 | super(HyperTextView, self).__init__(buffer=buffer) | 44 | super(HyperTextView, self).__init__(buffer=buffer) |
3160 | @@ -55,12 +55,10 @@ | |||
3161 | 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)) |
3162 | 56 | 56 | ||
3163 | 57 | def insert(self, text, _iter=None): | 57 | def insert(self, text, _iter=None): |
3164 | 58 | if not isinstance(text, unicode): | ||
3165 | 59 | text = unicode(text, "utf-8") | ||
3166 | 60 | b = self.get_buffer() | 58 | b = self.get_buffer() |
3167 | 61 | if _iter is None: | 59 | if _iter is None: |
3168 | 62 | _iter = b.get_end_iter() | 60 | _iter = b.get_end_iter() |
3170 | 63 | b.insert(_iter, text.encode("utf-8")) | 61 | b.insert(_iter, text) |
3171 | 64 | 62 | ||
3172 | 65 | def insert_with_anchor(self, text, anchor=None, _iter=None): | 63 | def insert_with_anchor(self, text, anchor=None, _iter=None): |
3173 | 66 | b = self.get_buffer() | 64 | b = self.get_buffer() |
3174 | @@ -109,7 +107,7 @@ | |||
3175 | 109 | 107 | ||
3176 | 110 | def __set_anchor(self, window, tag, cursor, prop): | 108 | def __set_anchor(self, window, tag, cursor, prop): |
3177 | 111 | window.set_cursor(cursor) | 109 | window.set_cursor(cursor) |
3179 | 112 | for key, val in prop.iteritems(): | 110 | for key, val in prop.items(): |
3180 | 113 | if val is not None: | 111 | if val is not None: |
3181 | 114 | tag.set_property(key, val) | 112 | tag.set_property(key, val) |
3182 | 115 | 113 | ||
3183 | 116 | 114 | ||
3184 | === modified file 'checkbox_qt/qt_interface.py' | |||
3185 | --- checkbox_qt/qt_interface.py 2012-04-11 17:20:37 +0000 | |||
3186 | +++ checkbox_qt/qt_interface.py 2012-06-23 00:59:17 +0000 | |||
3187 | @@ -16,20 +16,17 @@ | |||
3188 | 16 | # You should have received a copy of the GNU General Public License | 16 | # You should have received a copy of the GNU General Public License |
3189 | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 17 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
3190 | 18 | # | 18 | # |
3192 | 19 | import sys | 19 | import re |
3193 | 20 | import time | 20 | import time |
3194 | 21 | import posixpath | ||
3195 | 22 | import inspect | ||
3196 | 23 | from gi.repository import GObject | 21 | from gi.repository import GObject |
3197 | 24 | import os | ||
3198 | 25 | 22 | ||
3199 | 26 | from gettext import gettext as _ | 23 | from gettext import gettext as _ |
3200 | 27 | from string import Template | 24 | from string import Template |
3201 | 28 | 25 | ||
3203 | 29 | from checkbox.job import PASS | 26 | from checkbox.job import PASS |
3204 | 30 | from checkbox.user_interface import (UserInterface, | 27 | from checkbox.user_interface import (UserInterface, |
3205 | 31 | NEXT, PREV, YES_ANSWER, NO_ANSWER, SKIP_ANSWER, | 28 | NEXT, PREV, YES_ANSWER, NO_ANSWER, SKIP_ANSWER, |
3207 | 32 | ANSWER_TO_STATUS, STATUS_TO_ANSWER) | 29 | ANSWER_TO_STATUS) |
3208 | 33 | import dbus | 30 | import dbus |
3209 | 34 | from dbus.mainloop.glib import DBusGMainLoop | 31 | from dbus.mainloop.glib import DBusGMainLoop |
3210 | 35 | 32 | ||
3211 | @@ -40,30 +37,41 @@ | |||
3212 | 40 | 37 | ||
3213 | 41 | OPTION_TO_ANSWER = dict((o, a) | 38 | OPTION_TO_ANSWER = dict((o, a) |
3214 | 42 | for a, o in ANSWER_TO_OPTION.items()) | 39 | for a, o in ANSWER_TO_OPTION.items()) |
3215 | 40 | def dummy_handle_reply(r=None): | ||
3216 | 41 | return | ||
3217 | 42 | |||
3218 | 43 | def dummy_handle_error(e=None): | ||
3219 | 44 | return | ||
3220 | 43 | 45 | ||
3221 | 44 | class QTInterface(UserInterface): | 46 | class QTInterface(UserInterface): |
3222 | 45 | def __init__(self, title, data_path): | 47 | def __init__(self, title, data_path): |
3223 | 46 | super(QTInterface, self).__init__(title, data_path) | 48 | super(QTInterface, self).__init__(title, data_path) |
3224 | 47 | self._app_title = title | 49 | self._app_title = title |
3225 | 48 | notReady = True | 50 | notReady = True |
3226 | 51 | infoResult = None | ||
3227 | 49 | while notReady: | 52 | while notReady: |
3228 | 50 | try: | 53 | try: |
3229 | 51 | self.bus = dbus.SessionBus(mainloop=DBusGMainLoop()) | 54 | self.bus = dbus.SessionBus(mainloop=DBusGMainLoop()) |
3232 | 52 | self.qtfront = self.bus.get_object('com.canonical.QtCheckbox', '/QtCheckbox') | 55 | self.qtfront = self.bus.get_object( |
3233 | 53 | self.qtiface = dbus.Interface(self.qtfront, dbus_interface='com.canonical.QtCheckbox') | 56 | 'com.canonical.QtCheckbox', '/QtCheckbox') |
3234 | 57 | self.qtiface = dbus.Interface( | ||
3235 | 58 | self.qtfront, dbus_interface='com.canonical.QtCheckbox') | ||
3236 | 54 | self.loop = GObject.MainLoop() | 59 | self.loop = GObject.MainLoop() |
3237 | 55 | notReady = False | 60 | notReady = False |
3238 | 56 | except: | 61 | except: |
3239 | 57 | time.sleep(0.5) | 62 | time.sleep(0.5) |
3243 | 58 | self.bus.add_signal_receiver(self.onClosedFrontend, "closedFrontend") | 63 | self.bus.add_signal_receiver( |
3244 | 59 | self.bus.add_signal_receiver(self.onReviewTestsClicked, "reviewTestsClicked") | 64 | self.onClosedFrontend, "closedFrontend") |
3245 | 60 | self.bus.add_signal_receiver(self.onWelcomeCheckboxToggled, "welcomeCheckboxToggled") | 65 | self.bus.add_signal_receiver( |
3246 | 66 | self.onReviewTestsClicked, "reviewTestsClicked") | ||
3247 | 67 | self.bus.add_signal_receiver( | ||
3248 | 68 | self.onWelcomeCheckboxToggled, "welcomeCheckboxToggled") | ||
3249 | 69 | self.qtiface.setInitialState() | ||
3250 | 61 | 70 | ||
3251 | 62 | self.qtiface.setInitialState(); | ||
3252 | 63 | self._set_main_title() | 71 | self._set_main_title() |
3253 | 64 | 72 | ||
3254 | 65 | def onReviewTestsClicked(self): | 73 | def onReviewTestsClicked(self): |
3256 | 66 | self.show_url(self.report_url) | 74 | self.show_url(self.report_url) |
3257 | 67 | 75 | ||
3258 | 68 | def onWelcomeCheckboxToggled(self, checked): | 76 | def onWelcomeCheckboxToggled(self, checked): |
3259 | 69 | self.ui_flags["show_welcome_message"] = bool(checked) | 77 | self.ui_flags["show_welcome_message"] = bool(checked) |
3260 | @@ -95,8 +103,10 @@ | |||
3261 | 95 | def onFullTestsClicked(): | 103 | def onFullTestsClicked(): |
3262 | 96 | self.direction = NEXT | 104 | self.direction = NEXT |
3263 | 97 | self.loop.quit() | 105 | self.loop.quit() |
3264 | 106 | |||
3265 | 98 | def onCustomTestsClicked(): | 107 | def onCustomTestsClicked(): |
3266 | 99 | self.loop.quit() | 108 | self.loop.quit() |
3267 | 109 | |||
3268 | 100 | #Reset window title | 110 | #Reset window title |
3269 | 101 | self._set_main_title() | 111 | self._set_main_title() |
3270 | 102 | 112 | ||
3271 | @@ -106,13 +116,25 @@ | |||
3272 | 106 | self.qtiface.showText(text) | 116 | self.qtiface.showText(text) |
3273 | 107 | self.wait_on_signals(fullTestsClicked=onFullTestsClicked) | 117 | self.wait_on_signals(fullTestsClicked=onFullTestsClicked) |
3274 | 108 | 118 | ||
3276 | 109 | def show_entry(self, text, value, previous=None, next=None): | 119 | def show_entry(self, text, value, label='', previous=None, next=None): |
3277 | 110 | def onSubmitTestsClicked(): | 120 | def onSubmitTestsClicked(): |
3278 | 111 | self.loop.quit() | 121 | self.loop.quit() |
3279 | 112 | 122 | ||
3281 | 113 | self.qtiface.showEntry(text) | 123 | # Replace links wiki style markup with html markup |
3282 | 124 | text = '<html>{}</html>'.format(text) | ||
3283 | 125 | text = text.replace('\n', '<br/>') | ||
3284 | 126 | text = re.sub(r'\[\[([^|]*)\|([^\]]*)\]\]', | ||
3285 | 127 | lambda m: '<a href="{}">{}</a>' | ||
3286 | 128 | .format(m.group(1), m.group(2)), | ||
3287 | 129 | text) | ||
3288 | 130 | |||
3289 | 131 | # Make sure that value is a string | ||
3290 | 132 | if value is None: | ||
3291 | 133 | value = '' | ||
3292 | 134 | |||
3293 | 135 | self.qtiface.showEntry(text, value, label) | ||
3294 | 114 | self.wait_on_signals(submitTestsClicked=onSubmitTestsClicked) | 136 | self.wait_on_signals(submitTestsClicked=onSubmitTestsClicked) |
3296 | 115 | return self.qtiface.getEmailAddress() | 137 | return self.qtiface.getSubmissionData() |
3297 | 116 | 138 | ||
3298 | 117 | def show_check(self, text, options=[], default=[]): | 139 | def show_check(self, text, options=[], default=[]): |
3299 | 118 | return False | 140 | return False |
3300 | @@ -120,43 +142,57 @@ | |||
3301 | 120 | def show_radio(self, text, options=[], default=None): | 142 | def show_radio(self, text, options=[], default=None): |
3302 | 121 | return False | 143 | return False |
3303 | 122 | 144 | ||
3305 | 123 | def show_tree(self, text, options={}, default={}): | 145 | def show_tree(self, text, options={}, default={}, deselect_warning=""): |
3306 | 146 | indexedOptions = {} | ||
3307 | 147 | indexedDefaults = {} | ||
3308 | 148 | |||
3309 | 124 | def onStartTestsClicked(): | 149 | def onStartTestsClicked(): |
3310 | 125 | self.direction = NEXT | 150 | self.direction = NEXT |
3311 | 126 | self.loop.quit() | 151 | self.loop.quit() |
3312 | 127 | 152 | ||
3316 | 128 | def onWelcomeClicked(): | 153 | def buildBranch(options, default, baseIndex="1"): |
3317 | 129 | self.direction = PREV | 154 | internalIndex = 1 |
3318 | 130 | self.loop.quit() | 155 | for test, state in options.items(): |
3319 | 156 | active = test in default | ||
3320 | 157 | if isinstance(state, dict): | ||
3321 | 158 | indexedOptions[ | ||
3322 | 159 | baseIndex + "." + str(internalIndex)] = {test: ''} | ||
3323 | 160 | indexedDefaults[ | ||
3324 | 161 | baseIndex + "." + str(internalIndex)] = {test: active} | ||
3325 | 162 | buildBranch(state, default.get(test, {}), baseIndex + "." + str(internalIndex)) | ||
3326 | 163 | else: | ||
3327 | 164 | indexedOptions[ | ||
3328 | 165 | baseIndex + "." + str(internalIndex)] = {test: state} | ||
3329 | 166 | indexedDefaults[ | ||
3330 | 167 | baseIndex + "." + str(internalIndex)] = {test: active} | ||
3331 | 168 | internalIndex += 1 | ||
3332 | 169 | |||
3333 | 170 | def buildDict(options, baseIndex="1"): | ||
3334 | 171 | internalIndex = 1 | ||
3335 | 172 | branch = {} | ||
3336 | 173 | while True: | ||
3337 | 174 | currentIndex = baseIndex + "." + str(internalIndex) | ||
3338 | 175 | if currentIndex in options: | ||
3339 | 176 | key = list(options[currentIndex].keys())[0] | ||
3340 | 177 | value = list(options[currentIndex].values())[0] | ||
3341 | 178 | if value == "menu": | ||
3342 | 179 | branch[key] = buildDict(options, currentIndex) | ||
3343 | 180 | else: | ||
3344 | 181 | branch[key] = value | ||
3345 | 182 | internalIndex += 1 | ||
3346 | 183 | else: | ||
3347 | 184 | break | ||
3348 | 185 | return branch | ||
3349 | 131 | 186 | ||
3350 | 132 | self._set_main_title() | 187 | self._set_main_title() |
3365 | 133 | newOptions = {} | 188 | buildBranch(options, default) |
3366 | 134 | for section in options: | 189 | |
3367 | 135 | newTests = {} | 190 | self.qtiface.showTree(text, indexedOptions, indexedDefaults, |
3368 | 136 | for test, state in options[section].iteritems(): | 191 | deselect_warning) |
3355 | 137 | # TODO: add support for more than one level | ||
3356 | 138 | if not isinstance(state, dict): | ||
3357 | 139 | newTests[str(test)] = state | ||
3358 | 140 | |||
3359 | 141 | if newTests == {}: | ||
3360 | 142 | newTests = {'': ''} | ||
3361 | 143 | |||
3362 | 144 | newOptions[section] = newTests | ||
3363 | 145 | |||
3364 | 146 | self.qtiface.showTree(text, newOptions) | ||
3369 | 147 | self.wait_on_signals( | 192 | self.wait_on_signals( |
3370 | 148 | startTestsClicked=onStartTestsClicked) | 193 | startTestsClicked=onStartTestsClicked) |
3371 | 149 | 194 | ||
3382 | 150 | newOptions = {} | 195 | return buildDict(self.qtiface.getTestsToRun()) |
3373 | 151 | testsFromInterface = self.qtiface.getTestsToRun() | ||
3374 | 152 | for section in testsFromInterface: | ||
3375 | 153 | newTests = {} | ||
3376 | 154 | for test in testsFromInterface[section]: | ||
3377 | 155 | if test != '': | ||
3378 | 156 | newTests[str(test)] = {} | ||
3379 | 157 | newOptions[str(section)] = newTests | ||
3380 | 158 | |||
3381 | 159 | return newOptions | ||
3383 | 160 | 196 | ||
3384 | 161 | def _run_test(self, test, runner): | 197 | def _run_test(self, test, runner): |
3385 | 162 | self.qtiface.showTestControls(False) | 198 | self.qtiface.showTestControls(False) |
3386 | @@ -164,8 +200,12 @@ | |||
3387 | 164 | self.qtiface.setFocusTestYesNo(True if status == PASS else False) | 200 | self.qtiface.setFocusTestYesNo(True if status == PASS else False) |
3388 | 165 | self.qtiface.showTestControls(True) | 201 | self.qtiface.showTestControls(True) |
3389 | 166 | 202 | ||
3392 | 167 | return Template(test["info"]).substitute({ | 203 | if test["info"]: |
3393 | 168 | "output": data.strip()}) | 204 | info = Template(test["info"]).substitute({"output": data.strip()}) |
3394 | 205 | else: | ||
3395 | 206 | info = "" | ||
3396 | 207 | |||
3397 | 208 | return info | ||
3398 | 169 | 209 | ||
3399 | 170 | def show_test(self, test, runner): | 210 | def show_test(self, test, runner): |
3400 | 171 | def onStartTestClicked(): | 211 | def onStartTestClicked(): |
3401 | @@ -200,7 +240,7 @@ | |||
3402 | 200 | if not "data" in test: | 240 | if not "data" in test: |
3403 | 201 | test["data"] = "" | 241 | test["data"] = "" |
3404 | 202 | if "command" in test: | 242 | if "command" in test: |
3406 | 203 | enableTestButton = True | 243 | enableTestButton = True |
3407 | 204 | 244 | ||
3408 | 205 | self.qtiface.showTest( | 245 | self.qtiface.showTest( |
3409 | 206 | test["purpose"], test["steps"], test["verification"], info, test["data"], | 246 | test["purpose"], test["steps"], test["verification"], info, test["data"], |
3410 | @@ -217,33 +257,44 @@ | |||
3411 | 217 | 257 | ||
3412 | 218 | def show_info(self, text, options=[], default=None): | 258 | def show_info(self, text, options=[], default=None): |
3413 | 219 | def onInfoBoxResult(result): | 259 | def onInfoBoxResult(result): |
3414 | 260 | #result here will always be a dbus String | ||
3415 | 261 | #it may not be convertable with str due to the fact that it | ||
3416 | 262 | #may contain non-ascii characters, so we need to convert to | ||
3417 | 263 | #internal Python unicode instead. | ||
3418 | 220 | self.infoResult = str(result) | 264 | self.infoResult = str(result) |
3419 | 221 | self.loop.quit() | 265 | self.loop.quit() |
3420 | 222 | 266 | ||
3422 | 223 | self.qtiface.showInfo(text, options, default, | 267 | self.qtiface.showInfo( |
3423 | 268 | text, options, default, | ||
3424 | 224 | reply_handler=dummy_handle_reply, | 269 | reply_handler=dummy_handle_reply, |
3425 | 225 | error_handler=dummy_handle_error) | 270 | error_handler=dummy_handle_error) |
3426 | 226 | self.wait_on_signals( | 271 | self.wait_on_signals( |
3427 | 227 | infoBoxResult=onInfoBoxResult) | 272 | infoBoxResult=onInfoBoxResult) |
3428 | 228 | return self.infoResult | 273 | return self.infoResult |
3429 | 229 | 274 | ||
3431 | 230 | def show_error(self, text): | 275 | def show_error(self, primary_text, |
3432 | 276 | secondary_text=None, detailed_text=None): | ||
3433 | 231 | def onErrorBoxClosed(): | 277 | def onErrorBoxClosed(): |
3434 | 232 | self.loop.quit() | 278 | self.loop.quit() |
3435 | 233 | 279 | ||
3439 | 234 | self.qtiface.showError(text, | 280 | self.qtiface.showError(primary_text, |
3440 | 235 | reply_handler=dummy_handle_reply, | 281 | secondary_text, detailed_text, |
3441 | 236 | error_handler=dummy_handle_error) | 282 | reply_handler=dummy_handle_reply, |
3442 | 283 | error_handler=dummy_handle_error) | ||
3443 | 237 | self.wait_on_signals( | 284 | self.wait_on_signals( |
3444 | 238 | errorBoxClosed=onErrorBoxClosed) | 285 | errorBoxClosed=onErrorBoxClosed) |
3445 | 239 | 286 | ||
3446 | 287 | def update_status(self, job): | ||
3447 | 288 | if 'type' in job and job["type"] == "test": | ||
3448 | 289 | self.qtiface.updateAutoTestStatus(job["status"], job["name"]) | ||
3449 | 290 | |||
3450 | 240 | def wait_on_signals(self, **signals): | 291 | def wait_on_signals(self, **signals): |
3452 | 241 | for name, function in signals.iteritems(): | 292 | for name, function in signals.items(): |
3453 | 242 | self.bus.add_signal_receiver(function, name) | 293 | self.bus.add_signal_receiver(function, name) |
3454 | 243 | 294 | ||
3455 | 244 | self.loop.run() | 295 | self.loop.run() |
3456 | 245 | if self.direction == KeyboardInterrupt: | 296 | if self.direction == KeyboardInterrupt: |
3457 | 246 | raise KeyboardInterrupt | 297 | raise KeyboardInterrupt |
3458 | 247 | 298 | ||
3460 | 248 | for name, function in signals.iteritems(): | 299 | for name, function in signals.items(): |
3461 | 249 | self.bus.remove_signal_receiver(function, name) | 300 | self.bus.remove_signal_receiver(function, name) |
3462 | 250 | 301 | ||
3463 | === modified file 'checkbox_urwid/urwid_interface.py' | |||
3464 | --- checkbox_urwid/urwid_interface.py 2012-02-23 11:56:50 +0000 | |||
3465 | +++ checkbox_urwid/urwid_interface.py 2012-06-23 00:59:17 +0000 | |||
3466 | @@ -27,7 +27,27 @@ | |||
3467 | 27 | ALL_ANSWERS, ANSWER_TO_STATUS) | 27 | ALL_ANSWERS, ANSWER_TO_STATUS) |
3468 | 28 | 28 | ||
3469 | 29 | 29 | ||
3471 | 30 | class Dialog(object): | 30 | # HACK to workaround bug in urwid.container, line 1273 |
3472 | 31 | class ComparableString(str): | ||
3473 | 32 | |||
3474 | 33 | def __init__(self, string): | ||
3475 | 34 | self.string = string | ||
3476 | 35 | |||
3477 | 36 | def __getattr__(self, name): | ||
3478 | 37 | return getattr(self.string, name) | ||
3479 | 38 | |||
3480 | 39 | def __lt__(self, other): | ||
3481 | 40 | if not isinstance(other, str): | ||
3482 | 41 | return False | ||
3483 | 42 | return self.string < other | ||
3484 | 43 | |||
3485 | 44 | def __gt__(self, other): | ||
3486 | 45 | if not isinstance(other, str): | ||
3487 | 46 | return False | ||
3488 | 47 | return self.string > other | ||
3489 | 48 | |||
3490 | 49 | |||
3491 | 50 | class Dialog: | ||
3492 | 31 | """ | 51 | """ |
3493 | 32 | Basic dialog class that displays some text | 52 | Basic dialog class that displays some text |
3494 | 33 | """ | 53 | """ |
3495 | @@ -77,8 +97,10 @@ | |||
3496 | 77 | if not body: | 97 | if not body: |
3497 | 78 | text = urwid.Text(self.text) | 98 | text = urwid.Text(self.text) |
3498 | 79 | walker = urwid.SimpleListWalker([]) | 99 | walker = urwid.SimpleListWalker([]) |
3499 | 100 | list_box = urwid.ListBox(walker) | ||
3500 | 101 | list_box.pref_col = ComparableString(list_box.pref_col) | ||
3501 | 80 | body = urwid.Pile((('flow', text), | 102 | body = urwid.Pile((('flow', text), |
3503 | 81 | ('weight', 1, urwid.ListBox(walker)))) | 103 | ('weight', 1, list_box))) |
3504 | 82 | self.walker = walker | 104 | self.walker = walker |
3505 | 83 | 105 | ||
3506 | 84 | frame = urwid.AttrMap(urwid.Frame(body, header, footer), 'body') | 106 | frame = urwid.AttrMap(urwid.Frame(body, header, footer), 'body') |
3507 | @@ -290,9 +312,9 @@ | |||
3508 | 290 | """ | 312 | """ |
3509 | 291 | Return the label of the selected radio button | 313 | Return the label of the selected radio button |
3510 | 292 | """ | 314 | """ |
3512 | 293 | label = (radio_button.get_label() | 315 | label = next((radio_button.get_label() |
3513 | 294 | for radio_button in self.radio_button_group | 316 | for radio_button in self.radio_button_group |
3515 | 295 | if radio_button.get_state()).next() | 317 | if radio_button.get_state())) |
3516 | 296 | return label | 318 | return label |
3517 | 297 | 319 | ||
3518 | 298 | 320 | ||
3519 | @@ -379,7 +401,7 @@ | |||
3520 | 379 | widget.changed_cb, self.walker) | 401 | widget.changed_cb, self.walker) |
3521 | 380 | 402 | ||
3522 | 381 | if isinstance(data, dict): | 403 | if isinstance(data, dict): |
3524 | 382 | items = sorted(data.iteritems(), key=itemgetter(0)) | 404 | items = sorted(iter(data.items()), key=itemgetter(0)) |
3525 | 383 | for children_name, children_data in items: | 405 | for children_name, children_data in items: |
3526 | 384 | child_widget = self.create_tree(children_name, children_data, widget) | 406 | child_widget = self.create_tree(children_name, children_data, widget) |
3527 | 385 | widget.append(child_widget) | 407 | widget.append(child_widget) |
3528 | @@ -392,7 +414,7 @@ | |||
3529 | 392 | Set selected nodes by default recursively | 414 | Set selected nodes by default recursively |
3530 | 393 | """ | 415 | """ |
3531 | 394 | if isinstance(default, dict): | 416 | if isinstance(default, dict): |
3533 | 395 | for name, default_children in default.iteritems(): | 417 | for name, default_children in default.items(): |
3534 | 396 | for widget in widgets: | 418 | for widget in widgets: |
3535 | 397 | if widget.name == name: | 419 | if widget.name == name: |
3536 | 398 | widget.state = True | 420 | widget.state = True |
3537 | @@ -408,7 +430,7 @@ | |||
3538 | 408 | 430 | ||
3539 | 409 | # Show tree | 431 | # Show tree |
3540 | 410 | self.option_widgets = [] | 432 | self.option_widgets = [] |
3542 | 411 | items = sorted(self.options.iteritems(), | 433 | items = sorted(iter(self.options.items()), |
3543 | 412 | key=itemgetter(0)) | 434 | key=itemgetter(0)) |
3544 | 413 | for name, data in items: | 435 | for name, data in items: |
3545 | 414 | widget = self.create_tree(name, data) | 436 | widget = self.create_tree(name, data) |
3546 | @@ -498,10 +520,10 @@ | |||
3547 | 498 | urwid.signals.connect_signal(widget, 'change', | 520 | urwid.signals.connect_signal(widget, 'change', |
3548 | 499 | widget.changed_cb, self.walker) | 521 | widget.changed_cb, self.walker) |
3549 | 500 | 522 | ||
3551 | 501 | items = sorted(data.iteritems(), key=itemgetter(0)) | 523 | items = sorted(iter(data.items()), key=itemgetter(0)) |
3552 | 502 | for child_name, child_data in items: | 524 | for child_name, child_data in items: |
3553 | 503 | is_suite = all(issubclass(type(value), dict) | 525 | is_suite = all(issubclass(type(value), dict) |
3555 | 504 | for value in child_data.itervalues()) | 526 | for value in child_data.values()) |
3556 | 505 | 527 | ||
3557 | 506 | if is_suite: | 528 | if is_suite: |
3558 | 507 | child_widget = self.create_tree(child_name, | 529 | child_widget = self.create_tree(child_name, |
3559 | @@ -533,7 +555,7 @@ | |||
3560 | 533 | Dialog.show(self) | 555 | Dialog.show(self) |
3561 | 534 | 556 | ||
3562 | 535 | # Show tree | 557 | # Show tree |
3564 | 536 | items = sorted(self.results.iteritems(), | 558 | items = sorted(iter(self.results.items()), |
3565 | 537 | key=itemgetter(0)) | 559 | key=itemgetter(0)) |
3566 | 538 | for name, data in items: | 560 | for name, data in items: |
3567 | 539 | widget = self.create_tree(name, data) | 561 | widget = self.create_tree(name, data) |
3568 | @@ -899,7 +921,7 @@ | |||
3569 | 899 | """ | 921 | """ |
3570 | 900 | Pulse progress bar | 922 | Pulse progress bar |
3571 | 901 | """ | 923 | """ |
3573 | 902 | start, end = self.progress_coordinates.next() | 924 | start, end = next(self.progress_coordinates) |
3574 | 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) |
3575 | 904 | self.progress_bar.set_data(bar_data, 1) | 926 | self.progress_bar.set_data(bar_data, 1) |
3576 | 905 | self.loop.draw_screen() | 927 | self.loop.draw_screen() |
3577 | @@ -955,7 +977,7 @@ | |||
3578 | 955 | return dialog.response | 977 | return dialog.response |
3579 | 956 | 978 | ||
3580 | 957 | 979 | ||
3582 | 958 | def show_entry(self, text, value, previous=None, next=None): | 980 | def show_entry(self, text, value, label=None, previous=None, next=None): |
3583 | 959 | dialog = InputDialog(text).run() | 981 | dialog = InputDialog(text).run() |
3584 | 960 | self.direction = dialog.direction | 982 | self.direction = dialog.direction |
3585 | 961 | return dialog.response | 983 | return dialog.response |
3586 | @@ -974,7 +996,7 @@ | |||
3587 | 974 | return dialog.response | 996 | return dialog.response |
3588 | 975 | 997 | ||
3589 | 976 | 998 | ||
3591 | 977 | def show_tree(self, text, options={}, default={}): | 999 | def show_tree(self, text, options={}, default={}, deselect_warning=""): |
3592 | 978 | """ | 1000 | """ |
3593 | 979 | Show some options in a tree hierarchy | 1001 | Show some options in a tree hierarchy |
3594 | 980 | and let the user choose between them | 1002 | and let the user choose between them |
3595 | @@ -1004,8 +1026,7 @@ | |||
3596 | 1004 | output = '' | 1026 | output = '' |
3597 | 1005 | 1027 | ||
3598 | 1006 | # Get options | 1028 | # Get options |
3601 | 1007 | options = list([self.ANSWER_TO_OPTION[a] | 1029 | options = [self.ANSWER_TO_OPTION[a] for a in ALL_ANSWERS] |
3600 | 1008 | for a in ALL_ANSWERS]) | ||
3602 | 1009 | 1030 | ||
3603 | 1010 | # Get buttons | 1031 | # Get buttons |
3604 | 1011 | buttons = [] | 1032 | buttons = [] |
3605 | @@ -1040,9 +1061,11 @@ | |||
3606 | 1040 | """ | 1061 | """ |
3607 | 1041 | return self.show_radio(text, options, default) | 1062 | return self.show_radio(text, options, default) |
3608 | 1042 | 1063 | ||
3611 | 1043 | 1064 | def show_error(self, primary_text, | |
3612 | 1044 | def show_error(self, text): | 1065 | secondary_text=None, detailed_text=None): |
3613 | 1045 | """ | 1066 | """ |
3614 | 1046 | Show an error message | 1067 | Show an error message |
3615 | 1047 | """ | 1068 | """ |
3616 | 1069 | text = filter(None, [primary_text, secondary_text, detailed_text]) | ||
3617 | 1070 | text = '\n'.join(text) | ||
3618 | 1048 | return self.show_radio(text) | 1071 | return self.show_radio(text) |
3619 | 1049 | 1072 | ||
3620 | === removed file 'data/audio/Ogg_Vorbis_Audio.oga' | |||
3621 | 1050 | Binary 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 | 1073 | Binary 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 |
3622 | === removed file 'data/documents/Derivatives_of_Ubuntu.doc' | |||
3623 | 1051 | Binary 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 | 1074 | Binary 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 |
3624 | === removed file 'data/documents/OpenOffice_Presentation_Test.odp' | |||
3625 | 1052 | Binary 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 | 1075 | Binary 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 |
3626 | === removed file 'data/documents/OpenOffice_Spreadsheet_Payment.ods' | |||
3627 | 1053 | Binary 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 | 1076 | Binary 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 |
3628 | === removed file 'data/documents/OpenOffice_Text_Test.odt' | |||
3629 | 1054 | Binary 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 | 1077 | Binary 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 |
3630 | === removed file 'data/documents/PDF_Test.pdf' | |||
3631 | 1055 | Binary 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 | 1078 | Binary 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 |
3632 | === removed file 'data/documents/RTF_Russian.rtf' | |||
3633 | --- data/documents/RTF_Russian.rtf 2010-08-13 16:23:16 +0000 | |||
3634 | +++ data/documents/RTF_Russian.rtf 1970-01-01 00:00:00 +0000 | |||
3635 | @@ -1,51 +0,0 @@ | |||
3636 | 1 | {\rtf1\ansi\deff1\adeflang1025 | ||
3637 | 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};}} | ||
3638 | 3 | {\colortbl;\red0\green0\blue0;\red0\green0\blue128;\red128\green128\blue128;} | ||
3639 | 4 | {\stylesheet{\s1\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\snext1 Normal;} | ||
3640 | 5 | {\s2\sb240\sa120\keepn\rtlch\af1\afs28\lang255\ltrch\dbch\af2\langfe255\hich\f4\fs28\lang2057\loch\f4\fs28\lang2057\sbasedon1\snext3 Heading;} | ||
3641 | 6 | {\s3\sa120\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon1\snext3 Body Text;} | ||
3642 | 7 | {\s4\sa120\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon3\snext4 List;} | ||
3643 | 8 | {\s5\sb120\sa120\rtlch\af4\afs24\lang255\ai\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\i\loch\fs24\lang2057\i\sbasedon1\snext5 caption;} | ||
3644 | 9 | {\s6\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon1\snext6 Index;} | ||
3645 | 10 | {\s7\sb120\sa120\rtlch\af4\afs24\lang255\ai\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\i\loch\fs24\lang2057\i\sbasedon1\snext7 caption;} | ||
3646 | 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;} | ||
3647 | 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;} | ||
3648 | 13 | {\*\cs11\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 1;} | ||
3649 | 14 | {\*\cs12\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 2;} | ||
3650 | 15 | {\*\cs13\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 3;} | ||
3651 | 16 | {\*\cs14\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 4;} | ||
3652 | 17 | {\*\cs15\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 5;} | ||
3653 | 18 | {\*\cs16\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 6;} | ||
3654 | 19 | {\*\cs17\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 7;} | ||
3655 | 20 | {\*\cs18\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 8;} | ||
3656 | 21 | {\*\cs19\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 9;} | ||
3657 | 22 | {\*\cs20\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 10;} | ||
3658 | 23 | {\*\cs21\rtlch\af4\afs24\lang255\ab\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\b\loch\fs24\lang2057\b Strong Emphasis;} | ||
3659 | 24 | {\*\cs22\cf2\ul\ulc0\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 Internet link;} | ||
3660 | 25 | {\*\cs23\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 Bullet Symbols;} | ||
3661 | 26 | {\*\cs24\cf2\ul\ulc0\rtlch\af1\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang2057\loch\f1\fs24\lang2057 Internet link;} | ||
3662 | 27 | } | ||
3663 | 28 | {\info{\creatim\yr2006\mo3\dy8\hr21\min21}{\revtim\yr1601\mo1\dy1\hr0\min0}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab709 | ||
3664 | 29 | {\*\pgdsctbl | ||
3665 | 30 | {\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}} | ||
3666 | 31 | {\*\pgdscno0}\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc | ||
3667 | 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} | ||
3668 | 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 | ||
3669 | 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 | ||
3670 | 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. } | ||
3671 | 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? } | ||
3672 | 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} | ||
3673 | 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 | ||
3674 | 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. } | ||
3675 | 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} | ||
3676 | 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 | ||
3677 | 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. } | ||
3678 | 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} | ||
3679 | 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 | ||
3680 | 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. } | ||
3681 | 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 | ||
3682 | 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. } | ||
3683 | 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} | ||
3684 | 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 | ||
3685 | 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. } | ||
3686 | 51 | \par } | ||
3687 | 52 | \ No newline at end of file | 0 | \ No newline at end of file |
3688 | 53 | 1 | ||
3689 | === removed file 'data/documents/Trigonometric_functions.xls' | |||
3690 | 54 | Binary 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 | 2 | Binary 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 |
3691 | === removed file 'data/images/SVG_Color_Image_Xubuntu.svg' | |||
3692 | --- data/images/SVG_Color_Image_Xubuntu.svg 2010-08-13 16:23:16 +0000 | |||
3693 | +++ data/images/SVG_Color_Image_Xubuntu.svg 1970-01-01 00:00:00 +0000 | |||
3694 | @@ -1,109 +0,0 @@ | |||
3695 | 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
3696 | 2 | <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||
3697 | 3 | <svg | ||
3698 | 4 | xmlns:svg="http://www.w3.org/2000/svg" | ||
3699 | 5 | xmlns="http://www.w3.org/2000/svg" | ||
3700 | 6 | version="1.0" | ||
3701 | 7 | width="350.09" | ||
3702 | 8 | height="112.48" | ||
3703 | 9 | id="svg2381"> | ||
3704 | 10 | <defs | ||
3705 | 11 | id="defs2383" /> | ||
3706 | 12 | <g | ||
3707 | 13 | transform="translate(12.587294,0.2745725)" | ||
3708 | 14 | id="layer1"> | ||
3709 | 15 | <g | ||
3710 | 16 | transform="translate(-4,0)" | ||
3711 | 17 | id="g3608" | ||
3712 | 18 | style="fill:#033c71;fill-opacity:1"> | ||
3713 | 19 | <path | ||
3714 | 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" | ||
3715 | 21 | id="text2284" | ||
3716 | 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" /> | ||
3717 | 23 | <path | ||
3718 | 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" | ||
3719 | 25 | id="text3378" | ||
3720 | 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" /> | ||
3721 | 27 | </g> | ||
3722 | 28 | <path | ||
3723 | 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" | ||
3724 | 30 | id="path2111" | ||
3725 | 31 | style="fill:#639ad2;fill-opacity:1;stroke:none;stroke-opacity:1" /> | ||
3726 | 32 | <path | ||
3727 | 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" | ||
3728 | 34 | id="path2113" | ||
3729 | 35 | style="fill:#23507b;fill-opacity:1" /> | ||
3730 | 36 | <circle | ||
3731 | 37 | cx="98.936996" | ||
3732 | 38 | cy="9.1700001" | ||
3733 | 39 | r="9.1680002" | ||
3734 | 40 | transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)" | ||
3735 | 41 | id="circle2117" | ||
3736 | 42 | style="fill:#10518b;fill-opacity:1" /> | ||
3737 | 43 | <circle | ||
3738 | 44 | cx="33.206001" | ||
3739 | 45 | cy="47.130001" | ||
3740 | 46 | r="9.1680002" | ||
3741 | 47 | transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)" | ||
3742 | 48 | id="circle2107" | ||
3743 | 49 | style="fill:#4b9aeb;fill-opacity:1" /> | ||
3744 | 50 | <path | ||
3745 | 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" | ||
3746 | 52 | id="path2115" | ||
3747 | 53 | style="fill:#b4d1ea;fill-opacity:1" /> | ||
3748 | 54 | <circle | ||
3749 | 55 | cx="98.945" | ||
3750 | 56 | cy="85.073997" | ||
3751 | 57 | r="9.1689997" | ||
3752 | 58 | transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)" | ||
3753 | 59 | id="circle3484" | ||
3754 | 60 | style="fill:#83bef1;fill-opacity:1" /> | ||
3755 | 61 | <path | ||
3756 | 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" | ||
3757 | 63 | id="path3679" | ||
3758 | 64 | style="fill:#639ad2;fill-opacity:0;stroke:none;stroke-opacity:1" /> | ||
3759 | 65 | <path | ||
3760 | 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" | ||
3761 | 67 | id="path3691" | ||
3762 | 68 | style="fill:#b4d1ea;fill-opacity:0" /> | ||
3763 | 69 | <path | ||
3764 | 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" | ||
3765 | 71 | id="path3719" | ||
3766 | 72 | style="fill:#23507b;fill-opacity:0" /> | ||
3767 | 73 | <g | ||
3768 | 74 | id="g3583"> | ||
3769 | 75 | <path | ||
3770 | 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" | ||
3771 | 77 | id="path14" | ||
3772 | 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" /> | ||
3773 | 79 | <path | ||
3774 | 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" | ||
3775 | 81 | id="path7" | ||
3776 | 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" /> | ||
3777 | 83 | <path | ||
3778 | 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" | ||
3779 | 85 | id="path8" | ||
3780 | 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" /> | ||
3781 | 87 | <path | ||
3782 | 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" | ||
3783 | 89 | id="path13" | ||
3784 | 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" /> | ||
3785 | 91 | <ellipse | ||
3786 | 92 | cx="288.86475" | ||
3787 | 93 | cy="374.58655" | ||
3788 | 94 | rx="3.012037" | ||
3789 | 95 | ry="3.398196" | ||
3790 | 96 | transform="matrix(0.2078264,0,0,0.2097329,-4.371806,-26.527264)" | ||
3791 | 97 | id="ellipse17" | ||
3792 | 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" /> | ||
3793 | 99 | <path | ||
3794 | 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" | ||
3795 | 101 | id="path18" | ||
3796 | 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" /> | ||
3797 | 103 | <path | ||
3798 | 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" | ||
3799 | 105 | id="path21" | ||
3800 | 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" /> | ||
3801 | 107 | </g> | ||
3802 | 108 | </g> | ||
3803 | 109 | </svg> | ||
3804 | 110 | 0 | ||
3805 | === modified file 'data/whitelists/default.whitelist' | |||
3806 | --- data/whitelists/default.whitelist 2012-02-15 00:11:21 +0000 | |||
3807 | +++ data/whitelists/default.whitelist 2012-06-23 00:59:17 +0000 | |||
3808 | @@ -12,11 +12,17 @@ | |||
3809 | 12 | sleep | 12 | sleep |
3810 | 13 | display | 13 | display |
3811 | 14 | optical_drive | 14 | optical_drive |
3812 | 15 | block_device | ||
3813 | 15 | __audio__ | 16 | __audio__ |
3814 | 16 | audio/alsa_record_playback_external | 17 | audio/alsa_record_playback_external |
3815 | 17 | audio/alsa_record_playback_internal | 18 | audio/alsa_record_playback_internal |
3816 | 18 | audio/alsa_record_playback_usb | 19 | audio/alsa_record_playback_usb |
3817 | 19 | audio/playback_auto | 20 | audio/playback_auto |
3818 | 21 | __benchmarks__ | ||
3819 | 22 | benchmarks/disk/hdparm-read | ||
3820 | 23 | benchmarks/disk/hdparm-read_.* | ||
3821 | 24 | benchmarks/disk/hdparm-cache-read | ||
3822 | 25 | benchmarks/disk/hdparm-cache-read_.* | ||
3823 | 20 | __bluetooth__ | 26 | __bluetooth__ |
3824 | 21 | bluetooth/detect-output | 27 | bluetooth/detect-output |
3825 | 22 | __camera__ | 28 | __camera__ |
3826 | @@ -28,8 +34,6 @@ | |||
3827 | 28 | cpu/topology | 34 | cpu/topology |
3828 | 29 | cpu/clocktest | 35 | cpu/clocktest |
3829 | 30 | __disk__ | 36 | __disk__ |
3830 | 31 | disk/benchmarks | ||
3831 | 32 | disk/benchmark_sd\w | ||
3832 | 33 | disk/detect | 37 | disk/detect |
3833 | 34 | __firewire__ | 38 | __firewire__ |
3834 | 35 | firewire/insert | 39 | firewire/insert |
3835 | @@ -59,6 +63,7 @@ | |||
3836 | 59 | input/keyboard | 63 | input/keyboard |
3837 | 60 | input/mouse | 64 | input/mouse |
3838 | 61 | __keys__ | 65 | __keys__ |
3839 | 66 | keys/super | ||
3840 | 62 | keys/battery-info | 67 | keys/battery-info |
3841 | 63 | keys/brightness | 68 | keys/brightness |
3842 | 64 | keys/media-control | 69 | keys/media-control |
3843 | 65 | 70 | ||
3844 | === added file 'data/whitelists/smoke.whitelist' | |||
3845 | --- data/whitelists/smoke.whitelist 1970-01-01 00:00:00 +0000 | |||
3846 | +++ data/whitelists/smoke.whitelist 2012-06-23 00:59:17 +0000 | |||
3847 | @@ -0,0 +1,25 @@ | |||
3848 | 1 | ## This is an example whitelist to start from. | ||
3849 | 2 | ## To use, copy this file and add the jobs you want to run to the copy. Delete | ||
3850 | 3 | ## these comments. DO NOT delete the first 9 jobs in tis file. They are resource | ||
3851 | 4 | ## gathering jobs and are necessary to do any testing at all. | ||
3852 | 5 | # Resource Jobs (listed in jobs/resource.txt) | ||
3853 | 6 | cpuinfo | ||
3854 | 7 | cdimage | ||
3855 | 8 | dmi | ||
3856 | 9 | dpkg | ||
3857 | 10 | gconf | ||
3858 | 11 | lsb | ||
3859 | 12 | meminfo | ||
3860 | 13 | module | ||
3861 | 14 | package | ||
3862 | 15 | device | ||
3863 | 16 | uname | ||
3864 | 17 | # Smoke test cases | ||
3865 | 18 | __smoke__ | ||
3866 | 19 | smoke/true | ||
3867 | 20 | smoke/false | ||
3868 | 21 | smoke/dependency/good | ||
3869 | 22 | smoke/dependency/bad | ||
3870 | 23 | smoke/requirement/good | ||
3871 | 24 | smoke/requirement/bad | ||
3872 | 25 | smoke/manual | ||
3873 | 0 | 26 | ||
3874 | === added file 'data/whitelists/sniff.whitelist' | |||
3875 | --- data/whitelists/sniff.whitelist 1970-01-01 00:00:00 +0000 | |||
3876 | +++ data/whitelists/sniff.whitelist 2012-06-23 00:59:17 +0000 | |||
3877 | @@ -0,0 +1,25 @@ | |||
3878 | 1 | ## This is an example whitelist to start from. | ||
3879 | 2 | ## To use, copy this file and add the jobs you want to run to the copy. Delete | ||
3880 | 3 | ## these comments. DO NOT delete the first 9 jobs in tis file. They are resource | ||
3881 | 4 | ## gathering jobs and are necessary to do any testing at all. | ||
3882 | 5 | # Resource Jobs (listed in jobs/resource.txt) | ||
3883 | 6 | cpuinfo | ||
3884 | 7 | cdimage | ||
3885 | 8 | dmi | ||
3886 | 9 | dpkg | ||
3887 | 10 | gconf | ||
3888 | 11 | lsb | ||
3889 | 12 | meminfo | ||
3890 | 13 | module | ||
3891 | 14 | package | ||
3892 | 15 | device | ||
3893 | 16 | uname | ||
3894 | 17 | # Smoke sniffcases | ||
3895 | 18 | __sniff__ | ||
3896 | 19 | sniff/sniff7 | ||
3897 | 20 | sniff/sniff6 | ||
3898 | 21 | sniff/sniff5 | ||
3899 | 22 | sniff/sniff4 | ||
3900 | 23 | sniff/sniff3 | ||
3901 | 24 | sniff/sniff2 | ||
3902 | 25 | sniff/sniff1 | ||
3903 | 0 | 26 | ||
3904 | === modified file 'debian/changelog' | |||
3905 | --- debian/changelog 2012-04-11 17:20:37 +0000 | |||
3906 | +++ debian/changelog 2012-06-23 00:59:17 +0000 | |||
3907 | @@ -1,3 +1,218 @@ | |||
3908 | 1 | checkbox (0.14) quantal; urgency=low | ||
3909 | 2 | |||
3910 | 3 | * New upstream release (LP: #1016746): | ||
3911 | 4 | |||
3912 | 5 | [Aurelien Gateau] | ||
3913 | 6 | * lib/template.py, lib/template_i18n.py, plugins/jobs_info.py, | ||
3914 | 7 | plugins/suites_prompt.py: Add a "sortkey" attribute to jobs, the sortkey | ||
3915 | 8 | order matches the order in which they appear in jobfiles. | ||
3916 | 9 | * checkbox_gtk/gtk_interface.py: Shows jobs and suites in sortkey order | ||
3917 | 10 | (that is, as they appear in job definition files, rather than | ||
3918 | 11 | alphabetically). | ||
3919 | 12 | * checkbox_gtk/gtk_interface.py, gtk/checkbox-gtk.ui, | ||
3920 | 13 | plugins/jobs_prompt.py: Added a progress bar showing tests completed and | ||
3921 | 14 | total. | ||
3922 | 15 | |||
3923 | 16 | [Brendan Donegan] | ||
3924 | 17 | * jobs/suspend.txt.in: Fixed dependencies on wireless and suspend_advanced | ||
3925 | 18 | jobs. | ||
3926 | 19 | * Changed screenshot jobs to use /dev/external_webcam which will be set by | ||
3927 | 20 | a udev rule (LP: #956885) | ||
3928 | 21 | * [FEATURE] Added touchpad tests from CE QA Checkbox to allow touchpad | ||
3929 | 22 | testing to be performed | ||
3930 | 23 | * [FEATURE] Python 2 to 3 conversion: | ||
3931 | 24 | * scripts/create_connection - switched to using argparse and fixed | ||
3932 | 25 | representation of octal literal | ||
3933 | 26 | * scripts/internet_test - ran 2to3 tool and decoded result of | ||
3934 | 27 | check_output. Also replaced optparse with argparse | ||
3935 | 28 | * scripts/memory_info | ||
3936 | 29 | * scripts/removable_storage_test - ran 2to3 tool and fixed some | ||
3937 | 30 | encoding issues | ||
3938 | 31 | * scripts/removable_storage_watcher - ran 2to3 tool and swapped | ||
3939 | 32 | use of gobject with gi.repository.GObject | ||
3940 | 33 | * scripts/xrandr_cycle - ran 2to3 tool and fixed encoding issue | ||
3941 | 34 | * scripts/obex_send - ran 2to3 tool and swapped | ||
3942 | 35 | use of gobject with gi.repository.GObject | ||
3943 | 36 | * Update touchpad.py to use gsettings instead of deprecated gconf | ||
3944 | 37 | (LP: #1004212) | ||
3945 | 38 | * Instead of checking output of nmcli con up in create_connection, | ||
3946 | 39 | check the return code is success instead (LP: #1013537) | ||
3947 | 40 | * base64 encode the after suspend screenshot attachement so that it can | ||
3948 | 41 | be uploaded properly (LP: #1016126) | ||
3949 | 42 | * Fixed simple type in xorg_memory_test, introduced by Python3 | ||
3950 | 43 | conversion (LP: #1016387) | ||
3951 | 44 | * [FEATURE] Add suspend/bluetooth_obex_after_suspend_auto test to be | ||
3952 | 45 | used during fully automated SRU testing | ||
3953 | 46 | |||
3954 | 47 | [Daniel Manrique] | ||
3955 | 48 | * Tweaks to internet_test: don't try to ping an IP that's unreachable from | ||
3956 | 49 | the specified interface (or at all), try to find something pingable via | ||
3957 | 50 | other means. | ||
3958 | 51 | * Reverted feature to keep tests ordered, as the sortkey attribute causes | ||
3959 | 52 | undesirable secondary effects. | ||
3960 | 53 | * New version 0.14 for Quantal Quetzal development. | ||
3961 | 54 | * Set the correct user (root) for fwts-wakealarm test (LP: #1004102) | ||
3962 | 55 | * Set correct user (root) for usb/storage-preinserted, so it works correctly | ||
3963 | 56 | on servers (LP: #1004131) | ||
3964 | 57 | * Log (at level INFO) name of each message we execute, so the currently | ||
3965 | 58 | running job can be determined by looking at the logfile, rather than | ||
3966 | 59 | hunting through process lists. | ||
3967 | 60 | * [FEATURE] Added script and jobs to collect and attach output from | ||
3968 | 61 | alsa-info.sh. | ||
3969 | 62 | * Assume utf-8 encoding always, when opening template files. | ||
3970 | 63 | (LP: #1015174) | ||
3971 | 64 | * [FEATURE] Replaced the context menu in the selection tree with explicit | ||
3972 | 65 | "select/deselect all" buttons. | ||
3973 | 66 | |||
3974 | 67 | [Javier Collado] | ||
3975 | 68 | * Updated camera_test script to use better tool for capturing the image | ||
3976 | 69 | and allow specifying a device to use, plus other improvements. Create a | ||
3977 | 70 | job which takes a capture from the webcam of the desktop. | ||
3978 | 71 | * Added jobs to take screenshots after suspend and attach the resulting jpg | ||
3979 | 72 | * [FEATURE] Added smoke test jobs, whitelist and local job to use for | ||
3980 | 73 | checkbox development purposes. | ||
3981 | 74 | * Fixed "camera_test detect" problem with missing args attributes (LP: | ||
3982 | 75 | #967419) | ||
3983 | 76 | * Submission screen in Qt interface updated to support certification client: | ||
3984 | 77 | - customize contents depending on the upload target (launchpad or certification) | ||
3985 | 78 | - display links to the report properly in the show_entry method | ||
3986 | 79 | * Fixed qt interface show_entry method preopulates widget that gets | ||
3987 | 80 | user input (LP: #1000451) | ||
3988 | 81 | * Added customizable deselect_warning message in qt show_tree method (LP: #1000443) | ||
3989 | 82 | * show_error method shows long text properly in gtk/qt interfaces (LP: | ||
3990 | 83 | #1012052) | ||
3991 | 84 | |||
3992 | 85 | [Jeff Lane] | ||
3993 | 86 | * Created automated version of optical/read for server testing | ||
3994 | 87 | Fixed issues with optical_read_test script: | ||
3995 | 88 | - test could pass if /dev/cdrom did not exist | ||
3996 | 89 | - test could pass if /dev/cdrom was inaccessible | ||
3997 | 90 | - test could pass if no optical device was passed in (LP: #945178) | ||
3998 | 91 | * Removed hard coded paths from scripts (LP: #949435) | ||
3999 | 92 | * Removed files in /data that are not used in any job descriptions | ||
4000 | 93 | (LP: #957396) | ||
4001 | 94 | * [FEATURE] Modified stress jobs so that they are all automated per decision | ||
4002 | 95 | made during the cert sprint. | ||
4003 | 96 | * [FEATURE] Changes to Power Management testing in Checkbox: | ||
4004 | 97 | * scripts/pm_test: added a slightly modified version of OEM team's pm.py | ||
4005 | 98 | script for reboot/poweroff testing | ||
4006 | 99 | * jobs/hibernate.txt.in: modified hibernate test to use fwts and added new | ||
4007 | 100 | jobs to attach log files from hibernate testing. | ||
4008 | 101 | * jobs/power-management.txt.in: added new poweroff and reboot jobs using pm_test | ||
4009 | 102 | script. Added jobs to attach logs from reboot and poweroff tests to | ||
4010 | 103 | results. | ||
4011 | 104 | * jobs/stress.txt.in: modified suspend_30_cycles and hibernate_30_cycles to | ||
4012 | 105 | use fwts. Added jobs to attach logs from 30 cycle tests to results. | ||
4013 | 106 | * jobs/suspend.txt.in: Modified suspend_advanced and suspend_advanced_auto to use | ||
4014 | 107 | fwts. Added job to attach log from suspend_advanced and suspend_advanced_auto | ||
4015 | 108 | to results. | ||
4016 | 109 | * [FEATURE] jobs/miscellanea.txt.in: added a job to gather tester info for | ||
4017 | 110 | certification purposes. Not to be used for UF. | ||
4018 | 111 | * [FEATURE] Python 2 to 3 conversion: | ||
4019 | 112 | * scripts/cpu_topology: ran 2to3, made modificates based on code review and | ||
4020 | 113 | tested script to verify functionality. | ||
4021 | 114 | * scripts/disk_smart: ported to Python 3. Inserted bits to decode byte | ||
4022 | 115 | data returned by Popen. Fixed list_handler to decode bytes types to clean | ||
4023 | 116 | up debug output. Added bits to improve debug output. Migrated from | ||
4024 | 117 | optparse to argparse. | ||
4025 | 118 | * scripts/network_check: ran 2to3 and that was all that was needed. Also | ||
4026 | 119 | took the liberty of migrating from optparse to ArgParse sine we're | ||
4027 | 120 | Python3 only now. | ||
4028 | 121 | * scripts/network_device_info: ran 2to3 and changed shebang. | ||
4029 | 122 | * scripts/network_info: ran 2to3 and changed shebang. Fixed encoding issue | ||
4030 | 123 | with interface[:15] (needed to be a bytes object). | ||
4031 | 124 | * scripts/fwts_test: ran 2to3 and changed shebang, fixed an encoding bug | ||
4032 | 125 | with Popen output. Cleaned up the final output to be more useful for | ||
4033 | 126 | debugging test failures. | ||
4034 | 127 | * scripts/keyboard_test: nothing to do for conversion beyond changing shebang. | ||
4035 | 128 | * scripts/network_ntp_test: 2to3 changed nothing, so modified shebang. | ||
4036 | 129 | Fixed an encoding issue with Popen output in. Re-inserted a call to | ||
4037 | 130 | SilentCall() that was removed from TimeSkew() by someone in a previous | ||
4038 | 131 | revision, which made the TimeSkew() function do nothing. Fixed an | ||
4039 | 132 | unbuffered I/O error in SilentCall() discovered while testing Python3 | ||
4040 | 133 | changes. | ||
4041 | 134 | * scripts/optical_detect, scripts/optical_read_test: ran 2to3 and changed | ||
4042 | 135 | shebang. Changes were minimal. | ||
4043 | 136 | * scripts/xorg_memory_test: 2to3 made minimal changes, modifed shebang. | ||
4044 | 137 | Converted optparse code to argparse code and replaced sys.argv[] stuff | ||
4045 | 138 | with more useful positional arguments. Removed a redundant import that | ||
4046 | 139 | 2to3 injected. | ||
4047 | 140 | * scripts/resolution_test: ran 2to3 with minimal changes. Changed shebang. | ||
4048 | 141 | Converted optparse to argparse and removed unnecessary calls to | ||
4049 | 142 | sys.argv[] | ||
4050 | 143 | * scripts/pm_log_check: ran 2to3 and changed shebang. | ||
4051 | 144 | * scripts/pm_test: ran 2to3 and changed shebang. After a lot of trial and | ||
4052 | 145 | error, changed the way xinput is called to avoid confusing bytecode | ||
4053 | 146 | embedded in the command output that was causing problems with | ||
4054 | 147 | bytes.decode() on the "after reboot" hardware checks. | ||
4055 | 148 | |||
4056 | 149 | [Jeff Marcom] | ||
4057 | 150 | * [FEATURE] Python 2 to 3 conversion: | ||
4058 | 151 | * scripts/memory_info | ||
4059 | 152 | * scripts/memory_test | ||
4060 | 153 | * scripts/touchpad_test | ||
4061 | 154 | * Deprecated: wake_on_lan_test | ||
4062 | 155 | * Update touchpad.py to use gsettings instead of deprecated gconf | ||
4063 | 156 | (LP: #1004212) | ||
4064 | 157 | |||
4065 | 158 | [Marc Tardif] | ||
4066 | 159 | * [FEATURE] Reworked media_keys_test into key_test, making it more generic | ||
4067 | 160 | and able to test for any key that sends an scancode. Used it to implement | ||
4068 | 161 | a test for the Super key. | ||
4069 | 162 | * [FEATURE] Added new interactive and auto-verifying touchpad scrolling | ||
4070 | 163 | test. | ||
4071 | 164 | * [FEATURE] Python 2 to 3 conversion: | ||
4072 | 165 | * scripts/ansi_parser | ||
4073 | 166 | * scripts/cking_suite | ||
4074 | 167 | * scripts/floppy_test | ||
4075 | 168 | * scripts/network_bandwidth_test | ||
4076 | 169 | * scripts/cpu_scaling_test | ||
4077 | 170 | * Removed sleep_test script no longer used by any test definition. | ||
4078 | 171 | * [FEATURE] Deprecated scripts: | ||
4079 | 172 | * scripts/autotest_filter and scripts/autotest_suite | ||
4080 | 173 | * scripts/ltp_filter and scripts/ltp_suite | ||
4081 | 174 | * scripts/mago_filter and scripts/mago_suite | ||
4082 | 175 | * scripts/qa_regression_suite | ||
4083 | 176 | * [FEATURE] Reworked media_keys_test into key_test, making it more generic | ||
4084 | 177 | and able to test for any key that sends an scancode. Used it to implement | ||
4085 | 178 | a test for the Super key. | ||
4086 | 179 | * [FEATURE] Added new interactive and auto-verifying touchpad scrolling | ||
4087 | 180 | test. | ||
4088 | 181 | * Removed sleep_test script no longer used by any test definition. | ||
4089 | 182 | * Migrated project minus scripts to Python 3. | ||
4090 | 183 | |||
4091 | 184 | [Sylvain Pineau] | ||
4092 | 185 | * Updated gst_pipeline_test to add a --fullscreen option for video playback. | ||
4093 | 186 | * Add python-gtk2 dependency, Gst from gi.repository don't work well with | ||
4094 | 187 | messages (See https://bugzilla.gnome.org/show_bug.cgi?id=631901). | ||
4095 | 188 | * Add a new job to capture screen during fullscreen video playback. | ||
4096 | 189 | * qt/frontend/qtfront.cpp, qt/frontend/qtfront.h, plugins/suites_prompt.py, | ||
4097 | 190 | checkbox_qt/qt_interface.py, plugins/jobs_prompt.py: The selection tree is | ||
4098 | 191 | now updated when recovering from a previous run (LP: #937696) | ||
4099 | 192 | * [FEATURE] Python 2 to 3 conversion: | ||
4100 | 193 | * scripts/gst_pipeline_test. Migrated to PyGI. | ||
4101 | 194 | * scripts/removable_resource: Add a resource job to identify removable | ||
4102 | 195 | block devices. __disks__ jobs updated to run only on internal drives. | ||
4103 | 196 | * [FEATURE] jobs/benchmarks.txt.in, scripts/pts_run: Add a reworked launcher | ||
4104 | 197 | for phoronix-test-suite tests. | ||
4105 | 198 | * [FEATURE] Python 2 to 3 conversion: | ||
4106 | 199 | * jobs/stress.txt.in: add OEM team's stress tests (including reboot and poweroff) | ||
4107 | 200 | and log analysis jobs | ||
4108 | 201 | |||
4109 | 202 | [Tiago Salem Herrmann] | ||
4110 | 203 | * checkbox_qt/qt_interface.py, qt/frontend/qtfront.cpp, | ||
4111 | 204 | qt/frontend/qtfront.h, qt/frontend/treemodel.cpp, qt/frontend/treemodel.h: | ||
4112 | 205 | Makes it possible for the job selection tree to have more than 2 levels of | ||
4113 | 206 | children nodes. | ||
4114 | 207 | * checkbox/user_interface.py, checkbox_qt/qt_interface.py, | ||
4115 | 208 | plugins/user_interface.py, qt/frontend/qtfront.cpp, qt/frontend/qtfront.h: | ||
4116 | 209 | Correctly update automated test execution status in the Selection tab | ||
4117 | 210 | (LP: #950105). | ||
4118 | 211 | * qt/frontend/qtfront.cpp: Avoid QDBusArgument warnings when running | ||
4119 | 212 | checkbox-qt from a terminal (LP: #957476) | ||
4120 | 213 | |||
4121 | 214 | -- Marc Tardif <marc@ubuntu.com> Fri, 22 Jun 2012 17:04:14 -0400 | ||
4122 | 215 | |||
4123 | 1 | checkbox (0.13.7) precise; urgency=low | 216 | checkbox (0.13.7) precise; urgency=low |
4124 | 2 | 217 | ||
4125 | 3 | * New upstream release (LP: #980063) | 218 | * New upstream release (LP: #980063) |
4126 | 4 | 219 | ||
4127 | === modified file 'debian/checkbox.dirs' | |||
4128 | --- debian/checkbox.dirs 2009-03-17 09:46:16 +0000 | |||
4129 | +++ debian/checkbox.dirs 2012-06-23 00:59:17 +0000 | |||
4130 | @@ -1,2 +1,3 @@ | |||
4131 | 1 | etc/checkbox.d | 1 | etc/checkbox.d |
4132 | 2 | usr/share/icons | ||
4133 | 2 | usr/share/locale | 3 | usr/share/locale |
4134 | 3 | 4 | ||
4135 | === modified file 'debian/control' | |||
4136 | --- debian/control 2012-03-07 19:46:29 +0000 | |||
4137 | +++ debian/control 2012-06-23 00:59:17 +0000 | |||
4138 | @@ -3,24 +3,58 @@ | |||
4139 | 3 | Priority: optional | 3 | Priority: optional |
4140 | 4 | Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> | 4 | Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> |
4141 | 5 | Standards-Version: 3.9.2 | 5 | Standards-Version: 3.9.2 |
4144 | 6 | X-Python-Version: >= 2.6 | 6 | X-Python3-Version: >= 3.2 |
4145 | 7 | Build-Depends: debhelper (>= 7.0.50~), dh-translations, libqt4-dev, python (>= 2.6.6-3~), po-debconf, python-distutils-extra, qt4-qmake | 7 | Build-Depends: debhelper (>= 9.2), |
4146 | 8 | dh-translations, | ||
4147 | 9 | libqt4-dev, | ||
4148 | 10 | po-debconf, | ||
4149 | 11 | python3 (>= 3.2), | ||
4150 | 12 | python3-distutils-extra, | ||
4151 | 13 | qt4-qmake | ||
4152 | 8 | Vcs-Bzr: https://code.launchpad.net/~hardware-certification/checkbox/trunk | 14 | Vcs-Bzr: https://code.launchpad.net/~hardware-certification/checkbox/trunk |
4153 | 9 | 15 | ||
4154 | 10 | Package: checkbox | 16 | Package: checkbox |
4155 | 11 | Section: python | 17 | Section: python |
4156 | 12 | Architecture: any | 18 | Architecture: any |
4161 | 13 | Depends: ${misc:Depends}, ${python:Depends}, debconf, python-libxml2, udev | 19 | Depends: debconf, python3-lxml, udev, ${misc:Depends}, ${python3:Depends} |
4162 | 14 | Recommends: dpkg (>= 1.13), gstreamer0.10-gconf, lsb-release, perl, pm-utils, python-apport, python-apt, python-dateutil, python-gst0.10 | 20 | Recommends: dpkg (>= 1.13), |
4163 | 15 | Suggests: checkbox-cli | checkbox-gtk, bonnie++, bootchart, bzr, cvs, ethtool, flex, fwts, git-core, hdparm, lshw, make, nmap, obexd-client, python-pexpect, smartmontools, sox, stress, wodim | 21 | gir1.2-gst-plugins-base-0.10 | gir1.2-gst-plugins-base-1.0, |
4164 | 16 | Description: System testing application | 22 | gstreamer0.10-gconf | gstreamer1.0-plugins-good, |
4165 | 23 | lsb-release, | ||
4166 | 24 | perl, | ||
4167 | 25 | pm-utils, | ||
4168 | 26 | python-apport, | ||
4169 | 27 | python-apt, | ||
4170 | 28 | python3-dbus, | ||
4171 | 29 | python3-gi | ||
4172 | 30 | Suggests: bonnie++, | ||
4173 | 31 | bootchart, | ||
4174 | 32 | checkbox-cli | checkbox-gtk, | ||
4175 | 33 | ethtool, | ||
4176 | 34 | fwts, | ||
4177 | 35 | git-core, | ||
4178 | 36 | glmark2, | ||
4179 | 37 | glmark2-es2, | ||
4180 | 38 | hdparm, | ||
4181 | 39 | lshw, | ||
4182 | 40 | mesa-utils, | ||
4183 | 41 | nmap, | ||
4184 | 42 | obexd-client, | ||
4185 | 43 | render-bench, | ||
4186 | 44 | smartmontools, | ||
4187 | 45 | sox, | ||
4188 | 46 | stress, | ||
4189 | 47 | sysstat, | ||
4190 | 48 | wmctrl, | ||
4191 | 49 | wodim | ||
4192 | 50 | Description: System testing application | ||
4193 | 17 | This project provides an extensible interface for system testing. The | 51 | This project provides an extensible interface for system testing. The |
4194 | 18 | results can then be sent to Launchpad. | 52 | results can then be sent to Launchpad. |
4195 | 19 | 53 | ||
4196 | 20 | Package: checkbox-cli | 54 | Package: checkbox-cli |
4197 | 21 | Architecture: all | 55 | Architecture: all |
4198 | 22 | Depends: checkbox (>= ${source:Version}), ${misc:Depends} | 56 | Depends: checkbox (>= ${source:Version}), ${misc:Depends} |
4200 | 23 | Description: Command line interface for checkbox | 57 | Description: Command line interface for checkbox |
4201 | 24 | This project provides an extensible interface for system testing. The | 58 | This project provides an extensible interface for system testing. The |
4202 | 25 | results can then be sent to Launchpad. | 59 | results can then be sent to Launchpad. |
4203 | 26 | . | 60 | . |
4204 | @@ -28,18 +62,23 @@ | |||
4205 | 28 | 62 | ||
4206 | 29 | Package: checkbox-urwid | 63 | Package: checkbox-urwid |
4207 | 30 | Architecture: all | 64 | Architecture: all |
4210 | 31 | Depends: checkbox (>= ${source:Version}), python-urwid, ${misc:Depends} | 65 | Depends: checkbox (>= ${source:Version}), python3-urwid, ${misc:Depends} |
4211 | 32 | Description: Urwid interface for checkbox | 66 | Description: Urwid interface for checkbox |
4212 | 33 | This project provides an extensible interface for system testing. The | 67 | This project provides an extensible interface for system testing. The |
4213 | 34 | results can then be sent to Launchpad. | 68 | results can then be sent to Launchpad. |
4214 | 35 | . | 69 | . |
4216 | 36 | This package provides a command line interface (urwid version) for | 70 | This package provides a command line interface (urwid version) for |
4217 | 37 | answering tests. | 71 | answering tests. |
4218 | 38 | 72 | ||
4219 | 39 | Package: checkbox-gtk | 73 | Package: checkbox-gtk |
4220 | 40 | Section: gnome | 74 | Section: gnome |
4221 | 41 | Architecture: all | 75 | Architecture: all |
4223 | 42 | Depends: checkbox (>= ${source:Version}), gksu, python-gobject (>= 2.28), gir1.2-gtk-3.0, python-cairo, ${misc:Depends} | 76 | Depends: checkbox (>= ${source:Version}), |
4224 | 77 | gir1.2-gtk-3.0, | ||
4225 | 78 | gksu, | ||
4226 | 79 | python3-gi, | ||
4227 | 80 | python3-gi-cairo, | ||
4228 | 81 | ${misc:Depends} | ||
4229 | 43 | Description: GTK interface for checkbox | 82 | Description: GTK interface for checkbox |
4230 | 44 | This project provides an extensible interface for system testing. The | 83 | This project provides an extensible interface for system testing. The |
4231 | 45 | results can then be sent to Launchpad. | 84 | results can then be sent to Launchpad. |
4232 | @@ -48,7 +87,11 @@ | |||
4233 | 48 | 87 | ||
4234 | 49 | Package: checkbox-qt | 88 | Package: checkbox-qt |
4235 | 50 | Architecture: any | 89 | Architecture: any |
4237 | 51 | Depends: checkbox (>= ${source:Version}), libqtgui4, libqt4-dbus, ${misc:Depends} | 90 | Depends: checkbox (>= ${source:Version}), |
4238 | 91 | libqt4-dbus, | ||
4239 | 92 | libqtgui4, | ||
4240 | 93 | python3-dbus, | ||
4241 | 94 | ${misc:Depends} | ||
4242 | 52 | Description: QT4 interface for checkbox | 95 | Description: QT4 interface for checkbox |
4243 | 53 | This project provides an extensible interface for system testing. The | 96 | This project provides an extensible interface for system testing. The |
4244 | 54 | results can then be sent to Launchpad. | 97 | results can then be sent to Launchpad. |
4245 | 55 | 98 | ||
4246 | === modified file 'debian/po/ast.po' | |||
4247 | --- debian/po/ast.po 2012-04-02 15:22:05 +0000 | |||
4248 | +++ debian/po/ast.po 2012-06-23 00:59:17 +0000 | |||
4249 | @@ -15,8 +15,8 @@ | |||
4250 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4251 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4252 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4255 | 18 | "X-Launchpad-Export-Date: 2012-03-22 04:43+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4256 | 19 | "X-Generator: Launchpad (build 14981)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4257 | 20 | 20 | ||
4258 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4259 | 22 | #. Description | 22 | #. Description |
4260 | 23 | 23 | ||
4261 | === modified file 'debian/po/cs.po' | |||
4262 | --- debian/po/cs.po 2012-03-21 02:22:11 +0000 | |||
4263 | +++ debian/po/cs.po 2012-06-23 00:59:17 +0000 | |||
4264 | @@ -15,8 +15,8 @@ | |||
4265 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4266 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4267 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4270 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4271 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4272 | 20 | 20 | ||
4273 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4274 | 22 | #. Description | 22 | #. Description |
4275 | 23 | 23 | ||
4276 | === modified file 'debian/po/de.po' | |||
4277 | --- debian/po/de.po 2012-03-21 02:22:11 +0000 | |||
4278 | +++ debian/po/de.po 2012-06-23 00:59:17 +0000 | |||
4279 | @@ -15,8 +15,8 @@ | |||
4280 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4281 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4282 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4285 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4286 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4287 | 20 | 20 | ||
4288 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4289 | 22 | #. Description | 22 | #. Description |
4290 | 23 | 23 | ||
4291 | === modified file 'debian/po/en_AU.po' | |||
4292 | --- debian/po/en_AU.po 2012-03-21 02:22:11 +0000 | |||
4293 | +++ debian/po/en_AU.po 2012-06-23 00:59:17 +0000 | |||
4294 | @@ -15,8 +15,8 @@ | |||
4295 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4296 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4297 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4300 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4301 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4302 | 20 | 20 | ||
4303 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4304 | 22 | #. Description | 22 | #. Description |
4305 | 23 | 23 | ||
4306 | === modified file 'debian/po/en_GB.po' | |||
4307 | --- debian/po/en_GB.po 2012-03-21 02:22:11 +0000 | |||
4308 | +++ debian/po/en_GB.po 2012-06-23 00:59:17 +0000 | |||
4309 | @@ -15,8 +15,8 @@ | |||
4310 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4311 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4312 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4315 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4316 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4317 | 20 | 20 | ||
4318 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4319 | 22 | #. Description | 22 | #. Description |
4320 | 23 | 23 | ||
4321 | === modified file 'debian/po/es.po' | |||
4322 | --- debian/po/es.po 2012-04-11 17:20:37 +0000 | |||
4323 | +++ debian/po/es.po 2012-06-23 00:59:17 +0000 | |||
4324 | @@ -15,8 +15,8 @@ | |||
4325 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4326 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4327 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4330 | 18 | "X-Launchpad-Export-Date: 2012-04-07 04:33+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4331 | 19 | "X-Generator: Launchpad (build 15060)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4332 | 20 | 20 | ||
4333 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4334 | 22 | #. Description | 22 | #. Description |
4335 | @@ -75,8 +75,7 @@ | |||
4336 | 75 | #. Description | 75 | #. Description |
4337 | 76 | #: ../checkbox.templates:4001 | 76 | #: ../checkbox.templates:4001 |
4338 | 77 | msgid "List of jobs to run when testing with checkbox." | 77 | msgid "List of jobs to run when testing with checkbox." |
4341 | 78 | msgstr "" | 78 | msgstr "Lista de tareas a ejecutar mientras se realizan pruebas con checkbox." |
4340 | 79 | "Lista de tareas a ejecutar mientras se realizan pruebas con checkbox." | ||
4342 | 80 | 79 | ||
4343 | 81 | #. Type: string | 80 | #. Type: string |
4344 | 82 | #. Description | 81 | #. Description |
4345 | 83 | 82 | ||
4346 | === modified file 'debian/po/fr.po' | |||
4347 | --- debian/po/fr.po 2012-03-21 02:22:11 +0000 | |||
4348 | +++ debian/po/fr.po 2012-06-23 00:59:17 +0000 | |||
4349 | @@ -15,8 +15,8 @@ | |||
4350 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4351 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4352 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4355 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4356 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4357 | 20 | 20 | ||
4358 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4359 | 22 | #. Description | 22 | #. Description |
4360 | 23 | 23 | ||
4361 | === modified file 'debian/po/he.po' | |||
4362 | --- debian/po/he.po 2012-03-21 02:22:11 +0000 | |||
4363 | +++ debian/po/he.po 2012-06-23 00:59:17 +0000 | |||
4364 | @@ -15,8 +15,8 @@ | |||
4365 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4366 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4367 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4370 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4371 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4372 | 20 | 20 | ||
4373 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4374 | 22 | #. Description | 22 | #. Description |
4375 | 23 | 23 | ||
4376 | === modified file 'debian/po/hu.po' | |||
4377 | --- debian/po/hu.po 2012-03-21 02:22:11 +0000 | |||
4378 | +++ debian/po/hu.po 2012-06-23 00:59:17 +0000 | |||
4379 | @@ -15,8 +15,8 @@ | |||
4380 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4381 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4382 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4385 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4386 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4387 | 20 | 20 | ||
4388 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4389 | 22 | #. Description | 22 | #. Description |
4390 | 23 | 23 | ||
4391 | === modified file 'debian/po/it.po' | |||
4392 | --- debian/po/it.po 2012-03-21 02:22:11 +0000 | |||
4393 | +++ debian/po/it.po 2012-06-23 00:59:17 +0000 | |||
4394 | @@ -15,8 +15,8 @@ | |||
4395 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4396 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4397 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4400 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4401 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4402 | 20 | 20 | ||
4403 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4404 | 22 | #. Description | 22 | #. Description |
4405 | 23 | 23 | ||
4406 | === modified file 'debian/po/ja.po' | |||
4407 | --- debian/po/ja.po 2012-03-21 02:22:11 +0000 | |||
4408 | +++ debian/po/ja.po 2012-06-23 00:59:17 +0000 | |||
4409 | @@ -15,8 +15,8 @@ | |||
4410 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4411 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4412 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4415 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4416 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4417 | 20 | 20 | ||
4418 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4419 | 22 | #. Description | 22 | #. Description |
4420 | @@ -31,8 +31,9 @@ | |||
4421 | 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 " |
4422 | 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." |
4423 | 33 | msgstr "" | 33 | msgstr "" |
4426 | 34 | "このオプションが有効になっていると、テストに失敗した際にバグ報告を行うかどうか、checkboxが確認するようになります。これはapportが有効になって" | 34 | "このオプションが有効になっていると、テストに失敗した際にバグ報告を行うかどう" |
4427 | 35 | "いなくても機能します。" | 35 | "か、checkboxが確認するようになります。これはapportが有効になっていなくても機" |
4428 | 36 | "能します。" | ||
4429 | 36 | 37 | ||
4430 | 37 | #. Type: string | 38 | #. Type: string |
4431 | 38 | #. Description | 39 | #. Description |
4432 | @@ -46,7 +47,9 @@ | |||
4433 | 46 | msgid "" | 47 | msgid "" |
4434 | 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, " |
4435 | 48 | "the default package that the bug will be file against." | 49 | "the default package that the bug will be file against." |
4437 | 49 | msgstr "checkbox経由でバグ報告を行う場合、パッケージ名を推定できなかったときは、デフォルトのパッケージ名を用いて報告します。" | 50 | msgstr "" |
4438 | 51 | "checkbox経由でバグ報告を行う場合、パッケージ名を推定できなかったときは、デ" | ||
4439 | 52 | "フォルトのパッケージ名を用いて報告します。" | ||
4440 | 50 | 53 | ||
4441 | 51 | #. Type: string | 54 | #. Type: string |
4442 | 52 | #. Description | 55 | #. Description |
4443 | 53 | 56 | ||
4444 | === modified file 'debian/po/nl.po' | |||
4445 | --- debian/po/nl.po 2012-03-21 02:22:11 +0000 | |||
4446 | +++ debian/po/nl.po 2012-06-23 00:59:17 +0000 | |||
4447 | @@ -15,8 +15,8 @@ | |||
4448 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4449 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4450 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4453 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4454 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4455 | 20 | 20 | ||
4456 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4457 | 22 | #. Description | 22 | #. Description |
4458 | 23 | 23 | ||
4459 | === modified file 'debian/po/oc.po' | |||
4460 | --- debian/po/oc.po 2012-03-21 02:22:11 +0000 | |||
4461 | +++ debian/po/oc.po 2012-06-23 00:59:17 +0000 | |||
4462 | @@ -11,12 +11,12 @@ | |||
4463 | 11 | "PO-Revision-Date: 2012-02-24 07:45+0000\n" | 11 | "PO-Revision-Date: 2012-02-24 07:45+0000\n" |
4464 | 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" |
4465 | 13 | "Language-Team: Occitan (post 1500) <oc@li.org>\n" | 13 | "Language-Team: Occitan (post 1500) <oc@li.org>\n" |
4467 | 14 | "Language: oc\n" | 14 | "Language: \n" |
4468 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4469 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4470 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4473 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4474 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4475 | 20 | 20 | ||
4476 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4477 | 22 | #. Description | 22 | #. Description |
4478 | 23 | 23 | ||
4479 | === modified file 'debian/po/pl.po' | |||
4480 | --- debian/po/pl.po 2012-03-21 02:22:11 +0000 | |||
4481 | +++ debian/po/pl.po 2012-06-23 00:59:17 +0000 | |||
4482 | @@ -15,8 +15,8 @@ | |||
4483 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4484 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4485 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4488 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4489 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4490 | 20 | 20 | ||
4491 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4492 | 22 | #. Description | 22 | #. Description |
4493 | 23 | 23 | ||
4494 | === modified file 'debian/po/pt_BR.po' | |||
4495 | --- debian/po/pt_BR.po 2012-03-21 02:22:11 +0000 | |||
4496 | +++ debian/po/pt_BR.po 2012-06-23 00:59:17 +0000 | |||
4497 | @@ -8,15 +8,15 @@ | |||
4498 | 8 | "Project-Id-Version: checkbox\n" | 8 | "Project-Id-Version: checkbox\n" |
4499 | 9 | "Report-Msgid-Bugs-To: checkbox@packages.debian.org\n" | 9 | "Report-Msgid-Bugs-To: checkbox@packages.debian.org\n" |
4500 | 10 | "POT-Creation-Date: 2011-03-29 15:19+0200\n" | 10 | "POT-Creation-Date: 2011-03-29 15:19+0200\n" |
4503 | 11 | "PO-Revision-Date: 2011-09-16 19:04+0000\n" | 11 | "PO-Revision-Date: 2012-05-12 03:33+0000\n" |
4504 | 12 | "Last-Translator: André Gondim <Unknown>\n" | 12 | "Last-Translator: eniomarconcini <Unknown>\n" |
4505 | 13 | "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n" | 13 | "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n" |
4506 | 14 | "Language: pt_BR\n" | 14 | "Language: pt_BR\n" |
4507 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4508 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4509 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4512 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4513 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4514 | 20 | 20 | ||
4515 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4516 | 22 | #. Description | 22 | #. Description |
4517 | @@ -31,15 +31,15 @@ | |||
4518 | 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 " |
4519 | 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." |
4520 | 33 | msgstr "" | 33 | msgstr "" |
4524 | 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 " |
4525 | 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 " |
4526 | 36 | "não estiver habilitado." | 36 | "esteja habilitado." |
4527 | 37 | 37 | ||
4528 | 38 | #. Type: string | 38 | #. Type: string |
4529 | 39 | #. Description | 39 | #. Description |
4530 | 40 | #: ../checkbox.templates:2001 | 40 | #: ../checkbox.templates:2001 |
4531 | 41 | msgid "Default package to report bugs against:" | 41 | msgid "Default package to report bugs against:" |
4533 | 42 | msgstr "" | 42 | msgstr "Pacote padrão para relatar erros:" |
4534 | 43 | 43 | ||
4535 | 44 | #. Type: string | 44 | #. Type: string |
4536 | 45 | #. Description | 45 | #. Description |
4537 | @@ -48,42 +48,48 @@ | |||
4538 | 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, " |
4539 | 49 | "the default package that the bug will be file against." | 49 | "the default package that the bug will be file against." |
4540 | 50 | msgstr "" | 50 | msgstr "" |
4541 | 51 | "Quando estiver registrando um novo erro através do Checkbox, se ele não " | ||
4542 | 52 | "adivinhar o pacote, o pacote padrão do qual o erro será relatado." | ||
4543 | 51 | 53 | ||
4544 | 52 | #. Type: string | 54 | #. Type: string |
4545 | 53 | #. Description | 55 | #. Description |
4546 | 54 | #: ../checkbox.templates:3001 | 56 | #: ../checkbox.templates:3001 |
4547 | 55 | msgid "Test suite blacklist:" | 57 | msgid "Test suite blacklist:" |
4549 | 56 | msgstr "" | 58 | msgstr "Lista negra da suíte de testes:" |
4550 | 57 | 59 | ||
4551 | 58 | #. Type: string | 60 | #. Type: string |
4552 | 59 | #. Description | 61 | #. Description |
4553 | 60 | #: ../checkbox.templates:3001 | 62 | #: ../checkbox.templates:3001 |
4554 | 61 | msgid "List of job files to never run when testing with checkbox." | 63 | msgid "List of job files to never run when testing with checkbox." |
4555 | 62 | msgstr "" | 64 | msgstr "" |
4556 | 65 | "Lista de arquivos de trabalho para nunca serem executados quando estiver " | ||
4557 | 66 | "testando com checkbox." | ||
4558 | 63 | 67 | ||
4559 | 64 | #. Type: string | 68 | #. Type: string |
4560 | 65 | #. Description | 69 | #. Description |
4561 | 66 | #: ../checkbox.templates:4001 | 70 | #: ../checkbox.templates:4001 |
4562 | 67 | msgid "Test suite whitelist:" | 71 | msgid "Test suite whitelist:" |
4564 | 68 | msgstr "" | 72 | msgstr "Lista branca da suíte de testes:" |
4565 | 69 | 73 | ||
4566 | 70 | #. Type: string | 74 | #. Type: string |
4567 | 71 | #. Description | 75 | #. Description |
4568 | 72 | #: ../checkbox.templates:4001 | 76 | #: ../checkbox.templates:4001 |
4569 | 73 | msgid "List of jobs to run when testing with checkbox." | 77 | msgid "List of jobs to run when testing with checkbox." |
4570 | 74 | msgstr "" | 78 | msgstr "" |
4571 | 79 | "Lista de arquivos de trabalho para executar enquanto estiver testando com " | ||
4572 | 80 | "checkbox." | ||
4573 | 75 | 81 | ||
4574 | 76 | #. Type: string | 82 | #. Type: string |
4575 | 77 | #. Description | 83 | #. Description |
4576 | 78 | #: ../checkbox.templates:5001 | 84 | #: ../checkbox.templates:5001 |
4577 | 79 | msgid "Transport URL:" | 85 | msgid "Transport URL:" |
4579 | 80 | msgstr "" | 86 | msgstr "Transportar URL:" |
4580 | 81 | 87 | ||
4581 | 82 | #. Type: string | 88 | #. Type: string |
4582 | 83 | #. Description | 89 | #. Description |
4583 | 84 | #: ../checkbox.templates:5001 | 90 | #: ../checkbox.templates:5001 |
4584 | 85 | msgid "URL where to send submissions." | 91 | msgid "URL where to send submissions." |
4586 | 86 | msgstr "URL para enviar submissões" | 92 | msgstr "URL para enviar relatórios." |
4587 | 87 | 93 | ||
4588 | 88 | #. Type: string | 94 | #. Type: string |
4589 | 89 | #. Description | 95 | #. Description |
4590 | @@ -95,7 +101,7 @@ | |||
4591 | 95 | #. Description | 101 | #. Description |
4592 | 96 | #: ../checkbox.templates:6001 | 102 | #: ../checkbox.templates:6001 |
4593 | 97 | msgid "E-mail address used to sign in to Launchpad." | 103 | msgid "E-mail address used to sign in to Launchpad." |
4595 | 98 | msgstr "" | 104 | msgstr "Endereço de e-mail usado para entrar no Launchpad." |
4596 | 99 | 105 | ||
4597 | 100 | #. Type: string | 106 | #. Type: string |
4598 | 101 | #. Description | 107 | #. Description |
4599 | @@ -107,16 +113,16 @@ | |||
4600 | 107 | #. Description | 113 | #. Description |
4601 | 108 | #: ../checkbox.templates:7001 | 114 | #: ../checkbox.templates:7001 |
4602 | 109 | msgid "HTTP proxy to use instead of the one specified in environment." | 115 | msgid "HTTP proxy to use instead of the one specified in environment." |
4604 | 110 | msgstr "" | 116 | msgstr "Proxy HTTP para usar em vez do especificado pelo ambiente." |
4605 | 111 | 117 | ||
4606 | 112 | #. Type: string | 118 | #. Type: string |
4607 | 113 | #. Description | 119 | #. Description |
4608 | 114 | #: ../checkbox.templates:8001 | 120 | #: ../checkbox.templates:8001 |
4609 | 115 | msgid "HTTPS Proxy:" | 121 | msgid "HTTPS Proxy:" |
4611 | 116 | msgstr "HTTPS Proxy:" | 122 | msgstr "Proxy HTTPS:" |
4612 | 117 | 123 | ||
4613 | 118 | #. Type: string | 124 | #. Type: string |
4614 | 119 | #. Description | 125 | #. Description |
4615 | 120 | #: ../checkbox.templates:8001 | 126 | #: ../checkbox.templates:8001 |
4616 | 121 | msgid "HTTPS proxy to use instead of the one specified in environment." | 127 | msgid "HTTPS proxy to use instead of the one specified in environment." |
4618 | 122 | msgstr "" | 128 | msgstr "Proxy HTTPS para usar em vez do especificado pelo ambiente." |
4619 | 123 | 129 | ||
4620 | === modified file 'debian/po/ro.po' | |||
4621 | --- debian/po/ro.po 2012-03-21 02:22:11 +0000 | |||
4622 | +++ debian/po/ro.po 2012-06-23 00:59:17 +0000 | |||
4623 | @@ -15,8 +15,8 @@ | |||
4624 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4625 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4626 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4629 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4630 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4631 | 20 | 20 | ||
4632 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4633 | 22 | #. Description | 22 | #. Description |
4634 | 23 | 23 | ||
4635 | === modified file 'debian/po/ru.po' | |||
4636 | --- debian/po/ru.po 2012-03-21 02:22:11 +0000 | |||
4637 | +++ debian/po/ru.po 2012-06-23 00:59:17 +0000 | |||
4638 | @@ -15,8 +15,8 @@ | |||
4639 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4640 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4641 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4644 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4645 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4646 | 20 | 20 | ||
4647 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4648 | 22 | #. Description | 22 | #. Description |
4649 | 23 | 23 | ||
4650 | === added file 'debian/po/tr.po' | |||
4651 | --- debian/po/tr.po 1970-01-01 00:00:00 +0000 | |||
4652 | +++ debian/po/tr.po 2012-06-23 00:59:17 +0000 | |||
4653 | @@ -0,0 +1,119 @@ | |||
4654 | 1 | # Turkish translation for checkbox | ||
4655 | 2 | # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 | ||
4656 | 3 | # This file is distributed under the same license as the checkbox package. | ||
4657 | 4 | # FIRST AUTHOR <EMAIL@ADDRESS>, 2012. | ||
4658 | 5 | # | ||
4659 | 6 | msgid "" | ||
4660 | 7 | msgstr "" | ||
4661 | 8 | "Project-Id-Version: checkbox\n" | ||
4662 | 9 | "Report-Msgid-Bugs-To: checkbox@packages.debian.org\n" | ||
4663 | 10 | "POT-Creation-Date: 2011-03-29 15:19+0200\n" | ||
4664 | 11 | "PO-Revision-Date: 2012-05-18 12:51+0000\n" | ||
4665 | 12 | "Last-Translator: Hasan Yılmaz <iletisim@hasanyilmaz.net>\n" | ||
4666 | 13 | "Language-Team: Turkish <tr@li.org>\n" | ||
4667 | 14 | "Language: tr\n" | ||
4668 | 15 | "MIME-Version: 1.0\n" | ||
4669 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | ||
4670 | 17 | "Content-Transfer-Encoding: 8bit\n" | ||
4671 | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" | ||
4672 | 19 | "X-Generator: Launchpad (build 15316)\n" | ||
4673 | 20 | |||
4674 | 21 | #. Type: boolean | ||
4675 | 22 | #. Description | ||
4676 | 23 | #: ../checkbox.templates:1001 | ||
4677 | 24 | msgid "Enable bug reporting by default? " | ||
4678 | 25 | msgstr "" | ||
4679 | 26 | |||
4680 | 27 | #. Type: boolean | ||
4681 | 28 | #. Description | ||
4682 | 29 | #: ../checkbox.templates:1001 | ||
4683 | 30 | msgid "" | ||
4684 | 31 | "If this option is set to Yes, then checkbox will ask if the user wants to " | ||
4685 | 32 | "file a bug for failing tests, even if apport is not enabled." | ||
4686 | 33 | msgstr "" | ||
4687 | 34 | |||
4688 | 35 | #. Type: string | ||
4689 | 36 | #. Description | ||
4690 | 37 | #: ../checkbox.templates:2001 | ||
4691 | 38 | msgid "Default package to report bugs against:" | ||
4692 | 39 | msgstr "" | ||
4693 | 40 | |||
4694 | 41 | #. Type: string | ||
4695 | 42 | #. Description | ||
4696 | 43 | #: ../checkbox.templates:2001 | ||
4697 | 44 | msgid "" | ||
4698 | 45 | "When filing a new bug through checkbox, if it does not guess the package, " | ||
4699 | 46 | "the default package that the bug will be file against." | ||
4700 | 47 | msgstr "" | ||
4701 | 48 | |||
4702 | 49 | #. Type: string | ||
4703 | 50 | #. Description | ||
4704 | 51 | #: ../checkbox.templates:3001 | ||
4705 | 52 | msgid "Test suite blacklist:" | ||
4706 | 53 | msgstr "" | ||
4707 | 54 | |||
4708 | 55 | #. Type: string | ||
4709 | 56 | #. Description | ||
4710 | 57 | #: ../checkbox.templates:3001 | ||
4711 | 58 | msgid "List of job files to never run when testing with checkbox." | ||
4712 | 59 | msgstr "" | ||
4713 | 60 | |||
4714 | 61 | #. Type: string | ||
4715 | 62 | #. Description | ||
4716 | 63 | #: ../checkbox.templates:4001 | ||
4717 | 64 | msgid "Test suite whitelist:" | ||
4718 | 65 | msgstr "" | ||
4719 | 66 | |||
4720 | 67 | #. Type: string | ||
4721 | 68 | #. Description | ||
4722 | 69 | #: ../checkbox.templates:4001 | ||
4723 | 70 | msgid "List of jobs to run when testing with checkbox." | ||
4724 | 71 | msgstr "" | ||
4725 | 72 | |||
4726 | 73 | #. Type: string | ||
4727 | 74 | #. Description | ||
4728 | 75 | #: ../checkbox.templates:5001 | ||
4729 | 76 | msgid "Transport URL:" | ||
4730 | 77 | msgstr "" | ||
4731 | 78 | |||
4732 | 79 | #. Type: string | ||
4733 | 80 | #. Description | ||
4734 | 81 | #: ../checkbox.templates:5001 | ||
4735 | 82 | msgid "URL where to send submissions." | ||
4736 | 83 | msgstr "" | ||
4737 | 84 | |||
4738 | 85 | #. Type: string | ||
4739 | 86 | #. Description | ||
4740 | 87 | #: ../checkbox.templates:6001 | ||
4741 | 88 | msgid "Launchpad E-mail:" | ||
4742 | 89 | msgstr "Launchpad E-posta:" | ||
4743 | 90 | |||
4744 | 91 | #. Type: string | ||
4745 | 92 | #. Description | ||
4746 | 93 | #: ../checkbox.templates:6001 | ||
4747 | 94 | msgid "E-mail address used to sign in to Launchpad." | ||
4748 | 95 | msgstr "" | ||
4749 | 96 | |||
4750 | 97 | #. Type: string | ||
4751 | 98 | #. Description | ||
4752 | 99 | #: ../checkbox.templates:7001 | ||
4753 | 100 | msgid "HTTP Proxy:" | ||
4754 | 101 | msgstr "" | ||
4755 | 102 | |||
4756 | 103 | #. Type: string | ||
4757 | 104 | #. Description | ||
4758 | 105 | #: ../checkbox.templates:7001 | ||
4759 | 106 | msgid "HTTP proxy to use instead of the one specified in environment." | ||
4760 | 107 | msgstr "" | ||
4761 | 108 | |||
4762 | 109 | #. Type: string | ||
4763 | 110 | #. Description | ||
4764 | 111 | #: ../checkbox.templates:8001 | ||
4765 | 112 | msgid "HTTPS Proxy:" | ||
4766 | 113 | msgstr "" | ||
4767 | 114 | |||
4768 | 115 | #. Type: string | ||
4769 | 116 | #. Description | ||
4770 | 117 | #: ../checkbox.templates:8001 | ||
4771 | 118 | msgid "HTTPS proxy to use instead of the one specified in environment." | ||
4772 | 119 | msgstr "" | ||
4773 | 0 | 120 | ||
4774 | === modified file 'debian/po/uk.po' | |||
4775 | --- debian/po/uk.po 2012-03-21 02:22:11 +0000 | |||
4776 | +++ debian/po/uk.po 2012-06-23 00:59:17 +0000 | |||
4777 | @@ -15,8 +15,8 @@ | |||
4778 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4779 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4780 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4783 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4784 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4785 | 20 | 20 | ||
4786 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4787 | 22 | #. Description | 22 | #. Description |
4788 | 23 | 23 | ||
4789 | === added file 'debian/po/zh_CN.po' | |||
4790 | --- debian/po/zh_CN.po 1970-01-01 00:00:00 +0000 | |||
4791 | +++ debian/po/zh_CN.po 2012-06-23 00:59:17 +0000 | |||
4792 | @@ -0,0 +1,119 @@ | |||
4793 | 1 | # Chinese (Simplified) translation for checkbox | ||
4794 | 2 | # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 | ||
4795 | 3 | # This file is distributed under the same license as the checkbox package. | ||
4796 | 4 | # FIRST AUTHOR <EMAIL@ADDRESS>, 2012. | ||
4797 | 5 | # | ||
4798 | 6 | msgid "" | ||
4799 | 7 | msgstr "" | ||
4800 | 8 | "Project-Id-Version: checkbox\n" | ||
4801 | 9 | "Report-Msgid-Bugs-To: checkbox@packages.debian.org\n" | ||
4802 | 10 | "POT-Creation-Date: 2011-03-29 15:19+0200\n" | ||
4803 | 11 | "PO-Revision-Date: 2012-05-09 02:09+0000\n" | ||
4804 | 12 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||
4805 | 13 | "Language-Team: Chinese (Simplified) <zh_CN@li.org>\n" | ||
4806 | 14 | "Language: \n" | ||
4807 | 15 | "MIME-Version: 1.0\n" | ||
4808 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | ||
4809 | 17 | "Content-Transfer-Encoding: 8bit\n" | ||
4810 | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" | ||
4811 | 19 | "X-Generator: Launchpad (build 15316)\n" | ||
4812 | 20 | |||
4813 | 21 | #. Type: boolean | ||
4814 | 22 | #. Description | ||
4815 | 23 | #: ../checkbox.templates:1001 | ||
4816 | 24 | msgid "Enable bug reporting by default? " | ||
4817 | 25 | msgstr "" | ||
4818 | 26 | |||
4819 | 27 | #. Type: boolean | ||
4820 | 28 | #. Description | ||
4821 | 29 | #: ../checkbox.templates:1001 | ||
4822 | 30 | msgid "" | ||
4823 | 31 | "If this option is set to Yes, then checkbox will ask if the user wants to " | ||
4824 | 32 | "file a bug for failing tests, even if apport is not enabled." | ||
4825 | 33 | msgstr "" | ||
4826 | 34 | |||
4827 | 35 | #. Type: string | ||
4828 | 36 | #. Description | ||
4829 | 37 | #: ../checkbox.templates:2001 | ||
4830 | 38 | msgid "Default package to report bugs against:" | ||
4831 | 39 | msgstr "" | ||
4832 | 40 | |||
4833 | 41 | #. Type: string | ||
4834 | 42 | #. Description | ||
4835 | 43 | #: ../checkbox.templates:2001 | ||
4836 | 44 | msgid "" | ||
4837 | 45 | "When filing a new bug through checkbox, if it does not guess the package, " | ||
4838 | 46 | "the default package that the bug will be file against." | ||
4839 | 47 | msgstr "" | ||
4840 | 48 | |||
4841 | 49 | #. Type: string | ||
4842 | 50 | #. Description | ||
4843 | 51 | #: ../checkbox.templates:3001 | ||
4844 | 52 | msgid "Test suite blacklist:" | ||
4845 | 53 | msgstr "" | ||
4846 | 54 | |||
4847 | 55 | #. Type: string | ||
4848 | 56 | #. Description | ||
4849 | 57 | #: ../checkbox.templates:3001 | ||
4850 | 58 | msgid "List of job files to never run when testing with checkbox." | ||
4851 | 59 | msgstr "" | ||
4852 | 60 | |||
4853 | 61 | #. Type: string | ||
4854 | 62 | #. Description | ||
4855 | 63 | #: ../checkbox.templates:4001 | ||
4856 | 64 | msgid "Test suite whitelist:" | ||
4857 | 65 | msgstr "" | ||
4858 | 66 | |||
4859 | 67 | #. Type: string | ||
4860 | 68 | #. Description | ||
4861 | 69 | #: ../checkbox.templates:4001 | ||
4862 | 70 | msgid "List of jobs to run when testing with checkbox." | ||
4863 | 71 | msgstr "" | ||
4864 | 72 | |||
4865 | 73 | #. Type: string | ||
4866 | 74 | #. Description | ||
4867 | 75 | #: ../checkbox.templates:5001 | ||
4868 | 76 | msgid "Transport URL:" | ||
4869 | 77 | msgstr "" | ||
4870 | 78 | |||
4871 | 79 | #. Type: string | ||
4872 | 80 | #. Description | ||
4873 | 81 | #: ../checkbox.templates:5001 | ||
4874 | 82 | msgid "URL where to send submissions." | ||
4875 | 83 | msgstr "" | ||
4876 | 84 | |||
4877 | 85 | #. Type: string | ||
4878 | 86 | #. Description | ||
4879 | 87 | #: ../checkbox.templates:6001 | ||
4880 | 88 | msgid "Launchpad E-mail:" | ||
4881 | 89 | msgstr "" | ||
4882 | 90 | |||
4883 | 91 | #. Type: string | ||
4884 | 92 | #. Description | ||
4885 | 93 | #: ../checkbox.templates:6001 | ||
4886 | 94 | msgid "E-mail address used to sign in to Launchpad." | ||
4887 | 95 | msgstr "" | ||
4888 | 96 | |||
4889 | 97 | #. Type: string | ||
4890 | 98 | #. Description | ||
4891 | 99 | #: ../checkbox.templates:7001 | ||
4892 | 100 | msgid "HTTP Proxy:" | ||
4893 | 101 | msgstr "" | ||
4894 | 102 | |||
4895 | 103 | #. Type: string | ||
4896 | 104 | #. Description | ||
4897 | 105 | #: ../checkbox.templates:7001 | ||
4898 | 106 | msgid "HTTP proxy to use instead of the one specified in environment." | ||
4899 | 107 | msgstr "" | ||
4900 | 108 | |||
4901 | 109 | #. Type: string | ||
4902 | 110 | #. Description | ||
4903 | 111 | #: ../checkbox.templates:8001 | ||
4904 | 112 | msgid "HTTPS Proxy:" | ||
4905 | 113 | msgstr "" | ||
4906 | 114 | |||
4907 | 115 | #. Type: string | ||
4908 | 116 | #. Description | ||
4909 | 117 | #: ../checkbox.templates:8001 | ||
4910 | 118 | msgid "HTTPS proxy to use instead of the one specified in environment." | ||
4911 | 119 | msgstr "" | ||
4912 | 0 | 120 | ||
4913 | === modified file 'debian/po/zh_TW.po' | |||
4914 | --- debian/po/zh_TW.po 2012-03-21 02:22:11 +0000 | |||
4915 | +++ debian/po/zh_TW.po 2012-06-23 00:59:17 +0000 | |||
4916 | @@ -15,8 +15,8 @@ | |||
4917 | 15 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
4918 | 16 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
4919 | 17 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
4922 | 18 | "X-Launchpad-Export-Date: 2012-03-15 04:35+0000\n" | 18 | "X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4923 | 19 | "X-Generator: Launchpad (build 14933)\n" | 19 | "X-Generator: Launchpad (build 15316)\n" |
4924 | 20 | 20 | ||
4925 | 21 | #. Type: boolean | 21 | #. Type: boolean |
4926 | 22 | #. Description | 22 | #. Description |
4927 | @@ -30,7 +30,9 @@ | |||
4928 | 30 | msgid "" | 30 | msgid "" |
4929 | 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 " |
4930 | 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." |
4932 | 33 | msgstr "若這個選項設為「是」,checkbox 會詢問使用者是否要不管 apport 有沒有啟用,都提交失敗測試的臭蟲回報。" | 33 | msgstr "" |
4933 | 34 | "若這個選項設為「是」,checkbox 會詢問使用者是否要不管 apport 有沒有啟用,都提" | ||
4934 | 35 | "交失敗測試的臭蟲回報。" | ||
4935 | 34 | 36 | ||
4936 | 35 | #. Type: string | 37 | #. Type: string |
4937 | 36 | #. Description | 38 | #. Description |
4938 | 37 | 39 | ||
4939 | === modified file 'debian/rules' | |||
4940 | --- debian/rules 2012-02-15 00:11:21 +0000 | |||
4941 | +++ debian/rules 2012-06-23 00:59:17 +0000 | |||
4942 | @@ -1,11 +1,18 @@ | |||
4943 | 1 | #!/usr/bin/make -f | 1 | #!/usr/bin/make -f |
4944 | 2 | 2 | ||
4945 | 3 | %: | 3 | %: |
4947 | 4 | dh "$@" --with translations,python2 | 4 | dh "$@" --with translations,python3 |
4948 | 5 | 5 | ||
4949 | 6 | override_dh_auto_build: | 6 | override_dh_auto_build: |
4950 | 7 | (cd qt/frontend; qmake-qt4; make) | 7 | (cd qt/frontend; qmake-qt4; make) |
4952 | 8 | dh_auto_build | 8 | set -ex; for python in $(shell py3versions -r); do \ |
4953 | 9 | $$python setup.py build; \ | ||
4954 | 10 | done; | ||
4955 | 11 | |||
4956 | 12 | override_dh_auto_install: | ||
4957 | 13 | set -ex; for python in $(shell py3versions -r); do \ | ||
4958 | 14 | $$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \ | ||
4959 | 15 | done; | ||
4960 | 9 | 16 | ||
4961 | 10 | override_dh_installdeb: | 17 | override_dh_installdeb: |
4962 | 11 | cp debian/checkbox.postrm debian/checkbox-cli.postrm | 18 | cp debian/checkbox.postrm debian/checkbox-cli.postrm |
4963 | 12 | 19 | ||
4964 | === modified file 'examples/checkbox-qt.ini' | |||
4965 | --- examples/checkbox-qt.ini 2012-02-15 00:11:21 +0000 | |||
4966 | +++ examples/checkbox-qt.ini 2012-06-23 00:59:17 +0000 | |||
4967 | @@ -12,5 +12,5 @@ | |||
4968 | 12 | # Class implementing the UserInterface interface. | 12 | # Class implementing the UserInterface interface. |
4969 | 13 | interface_class = QTInterface | 13 | interface_class = QTInterface |
4970 | 14 | 14 | ||
4972 | 15 | # Path where GTK files are stored. | 15 | # Path where qt files are stored. |
4973 | 16 | data_path = %(checkbox_share)s/qt | 16 | data_path = %(checkbox_share)s/qt |
4974 | 17 | 17 | ||
4975 | === modified file 'examples/checkbox.ini' | |||
4976 | --- examples/checkbox.ini 2011-11-18 12:46:21 +0000 | |||
4977 | +++ examples/checkbox.ini 2012-06-23 00:59:17 +0000 | |||
4978 | @@ -21,6 +21,4 @@ | |||
4979 | 21 | 21 | ||
4980 | 22 | [checkbox/plugins/jobs_info] | 22 | [checkbox/plugins/jobs_info] |
4981 | 23 | 23 | ||
4985 | 24 | # Blacklist of jobs that are potentially dangerous | 24 | # Required section so that checkbox.application can match .*/jobs_info/.* |
4983 | 25 | blacklist = autotest/full_suite ltp phoronix qa-regression-testing | ||
4984 | 26 | clone06.1 ioctl03.1 lchown02.* swapon03.1 | ||
4986 | 27 | 25 | ||
4987 | === modified file 'gtk/checkbox-gtk.ui' | |||
4988 | --- gtk/checkbox-gtk.ui 2011-11-18 12:46:21 +0000 | |||
4989 | +++ gtk/checkbox-gtk.ui 2012-06-23 00:59:17 +0000 | |||
4990 | @@ -165,10 +165,22 @@ | |||
4991 | 165 | </packing> | 165 | </packing> |
4992 | 166 | </child> | 166 | </child> |
4993 | 167 | <child> | 167 | <child> |
4995 | 168 | <object class="GtkHButtonBox" id="hbuttonbox_test"> | 168 | <object class="GtkBox" id="hbuttonbox_test"> |
4996 | 169 | <property name="visible">True</property> | 169 | <property name="visible">True</property> |
4997 | 170 | <property name="layout_style">end</property> | 170 | <property name="layout_style">end</property> |
4998 | 171 | <child> | 171 | <child> |
4999 | 172 | <object class="GtkProgressBar" id="progressbar_test"> | ||
5000 | 173 | <property name="visible">True</property> |
The diff has been truncated for viewing.