Merge lp:~saviq/unity8/fix-flake8 into lp:unity8

Proposed by Michał Sawicz on 2015-04-16
Status: Merged
Approved by: Michał Sawicz on 2015-04-22
Approved revision: 1733
Merged at revision: 1741
Proposed branch: lp:~saviq/unity8/fix-flake8
Merge into: lp:unity8
Diff against target: 512 lines (+74/-53)
14 files modified
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py (+0/-2)
tests/autopilot/unity8/fixture_setup.py (+2/-0)
tests/autopilot/unity8/greeter/tests/__init__.py (+3/-1)
tests/autopilot/unity8/greeter/tests/test_args.py (+4/-2)
tests/autopilot/unity8/indicators/__init__.py (+8/-7)
tests/autopilot/unity8/indicators/tests/__init__.py (+1/-0)
tests/autopilot/unity8/indicators/tests/test_action_latency.py (+21/-18)
tests/autopilot/unity8/shell/emulators/dash.py (+15/-10)
tests/autopilot/unity8/shell/emulators/greeter.py (+0/-1)
tests/autopilot/unity8/shell/emulators/tutorial.py (+0/-1)
tests/autopilot/unity8/shell/tests/__init__.py (+1/-0)
tests/autopilot/unity8/shell/tests/test_lock_screen.py (+4/-4)
tests/autopilot/unity8/shell/tests/test_notifications.py (+14/-6)
tests/autopilot/unity8/shell/tests/test_tutorial.py (+1/-1)
To merge this branch: bzr merge lp:~saviq/unity8/fix-flake8
Reviewer Review Type Date Requested Status
Leo Arias (community) 2015-04-16 Approve on 2015-04-21
PS Jenkins bot continuous-integration Needs Fixing on 2015-04-21
Unity Team 2015-04-16 Pending
Review via email: mp+256510@code.launchpad.net

Commit Message

Fix flake8 warnings

Description of the Change

 * Are there any related MPs required for this MP to build/function as expected? Please list.
N
 * Did you perform an exploratory manual test run of your code change and any related functionality?
Y
 * Did you make sure that your branch does not contain spurious tags?
Y
 * If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
N/A
 * If you changed the UI, has there been a design review?
N/A

To post a comment you must log in.
Leo Arias (elopio) wrote :

Awesome, thanks saviq.

A couple of things:

46+ main_window = \
47+ unity_proxy.select_single(main_window_emulator.QQuickView)

This is correct, but people in python avoid the \ as much as possible. This is what they have recommended to me instead:

main_window = (
    unity_proxy.select_single(main_window_emulator.QQuickView))

I think it's uglier, but I do it for consistency. I won't complaint if you prefer the \ here.

322+ self.select_single(objectName="processingIndicator")\
323+ .visible.wait_for(False)

This should be split after the parenthesis, like:

self.select_single(
    objectName="processingIndicator").visible.wait_for(
        False)

or,

processing_indicator = self.select_single(objectName="processingIndicator")
processing_indicator.visible.wait_for(False)

I prefer using two statements.

495-from unity8.shell.emulators import tutorial # NOQA

This is needed, it populates the autopilot object registry, used to match QML elements to custom proxy objects. It has a comment in the line before mentioning that. The # NOQA should take care of the flake8 error.

Needs fixing, because that last removed import will make the tests fail.

review: Needs Fixing
Leo Arias (elopio) wrote :

Oh, also:

elopio@tangamandapio76:~/workspace/canonical/unity/unity8/reviews/saviq/fix-flake8$ python3 -m flake8 .
./.bazaar/plugins/makecheck_unity_phablet.py:30:48: E901 SyntaxError: invalid syntax
./tests/autopilot/unity8/indicators/__init__.py:72:17: E126 continuation line over-indented for hanging indent

lp:~saviq/unity8/fix-flake8 updated on 2015-04-20
1732. By Michał Sawicz on 2015-04-20

Fix more

1733. By Michał Sawicz on 2015-04-20

One more tweak

Leo Arias (elopio) wrote :

Looks good. Waiting for jenkins to confirm that the tutorial test is green again.

Leo Arias (elopio) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py'
2--- tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py 2015-04-02 08:16:34 +0000
3+++ tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py 2015-04-20 16:06:00 +0000
4@@ -22,9 +22,7 @@
5 import logging
6 import os
7
8-from autopilot.matchers import Eventually
9 from autopilot.platform import model
10-from testtools.matchers import Equals
11
12 from unity8 import process_helpers
13 from unity8.application_lifecycle import tests
14
15=== modified file 'tests/autopilot/unity8/fixture_setup.py'
16--- tests/autopilot/unity8/fixture_setup.py 2015-04-07 11:48:34 +0000
17+++ tests/autopilot/unity8/fixture_setup.py 2015-04-20 16:06:00 +0000
18@@ -31,6 +31,7 @@
19
20 logger = logging.getLogger(__name__)
21
22+
23 class LaunchDashApp(fixtures.Fixture):
24
25 """Fixture to launch the Dash app."""
26@@ -102,6 +103,7 @@
27 ]
28 subprocess.check_output(command)
29
30+
31 class LaunchMockIndicatorService(fixtures.Fixture):
32
33 """Fixture to launch the indicator test service."""
34
35=== modified file 'tests/autopilot/unity8/greeter/tests/__init__.py'
36--- tests/autopilot/unity8/greeter/tests/__init__.py 2015-03-23 23:40:27 +0000
37+++ tests/autopilot/unity8/greeter/tests/__init__.py 2015-04-20 16:06:00 +0000
38@@ -20,7 +20,9 @@
39 from unity8.shell.emulators import main_window as main_window_emulator
40 from unity8.shell.tests import UnityTestCase
41
42+
43 class GreeterTestCase(UnityTestCase):
44 def get_shell(self, unity_proxy):
45- main_window = unity_proxy.select_single(main_window_emulator.QQuickView)
46+ main_window = (
47+ unity_proxy.select_single(main_window_emulator.QQuickView))
48 return main_window.select_single('Shell')
49
50=== modified file 'tests/autopilot/unity8/greeter/tests/test_args.py'
51--- tests/autopilot/unity8/greeter/tests/test_args.py 2015-03-23 23:40:27 +0000
52+++ tests/autopilot/unity8/greeter/tests/test_args.py 2015-04-20 16:06:00 +0000
53@@ -19,6 +19,7 @@
54
55 from unity8.greeter.tests import GreeterTestCase
56
57+
58 class GreeterArgsTest(GreeterTestCase):
59
60 DEFAULT_SHELL_MODE = 'full-greeter'
61@@ -43,8 +44,9 @@
62 unity_proxy = self.launch_unity(mode=self.NONEXISTENT_MODE)
63 shell = self.get_shell(unity_proxy)
64 self.assertTrue(shell.testShellMode == self.DEFAULT_SHELL_MODE,
65- "Shell mode was {} but should have been {}".format(
66- shell.testShellMode, self.DEFAULT_SHELL_MODE))
67+ "Shell mode was {} but should have been {}"
68+ .format(shell.testShellMode,
69+ self.DEFAULT_SHELL_MODE))
70
71 def test_shell_mode(self):
72 unity_proxy = self.launch_unity(mode='shell')
73
74=== modified file 'tests/autopilot/unity8/indicators/__init__.py'
75--- tests/autopilot/unity8/indicators/__init__.py 2015-03-20 11:31:40 +0000
76+++ tests/autopilot/unity8/indicators/__init__.py 2015-04-20 16:06:00 +0000
77@@ -19,7 +19,6 @@
78 from autopilot import introspection
79
80 from unity8.shell import emulators
81-from unity8 import fixture_setup
82
83
84 class IndicatorPage(emulators.UnityEmulatorBase):
85@@ -34,6 +33,7 @@
86 def validate_dbus_object(cls, path, state):
87 return False
88
89+
90 class Indicator():
91
92 def __init__(self, main_window, name):
93@@ -67,9 +67,9 @@
94 objectName=self._name+'-page')
95
96 def _make_indicator_icon_visible(self):
97- indicators_bar_flickable = self._main_window.select_single(
98- 'IndicatorsBar').select_single(
99- ubuntuuitoolkit.QQuickFlickable, objectName='flickable')
100+ indicators_bar = self._main_window.select_single('IndicatorsBar')
101+ indicators_bar_flickable = indicators_bar.select_single(
102+ ubuntuuitoolkit.QQuickFlickable, objectName='flickable')
103 self._swipe_flickable_to_x_end(indicators_bar_flickable)
104
105 def _swipe_flickable_to_x_end(self, flickable):
106@@ -98,7 +98,8 @@
107 class DisplayIndicator(Indicator):
108
109 def __init__(self, main_window):
110- super(DisplayIndicator, self).__init__(main_window, 'indicator-rotation-lock')
111+ super(DisplayIndicator, self).__init__(main_window,
112+ 'indicator-rotation-lock')
113 self._main_window = main_window
114
115
116@@ -189,7 +190,7 @@
117 stop_x = x
118
119 self.pointing_device.drag(start_x, start_y, stop_x, stop_y, rate)
120- self.value.wait_for(self.minimumValue, timeout);
121+ self.value.wait_for(self.minimumValue, timeout)
122
123 def slide_right(self, timeout=10):
124 x, y, width, height = self.globalRect
125@@ -200,4 +201,4 @@
126 stop_x = x + width
127
128 self.pointing_device.drag(start_x, start_y, stop_x, stop_y, rate)
129- self.value.wait_for(self.maximumValue, timeout);
130+ self.value.wait_for(self.maximumValue, timeout)
131
132=== modified file 'tests/autopilot/unity8/indicators/tests/__init__.py'
133--- tests/autopilot/unity8/indicators/tests/__init__.py 2015-03-20 11:31:40 +0000
134+++ tests/autopilot/unity8/indicators/tests/__init__.py 2015-04-20 16:06:00 +0000
135@@ -31,6 +31,7 @@
136 self.unity_proxy = self.launch_unity()
137 process_helpers.unlock_unity(self.unity_proxy)
138
139+
140 class DeviceIndicatorTestCase(IndicatorTestCase):
141
142 def setUp(self):
143
144=== modified file 'tests/autopilot/unity8/indicators/tests/test_action_latency.py'
145--- tests/autopilot/unity8/indicators/tests/test_action_latency.py 2015-04-07 11:48:34 +0000
146+++ tests/autopilot/unity8/indicators/tests/test_action_latency.py 2015-04-20 16:06:00 +0000
147@@ -21,19 +21,16 @@
148 from unity8 import (
149 fixture_setup,
150 indicators,
151- process_helpers
152 )
153-from unity8.shell import tests
154 from unity8.indicators import tests
155
156 from autopilot.matchers import Eventually
157 from testtools.matchers import Equals, NotEquals
158-import time
159
160
161 class TestIndicatorBaseTestCase(tests.IndicatorTestCase):
162
163- scenarios = [ tests.IndicatorTestCase.device_emulation_scenarios[0] ]
164+ scenarios = [tests.IndicatorTestCase.device_emulation_scenarios[0]]
165
166 def setUp(self):
167 super(TestIndicatorBaseTestCase, self).setUp()
168@@ -49,7 +46,8 @@
169 self.indicator_page = self.indicator.open()
170
171 def launch_indicator_service(self):
172- launch_service_fixture = fixture_setup.LaunchMockIndicatorService(self.action_delay)
173+ launch_service_fixture = \
174+ fixture_setup.LaunchMockIndicatorService(self.action_delay)
175 self.useFixture(launch_service_fixture)
176
177
178@@ -95,6 +93,7 @@
179 Eventually(Equals(slider.value), timeout=20)
180 )
181
182+
183 class TestBuffering(TestIndicatorBaseTestCase):
184
185 """Test that switching multiple times will buffer activations
186@@ -107,11 +106,11 @@
187
188 switch = self.indicator_page.get_switcher()
189 switch.change_state()
190- intermediate_value = switch.checked;
191+ intermediate_value = switch.checked
192
193 # will buffer change until it receives the change from server
194 switch.change_state()
195- final_value = switch.checked;
196+ final_value = switch.checked
197
198 # backend will respond to first switch.
199 switch_menu = self.indicator_page.get_switch_menu()
200@@ -121,7 +120,8 @@
201 )
202 # The buffered activation should have gone to server now.
203
204- # front-end should not change as a result of server update while it is buffered
205+ # front-end should not change as a result of server update
206+ # while it is buffered
207 self.assertThat(
208 switch.checked,
209 Equals(final_value)
210@@ -142,15 +142,15 @@
211 def test_slider_buffers_activations(self):
212
213 slider = self.indicator_page.get_slider()
214- original_value = slider.value;
215+ original_value = slider.value
216 slider.slide_left()
217
218 # will buffer change until it receives the change from server
219 slider.slide_right()
220- final_value = slider.value;
221+ final_value = slider.value
222
223- # backend will respond to first slider. Since it's a live slider it'll probably
224- # be a random value along the slide.
225+ # backend will respond to first slider. Since it's a live slider
226+ # it'll probably be a random value along the slide.
227 slider_menu = self.indicator_page.get_slider_menu()
228 self.assertThat(
229 slider_menu.serverValue,
230@@ -163,7 +163,8 @@
231 NotEquals(final_value)
232 )
233
234- # front-end should not change as a result of server update while it is buffered
235+ # front-end should not change as a result of server update
236+ # while it is buffered
237 self.assertThat(
238 slider.value,
239 Equals(final_value)
240@@ -189,17 +190,18 @@
241
242 See https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1390136 .
243 """
244- action_delay = -1 # never action.
245+ action_delay = -1 # never action.
246
247 def test_switch_reverts_on_late_response(self):
248
249 switch = self.indicator_page.get_switcher()
250 switch_menu = self.indicator_page.get_switch_menu()
251
252- original_value = switch.checked;
253+ original_value = switch.checked
254 switch.change_state()
255
256- # switch should revert to original value after 5 seconds (30 seconds in real usage)
257+ # switch should revert to original value after 5 seconds
258+ # (30 seconds in real usage)
259 self.assertThat(
260 switch.checked,
261 Eventually(Equals(original_value), timeout=20)
262@@ -216,10 +218,11 @@
263 slider = self.indicator_page.get_slider()
264 slider_menu = self.indicator_page.get_slider_menu()
265
266- original_value = slider.value;
267+ original_value = slider.value
268 slider.slide_left()
269
270- # slider should revert to original value after 5 seconds (30 seconds in real usage)
271+ # slider should revert to original value after 5 seconds
272+ # (30 seconds in real usage)
273 self.assertThat(
274 slider.value,
275 Eventually(Equals(original_value), timeout=20)
276
277=== modified file 'tests/autopilot/unity8/shell/emulators/dash.py'
278--- tests/autopilot/unity8/shell/emulators/dash.py 2015-03-06 15:38:57 +0000
279+++ tests/autopilot/unity8/shell/emulators/dash.py 2015-04-20 16:06:00 +0000
280@@ -92,7 +92,7 @@
281 aux = self.dash_content_list.get_children_by_type('QQuickItem')[0]
282 for l in aux.get_children_by_type('QQuickLoader'):
283 if (l.scopeId == scope_id):
284- return l;
285+ return l
286 raise emulators.UnityEmulatorException(
287 'No scope found with id {0}'.format(scope_id))
288 except dbus.StateNotFoundError:
289@@ -100,7 +100,7 @@
290 'No scope found with id {0}'.format(scope_id))
291
292 def _get_scope_from_loader(self, loader):
293- return loader.wait_select_single('GenericScopeView');
294+ return loader.wait_select_single('GenericScopeView')
295
296 def _open_scope_scrolling(self, scope_loader):
297 scroll = self._get_scroll_direction(scope_loader)
298@@ -132,7 +132,7 @@
299 # Workarounds https://bugs.launchpad.net/mir/+bug/1399690
300 rate = 10
301 divisions = 5
302- jump = ( width / divisions ) // rate * rate
303+ jump = (width / divisions) // rate * rate
304 start_x = x + jump
305 stop_x = x + jump * (divisions - 1)
306 start_y = stop_y = y + 1
307@@ -148,7 +148,7 @@
308 # Workarounds https://bugs.launchpad.net/mir/+bug/1399690
309 rate = 10
310 divisions = 5
311- jump = ( width / divisions ) // rate * rate
312+ jump = (width / divisions) // rate * rate
313 start_x = x + jump * (divisions - 1)
314 stop_x = x + jump
315 start_y = stop_y = y + 1
316@@ -157,16 +157,19 @@
317
318 def enter_search_query(self, query):
319 current_header = self._get_current_page_header()
320- search_button = current_header.select_single(objectName="search_header_button")
321- self.pointing_device.move(search_button.globalRect.x + search_button.width / 2,
322- search_button.globalRect.y + search_button.height / 2)
323+ search_button = \
324+ current_header.select_single(objectName="search_header_button")
325+ self.pointing_device.move(
326+ search_button.globalRect.x + search_button.width / 2,
327+ search_button.globalRect.y + search_button.height / 2)
328 self.pointing_device.click()
329 headerContainer = current_header.select_single(
330 objectName="headerContainer")
331 headerContainer.contentY.wait_for(0)
332 search_text_field = self._get_search_text_field()
333 search_text_field.write(query)
334- self.select_single(objectName="processingIndicator").visible.wait_for(False)
335+ self.select_single(
336+ objectName="processingIndicator").visible.wait_for(False)
337
338 def _get_search_text_field(self):
339 page_header = self._get_current_page_header()
340@@ -217,13 +220,15 @@
341
342 """
343 category_element = self._get_category_element(category)
344- icon = category_element.wait_select_single('AbstractButton', title=title)
345+ icon = category_element.wait_select_single('AbstractButton',
346+ title=title)
347 self.pointing_device.click_object(icon)
348
349 def _get_category_element(self, category):
350 try:
351 return self.wait_select_single(
352- 'DashCategoryBase', objectName='dashCategory{}'.format(category))
353+ 'DashCategoryBase',
354+ objectName='dashCategory{}'.format(category))
355 except dbus.StateNotFoundError:
356 raise emulators.UnityEmulatorException(
357 'No category found with name {}'.format(category))
358
359=== modified file 'tests/autopilot/unity8/shell/emulators/greeter.py'
360--- tests/autopilot/unity8/shell/emulators/greeter.py 2015-02-06 22:12:38 +0000
361+++ tests/autopilot/unity8/shell/emulators/greeter.py 2015-04-20 16:06:00 +0000
362@@ -42,7 +42,6 @@
363
364 raise AssertionError("Greeter cover page still up after 10s")
365
366-
367 def swipe(self):
368 """Swipe the greeter screen away."""
369 self.waiting.wait_for(False)
370
371=== modified file 'tests/autopilot/unity8/shell/emulators/tutorial.py'
372--- tests/autopilot/unity8/shell/emulators/tutorial.py 2015-02-03 16:22:05 +0000
373+++ tests/autopilot/unity8/shell/emulators/tutorial.py 2015-04-20 16:06:00 +0000
374@@ -18,7 +18,6 @@
375 #
376
377 import logging
378-import time
379
380 import ubuntuuitoolkit
381
382
383=== modified file 'tests/autopilot/unity8/shell/tests/__init__.py'
384--- tests/autopilot/unity8/shell/tests/__init__.py 2015-04-09 14:00:54 +0000
385+++ tests/autopilot/unity8/shell/tests/__init__.py 2015-04-20 16:06:00 +0000
386@@ -65,6 +65,7 @@
387 UNITYSHELL_LAUNCHER_KEY = "launcher-hide-mode"
388 UNITYSHELL_LAUNCHER_MODE = 1 # launcher hidden
389
390+
391 def _get_device_emulation_scenarios(devices='All'):
392 nexus4 = ('Desktop Nexus 4',
393 dict(app_width=768, app_height=1280, grid_unit_px=18))
394
395=== modified file 'tests/autopilot/unity8/shell/tests/test_lock_screen.py'
396--- tests/autopilot/unity8/shell/tests/test_lock_screen.py 2015-03-20 14:50:04 +0000
397+++ tests/autopilot/unity8/shell/tests/test_lock_screen.py 2015-04-20 16:06:00 +0000
398@@ -41,7 +41,7 @@
399
400 if not greeter.tabletMode:
401 greeter.swipe()
402- lockscreen = self._wait_for_lockscreen()
403+ self._wait_for_lockscreen()
404 self.main_window.enter_pin_code("1234")
405 else:
406 self._enter_prompt_passphrase("1234\n")
407@@ -56,7 +56,7 @@
408
409 if not greeter.tabletMode:
410 greeter.swipe()
411- lockscreen = self._wait_for_lockscreen()
412+ self._wait_for_lockscreen()
413 self._enter_pin_passphrase("password")
414 else:
415 self._enter_prompt_passphrase("password")
416@@ -70,7 +70,7 @@
417
418 if not greeter.tabletMode:
419 greeter.swipe()
420- lockscreen = self._wait_for_lockscreen()
421+ self._wait_for_lockscreen()
422 self.main_window.enter_pin_code("4321")
423 pinentryField = self.main_window.get_pinentryField()
424 self.assertThat(pinentryField.text, Eventually(Equals("")))
425@@ -88,7 +88,7 @@
426
427 if not greeter.tabletMode:
428 greeter.swipe()
429- lockscreen = self._wait_for_lockscreen()
430+ self._wait_for_lockscreen()
431 self._enter_pin_passphrase("foobar")
432 pinentryField = self.main_window.get_pinentryField()
433 self.assertThat(pinentryField.text, Eventually(Equals("")))
434
435=== modified file 'tests/autopilot/unity8/shell/tests/test_notifications.py'
436--- tests/autopilot/unity8/shell/tests/test_notifications.py 2015-03-03 04:21:32 +0000
437+++ tests/autopilot/unity8/shell/tests/test_notifications.py 2015-04-20 16:06:00 +0000
438@@ -127,7 +127,7 @@
439 actions = [("action_id", "dummy")]
440 hints = [
441 ("x-canonical-switch-to-application", "true"),
442- ("x-canonical-secondary-icon","dialer")
443+ ("x-canonical-secondary-icon", "dialer")
444 ]
445
446 self._create_interactive_notification(
447@@ -150,7 +150,9 @@
448 self.assert_notification_action_id_was_called('action_id')
449
450 def test_sd_one_over_two_layout(self):
451- """Snap-decision with three actions should use one-over two button layout."""
452+ """Snap-decision with three actions should use
453+ one-over two button layout.
454+ """
455 unity_proxy = self.launch_unity()
456 unlock_unity(unity_proxy)
457
458@@ -189,7 +191,9 @@
459 self.assert_notification_action_id_was_called("action_accept")
460
461 def test_modal_sd_without_greeter(self):
462- """Snap-decision should block input to shell without greeter/lockscreen."""
463+ """Snap-decision should block input to shell
464+ without greeter/lockscreen.
465+ """
466 unity_proxy = self.launch_unity()
467 unlock_unity(unity_proxy)
468
469@@ -236,7 +240,9 @@
470 self.assert_notification_action_id_was_called("action_accept")
471
472 def test_modal_sd_with_greeter(self):
473- """A snap-decision should block input to the greeter/lockscreen beneath it."""
474+ """A snap-decision should block input to the
475+ greeter/lockscreen beneath it.
476+ """
477 self.launch_unity()
478
479 summary = "Incoming file"
480@@ -350,7 +356,9 @@
481 raise RuntimeError("Call to script failed with: %s" % error_output)
482
483 def _get_notify_script(self):
484- """Returns the path to the interactive notification creation script."""
485+ """Returns the path to the interactive notification
486+ creation script.
487+ """
488 file_path = "../../emulators/create_interactive_notification.py"
489
490 the_path = os.path.abspath(
491@@ -454,7 +462,7 @@
492
493 summary = "Upload of image completed"
494 icon_path = self._get_icon_path('applicationIcons/facebook.png')
495- hints=[]
496+ hints = []
497
498 notification = shell.create_ephemeral_notification(
499 summary,
500
501=== modified file 'tests/autopilot/unity8/shell/tests/test_tutorial.py'
502--- tests/autopilot/unity8/shell/tests/test_tutorial.py 2015-02-23 17:29:04 +0000
503+++ tests/autopilot/unity8/shell/tests/test_tutorial.py 2015-04-20 16:06:00 +0000
504@@ -25,7 +25,7 @@
505 tests
506 )
507 # unused import to load the tutorial emulators custom proxy objects.
508-from unity8.shell.emulators import tutorial # NOQA
509+from unity8.shell.emulators import tutorial as tutorial_emulator # NOQA
510
511
512 class TutorialTestCase(tests.UnityTestCase):

Subscribers

People subscribed via source and target branches