Merge lp:~ralsina/ubuntuone-windows-installer/fix_800383 into lp:ubuntuone-windows-installer
- fix_800383
- Merge into trunk
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Roberto Alsina | ||||
Approved revision: | 30 | ||||
Merged at revision: | 7 | ||||
Proposed branch: | lp:~ralsina/ubuntuone-windows-installer/fix_800383 | ||||
Merge into: | lp:ubuntuone-windows-installer | ||||
Diff against target: |
827 lines (+674/-21) 10 files modified
data/qt/congratulations.ui (+103/-0) pylintrc (+305/-0) run-tests (+1/-1) ubuntuone_installer/__init__.py (+1/-1) ubuntuone_installer/gui/qt/__init__.py (+0/-1) ubuntuone_installer/gui/qt/gui.py (+52/-18) ubuntuone_installer/gui/qt/tests/__init__.py (+68/-0) ubuntuone_installer/gui/qt/tests/test_gui.py (+61/-0) ubuntuone_installer/gui/tests/__init__.py (+45/-0) ubuntuone_installer/tests/__init__.py (+38/-0) |
||||
To merge this branch: | bzr merge lp:~ralsina/ubuntuone-windows-installer/fix_800383 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
dobey (community) | Approve | ||
Natalia Bidart (community) | Approve | ||
Review via email: mp+65416@code.launchpad.net |
Commit message
Beginning of the implementation of the congratulations page.
Description of the change
Beginning of the implementation of this page.
Even after this branch lands:
* Need correct artwork from design
* The optional "syncing" message depends on a previous page
To test (on Linux):
PYTHONPATH=. python bin/ubuntuone-
You should have two pages on the wizard.
The "Open Ubuntu One Dashboard" button on the final page should open the control panel.
Natalia Bidart (nataliabidart) wrote : | # |
I'm marking this as needs fixing so we have can have at least a minimal test suite for this widgets that are now starting to have some logic.
Thanks!
- 12. By Roberto Alsina
-
style fixes
- 13. By Roberto Alsina
-
Basic testing stuff copied from control panel, with 4 tests which fail
- 14. By Roberto Alsina
-
The main UI is not loaded using loadUI
- 15. By Roberto Alsina
-
Re-add some things that should not have been removed
- 16. By Roberto Alsina
-
closer to making testing itself work
- 17. By Roberto Alsina
-
use done() instead of closeEvent()
- 18. By Roberto Alsina
-
This is as far as I managed to monkeypatch, and I have a problem. I will ask for help now.
- 19. By Roberto Alsina
-
Make tests work using the reactor as mandel said
- 20. By Roberto Alsina
-
style fixes
- 21. By Roberto Alsina
-
Don't start the control panel on the tests
- 22. By Roberto Alsina
-
whitespace fixes, pylintrc
- 23. By Roberto Alsina
-
added tests for the 'start control panel' logic
- 24. By Roberto Alsina
-
add build step to run-tests
- 25. By Roberto Alsina
-
Style fix
- 26. By Roberto Alsina
-
use .ui instead of .page_ui for consistency
- 27. By Roberto Alsina
-
changed method name to be PEP8-alike
- 28. By Roberto Alsina
-
style issues
- 29. By Roberto Alsina
-
Make it more like control panel's
Natalia Bidart (nataliabidart) : | # |
- 30. By Roberto Alsina
-
switch t the -qt version of control panel
dobey (dobey) : | # |
Preview Diff
1 | === added file 'data/qt/congratulations.ui' | |||
2 | --- data/qt/congratulations.ui 1970-01-01 00:00:00 +0000 | |||
3 | +++ data/qt/congratulations.ui 2011-06-22 14:18:49 +0000 | |||
4 | @@ -0,0 +1,103 @@ | |||
5 | 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
6 | 2 | <ui version="4.0"> | ||
7 | 3 | <class>Form</class> | ||
8 | 4 | <widget class="QWidget" name="Form"> | ||
9 | 5 | <property name="geometry"> | ||
10 | 6 | <rect> | ||
11 | 7 | <x>0</x> | ||
12 | 8 | <y>0</y> | ||
13 | 9 | <width>426</width> | ||
14 | 10 | <height>387</height> | ||
15 | 11 | </rect> | ||
16 | 12 | </property> | ||
17 | 13 | <property name="windowTitle"> | ||
18 | 14 | <string>Form</string> | ||
19 | 15 | </property> | ||
20 | 16 | <layout class="QVBoxLayout" name="verticalLayout_2"> | ||
21 | 17 | <property name="spacing"> | ||
22 | 18 | <number>24</number> | ||
23 | 19 | </property> | ||
24 | 20 | <item> | ||
25 | 21 | <widget class="QLabel" name="label"> | ||
26 | 22 | <property name="font"> | ||
27 | 23 | <font> | ||
28 | 24 | <pointsize>14</pointsize> | ||
29 | 25 | <weight>75</weight> | ||
30 | 26 | <bold>true</bold> | ||
31 | 27 | </font> | ||
32 | 28 | </property> | ||
33 | 29 | <property name="text"> | ||
34 | 30 | <string>Congratulation!</string> | ||
35 | 31 | </property> | ||
36 | 32 | </widget> | ||
37 | 33 | </item> | ||
38 | 34 | <item> | ||
39 | 35 | <widget class="QLabel" name="label_2"> | ||
40 | 36 | <property name="text"> | ||
41 | 37 | <string>Nice picture goes here</string> | ||
42 | 38 | </property> | ||
43 | 39 | </widget> | ||
44 | 40 | </item> | ||
45 | 41 | <item> | ||
46 | 42 | <widget class="QLabel" name="label_3"> | ||
47 | 43 | <property name="text"> | ||
48 | 44 | <string>Ubuntu One is installed, set up and is ready to go!</string> | ||
49 | 45 | </property> | ||
50 | 46 | </widget> | ||
51 | 47 | </item> | ||
52 | 48 | <item> | ||
53 | 49 | <layout class="QHBoxLayout" name="horizontalLayout"> | ||
54 | 50 | <item> | ||
55 | 51 | <widget class="QLabel" name="label_4"> | ||
56 | 52 | <property name="text"> | ||
57 | 53 | <string>IMAGE GOES HERE?</string> | ||
58 | 54 | </property> | ||
59 | 55 | </widget> | ||
60 | 56 | </item> | ||
61 | 57 | <item> | ||
62 | 58 | <layout class="QVBoxLayout" name="verticalLayout"> | ||
63 | 59 | <item> | ||
64 | 60 | <widget class="QLabel" name="label_5"> | ||
65 | 61 | <property name="font"> | ||
66 | 62 | <font> | ||
67 | 63 | <weight>75</weight> | ||
68 | 64 | <bold>true</bold> | ||
69 | 65 | </font> | ||
70 | 66 | </property> | ||
71 | 67 | <property name="text"> | ||
72 | 68 | <string>Sync in progress...</string> | ||
73 | 69 | </property> | ||
74 | 70 | </widget> | ||
75 | 71 | </item> | ||
76 | 72 | <item> | ||
77 | 73 | <widget class="QLabel" name="label_6"> | ||
78 | 74 | <property name="text"> | ||
79 | 75 | <string>Your folders have started to sync in the background, launch the dahboard to get more information about the sync in progress</string> | ||
80 | 76 | </property> | ||
81 | 77 | <property name="wordWrap"> | ||
82 | 78 | <bool>true</bool> | ||
83 | 79 | </property> | ||
84 | 80 | </widget> | ||
85 | 81 | </item> | ||
86 | 82 | </layout> | ||
87 | 83 | </item> | ||
88 | 84 | </layout> | ||
89 | 85 | </item> | ||
90 | 86 | <item> | ||
91 | 87 | <spacer name="verticalSpacer"> | ||
92 | 88 | <property name="orientation"> | ||
93 | 89 | <enum>Qt::Vertical</enum> | ||
94 | 90 | </property> | ||
95 | 91 | <property name="sizeHint" stdset="0"> | ||
96 | 92 | <size> | ||
97 | 93 | <width>20</width> | ||
98 | 94 | <height>40</height> | ||
99 | 95 | </size> | ||
100 | 96 | </property> | ||
101 | 97 | </spacer> | ||
102 | 98 | </item> | ||
103 | 99 | </layout> | ||
104 | 100 | </widget> | ||
105 | 101 | <resources/> | ||
106 | 102 | <connections/> | ||
107 | 103 | </ui> | ||
108 | 0 | 104 | ||
109 | === added file 'pylintrc' | |||
110 | --- pylintrc 1970-01-01 00:00:00 +0000 | |||
111 | +++ pylintrc 2011-06-22 14:18:49 +0000 | |||
112 | @@ -0,0 +1,305 @@ | |||
113 | 1 | # lint Python modules using external checkers. | ||
114 | 2 | # | ||
115 | 3 | # This is the main checker controlling the other ones and the reports | ||
116 | 4 | # generation. It is itself both a raw checker and an astng checker in order | ||
117 | 5 | # to: | ||
118 | 6 | # * handle message activation / deactivation at the module level | ||
119 | 7 | # * handle some basic but necessary stats'data (number of classes, methods...) | ||
120 | 8 | # | ||
121 | 9 | [MASTER] | ||
122 | 10 | |||
123 | 11 | # Specify a configuration file. | ||
124 | 12 | #rcfile= | ||
125 | 13 | |||
126 | 14 | # Python code to execute, usually for sys.path manipulation such as | ||
127 | 15 | # pygtk.require(). | ||
128 | 16 | #init-hook= | ||
129 | 17 | |||
130 | 18 | # Profiled execution. | ||
131 | 19 | profile=no | ||
132 | 20 | |||
133 | 21 | # Add <file or directory> to the black list. It should be a base name, not a | ||
134 | 22 | # path. You may set this option multiple times. | ||
135 | 23 | ignore=ui,qtreactor | ||
136 | 24 | |||
137 | 25 | # Pickle collected data for later comparisons. | ||
138 | 26 | persistent=no | ||
139 | 27 | |||
140 | 28 | # List of plugins (as comma separated values of python modules names) to load, | ||
141 | 29 | # usually to register additional checkers. | ||
142 | 30 | load-plugins= | ||
143 | 31 | |||
144 | 32 | |||
145 | 33 | [MESSAGES CONTROL] | ||
146 | 34 | |||
147 | 35 | # Enable only checker(s) with the given id(s). This option conflicts with the | ||
148 | 36 | # disable-checker option | ||
149 | 37 | #enable-checker= | ||
150 | 38 | |||
151 | 39 | # Enable all checker(s) except those with the given id(s). This option | ||
152 | 40 | # conflicts with the enable-checker option | ||
153 | 41 | #disable-checker= | ||
154 | 42 | |||
155 | 43 | # Enable all messages in the listed categories. | ||
156 | 44 | #enable-cat= | ||
157 | 45 | |||
158 | 46 | # Disable all messages in the listed categories. | ||
159 | 47 | #disable-cat= | ||
160 | 48 | |||
161 | 49 | # Disable the message(s) with the given id(s) or categories | ||
162 | 50 | # W0142: Used * or ** magic | ||
163 | 51 | # W0613: Unused argument 'yyy' | ||
164 | 52 | disable=R,I,W0142,W0613,W0511 | ||
165 | 53 | |||
166 | 54 | |||
167 | 55 | [REPORTS] | ||
168 | 56 | |||
169 | 57 | # Set the output format. Available formats are text, parseable, colorized, msvs | ||
170 | 58 | # (visual studio) and html | ||
171 | 59 | output-format=colorized | ||
172 | 60 | |||
173 | 61 | # Include message's id in output | ||
174 | 62 | include-ids=yes | ||
175 | 63 | |||
176 | 64 | # Put messages in a separate file for each module / package specified on the | ||
177 | 65 | # command line instead of printing them on stdout. Reports (if any) will be | ||
178 | 66 | # written in a file name "pylint_global.[txt|html]". | ||
179 | 67 | files-output=no | ||
180 | 68 | |||
181 | 69 | # Tells whether to display a full report or only the messages | ||
182 | 70 | reports=no | ||
183 | 71 | |||
184 | 72 | # Python expression which should return a note less than 10 (10 is the highest | ||
185 | 73 | # note). You have access to the variables errors warning, statement which | ||
186 | 74 | # respectively contain the number of errors / warnings messages and the total | ||
187 | 75 | # number of statements analyzed. This is used by the global evaluation report | ||
188 | 76 | # (R0004). | ||
189 | 77 | evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) | ||
190 | 78 | |||
191 | 79 | # Add a comment according to your evaluation note. This is used by the global | ||
192 | 80 | # evaluation report (R0004). | ||
193 | 81 | comment=no | ||
194 | 82 | |||
195 | 83 | # Enable the report(s) with the given id(s). | ||
196 | 84 | #enable-report= | ||
197 | 85 | |||
198 | 86 | # Disable the report(s) with the given id(s). | ||
199 | 87 | #disable-report= | ||
200 | 88 | |||
201 | 89 | |||
202 | 90 | # try to find bugs in the code using type inference | ||
203 | 91 | # | ||
204 | 92 | [TYPECHECK] | ||
205 | 93 | |||
206 | 94 | # Tells whether missing members accessed in mixin class should be ignored. A | ||
207 | 95 | # mixin class is detected if its name ends with "mixin" (case insensitive). | ||
208 | 96 | ignore-mixin-members=yes | ||
209 | 97 | |||
210 | 98 | # List of classes names for which member attributes should not be checked | ||
211 | 99 | # (useful for classes with attributes dynamically set). | ||
212 | 100 | ignored-classes= | ||
213 | 101 | |||
214 | 102 | # When zope mode is activated, add a predefined set of Zope acquired attributes | ||
215 | 103 | # to generated-members. | ||
216 | 104 | zope=no | ||
217 | 105 | |||
218 | 106 | # List of members which are set dynamically and missed by pylint inference | ||
219 | 107 | # system, and so shouldn't trigger E0201 when accessed. | ||
220 | 108 | generated-members=REQUEST,acl_users,aq_parent | ||
221 | 109 | |||
222 | 110 | |||
223 | 111 | # checks for | ||
224 | 112 | # * unused variables / imports | ||
225 | 113 | # * undefined variables | ||
226 | 114 | # * redefinition of variable from builtins or from an outer scope | ||
227 | 115 | # * use of variable before assignment | ||
228 | 116 | # | ||
229 | 117 | [VARIABLES] | ||
230 | 118 | |||
231 | 119 | # Tells whether we should check for unused import in __init__ files. | ||
232 | 120 | init-import=yes | ||
233 | 121 | |||
234 | 122 | # A regular expression matching names used for dummy variables (i.e. not used). | ||
235 | 123 | dummy-variables-rgx=_|dummy | ||
236 | 124 | |||
237 | 125 | # List of additional names supposed to be defined in builtins. Remember that | ||
238 | 126 | # you should avoid to define new builtins when possible. | ||
239 | 127 | additional-builtins= | ||
240 | 128 | |||
241 | 129 | |||
242 | 130 | # checks for : | ||
243 | 131 | # * doc strings | ||
244 | 132 | # * modules / classes / functions / methods / arguments / variables name | ||
245 | 133 | # * number of arguments, local variables, branches, returns and statements in | ||
246 | 134 | # functions, methods | ||
247 | 135 | # * required module attributes | ||
248 | 136 | # * dangerous default values as arguments | ||
249 | 137 | # * redefinition of function / method / class | ||
250 | 138 | # * uses of the global statement | ||
251 | 139 | # | ||
252 | 140 | [BASIC] | ||
253 | 141 | |||
254 | 142 | # Required attributes for module, separated by a comma | ||
255 | 143 | required-attributes= | ||
256 | 144 | |||
257 | 145 | # Regular expression which should only match functions or classes name which do | ||
258 | 146 | # not require a docstring | ||
259 | 147 | no-docstring-rgx=(__.*__|setUp|tearDown) | ||
260 | 148 | |||
261 | 149 | # Regular expression which should only match correct module names | ||
262 | 150 | module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ | ||
263 | 151 | |||
264 | 152 | # Regular expression which should only match correct module level names | ||
265 | 153 | const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ | ||
266 | 154 | |||
267 | 155 | # Regular expression which should only match correct class names | ||
268 | 156 | class-rgx=[A-Z_][a-zA-Z0-9]+$ | ||
269 | 157 | |||
270 | 158 | # Regular expression which should only match correct function names | ||
271 | 159 | function-rgx=[a-z_][a-z0-9_]{2,79}$ | ||
272 | 160 | |||
273 | 161 | # Regular expression which should only match correct method names | ||
274 | 162 | method-rgx=([a-z_][a-z0-9_]{2,79}$|setUp|tearDown) | ||
275 | 163 | |||
276 | 164 | # Regular expression which should only match correct instance attribute names | ||
277 | 165 | attr-rgx=[a-z_][a-z0-9_]{1,30}$ | ||
278 | 166 | |||
279 | 167 | # Regular expression which should only match correct argument names | ||
280 | 168 | argument-rgx=[a-z_][a-z0-9_]{1,30}$ | ||
281 | 169 | |||
282 | 170 | # Regular expression which should only match correct variable names | ||
283 | 171 | variable-rgx=[a-z_][a-z0-9_]{1,30}$ | ||
284 | 172 | |||
285 | 173 | # Regular expression which should only match correct list comprehension / | ||
286 | 174 | # generator expression variable names | ||
287 | 175 | inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ | ||
288 | 176 | |||
289 | 177 | # Good variable names which should always be accepted, separated by a comma | ||
290 | 178 | good-names=d,e,f,g,i,j,k,ex,logger,Run,_ | ||
291 | 179 | |||
292 | 180 | # Bad variable names which should always be refused, separated by a comma | ||
293 | 181 | bad-names=foo,bar,baz,toto,tutu,tata | ||
294 | 182 | |||
295 | 183 | # List of builtins function names that should not be used, separated by a comma | ||
296 | 184 | bad-functions=apply,input,reduce | ||
297 | 185 | |||
298 | 186 | |||
299 | 187 | # checks for sign of poor/misdesign: | ||
300 | 188 | # * number of methods, attributes, local variables... | ||
301 | 189 | # * size, complexity of functions, methods | ||
302 | 190 | # | ||
303 | 191 | [DESIGN] | ||
304 | 192 | |||
305 | 193 | # Maximum number of arguments for function / method | ||
306 | 194 | max-args=5 | ||
307 | 195 | |||
308 | 196 | # Maximum number of locals for function / method body | ||
309 | 197 | max-locals=15 | ||
310 | 198 | |||
311 | 199 | # Maximum number of return / yield for function / method body | ||
312 | 200 | max-returns=6 | ||
313 | 201 | |||
314 | 202 | # Maximum number of branch for function / method body | ||
315 | 203 | max-branchs=12 | ||
316 | 204 | |||
317 | 205 | # Maximum number of statements in function / method body | ||
318 | 206 | max-statements=50 | ||
319 | 207 | |||
320 | 208 | # Maximum number of parents for a class (see R0901). | ||
321 | 209 | max-parents=7 | ||
322 | 210 | |||
323 | 211 | # Maximum number of attributes for a class (see R0902). | ||
324 | 212 | max-attributes=7 | ||
325 | 213 | |||
326 | 214 | # Minimum number of public methods for a class (see R0903). | ||
327 | 215 | min-public-methods=2 | ||
328 | 216 | |||
329 | 217 | # Maximum number of public methods for a class (see R0904). | ||
330 | 218 | max-public-methods=20 | ||
331 | 219 | |||
332 | 220 | |||
333 | 221 | # checks for : | ||
334 | 222 | # * methods without self as first argument | ||
335 | 223 | # * overridden methods signature | ||
336 | 224 | # * access only to existent members via self | ||
337 | 225 | # * attributes not defined in the __init__ method | ||
338 | 226 | # * supported interfaces implementation | ||
339 | 227 | # * unreachable code | ||
340 | 228 | # | ||
341 | 229 | [CLASSES] | ||
342 | 230 | |||
343 | 231 | # List of interface methods to ignore, separated by a comma. This is used for | ||
344 | 232 | # instance to not check methods defines in Zopes Interface base class. | ||
345 | 233 | #ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by,providedBy | ||
346 | 234 | |||
347 | 235 | # List of method names used to declare (i.e. assign) instance attributes. | ||
348 | 236 | defining-attr-methods=__init__,__new__,setUp | ||
349 | 237 | |||
350 | 238 | |||
351 | 239 | # checks for | ||
352 | 240 | # * external modules dependencies | ||
353 | 241 | # * relative / wildcard imports | ||
354 | 242 | # * cyclic imports | ||
355 | 243 | # * uses of deprecated modules | ||
356 | 244 | # | ||
357 | 245 | [IMPORTS] | ||
358 | 246 | |||
359 | 247 | # Deprecated modules which should not be used, separated by a comma | ||
360 | 248 | deprecated-modules=regsub,string,TERMIOS,Bastion,rexec | ||
361 | 249 | |||
362 | 250 | # Create a graph of every (i.e. internal and external) dependencies in the | ||
363 | 251 | # given file (report RP0402 must not be disabled) | ||
364 | 252 | import-graph= | ||
365 | 253 | |||
366 | 254 | # Create a graph of external dependencies in the given file (report RP0402 must | ||
367 | 255 | # not be disabled) | ||
368 | 256 | ext-import-graph= | ||
369 | 257 | |||
370 | 258 | # Create a graph of internal dependencies in the given file (report RP0402 must | ||
371 | 259 | # not be disabled) | ||
372 | 260 | int-import-graph= | ||
373 | 261 | |||
374 | 262 | |||
375 | 263 | # checks for : | ||
376 | 264 | # * unauthorized constructions | ||
377 | 265 | # * strict indentation | ||
378 | 266 | # * line length | ||
379 | 267 | # * use of <> instead of != | ||
380 | 268 | # | ||
381 | 269 | [FORMAT] | ||
382 | 270 | |||
383 | 271 | # Maximum number of characters on a single line. | ||
384 | 272 | max-line-length=79 | ||
385 | 273 | |||
386 | 274 | # Maximum number of lines in a module | ||
387 | 275 | max-module-lines=2500 | ||
388 | 276 | |||
389 | 277 | # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 | ||
390 | 278 | # tab). | ||
391 | 279 | indent-string=' ' | ||
392 | 280 | |||
393 | 281 | |||
394 | 282 | # checks for similarities and duplicated code. This computation may be | ||
395 | 283 | # memory / CPU intensive, so you should disable it if you experiments some | ||
396 | 284 | # problems. | ||
397 | 285 | # | ||
398 | 286 | [SIMILARITIES] | ||
399 | 287 | |||
400 | 288 | # Minimum lines number of a similarity. | ||
401 | 289 | min-similarity-lines=4 | ||
402 | 290 | |||
403 | 291 | # Ignore comments when computing similarities. | ||
404 | 292 | ignore-comments=yes | ||
405 | 293 | |||
406 | 294 | # Ignore docstrings when computing similarities. | ||
407 | 295 | ignore-docstrings=yes | ||
408 | 296 | |||
409 | 297 | |||
410 | 298 | # checks for: | ||
411 | 299 | # * warning notes in the code like FIXME, XXX | ||
412 | 300 | # * PEP 263: source code with non ascii character but no encoding declaration | ||
413 | 301 | # | ||
414 | 302 | [MISCELLANEOUS] | ||
415 | 303 | |||
416 | 304 | # List of note tags to take in consideration, separated by a comma. | ||
417 | 305 | notes=FIXME,XXX,TODO,fixme,xxx,todo | ||
418 | 0 | 306 | ||
419 | === modified file 'run-tests' | |||
420 | --- run-tests 2011-06-21 20:01:26 +0000 | |||
421 | +++ run-tests 2011-06-22 14:18:49 +0000 | |||
422 | @@ -37,7 +37,7 @@ | |||
423 | 37 | 37 | ||
424 | 38 | ./setup.py build | 38 | ./setup.py build |
425 | 39 | echo "Running test suite for ""$MODULE" | 39 | echo "Running test suite for ""$MODULE" |
427 | 40 | `which xvfb-run` u1trial "$MODULE" | 40 | `which xvfb-run` u1trial --reactor=qt4 --gui "$MODULE" |
428 | 41 | style_check | 41 | style_check |
429 | 42 | rm -rf _trial_temp | 42 | rm -rf _trial_temp |
430 | 43 | rm -rf build | 43 | rm -rf build |
431 | 44 | 44 | ||
432 | === modified file 'ubuntuone_installer/__init__.py' | |||
433 | --- ubuntuone_installer/__init__.py 2011-06-21 15:41:55 +0000 | |||
434 | +++ ubuntuone_installer/__init__.py 2011-06-22 14:18:49 +0000 | |||
435 | @@ -19,7 +19,7 @@ | |||
436 | 19 | 19 | ||
437 | 20 | """The windows installer for Ubuntu One. | 20 | """The windows installer for Ubuntu One. |
438 | 21 | 21 | ||
440 | 22 | The installer is a wizard that sets up the basic account and configuration for | 22 | The installer is a wizard that sets up the basic account and configuration for |
441 | 23 | a Ubuntu One user on windows. | 23 | a Ubuntu One user on windows. |
442 | 24 | """ | 24 | """ |
443 | 25 | 25 | ||
444 | 26 | 26 | ||
445 | === modified file 'ubuntuone_installer/gui/qt/__init__.py' | |||
446 | --- ubuntuone_installer/gui/qt/__init__.py 2011-06-21 18:18:33 +0000 | |||
447 | +++ ubuntuone_installer/gui/qt/__init__.py 2011-06-22 14:18:49 +0000 | |||
448 | @@ -17,4 +17,3 @@ | |||
449 | 17 | # with this program. If not, see <http://www.gnu.org/licenses/>. | 17 | # with this program. If not, see <http://www.gnu.org/licenses/>. |
450 | 18 | 18 | ||
451 | 19 | """The Qt graphical interface for the Ubuntu One Installer.""" | 19 | """The Qt graphical interface for the Ubuntu One Installer.""" |
452 | 20 | |||
453 | 21 | 20 | ||
454 | === modified file 'ubuntuone_installer/gui/qt/gui.py' | |||
455 | --- ubuntuone_installer/gui/qt/gui.py 2011-06-21 19:46:39 +0000 | |||
456 | +++ ubuntuone_installer/gui/qt/gui.py 2011-06-22 14:18:49 +0000 | |||
457 | @@ -19,32 +19,37 @@ | |||
458 | 19 | 19 | ||
459 | 20 | """The user interface for the Ubuntu One Installer.""" | 20 | """The user interface for the Ubuntu One Installer.""" |
460 | 21 | 21 | ||
461 | 22 | import subprocess | ||
462 | 22 | 23 | ||
463 | 23 | from PyQt4 import QtGui | 24 | from PyQt4 import QtGui |
464 | 24 | 25 | ||
465 | 25 | from ubuntuone_installer.logger import setup_logging | 26 | from ubuntuone_installer.logger import setup_logging |
467 | 26 | from ubuntuone_installer.gui.qt.ui import license_ui | 27 | from ubuntuone_installer.gui.qt.ui import ( |
468 | 28 | license_ui, | ||
469 | 29 | congratulations_ui, | ||
470 | 30 | ) | ||
471 | 27 | 31 | ||
472 | 28 | import gettext | 32 | import gettext |
473 | 29 | 33 | ||
474 | 30 | _ = gettext.gettext | 34 | _ = gettext.gettext |
475 | 31 | 35 | ||
476 | 36 | # Invalid name logger | ||
477 | 37 | # pylint: disable=C0103 | ||
478 | 32 | logger = setup_logging('qt.gui') | 38 | logger = setup_logging('qt.gui') |
479 | 39 | # pylint: enable=C0103 | ||
480 | 33 | 40 | ||
481 | 34 | 41 | ||
482 | 35 | class LicensePage(QtGui.QWizardPage): | 42 | class LicensePage(QtGui.QWizardPage): |
483 | 36 | """Wizard Page that displays the license info and links to the GPL""" | 43 | """Wizard Page that displays the license info and links to the GPL""" |
484 | 37 | 44 | ||
485 | 38 | # Invalid constant names and Qt-inherited methods | ||
486 | 39 | # pylint: disable=C0103 | ||
487 | 40 | |||
488 | 41 | LICENSE_PAGE = 0 | ||
489 | 42 | |||
490 | 43 | def __init__(self, parent=None): | 45 | def __init__(self, parent=None): |
491 | 44 | QtGui.QWizardPage.__init__(self, parent) | 46 | QtGui.QWizardPage.__init__(self, parent) |
492 | 45 | self.ui = license_ui.Ui_Form() | 47 | self.ui = license_ui.Ui_Form() |
493 | 46 | self.ui.setupUi(self) | 48 | self.ui.setupUi(self) |
494 | 47 | 49 | ||
495 | 50 | # Invalid names of Qt-inherited methods | ||
496 | 51 | # pylint: disable=C0103 | ||
497 | 52 | |||
498 | 48 | def initializePage(self): | 53 | def initializePage(self): |
499 | 49 | """Setup UI details""" | 54 | """Setup UI details""" |
500 | 50 | 55 | ||
501 | @@ -55,50 +60,79 @@ | |||
502 | 55 | # Set the right texts and connections for buttons | 60 | # Set the right texts and connections for buttons |
503 | 56 | self.setButtonText(QtGui.QWizard.NextButton, _("Agree && Install")) | 61 | self.setButtonText(QtGui.QWizard.NextButton, _("Agree && Install")) |
504 | 57 | self.setButtonText(QtGui.QWizard.CancelButton, | 62 | self.setButtonText(QtGui.QWizard.CancelButton, |
510 | 58 | _("Disagree && Cancel")) | 63 | _("Disagree && Cancel")) |
511 | 59 | self.setButtonText(QtGui.QWizard.CustomButton1, _("&Print")) | 64 | self.setButtonText(QtGui.QWizard.CustomButton1, _("&Print")) |
512 | 60 | self.wizard().customButtonClicked.connect(self.printDocument) | 65 | self.wizard().customButtonClicked.connect(self.print_document) |
513 | 61 | 66 | ||
514 | 62 | def printDocument(self, button_id): | 67 | def print_document(self, button_id): |
515 | 63 | """Print the document displayed in textBrowser""" | 68 | """Print the document displayed in textBrowser""" |
517 | 64 | 69 | ||
518 | 65 | if button_id == QtGui.QWizard.CustomButton1: | 70 | if button_id == QtGui.QWizard.CustomButton1: |
519 | 66 | document = self.ui.textBrowser.document() | 71 | document = self.ui.textBrowser.document() |
520 | 67 | printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) | 72 | printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) |
521 | 68 | 73 | ||
522 | 69 | dialog = QtGui.QPrintDialog(printer, self) | 74 | dialog = QtGui.QPrintDialog(printer, self) |
524 | 70 | 75 | ||
525 | 71 | dialog.setWindowTitle(_("Send to printer")) | 76 | dialog.setWindowTitle(_("Send to printer")) |
526 | 72 | if dialog.exec_() != QtGui.QDialog.Accepted: | 77 | if dialog.exec_() != QtGui.QDialog.Accepted: |
527 | 73 | return | 78 | return |
528 | 74 | printer.setFullPage(True) | 79 | printer.setFullPage(True) |
529 | 75 | printer.setPageSize(QtGui.QPrinter.A4) | 80 | printer.setPageSize(QtGui.QPrinter.A4) |
530 | 76 | document.print_(printer) | 81 | document.print_(printer) |
532 | 77 | 82 | ||
533 | 83 | |||
534 | 84 | class CongratulationsPage(QtGui.QWizardPage): | ||
535 | 85 | """Final page of the wizard""" | ||
536 | 86 | |||
537 | 87 | def __init__(self, parent=None): | ||
538 | 88 | QtGui.QWizardPage.__init__(self, parent) | ||
539 | 89 | self.ui = congratulations_ui.Ui_Form() | ||
540 | 90 | self.ui.setupUi(self) | ||
541 | 91 | |||
542 | 92 | # Invalid names of Qt-inherited methods | ||
543 | 93 | # pylint: disable=C0103 | ||
544 | 94 | |||
545 | 95 | def initializePage(self): | ||
546 | 96 | """Setup UI details""" | ||
547 | 97 | |||
548 | 98 | # We need custom buttons | ||
549 | 99 | self.wizard().setButtonText(QtGui.QWizard.FinishButton, | ||
550 | 100 | _("Go to my Ubuntu One dashboard")) | ||
551 | 101 | self.wizard().setOption(QtGui.QWizard.HaveCustomButton1, False) | ||
552 | 102 | self.wizard().setOption(QtGui.QWizard.NoCancelButton, True) | ||
553 | 103 | |||
554 | 78 | 104 | ||
555 | 79 | class MainWindow(QtGui.QWizard): | 105 | class MainWindow(QtGui.QWizard): |
556 | 80 | """The Main Window of the Installer wizard.""" | 106 | """The Main Window of the Installer wizard.""" |
557 | 81 | 107 | ||
558 | 108 | # Invalid constant names and Qt-inherited methods | ||
559 | 109 | # pylint: disable=C0103 | ||
560 | 110 | |||
561 | 111 | LICENSE_PAGE = 0 | ||
562 | 112 | CONGRATULATIONS_PAGE = 1 | ||
563 | 113 | |||
564 | 82 | def __init__(self, close_callback=None): | 114 | def __init__(self, close_callback=None): |
565 | 83 | """Initialize this instance with the UI layout.""" | 115 | """Initialize this instance with the UI layout.""" |
566 | 116 | |||
567 | 84 | QtGui.QWizard.__init__(self) | 117 | QtGui.QWizard.__init__(self) |
568 | 85 | self.close_callback = close_callback | 118 | self.close_callback = close_callback |
569 | 86 | 119 | ||
570 | 87 | self.setOption(self.NoBackButtonOnStartPage, True) | 120 | self.setOption(self.NoBackButtonOnStartPage, True) |
572 | 88 | 121 | self.setOption(self.DisabledBackButtonOnLastPage, True) | |
573 | 89 | # PyQt doesn't support the (int, page) version of addPage | 122 | # PyQt doesn't support the (int, page) version of addPage |
574 | 90 | # Add the pages in the right order | 123 | # Add the pages in the right order |
576 | 91 | 124 | ||
577 | 92 | # pylint: disable=C0103 | 125 | # pylint: disable=C0103 |
578 | 93 | self.LICENSE_PAGE = self.addPage(LicensePage()) | 126 | self.LICENSE_PAGE = self.addPage(LicensePage()) |
581 | 94 | # Dummy page to have a "Next" | 127 | self.CONGRATULATIONS_PAGE = self.addPage(CongratulationsPage()) |
580 | 95 | self.addPage(QtGui.QWizardPage()) | ||
582 | 96 | 128 | ||
583 | 97 | # Invalid name "closeEvent" | 129 | # Invalid name "closeEvent" |
584 | 98 | # pylint: disable=C0103 | 130 | # pylint: disable=C0103 |
585 | 99 | 131 | ||
586 | 100 | def done(self, result): | 132 | def done(self, result): |
587 | 101 | """The main window is being closed, call any custom callback.""" | 133 | """The main window is being closed, call any custom callback.""" |
588 | 134 | if result == 1: # Finished, not cancelled | ||
589 | 135 | subprocess.Popen(["ubuntuone-control-panel-qt", ]) | ||
590 | 102 | if self.close_callback is not None: | 136 | if self.close_callback is not None: |
591 | 103 | self.close_callback() | 137 | self.close_callback() |
592 | 104 | QtGui.QWizard.done(self, result) | 138 | QtGui.QWizard.done(self, result) |
593 | 105 | 139 | ||
594 | === added directory 'ubuntuone_installer/gui/qt/tests' | |||
595 | === added file 'ubuntuone_installer/gui/qt/tests/__init__.py' | |||
596 | --- ubuntuone_installer/gui/qt/tests/__init__.py 1970-01-01 00:00:00 +0000 | |||
597 | +++ ubuntuone_installer/gui/qt/tests/__init__.py 2011-06-22 14:18:49 +0000 | |||
598 | @@ -0,0 +1,68 @@ | |||
599 | 1 | # -*- coding: utf-8 -*- | ||
600 | 2 | |||
601 | 3 | # Authors: Alejandro J. Cura <alecu@canonical.com> | ||
602 | 4 | # | ||
603 | 5 | # Copyright 2011 Canonical Ltd. | ||
604 | 6 | # | ||
605 | 7 | # This program is free software: you can redistribute it and/or modify it | ||
606 | 8 | # under the terms of the GNU General Public License version 3, as published | ||
607 | 9 | # by the Free Software Foundation. | ||
608 | 10 | # | ||
609 | 11 | # This program is distributed in the hope that it will be useful, but | ||
610 | 12 | # WITHOUT ANY WARRANTY; without even the implied warranties of | ||
611 | 13 | # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
612 | 14 | # PURPOSE. See the GNU General Public License for more details. | ||
613 | 15 | # | ||
614 | 16 | # You should have received a copy of the GNU General Public License along | ||
615 | 17 | # with this program. If not, see <http://www.gnu.org/licenses/>. | ||
616 | 18 | |||
617 | 19 | """The test suite for the Qt UI of the Ubuntu One Installer.""" | ||
618 | 20 | |||
619 | 21 | from ubuntuone_installer.tests import TestCase | ||
620 | 22 | from ubuntuone_installer.gui.tests import FakedObject | ||
621 | 23 | |||
622 | 24 | # Attribute 'yyy' defined outside __init__, access to a protected member | ||
623 | 25 | # pylint: disable=W0201, W0212 | ||
624 | 26 | |||
625 | 27 | |||
626 | 28 | NO_OP = lambda *args: None | ||
627 | 29 | |||
628 | 30 | |||
629 | 31 | def skip_if_abstract_class(test): | ||
630 | 32 | """Decorator to skip a test if is an abstract class.""" | ||
631 | 33 | |||
632 | 34 | def inner(instance): | ||
633 | 35 | """Skip a test if is an abstract class.""" | ||
634 | 36 | abstract = instance.class_ui is None | ||
635 | 37 | result = None | ||
636 | 38 | if not abstract: | ||
637 | 39 | result = test(instance) | ||
638 | 40 | |||
639 | 41 | return result | ||
640 | 42 | |||
641 | 43 | return inner | ||
642 | 44 | |||
643 | 45 | |||
644 | 46 | class FakeUi(FakedObject): | ||
645 | 47 | """A fake Ui object.""" | ||
646 | 48 | |||
647 | 49 | exposed_methods = ['setupUi'] | ||
648 | 50 | |||
649 | 51 | |||
650 | 52 | class BaseTestCase(TestCase): | ||
651 | 53 | """Base Test Case.""" | ||
652 | 54 | |||
653 | 55 | class_ui = None | ||
654 | 56 | kwargs = {} | ||
655 | 57 | |||
656 | 58 | @skip_if_abstract_class | ||
657 | 59 | def setUp(self): | ||
658 | 60 | super(BaseTestCase, self).setUp() | ||
659 | 61 | # self.class_ui is not callable | ||
660 | 62 | # pylint: disable=E1102 | ||
661 | 63 | # pylint: disable=C0103 | ||
662 | 64 | self.ui = self.class_ui(**self.kwargs) | ||
663 | 65 | |||
664 | 66 | if hasattr(self.ui, 'backend'): | ||
665 | 67 | # clean backend calls | ||
666 | 68 | self.ui.backend._called.clear() | ||
667 | 0 | 69 | ||
668 | === added file 'ubuntuone_installer/gui/qt/tests/test_gui.py' | |||
669 | --- ubuntuone_installer/gui/qt/tests/test_gui.py 1970-01-01 00:00:00 +0000 | |||
670 | +++ ubuntuone_installer/gui/qt/tests/test_gui.py 2011-06-22 14:18:49 +0000 | |||
671 | @@ -0,0 +1,61 @@ | |||
672 | 1 | # -*- coding: utf-8 -*- | ||
673 | 2 | |||
674 | 3 | # Authors: Alejandro J. Cura <alecu@canonical.com> | ||
675 | 4 | # Roberto Alsina <roberto.alsina@canonical.com> | ||
676 | 5 | # | ||
677 | 6 | # Copyright 2011 Canonical Ltd. | ||
678 | 7 | # | ||
679 | 8 | # This program is free software: you can redistribute it and/or modify it | ||
680 | 9 | # under the terms of the GNU General Public License version 3, as published | ||
681 | 10 | # by the Free Software Foundation. | ||
682 | 11 | # | ||
683 | 12 | # This program is distributed in the hope that it will be useful, but | ||
684 | 13 | # WITHOUT ANY WARRANTY; without even the implied warranties of | ||
685 | 14 | # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
686 | 15 | # PURPOSE. See the GNU General Public License for more details. | ||
687 | 16 | # | ||
688 | 17 | # You should have received a copy of the GNU General Public License along | ||
689 | 18 | # with this program. If not, see <http://www.gnu.org/licenses/>. | ||
690 | 19 | |||
691 | 20 | """Tests for the Qt UI.""" | ||
692 | 21 | |||
693 | 22 | from ubuntuone_installer.gui.qt import gui | ||
694 | 23 | from ubuntuone_installer.gui.qt.tests import BaseTestCase | ||
695 | 24 | |||
696 | 25 | |||
697 | 26 | class MainWindowTestCase(BaseTestCase): | ||
698 | 27 | """Test the qt main window.""" | ||
699 | 28 | |||
700 | 29 | class_ui = gui.MainWindow | ||
701 | 30 | |||
702 | 31 | def setUp(self): | ||
703 | 32 | """Initialize this test instance.""" | ||
704 | 33 | super(MainWindowTestCase, self).setUp() | ||
705 | 34 | |||
706 | 35 | def test_done_calls_custom_close_callback(self): | ||
707 | 36 | """When closing the window, close_callback is called.""" | ||
708 | 37 | self.ui.close_callback = self._set_called | ||
709 | 38 | self.ui.done(result=0) | ||
710 | 39 | self.assertEqual(self._called, | ||
711 | 40 | ((), {}), 'close_callback called.') | ||
712 | 41 | |||
713 | 42 | def test_close_callback_can_be_none(self): | ||
714 | 43 | """The close_callback can be None.""" | ||
715 | 44 | self.ui.close_callback = None | ||
716 | 45 | self.ui.done(result=0) | ||
717 | 46 | # world did not explode | ||
718 | 47 | |||
719 | 48 | def test_start_control_panel_on_finishing(self): | ||
720 | 49 | """If done is called with result=1, the control panel | ||
721 | 50 | should be called""" | ||
722 | 51 | self.patch(gui.subprocess, "Popen", self._set_called) | ||
723 | 52 | self.ui.done(result=1) | ||
724 | 53 | self.assertEqual(self._called, | ||
725 | 54 | ((['ubuntuone-control-panel-qt'],), {})) | ||
726 | 55 | |||
727 | 56 | def test_not_start_control_panel_on_cancel(self): | ||
728 | 57 | """If done is called with result=0, the control panel | ||
729 | 58 | should NOT be called""" | ||
730 | 59 | self.patch(gui.subprocess, "Popen", self._set_called) | ||
731 | 60 | self.ui.done(result=0) | ||
732 | 61 | self.assertEqual(self._called, False) | ||
733 | 0 | 62 | ||
734 | === added directory 'ubuntuone_installer/gui/tests' | |||
735 | === added file 'ubuntuone_installer/gui/tests/__init__.py' | |||
736 | --- ubuntuone_installer/gui/tests/__init__.py 1970-01-01 00:00:00 +0000 | |||
737 | +++ ubuntuone_installer/gui/tests/__init__.py 2011-06-22 14:18:49 +0000 | |||
738 | @@ -0,0 +1,45 @@ | |||
739 | 1 | # -*- coding: utf-8 -*- | ||
740 | 2 | |||
741 | 3 | # Authors: Natalia B Bidart <natalia.bidart@canonical.com> | ||
742 | 4 | # Roberto Alsina <roberto.alsina@canonical.com> | ||
743 | 5 | # | ||
744 | 6 | # Copyright 2011 Canonical Ltd. | ||
745 | 7 | # | ||
746 | 8 | # This program is free software: you can redistribute it and/or modify it | ||
747 | 9 | # under the terms of the GNU General Public License version 3, as published | ||
748 | 10 | # by the Free Software Foundation. | ||
749 | 11 | # | ||
750 | 12 | # This program is distributed in the hope that it will be useful, but | ||
751 | 13 | # WITHOUT ANY WARRANTY; without even the implied warranties of | ||
752 | 14 | # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
753 | 15 | # PURPOSE. See the GNU General Public License for more details. | ||
754 | 16 | # | ||
755 | 17 | # You should have received a copy of the GNU General Public License along | ||
756 | 18 | # with this program. If not, see <http://www.gnu.org/licenses/>. | ||
757 | 19 | |||
758 | 20 | """The test suite for the Ubuntu One Installer.""" | ||
759 | 21 | |||
760 | 22 | # Attribute 'yyy' defined outside __init__, access to a protected member | ||
761 | 23 | # pylint: disable=W0201, W0212 | ||
762 | 24 | |||
763 | 25 | |||
764 | 26 | class FakedObject(object): | ||
765 | 27 | """Fake an object, record every call.""" | ||
766 | 28 | |||
767 | 29 | exposed_methods = [] | ||
768 | 30 | |||
769 | 31 | def __init__(self, *args, **kwargs): | ||
770 | 32 | self._args = args | ||
771 | 33 | self._kwargs = kwargs | ||
772 | 34 | self._called = {} | ||
773 | 35 | for i in self.exposed_methods: | ||
774 | 36 | setattr(self, i, self._record_call(i)) | ||
775 | 37 | |||
776 | 38 | def _record_call(self, func_name): | ||
777 | 39 | """Store values when calling 'func_name'.""" | ||
778 | 40 | |||
779 | 41 | def inner(*args, **kwargs): | ||
780 | 42 | """Fake 'func_name'.""" | ||
781 | 43 | self._called[func_name] = (args, kwargs) | ||
782 | 44 | |||
783 | 45 | return inner | ||
784 | 0 | 46 | ||
785 | === added directory 'ubuntuone_installer/tests' | |||
786 | === added file 'ubuntuone_installer/tests/__init__.py' | |||
787 | --- ubuntuone_installer/tests/__init__.py 1970-01-01 00:00:00 +0000 | |||
788 | +++ ubuntuone_installer/tests/__init__.py 2011-06-22 14:18:49 +0000 | |||
789 | @@ -0,0 +1,38 @@ | |||
790 | 1 | # -*- coding: utf-8 -*- | ||
791 | 2 | |||
792 | 3 | # Authors: Natalia B Bidart <natalia.bidart@canonical.com> | ||
793 | 4 | # Roberto Alsina <roberto.alsina@canonical.com> | ||
794 | 5 | # | ||
795 | 6 | # Copyright 2010-2011 Canonical Ltd. | ||
796 | 7 | # | ||
797 | 8 | # This program is free software: you can redistribute it and/or modify it | ||
798 | 9 | # under the terms of the GNU General Public License version 3, as published | ||
799 | 10 | # by the Free Software Foundation. | ||
800 | 11 | # | ||
801 | 12 | # This program is distributed in the hope that it will be useful, but | ||
802 | 13 | # WITHOUT ANY WARRANTY; without even the implied warranties of | ||
803 | 14 | # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
804 | 15 | # PURPOSE. See the GNU General Public License for more details. | ||
805 | 16 | # | ||
806 | 17 | # You should have received a copy of the GNU General Public License along | ||
807 | 18 | # with this program. If not, see <http://www.gnu.org/licenses/>. | ||
808 | 19 | |||
809 | 20 | """The test suite for the Ubuntu One Installer""" | ||
810 | 21 | |||
811 | 22 | from ubuntuone.devtools.testcase import TestCase as BaseTestCase | ||
812 | 23 | |||
813 | 24 | |||
814 | 25 | class TestCase(BaseTestCase): | ||
815 | 26 | """Basics for testing.""" | ||
816 | 27 | |||
817 | 28 | assertIs = BaseTestCase.assertIdentical | ||
818 | 29 | |||
819 | 30 | def setUp(self): | ||
820 | 31 | self._called = False | ||
821 | 32 | |||
822 | 33 | def tearDown(self): | ||
823 | 34 | self._called = False | ||
824 | 35 | |||
825 | 36 | def _set_called(self, *args, **kwargs): | ||
826 | 37 | """Store 'args' and 'kwargs' for test assertions.""" | ||
827 | 38 | self._called = (args, kwargs) |
+ subprocess. Popen([ "ubuntuone- control- panel-gtk" ,])
Should this not be ubuntuone- control- panel-qt, given that we're running it from a qt gui? Also, should we not rely on IPC activation to just start the correct one for the user's environment, instead of running it directly?