Merge lp:~cjwatson/launchpad/bugs-pagetests-future-imports into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 18709
Proposed branch: lp:~cjwatson/launchpad/bugs-pagetests-future-imports
Merge into: lp:launchpad
Diff against target: 8904 lines (+1232/-1221)
125 files modified
lib/lp/bugs/browser/tests/bug-nomination-views.txt (+14/-14)
lib/lp/bugs/browser/tests/bug-views.txt (+22/-22)
lib/lp/bugs/browser/tests/buglinktarget-views.txt (+8/-8)
lib/lp/bugs/browser/tests/bugs-views.txt (+5/-5)
lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt (+9/-9)
lib/lp/bugs/browser/tests/bugtask-adding-views.txt (+25/-25)
lib/lp/bugs/browser/tests/bugtask-edit-views.txt (+3/-3)
lib/lp/bugs/browser/tests/bugtask-search-views.txt (+17/-16)
lib/lp/bugs/browser/tests/bugwatch-views.txt (+2/-2)
lib/lp/bugs/browser/tests/person-bug-views.txt (+44/-44)
lib/lp/bugs/browser/tests/test_views.py (+3/-2)
lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt (+4/-4)
lib/lp/bugs/stories/bug-also-affects/xx-bug-also-affects.txt (+56/-56)
lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt (+2/-2)
lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt (+3/-3)
lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt (+6/-6)
lib/lp/bugs/stories/bug-privacy/xx-bug-privacy.txt (+4/-4)
lib/lp/bugs/stories/bug-privacy/xx-presenting-private-bugs.txt (+6/-6)
lib/lp/bugs/stories/bug-release-management/xx-bug-release-management.txt (+12/-12)
lib/lp/bugs/stories/bug-tags/xx-official-bug-tags.txt (+9/-9)
lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt (+3/-3)
lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-listings-page.txt (+3/-3)
lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-page.txt (+7/-7)
lib/lp/bugs/stories/bugattachments/xx-attachments-to-bug-report.txt (+5/-5)
lib/lp/bugs/stories/bugattachments/xx-bugattachments.txt (+18/-18)
lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt (+4/-4)
lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt (+2/-2)
lib/lp/bugs/stories/bugs/bug-add-subscriber.txt (+3/-3)
lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt (+1/-1)
lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt (+1/-1)
lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt (+4/-4)
lib/lp/bugs/stories/bugs/xx-bug-activity.txt (+5/-5)
lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt (+14/-14)
lib/lp/bugs/stories/bugs/xx-bug-comment-attach-file.txt (+5/-5)
lib/lp/bugs/stories/bugs/xx-bug-comments-truncated.txt (+8/-8)
lib/lp/bugs/stories/bugs/xx-bug-create-question.txt (+18/-18)
lib/lp/bugs/stories/bugs/xx-bug-edit.txt (+6/-6)
lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt (+1/-1)
lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt (+11/-11)
lib/lp/bugs/stories/bugs/xx-bug-index-lots-of-comments.txt (+9/-9)
lib/lp/bugs/stories/bugs/xx-bug-index.txt (+18/-18)
lib/lp/bugs/stories/bugs/xx-bug-obfuscation.txt (+2/-2)
lib/lp/bugs/stories/bugs/xx-bug-personal-subscriptions-advanced-features.txt (+4/-4)
lib/lp/bugs/stories/bugs/xx-bug-single-comment-view.txt (+1/-1)
lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt (+21/-21)
lib/lp/bugs/stories/bugs/xx-bugs-advanced-search-upstream-status.txt (+9/-9)
lib/lp/bugs/stories/bugs/xx-bugs.txt (+3/-3)
lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.txt (+14/-14)
lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt (+3/-3)
lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt (+1/-1)
lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt (+3/-3)
lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt (+8/-8)
lib/lp/bugs/stories/bugs/xx-front-page-bug-lists.txt (+4/-4)
lib/lp/bugs/stories/bugs/xx-front-page-info.txt (+7/-7)
lib/lp/bugs/stories/bugs/xx-front-page-search.txt (+6/-6)
lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt (+1/-1)
lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt (+14/-14)
lib/lp/bugs/stories/bugs/xx-link-bug-to-branch.txt (+7/-7)
lib/lp/bugs/stories/bugs/xx-malone-homepage.txt (+2/-2)
lib/lp/bugs/stories/bugs/xx-numbered-comments.txt (+2/-2)
lib/lp/bugs/stories/bugs/xx-portlets-bug-milestones.txt (+5/-5)
lib/lp/bugs/stories/bugs/xx-portlets-bug-series.txt (+7/-7)
lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt (+4/-4)
lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt (+1/-1)
lib/lp/bugs/stories/bugs/xx-remote-bug-comments.txt (+8/-8)
lib/lp/bugs/stories/bugs/xx-switch-to-malone.txt (+2/-2)
lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt (+1/-1)
lib/lp/bugs/stories/bugtask-management/xx-bug-importance-change.txt (+2/-2)
lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt (+12/-11)
lib/lp/bugs/stories/bugtask-management/xx-bugtask-edit-forms.txt (+9/-9)
lib/lp/bugs/stories/bugtask-management/xx-change-assignee.txt (+9/-9)
lib/lp/bugs/stories/bugtask-management/xx-change-milestone.txt (+4/-4)
lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt (+1/-1)
lib/lp/bugs/stories/bugtask-management/xx-subscribe-while-editing.txt (+1/-1)
lib/lp/bugs/stories/bugtask-management/xx-view-editable-bug-task.txt (+1/-1)
lib/lp/bugs/stories/bugtask-searches/xx-advanced-people-filters.txt (+10/-10)
lib/lp/bugs/stories/bugtask-searches/xx-distribution-statistics-portlet.txt (+10/-10)
lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt (+4/-4)
lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt (+7/-7)
lib/lp/bugs/stories/bugtask-searches/xx-person-bugs.txt (+18/-18)
lib/lp/bugs/stories/bugtask-searches/xx-unexpected-form-data.txt (+1/-1)
lib/lp/bugs/stories/bugtracker/bugtrackers-index.txt (+5/-5)
lib/lp/bugs/stories/bugtracker/xx-bugtracker-remote-bug.txt (+4/-4)
lib/lp/bugs/stories/bugtracker/xx-bugtracker.txt (+48/-48)
lib/lp/bugs/stories/bugtracker/xx-reschedule-all-watches.txt (+5/-5)
lib/lp/bugs/stories/bugwatches/xx-bugtask-bugwatch-linkage.txt (+5/-5)
lib/lp/bugs/stories/bugwatches/xx-bugwatch-errors.txt (+4/-4)
lib/lp/bugs/stories/bugwatches/xx-edit-bugwatch.txt (+21/-21)
lib/lp/bugs/stories/cve/cve-linking.txt (+7/-7)
lib/lp/bugs/stories/cve/cve-pages.txt (+13/-13)
lib/lp/bugs/stories/cve/xx-cve-link-xss.txt (+3/-3)
lib/lp/bugs/stories/feeds/xx-bug-atom.txt (+84/-84)
lib/lp/bugs/stories/feeds/xx-bug-html.txt (+15/-15)
lib/lp/bugs/stories/guided-filebug/xx-bug-reporting-guidelines.txt (+25/-25)
lib/lp/bugs/stories/guided-filebug/xx-bug-reporting-tools.txt (+12/-12)
lib/lp/bugs/stories/guided-filebug/xx-displaying-similar-bugs.txt (+3/-3)
lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug-tags.txt (+1/-1)
lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug.txt (+5/-5)
lib/lp/bugs/stories/guided-filebug/xx-distro-sourcepackage-guided-filebug.txt (+2/-2)
lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.txt (+3/-3)
lib/lp/bugs/stories/guided-filebug/xx-no-launchpadder.txt (+11/-11)
lib/lp/bugs/stories/guided-filebug/xx-options-for-bug-supervisors.txt (+4/-4)
lib/lp/bugs/stories/guided-filebug/xx-product-guided-filebug.txt (+10/-10)
lib/lp/bugs/stories/guided-filebug/xx-productseries-guided-filebug.txt (+1/-1)
lib/lp/bugs/stories/guided-filebug/xx-project-guided-filebug.txt (+2/-2)
lib/lp/bugs/stories/guided-filebug/xx-ubuntu-filebug.txt (+8/-8)
lib/lp/bugs/stories/patches-view/patches-view.txt (+2/-2)
lib/lp/bugs/stories/standalone/xx-filebug-package-chooser-radio-buttons.txt (+5/-5)
lib/lp/bugs/stories/standalone/xx-nonexistent-bugid-raises-404.txt (+4/-4)
lib/lp/bugs/stories/standalone/xx-obsolete-bug-and-task-urls.txt (+4/-4)
lib/lp/bugs/stories/standalone/xx-show-distribution-cve-report.txt (+3/-3)
lib/lp/bugs/stories/standalone/xx-show-distrorelease-cve-report.txt (+2/-2)
lib/lp/bugs/stories/standalone/xx-slash-malone-slash-assigned.txt (+4/-4)
lib/lp/bugs/stories/structural-subscriptions/xx-bug-subscriptions.txt (+15/-15)
lib/lp/bugs/stories/upstream-bugprivacy/xx-upstream-bug-privacy.txt (+20/-20)
lib/lp/bugs/stories/webservice/xx-bug-target.txt (+29/-29)
lib/lp/bugs/stories/webservice/xx-bug-tracker.txt (+4/-4)
lib/lp/bugs/stories/webservice/xx-bug.txt (+173/-171)
lib/lp/bugs/stories/webservice/xx-hide-comments.txt (+6/-6)
lib/lp/bugs/stories/xx-bugs-statistics-portlet.txt (+6/-6)
lib/lp/bugs/tests/test_buglinktarget.py (+4/-4)
lib/lp/bugs/tests/test_bugtarget.py (+6/-6)
lib/lp/bugs/tests/test_doc.py (+8/-3)
lib/lp/bugs/tests/test_structuralsubscriptiontarget.py (+5/-5)
lib/lp/testing/factory.py (+2/-1)
To merge this branch: bzr merge lp:~cjwatson/launchpad/bugs-pagetests-future-imports
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+348788@code.launchpad.net

Commit message

Convert pagetests under lp.bugs to Launchpad's preferred __future__ imports.

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) wrote :

Self-approving more tedious and bulky __future__ work.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/bugs/browser/tests/bug-nomination-views.txt'
2--- lib/lp/bugs/browser/tests/bug-nomination-views.txt 2014-11-28 22:07:05 +0000
3+++ lib/lp/bugs/browser/tests/bug-nomination-views.txt 2018-06-30 16:32:46 +0000
4@@ -30,9 +30,9 @@
5 >>> ignored = login_person(nominator)
6 >>> request = LaunchpadTestRequest()
7 >>> bug_one_in_ubuntu_firefox = getUtility(IBugTaskSet).get(17)
8- >>> print bug_one_in_ubuntu_firefox.bug.id
9+ >>> print(bug_one_in_ubuntu_firefox.bug.id)
10 1
11- >>> print bug_one_in_ubuntu_firefox.target.bugtargetdisplayname
12+ >>> print(bug_one_in_ubuntu_firefox.target.bugtargetdisplayname)
13 mozilla-firefox (Ubuntu)
14
15 >>> nomination_view = getMultiAdapter(
16@@ -80,15 +80,15 @@
17 >>> len(request.response.notifications)
18 1
19
20- >>> print request.response.notifications[0].message
21+ >>> print(request.response.notifications[0].message)
22 Added nominations for: Ubuntu Warty
23
24 Here's an example of nominating a bug for a productseries.
25
26 >>> bug_one_in_firefox = getUtility(IBugTaskSet).get(2)
27- >>> print bug_one_in_firefox.bug.id
28+ >>> print(bug_one_in_firefox.bug.id)
29 1
30- >>> print bug_one_in_firefox.target.bugtargetdisplayname
31+ >>> print(bug_one_in_firefox.target.bugtargetdisplayname)
32 Mozilla Firefox
33
34 >>> firefox = bug_one_in_firefox.target
35@@ -121,7 +121,7 @@
36 >>> len(request.response.notifications)
37 1
38
39- >>> print request.response.notifications[0].message
40+ >>> print(request.response.notifications[0].message)
41 Added nominations for: Mozilla Firefox trunk
42
43
44@@ -158,7 +158,7 @@
45 approval.
46
47 >>> hoary_nomination.decline(launchbag.user)
48- >>> print hoary_nomination.status.title
49+ >>> print(hoary_nomination.status.title)
50 Declined
51
52 >>> hoary_nomination_edit_form.shouldShowApproveButton(None)
53@@ -179,14 +179,14 @@
54
55 >>> ubuntu_nominations = bug_one.getNominations(ubuntu)
56 >>> for nomination in ubuntu_nominations:
57- ... print nomination.target.bugtargetdisplayname
58+ ... print(nomination.target.bugtargetdisplayname)
59 Ubuntu Hoary
60 Ubuntu Warty
61
62 Bug #1 currently has three tasks.
63
64 >>> for bugtask in bug_one.bugtasks:
65- ... print bugtask.bugtargetdisplayname
66+ ... print(bugtask.bugtargetdisplayname)
67 Mozilla Firefox
68 mozilla-firefox (Ubuntu)
69 mozilla-firefox (Debian)
70@@ -201,7 +201,7 @@
71 >>> login("celso.providelo@canonical.com")
72
73 >>> cprov = launchbag.user
74- >>> print cprov.name
75+ >>> print(cprov.name)
76 cprov
77
78 >>> cprov.inTeam(ubuntu_team)
79@@ -220,9 +220,9 @@
80
81 >>> def print_nominations(nominations):
82 ... for nomination in nominations:
83- ... print "%s, %s" % (
84+ ... print("%s, %s" % (
85 ... nomination.target.bugtargetdisplayname,
86- ... nomination.status.title)
87+ ... nomination.status.title))
88 >>> print_nominations(bug_one.getNominations(ubuntu))
89 Ubuntu Hoary, Declined
90 Ubuntu Warty, Nominated
91@@ -240,7 +240,7 @@
92 Ubuntu Warty, Nominated
93
94 >>> for bugtask in bug_one.bugtasks:
95- ... print bugtask.bugtargetdisplayname
96+ ... print(bugtask.bugtargetdisplayname)
97 Mozilla Firefox
98 mozilla-firefox (Ubuntu)
99 mozilla-firefox (Ubuntu Grumpy)
100@@ -248,5 +248,5 @@
101
102 The notification message also changes slightly.
103
104- >>> print request.response.notifications[0].message
105+ >>> print(request.response.notifications[0].message)
106 Targeted bug to: Ubuntu Grumpy
107
108=== modified file 'lib/lp/bugs/browser/tests/bug-views.txt'
109--- lib/lp/bugs/browser/tests/bug-views.txt 2015-10-06 06:48:01 +0000
110+++ lib/lp/bugs/browser/tests/bug-views.txt 2018-06-30 16:32:46 +0000
111@@ -15,7 +15,7 @@
112 >>> from lazr.lifecycle.event import IObjectCreatedEvent
113 >>> from lp.bugs.interfaces.bug import IBug
114 >>> def on_created_event(object, event):
115- ... print "ObjectCreatedEvent: %r" % object
116+ ... print("ObjectCreatedEvent: %r" % object)
117 >>> on_created_listener = TestEventListener(
118 ... IBug, IObjectCreatedEvent, on_created_event)
119
120@@ -71,13 +71,13 @@
121 The user specified a binary package name, so that's been added to the
122 bug description and the first comment:
123
124- >>> print latest_ubuntu_bugtask.bug.description
125+ >>> print(latest_ubuntu_bugtask.bug.description)
126 a bug in a bin pkg
127
128 the source package from which the binary was built has been set on
129 the bugtask.
130
131- >>> print latest_ubuntu_bugtask.sourcepackagename.name
132+ >>> print(latest_ubuntu_bugtask.sourcepackagename.name)
133 linux-source-2.6.15
134
135 2. Filing a bug on a product.
136@@ -157,7 +157,7 @@
137
138 >>> ubuntu_bugview = getMultiAdapter(
139 ... (latest_ubuntu_bugtask, request), name="+index")
140- >>> print len(ubuntu_bugview.comments)
141+ >>> print(len(ubuntu_bugview.comments))
142 3
143 >>> [ (c.index, c.owner.name, c.text_contents)
144 ... for c in ubuntu_bugview.comments ]
145@@ -172,12 +172,12 @@
146 When a user posts a new bug, the first comment and the description are
147 identical. Take as an example the first bug posted above:
148
149- >>> print latest_ubuntu_bugtask.bug.description
150+ >>> print(latest_ubuntu_bugtask.bug.description)
151 a bug in a bin pkg
152
153 Its description has the same contents as the bug's first comment:
154
155- >>> print latest_ubuntu_bugtask.bug.messages[0].text_contents
156+ >>> print(latest_ubuntu_bugtask.bug.messages[0].text_contents)
157 a bug in a bin pkg
158
159 The view class offers a method to check exactly that:
160@@ -203,7 +203,7 @@
161 Because we omit the first comment, and because the third comment is
162 indentical to the second, we really only display one comment:
163
164- >>> print len(comments)
165+ >>> print(len(comments))
166 1
167 >>> [(c.index, c.owner.name, c.text_contents) for c in comments]
168 [(1, u'name16', u'I can reproduce this bug.')]
169@@ -233,9 +233,9 @@
170
171 >>> bug_five_in_firefox = bugtaskset.get(14)
172
173- >>> print bug_five_in_firefox.bug.id
174+ >>> print(bug_five_in_firefox.bug.id)
175 5
176- >>> print bug_five_in_firefox.product.name
177+ >>> print(bug_five_in_firefox.product.name)
178 firefox
179
180
181@@ -247,7 +247,7 @@
182 >>> getUtility(IOpenLaunchBag).add(bug_five_in_firefox)
183
184 >>> for dupe in bug_page_view.duplicates():
185- ... print dupe['url']
186+ ... print(dupe['url'])
187 http://.../firefox/+bug/6
188
189 Bug 2 is not reported in Firefox. Let's mark bug 2 as a dupe of bug 5,
190@@ -261,7 +261,7 @@
191 ... (bug_five_in_firefox.bug, request), name="+portlet-duplicates")
192
193 >>> for dupe in bug_page_view.duplicates():
194- ... print dupe['url']
195+ ... print(dupe['url'])
196 http://.../bugs/2
197 ...
198
199@@ -476,10 +476,10 @@
200 >>> def print_tasks_and_nominations(task_and_nomination_views):
201 ... for task_or_nomination_view in task_and_nomination_views:
202 ... task_or_nomination = task_or_nomination_view.context
203- ... print "%s, %s, %s" % (
204+ ... print("%s, %s, %s" % (
205 ... get_object_type(task_or_nomination),
206 ... task_or_nomination.status.title,
207- ... task_or_nomination.target.bugtargetdisplayname)
208+ ... task_or_nomination.target.bugtargetdisplayname))
209
210 >>> task_and_nomination_views = (
211 ... bugtasks_and_nominations_view.getBugTaskAndNominationViews())
212@@ -604,7 +604,7 @@
213 >>> from lp.bugs.browser.bug import BugEditView
214 >>> class BugEditViewTest(BugEditView):
215 ... def index(self):
216- ... print 'EDIT BUG'
217+ ... print('EDIT BUG')
218
219 >>> firefox_task = bug_one.bugtasks[0]
220 >>> firefox_task.bugtargetdisplayname
221@@ -737,23 +737,23 @@
222 ... for activity in activities:
223 ... target_name = activity['target']
224 ... if target_name is None:
225- ... print "Changed:"
226+ ... print("Changed:")
227 ... else:
228- ... print "Changed in %s:" % target_name
229+ ... print("Changed in %s:" % target_name)
230 ... activity_items = activity['activity']
231 ... for activity_item in activity_items:
232- ... print "* %s: %s => %s" % (
233+ ... print("* %s: %s => %s" % (
234 ... activity_item.change_summary,
235 ... activity_item.oldvalue,
236- ... activity_item.newvalue)
237+ ... activity_item.newvalue))
238
239 >>> def print_comment(comment):
240- ... print comment.text_for_display
241+ ... print(comment.text_for_display)
242 ... print_activities(comment.activity)
243
244 >>> def print_activity_and_comments(activity_and_comments):
245 ... for activity_or_comment in activity_and_comments:
246- ... print "-- {person.name} --".format(**activity_or_comment)
247+ ... print("-- {person.name} --".format(**activity_or_comment))
248 ... if 'activity' in activity_or_comment:
249 ... print_activities(activity_or_comment["activity"])
250 ... if 'comment' in activity_or_comment:
251@@ -826,7 +826,7 @@
252 searched for.
253
254 >>> for bug in view.similar_bugs:
255- ... print bug.title
256+ ... print(bug.title)
257 New title
258 Reflow problems with complex page layouts
259 Firefox install instructions should be complete
260@@ -841,5 +841,5 @@
261 ... (firefox, request), name="+filebug-show-similar")
262 >>> view.initialize()
263 >>> for bug in view.similar_bugs:
264- ... print bug.title
265+ ... print(bug.title)
266 Reflow problems with complex page layouts
267
268=== modified file 'lib/lp/bugs/browser/tests/buglinktarget-views.txt'
269--- lib/lp/bugs/browser/tests/buglinktarget-views.txt 2012-12-10 13:43:47 +0000
270+++ lib/lp/bugs/browser/tests/buglinktarget-views.txt 2018-06-30 16:32:46 +0000
271@@ -28,10 +28,10 @@
272 The +linkbug view is used to link bugs to IBugLinkTarget.
273
274 >>> view = create_view(cve, name='+linkbug')
275- >>> print view.label
276+ >>> print(view.label)
277 Link a bug report
278
279- >>> print view.cancel_url
280+ >>> print(view.cancel_url)
281 http://bugs.launchpad.dev/bugs/cve/2005-2730
282
283 It has a simple widget to enter the bug number or nickname of the bug to link
284@@ -50,7 +50,7 @@
285
286 Bug #1 was added to the object:
287
288- >>> print [bug.id for bug in cve.bugs]
289+ >>> print([bug.id for bug in cve.bugs])
290 [1]
291
292 A ObjectModifiedEvent was sent:
293@@ -82,10 +82,10 @@
294 IBugLinkTarget.
295
296 >>> view = create_view(cve, name='+unlinkbug')
297- >>> print view.label
298+ >>> print(view.label)
299 Remove links to bug reports
300
301- >>> print view.cancel_url
302+ >>> print(view.cancel_url)
303 http://bugs.launchpad.dev/bugs/cve/2005-2730
304
305 After removing the bugs, it sends a SQLObjectModified event.
306@@ -103,7 +103,7 @@
307
308 The two bugs were removed and only bug #3 should still be present:
309
310- >>> print [bug.id for bug in cve.bugs]
311+ >>> print([bug.id for bug in cve.bugs])
312 [3]
313
314 A ObjectModifiedEvent was sent:
315@@ -117,7 +117,7 @@
316 True
317 >>> event.edited_fields
318 ['bugs']
319- >>> print [bug.id for bug in event.object_before_modification.bugs]
320+ >>> print([bug.id for bug in event.object_before_modification.bugs])
321 [1, 2, 3]
322
323
324@@ -143,7 +143,7 @@
325 The notification contains the escaped bug title.
326
327 >>> for notification in request.response.notifications:
328- ... print notification.message.encode('utf8')
329+ ... print(notification.message.encode('utf8'))
330 Added link to bug #2:
331 ...<script>window.alert("Hello!")</script>....
332
333
334=== modified file 'lib/lp/bugs/browser/tests/bugs-views.txt'
335--- lib/lp/bugs/browser/tests/bugs-views.txt 2016-01-26 15:47:37 +0000
336+++ lib/lp/bugs/browser/tests/bugs-views.txt 2018-06-30 16:32:46 +0000
337@@ -26,7 +26,7 @@
338 ... for bugtask in BugTask.selectBy(_status=BugTaskStatus.FIXRELEASED)]
339 [8]
340 >>> for bug in bugs_view.most_recently_fixed_bugs:
341- ... print "%s: %s" % (bug.id, bug.title)
342+ ... print("%s: %s" % (bug.id, bug.title))
343 8: Printing doesn't work
344
345 Let's reopen it and close it again, to ensure that the date closed isn't
346@@ -53,7 +53,7 @@
347 >>> fix_bug(4)
348
349 >>> for bug in bugs_view.most_recently_fixed_bugs:
350- ... print "%s: %s" % (bug.id, bug.title)
351+ ... print("%s: %s" % (bug.id, bug.title))
352 4: Reflow problems with complex page layouts
353 2: Blackhole Trash folder
354 1: Firefox does not support SVG
355@@ -66,7 +66,7 @@
356 >>> fix_bug(1, bugtask_index=1)
357
358 >>> for bug in bugs_view.most_recently_fixed_bugs:
359- ... print "%s: %s" % (bug.id, bug.title)
360+ ... print("%s: %s" % (bug.id, bug.title))
361 1: Firefox does not support SVG
362 4: Reflow problems with complex page layouts
363 2: Blackhole Trash folder
364@@ -84,7 +84,7 @@
365 >>> bugs_view = MaloneView(MaloneApplication(), LaunchpadTestRequest())
366 >>> bugs_view.initialize()
367 >>> for bug in bugs_view.most_recently_fixed_bugs:
368- ... print "%s: %s" % (bug.id, bug.title)
369+ ... print("%s: %s" % (bug.id, bug.title))
370 1: Firefox does not support SVG
371 2: Blackhole Trash folder
372 8: Printing doesn't work
373@@ -102,7 +102,7 @@
374 >>> bugs_view = MaloneView(MaloneApplication(), LaunchpadTestRequest())
375 >>> bugs_view.initialize()
376 >>> for bug in bugs_view.most_recently_fixed_bugs:
377- ... print "%s: %s" % (bug.id, bug.title)
378+ ... print("%s: %s" % (bug.id, bug.title))
379 1: Firefox does not support SVG
380 4: Reflow problems with complex page layouts
381 2: Blackhole Trash folder
382
383=== modified file 'lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt'
384--- lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt 2017-07-21 14:06:38 +0000
385+++ lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt 2018-06-30 16:32:46 +0000
386@@ -60,14 +60,14 @@
387 The inline_filebug_form_url property returns the URL of the inline
388 filebug form so that it may be loaded asynchronously.
389
390- >>> print filebug_view.inline_filebug_form_url
391+ >>> print(filebug_view.inline_filebug_form_url)
392 http://launchpad.dev/firefox/+filebug-inline-form
393
394 Similarly, the duplicate_search_url property returns the base URL for
395 the duplicate search view, which can be used to load the list of
396 possible duplicates for a bug asynchronously.
397
398- >>> print filebug_view.duplicate_search_url
399+ >>> print(filebug_view.duplicate_search_url)
400 http://launchpad.dev/firefox/+filebug-show-similar
401
402
403@@ -95,7 +95,7 @@
404 u'Test description.'
405
406 >>> for tag in filebug_view.added_bug.tags:
407- ... print tag
408+ ... print(tag)
409 bar
410 foo
411
412@@ -150,7 +150,7 @@
413 True
414
415 >>> for field in sorted(supervisor_fields - normal_fields):
416- ... print field
417+ ... print(field)
418 assignee
419 importance
420 information_type
421@@ -169,20 +169,20 @@
422 ... title=u'Extra Fields Bug', comment=u'Test description.',
423 ... assignee=owner, importance=BugTaskImportance.HIGH,
424 ... milestone=milestone, status=BugTaskStatus.TRIAGED)
425- >>> print filebug_view.validate(bug_data)
426+ >>> print(filebug_view.validate(bug_data))
427 None
428
429 >>> filebug_view.submit_bug_action.success(bug_data)
430 >>> [added_bugtask] = filebug_view.added_bug.bugtasks
431
432- >>> print added_bugtask.status.title
433+ >>> print(added_bugtask.status.title)
434 Triaged
435
436- >>> print added_bugtask.importance.title
437+ >>> print(added_bugtask.importance.title)
438 High
439
440- >>> print added_bugtask.assignee.name
441+ >>> print(added_bugtask.assignee.name)
442 bug-superdude
443
444- >>> print added_bugtask.milestone.name
445+ >>> print(added_bugtask.milestone.name)
446 bug-superdude-milestone
447
448=== modified file 'lib/lp/bugs/browser/tests/bugtask-adding-views.txt'
449--- lib/lp/bugs/browser/tests/bugtask-adding-views.txt 2016-01-26 15:47:37 +0000
450+++ lib/lp/bugs/browser/tests/bugtask-adding-views.txt 2018-06-30 16:32:46 +0000
451@@ -39,7 +39,7 @@
452 Since we gave the view an upstream product as its context, it can't
453 guess which product we want to add, so it will ask us to specify it.
454
455- >>> print add_task_view.widgets['product']._getFormInput()
456+ >>> print(add_task_view.widgets['product']._getFormInput())
457 None
458 >>> add_task_view.step_name
459 'choose_product'
460@@ -140,7 +140,7 @@
461 >>> add_task_view.field_names
462 ['product', 'add_packaging', '__visited_steps__']
463
464- >>> print add_task_view.widgets['product']._getFormInput()
465+ >>> print(add_task_view.widgets['product']._getFormInput())
466 None
467
468 Sometimes the distribution won't have any series, though. In that
469@@ -159,7 +159,7 @@
470 ... method='GET')
471 >>> add_task_view.step_name
472 'choose_product'
473- >>> print add_task_view.widgets['product']._getFormInput()
474+ >>> print(add_task_view.widgets['product']._getFormInput())
475 None
476
477 >>> len(add_task_view.request.response.notifications)
478@@ -175,7 +175,7 @@
479 >>> from lazr.lifecycle.interfaces import IObjectCreatedEvent
480
481 >>> def on_created_event(object, event):
482- ... print "ObjectCreatedEvent: %r" % object
483+ ... print("ObjectCreatedEvent: %r" % object)
484
485 >>> on_created_listener = TestEventListener(
486 ... Interface, IObjectCreatedEvent, on_created_event)
487@@ -199,7 +199,7 @@
488 ... firefox_task, '+choose-affected-product', form)
489 >>> add_task_view.step_name
490 'choose_product'
491- >>> print add_task_view.widgets['product']._getFormInput()
492+ >>> print(add_task_view.widgets['product']._getFormInput())
493 no-such-product
494
495 >>> form['field.product'] = u'firefox'
496@@ -207,7 +207,7 @@
497 ... firefox_task, '+choose-affected-product', form)
498 >>> add_task_view.step_name
499 'choose_product'
500- >>> print add_task_view.widgets['product']._getFormInput()
501+ >>> print(add_task_view.widgets['product']._getFormInput())
502 firefox
503
504 If we specify a valid product, no errors will occur, and a bugtask will
505@@ -219,7 +219,7 @@
506 ObjectCreatedEvent: <BugTask ...>
507
508 >>> for bugtask in bug_four.bugtasks:
509- ... print bugtask.bugtargetdisplayname
510+ ... print(bugtask.bugtargetdisplayname)
511 Evolution
512 Mozilla Firefox
513
514@@ -243,7 +243,7 @@
515
516 >>> add_task_view.step_name
517 'specify_remote_bug_url'
518- >>> print add_task_view.widgets['product']._getFormInput()
519+ >>> print(add_task_view.widgets['product']._getFormInput())
520 alsa-utils
521
522 As you can see, we're still in the second step, because the user has
523@@ -263,13 +263,13 @@
524 >>> add_task_view = get_and_setup_view(
525 ... firefox_task, '+choose-affected-product', form)
526 ObjectCreatedEvent: <BugTask ...>
527- >>> print add_task_view.notifications
528+ >>> print(add_task_view.notifications)
529 []
530 >>> add_task_view.next_url is not None
531 True
532
533 >>> for bugtask in bug_four.bugtasks:
534- ... print bugtask.bugtargetdisplayname
535+ ... print(bugtask.bugtargetdisplayname)
536 alsa-utils
537 Evolution
538 Mozilla Firefox
539@@ -295,14 +295,14 @@
540 ... firefox_task, '+choose-affected-product', form)
541 >>> add_task_view.step_name
542 'specify_remote_bug_url'
543- >>> print add_task_view.getFieldError('bug_url')
544+ >>> print(add_task_view.getFieldError('bug_url'))
545 Launchpad does not recognize the bug tracker at this URL.
546
547 Note that this caused the transaction to be aborted, thus the
548 alsa-utils bugtask added earlier is now gone:
549
550 >>> for bugtask in bug_four.bugtasks:
551- ... print bugtask.bugtargetdisplayname
552+ ... print(bugtask.bugtargetdisplayname)
553 Evolution
554 Mozilla Firefox
555
556@@ -327,13 +327,13 @@
557 ObjectCreatedEvent: <BugTask ...>
558
559 >>> for bugtask in bug_four.bugtasks:
560- ... print bugtask.bugtargetdisplayname
561+ ... print(bugtask.bugtargetdisplayname)
562 APTonCD
563 Evolution
564 Mozilla Firefox
565
566 >>> for bugwatch in bug_four.watches:
567- ... print "%s: %s" % (bugwatch.bugtracker.title, bugwatch.remotebug)
568+ ... print("%s: %s" % (bugwatch.bugtracker.title, bugwatch.remotebug))
569 bugzilla.somewhere.org/bugs/: 84
570
571 If we specify a URL of an already registered bug tracker, both the task
572@@ -349,18 +349,18 @@
573 ObjectCreatedEvent: <BugWatch at ...>
574 ObjectCreatedEvent: <BugTask ...>
575
576- >>> print add_task_view.notifications
577+ >>> print(add_task_view.notifications)
578 []
579
580 >>> for bugtask in bug_four.bugtasks:
581- ... print bugtask.bugtargetdisplayname
582+ ... print(bugtask.bugtargetdisplayname)
583 alsa-utils
584 APTonCD
585 Evolution
586 Mozilla Firefox
587
588 >>> for bugwatch in bug_four.watches:
589- ... print "%s: %s" % (bugwatch.bugtracker.title, bugwatch.remotebug)
590+ ... print("%s: %s" % (bugwatch.bugtracker.title, bugwatch.remotebug))
591 GnomeGBug GTracker: 84
592 bugzilla.somewhere.org/bugs/: 84
593
594@@ -396,12 +396,12 @@
595 'http://.../+bug/5'
596
597 >>> for notification in add_task_view.request.response.notifications:
598- ... print notification.message
599+ ... print(notification.message)
600 <a href="...">Bug #4</a> also links to the added bug watch
601 (gnome-bugzilla #84).
602
603 >>> for bugwatch in bug_five.watches:
604- ... print "%s: %s" % (bugwatch.bugtracker.title, bugwatch.remotebug)
605+ ... print("%s: %s" % (bugwatch.bugtracker.title, bugwatch.remotebug))
606 GnomeGBug GTracker: 84
607
608 There's a property for easily retrieving the target for use on the
609@@ -444,7 +444,7 @@
610 []
611
612 >>> for bugtask in bug_four.bugtasks:
613- ... print bugtask.bugtargetdisplayname
614+ ... print(bugtask.bugtargetdisplayname)
615 alsa-utils
616 ...
617 mozilla-firefox (Ubuntu)
618@@ -473,7 +473,7 @@
619 We have no products using http://bugs.foo.org as its bug tracker, so we have
620 nothing to present to the user.
621
622- >>> print add_task_view.existing_products
623+ >>> print(add_task_view.existing_products)
624 None
625
626 Since the user is just creating the product in Launchpad to link to an
627@@ -483,9 +483,9 @@
628
629 >>> from lp.registry.interfaces.product import IProductSet
630 >>> foo_product = getUtility(IProductSet).getByName('foo-product')
631- >>> print foo_product.owner.displayname
632+ >>> print(foo_product.owner.displayname)
633 Registry Administrators
634- >>> print foo_product.registrant.displayname
635+ >>> print(foo_product.registrant.displayname)
636 Sample Person
637
638 The licence is set to DONT_KNOW for now.
639@@ -599,11 +599,11 @@
640
641 >>> def print_links(links_dict):
642 ... if links_dict is None:
643- ... print None
644+ ... print(None)
645 ... return
646 ...
647 ... for key in sorted(links_dict):
648- ... print "%s: %s" % (key, links_dict[key])
649+ ... print("%s: %s" % (key, links_dict[key]))
650
651 upstream_bugtracker_links is a dict of `bug_filing_url` and `bug_search_url`.
652 The bug filing link includes the summary and description of the bug; the
653
654=== modified file 'lib/lp/bugs/browser/tests/bugtask-edit-views.txt'
655--- lib/lp/bugs/browser/tests/bugtask-edit-views.txt 2013-04-11 04:54:04 +0000
656+++ lib/lp/bugs/browser/tests/bugtask-edit-views.txt 2018-06-30 16:32:46 +0000
657@@ -59,7 +59,7 @@
658 changed to the corresponding source package.
659
660 >>> for notification in edit_view.request.response.notifications:
661- ... print notification.message
662+ ... print(notification.message)
663 &#x27;linux-2.6.12&#x27; is a binary package. This bug has been
664 assigned to its source package &#x27;linux-source-2.6.15&#x27;
665 instead.
666@@ -83,7 +83,7 @@
667 ... (ubuntu_thunderbird_task, request), name='+editstatus')
668 >>> edit_view.initialize()
669 >>> for error in edit_view.errors:
670- ... print error
671+ ... print(error)
672 (u'ubuntu_thunderbird.target', u'Target',
673 LaunchpadValidationError(u'There is no package named
674 &#x27;no-such-package&#x27; published in Ubuntu.'))
675@@ -137,7 +137,7 @@
676 ... (product_task, request), name='+editstatus')
677 >>> edit_view.initialize()
678 >>> for error in edit_view.errors:
679- ... print error
680+ ... print(error)
681 ('product', u'Project', RequiredMissing('product'))
682
683
684
685=== modified file 'lib/lp/bugs/browser/tests/bugtask-search-views.txt'
686--- lib/lp/bugs/browser/tests/bugtask-search-views.txt 2014-11-29 01:33:59 +0000
687+++ lib/lp/bugs/browser/tests/bugtask-search-views.txt 2018-06-30 16:32:46 +0000
688@@ -67,7 +67,7 @@
689 >>> milestones = (
690 ... distro_advanced_search_listingview.getMilestoneWidgetValues())
691 >>> for value in milestones:
692- ... print value['title']
693+ ... print(value['title'])
694 Debian 3.1 (2056-05-16)
695 Debian 3.1-rc1 (2056-02-16)
696
697@@ -81,7 +81,7 @@
698 >>> milestones = (
699 ... package_advanced_search_listingview.getMilestoneWidgetValues())
700 >>> for value in milestones:
701- ... print value['title']
702+ ... print(value['title'])
703 Debian 3.1 (2056-05-16)
704 Debian 3.1-rc1 (2056-02-16)
705
706@@ -302,7 +302,7 @@
707
708 >>> open_bugtasks = list(mozilla_search_listingview.search().batch)
709 >>> for bugtask in open_bugtasks:
710- ... print bugtask.bug.id, bugtask.product.name, bugtask.status.name
711+ ... print(bugtask.bug.id, bugtask.product.name, bugtask.status.name)
712 15 thunderbird NEW
713 5 firefox NEW
714 4 firefox NEW
715@@ -328,7 +328,7 @@
716 >>> mozilla_search_listingview = create_view(mozilla, '+bugs', form_values)
717 >>> invalid_bugtasks = list(mozilla_search_listingview.search().batch)
718 >>> for bugtask in invalid_bugtasks:
719- ... print bugtask.bug.id, bugtask.product.name, bugtask.status.name
720+ ... print(bugtask.bug.id, bugtask.product.name, bugtask.status.name)
721 15 thunderbird INVALID
722
723 >>> open_bugtasks[0].transitionToStatus(
724@@ -348,7 +348,7 @@
725 >>> advanced_search_view = create_view(
726 ... mozilla, '+bugs', form_values)
727 >>> for value in advanced_search_view.getMilestoneWidgetValues():
728- ... print value['title']
729+ ... print(value['title'])
730 Mozilla Firefox 1.0 (2056-10-16)
731
732
733@@ -379,7 +379,8 @@
734 >>> mozilla_search_listingview = create_view(mozilla, '+bugs', form_values)
735 >>> userdata_bugtasks = list(mozilla_search_listingview.search().batch)
736 >>> for bugtask in userdata_bugtasks:
737- ... print bugtask.bug.id, bugtask.product.name, bugtask.bug.information_type.name
738+ ... print(bugtask.bug.id, bugtask.product.name,
739+ ... bugtask.bug.information_type.name)
740 15 thunderbird USERDATA
741
742 >>> open_bugtasks[0].bug.transitionToInformationType(
743@@ -406,49 +407,49 @@
744 return a plain search URL which, when visited, will display all open
745 bugs.
746
747- >>> print get_buglisting_search_filter_url()
748+ >>> print(get_buglisting_search_filter_url())
749 +bugs?search=Search
750
751 Passing an assignee will add an assignee field to the query string. Not
752 that get_buglisting_search_filter_url() doesn't check any of the data
753 that's passed to it; that's for the target search to do.
754
755- >>> print get_buglisting_search_filter_url(assignee='gmb')
756+ >>> print(get_buglisting_search_filter_url(assignee='gmb'))
757 +bugs?search=Search&field.assignee=gmb
758
759 Passing an importance will add an importance field to the query string.
760
761- >>> print get_buglisting_search_filter_url(importance='UNDECIDED')
762+ >>> print(get_buglisting_search_filter_url(importance='UNDECIDED'))
763 +bugs?search=Search&field.importance=UNDECIDED
764
765 Importance can be a single item or a list of items:
766
767- >>> print get_buglisting_search_filter_url(importance=['LOW', 'HIGH'])
768+ >>> print(get_buglisting_search_filter_url(importance=['LOW', 'HIGH']))
769 +bugs?search=Search&field.importance=LOW&field.importance=HIGH
770
771 Passing a status will add a status field to the query string:
772
773- >>> print get_buglisting_search_filter_url(status='TRIAGED')
774+ >>> print(get_buglisting_search_filter_url(status='TRIAGED'))
775 +bugs?search=Search&field.status=TRIAGED
776
777 Status, like importance, can be a list:
778
779- >>> print get_buglisting_search_filter_url(status=['NEW', 'INCOMPLETE'])
780+ >>> print(get_buglisting_search_filter_url(status=['NEW', 'INCOMPLETE']))
781 +bugs?search=Search&field.status=NEW&field.status=INCOMPLETE
782
783 Passing a status_upstream parameter will add a status_upstream field to
784 the query string.
785
786- >>> print get_buglisting_search_filter_url(
787- ... status_upstream='open_upstream')
788+ >>> print(get_buglisting_search_filter_url(
789+ ... status_upstream='open_upstream'))
790 +bugs?search=Search&field.status_upstream=open_upstream
791
792 The fields will always be rendered in the order assignee, importance,
793 status, status_upstream, regardless of what order they're passed to
794 get_buglisting_search_filter_url().
795
796- >>> print get_buglisting_search_filter_url(
797+ >>> print(get_buglisting_search_filter_url(
798 ... status_upstream='open_upstream', status='NEW',
799- ... importance='WISHLIST', assignee='mark')
800+ ... importance='WISHLIST', assignee='mark'))
801 +bugs?search=Search&field.assignee=mark&field.importance=WISHLIST&field.status=NEW&field.status_upstream=open_upstream
802
803
804=== modified file 'lib/lp/bugs/browser/tests/bugwatch-views.txt'
805--- lib/lp/bugs/browser/tests/bugwatch-views.txt 2011-12-24 17:49:30 +0000
806+++ lib/lp/bugs/browser/tests/bugwatch-views.txt 2018-06-30 16:32:46 +0000
807@@ -57,7 +57,7 @@
808
809 >>> new_watch_edit_view = create_initialized_view(
810 ... new_watch, '+edit')
811- >>> print new_watch_edit_view.watch_has_activity
812+ >>> print(new_watch_edit_view.watch_has_activity)
813 False
814
815 Adding a successful activity entry for the watch will cause it to show
816@@ -72,7 +72,7 @@
817
818 >>> new_watch_edit_view = create_initialized_view(
819 ... new_watch, '+edit')
820- >>> print new_watch_edit_view.watch_has_activity
821+ >>> print(new_watch_edit_view.watch_has_activity)
822 True
823
824 Each entry in the recent_watch_activity list is a dict containing data
825
826=== modified file 'lib/lp/bugs/browser/tests/person-bug-views.txt'
827--- lib/lp/bugs/browser/tests/person-bug-views.txt 2016-01-26 15:47:37 +0000
828+++ lib/lp/bugs/browser/tests/person-bug-views.txt 2018-06-30 16:32:46 +0000
829@@ -99,9 +99,9 @@
830
831 >>> from lp.bugs.interfaces.bugtask import BugTaskStatus
832 >>> bug_task = reported_bugtasks[1]
833- >>> print bug_task.distribution.name
834+ >>> print(bug_task.distribution.name)
835 ubuntu
836- >>> print bug_task.sourcepackagename.name
837+ >>> print(bug_task.sourcepackagename.name)
838 thunderbird
839 >>> bug_task.bug.id
840 9
841@@ -192,13 +192,13 @@
842 >>> ubuntu_firefox_bugcounts['package_search_url']
843 u'http://bugs.launchpad.dev/ubuntu/+source/mozilla-firefox?field.status=New&field.status=Incomplete&field.status=Confirmed&field.status=Triaged&field.status=In+Progress&field.status=Fix+Committed&search=Search'
844
845- >>> print ubuntu_firefox_bugcounts['open_bugs_count']
846+ >>> print(ubuntu_firefox_bugcounts['open_bugs_count'])
847 1
848- >>> print ubuntu_firefox_bugcounts['critical_bugs_count']
849+ >>> print(ubuntu_firefox_bugcounts['critical_bugs_count'])
850 0
851- >>> print ubuntu_firefox_bugcounts['unassigned_bugs_count']
852+ >>> print(ubuntu_firefox_bugcounts['unassigned_bugs_count'])
853 1
854- >>> print ubuntu_firefox_bugcounts['inprogress_bugs_count']
855+ >>> print(ubuntu_firefox_bugcounts['inprogress_bugs_count'])
856 0
857
858 >>> ubuntu_firefox_bugcounts['open_bugs_url']
859@@ -214,13 +214,13 @@
860 bug counts, is also available.
861
862 >>> total_counts = packagebugs_search_view.total_bug_counts
863- >>> print total_counts['open_bugs_count']
864+ >>> print(total_counts['open_bugs_count'])
865 1
866- >>> print total_counts['critical_bugs_count']
867+ >>> print(total_counts['critical_bugs_count'])
868 0
869- >>> print total_counts['unassigned_bugs_count']
870+ >>> print(total_counts['unassigned_bugs_count'])
871 1
872- >>> print total_counts['inprogress_bugs_count']
873+ >>> print(total_counts['inprogress_bugs_count'])
874 0
875
876 Adding another bug will update the totals returned by
877@@ -251,25 +251,25 @@
878 We can see that the firefox bug counts have been altered:
879
880 >>> firefox_bug_counts = packagebugs_search_view.package_bug_counts[0]
881- >>> print firefox_bug_counts['open_bugs_count']
882+ >>> print(firefox_bug_counts['open_bugs_count'])
883 2
884- >>> print firefox_bug_counts['critical_bugs_count']
885+ >>> print(firefox_bug_counts['critical_bugs_count'])
886 1
887- >>> print firefox_bug_counts['unassigned_bugs_count']
888+ >>> print(firefox_bug_counts['unassigned_bugs_count'])
889 2
890- >>> print firefox_bug_counts['inprogress_bugs_count']
891+ >>> print(firefox_bug_counts['inprogress_bugs_count'])
892 0
893
894 And the total bug counts reflect this:
895
896 >>> total_counts = packagebugs_search_view.total_bug_counts
897- >>> print total_counts['open_bugs_count']
898+ >>> print(total_counts['open_bugs_count'])
899 2
900- >>> print total_counts['critical_bugs_count']
901+ >>> print(total_counts['critical_bugs_count'])
902 1
903- >>> print total_counts['unassigned_bugs_count']
904+ >>> print(total_counts['unassigned_bugs_count'])
905 2
906- >>> print total_counts['inprogress_bugs_count']
907+ >>> print(total_counts['inprogress_bugs_count'])
908 0
909
910 Adding a new bug to a package other than Ubuntu Firefox will naturally
911@@ -292,37 +292,37 @@
912 So the total counts will have changed:
913
914 >>> total_counts = packagebugs_search_view.total_bug_counts
915- >>> print total_counts['open_bugs_count']
916+ >>> print(total_counts['open_bugs_count'])
917 3
918- >>> print total_counts['critical_bugs_count']
919+ >>> print(total_counts['critical_bugs_count'])
920 1
921- >>> print total_counts['unassigned_bugs_count']
922+ >>> print(total_counts['unassigned_bugs_count'])
923 3
924- >>> print total_counts['inprogress_bugs_count']
925+ >>> print(total_counts['inprogress_bugs_count'])
926 1
927
928 Whilst the firefox ones remain static:
929
930 >>> firefox_bug_counts = packagebugs_search_view.package_bug_counts[0]
931- >>> print firefox_bug_counts['open_bugs_count']
932+ >>> print(firefox_bug_counts['open_bugs_count'])
933 2
934- >>> print firefox_bug_counts['critical_bugs_count']
935+ >>> print(firefox_bug_counts['critical_bugs_count'])
936 1
937- >>> print firefox_bug_counts['unassigned_bugs_count']
938+ >>> print(firefox_bug_counts['unassigned_bugs_count'])
939 2
940- >>> print firefox_bug_counts['inprogress_bugs_count']
941+ >>> print(firefox_bug_counts['inprogress_bugs_count'])
942 0
943
944 And the pmount counts make up the difference between the two:
945
946 >>> pmount_bug_counts = packagebugs_search_view.package_bug_counts[1]
947- >>> print pmount_bug_counts['open_bugs_count']
948+ >>> print(pmount_bug_counts['open_bugs_count'])
949 1
950- >>> print pmount_bug_counts['critical_bugs_count']
951+ >>> print(pmount_bug_counts['critical_bugs_count'])
952 0
953- >>> print pmount_bug_counts['unassigned_bugs_count']
954+ >>> print(pmount_bug_counts['unassigned_bugs_count'])
955 1
956- >>> print pmount_bug_counts['inprogress_bugs_count']
957+ >>> print(pmount_bug_counts['inprogress_bugs_count'])
958 1
959
960 >>> transaction.abort()
961@@ -378,9 +378,9 @@
962 A new user will have no related bugs, and therefore no related
963 milestones.
964
965- >>> print pretty(list(related_bugs_view.searchUnbatched()))
966+ >>> print(pretty(list(related_bugs_view.searchUnbatched())))
967 []
968- >>> print pretty(related_bugs_view.getMilestoneWidgetValues())
969+ >>> print(pretty(related_bugs_view.getMilestoneWidgetValues()))
970 []
971
972 Even if the user registers a product with a milestone, the list of
973@@ -389,7 +389,7 @@
974 >>> product = factory.makeProduct(owner=user, displayname='Coughing Bob')
975 >>> milestone09 = factory.makeMilestone(product=product, name="0.9")
976
977- >>> print pretty(related_bugs_view.getMilestoneWidgetValues())
978+ >>> print(pretty(related_bugs_view.getMilestoneWidgetValues()))
979 []
980
981 Even if the user files a bug against a product with a milestone, the
982@@ -398,9 +398,9 @@
983 >>> bug = factory.makeBug(target=product, owner=user)
984 >>> transaction.commit()
985
986- >>> print pretty(list(related_bugs_view.searchUnbatched()))
987+ >>> print(pretty(list(related_bugs_view.searchUnbatched())))
988 [<BugTask ...>]
989- >>> print pretty(related_bugs_view.getMilestoneWidgetValues())
990+ >>> print(pretty(related_bugs_view.getMilestoneWidgetValues()))
991 []
992
993 Only when a milestone is set for a related bug task does the advanced
994@@ -409,7 +409,7 @@
995 >>> bug.bugtasks[0].milestone = milestone09
996 >>> transaction.commit()
997
998- >>> print pretty(related_bugs_view.getMilestoneWidgetValues())
999+ >>> print(pretty(related_bugs_view.getMilestoneWidgetValues()))
1000 [{'checked': False,
1001 'title': u'Coughing Bob 0.9',
1002 'value': ...}]
1003@@ -426,7 +426,7 @@
1004 The earlier bug was reported by our user, so the assigned milestone
1005 will already appear.
1006
1007- >>> print pretty(reported_bugs_view.getMilestoneWidgetValues())
1008+ >>> print(pretty(reported_bugs_view.getMilestoneWidgetValues()))
1009 [{'checked': False,
1010 'title': u'Coughing Bob 0.9',
1011 'value': ...}]
1012@@ -438,7 +438,7 @@
1013 >>> bug = factory.makeBug(target=product, owner=user)
1014 >>> bug.bugtasks[0].milestone = milestone10
1015
1016- >>> print pretty(reported_bugs_view.getMilestoneWidgetValues())
1017+ >>> print(pretty(reported_bugs_view.getMilestoneWidgetValues()))
1018 [{'checked': False,
1019 'title': u'Coughing Bob 1.0',
1020 'value': ...},
1021@@ -456,14 +456,14 @@
1022 No bugs have been assigned to our user, so no relevant milestones are
1023 found.
1024
1025- >>> print pretty(assigned_bugs_view.getMilestoneWidgetValues())
1026+ >>> print(pretty(assigned_bugs_view.getMilestoneWidgetValues()))
1027 []
1028
1029 Once a bug has been assigned, the milestone appears.
1030
1031 >>> bug.bugtasks[0].transitionToAssignee(user)
1032
1033- >>> print pretty(assigned_bugs_view.getMilestoneWidgetValues())
1034+ >>> print(pretty(assigned_bugs_view.getMilestoneWidgetValues()))
1035 [{'checked': False,
1036 'title': u'Coughing Bob 1.0',
1037 'value': ...}]
1038@@ -478,7 +478,7 @@
1039 Our user has not commented on any bugs, so no relevant milestones are
1040 found.
1041
1042- >>> print pretty(commented_bugs_view.getMilestoneWidgetValues())
1043+ >>> print(pretty(commented_bugs_view.getMilestoneWidgetValues()))
1044 []
1045
1046 Once the user has commented, the related milestone does appear.
1047@@ -486,7 +486,7 @@
1048 >>> bug.newMessage(user)
1049 <Message at ...>
1050
1051- >>> print pretty(commented_bugs_view.getMilestoneWidgetValues())
1052+ >>> print(pretty(commented_bugs_view.getMilestoneWidgetValues()))
1053 [{'checked': False,
1054 'title': u'Coughing Bob 1.0',
1055 'value': ...}]
1056@@ -502,7 +502,7 @@
1057 Our new_user is not subscribed to any bugs, so no relevant milestones
1058 are found.
1059
1060- >>> print pretty(subscribed_bugs_view.getMilestoneWidgetValues())
1061+ >>> print(pretty(subscribed_bugs_view.getMilestoneWidgetValues()))
1062 []
1063
1064 Once new_user has subscribed, the related milestones appear.
1065@@ -510,7 +510,7 @@
1066 >>> bug.subscribe(new_user, new_user)
1067 <lp.bugs.model.bugsubscription.BugSubscription ...>
1068
1069- >>> print pretty(subscribed_bugs_view.getMilestoneWidgetValues())
1070+ >>> print(pretty(subscribed_bugs_view.getMilestoneWidgetValues()))
1071 [{'checked': False,
1072 'title': u'Coughing Bob 1.0',
1073 'value': ...}]
1074
1075=== modified file 'lib/lp/bugs/browser/tests/test_views.py'
1076--- lib/lp/bugs/browser/tests/test_views.py 2011-12-28 17:03:06 +0000
1077+++ lib/lp/bugs/browser/tests/test_views.py 2018-06-30 16:32:46 +0000
1078@@ -44,8 +44,9 @@
1079 path = filename
1080 layer = special_test_layer.get(path, DatabaseFunctionalLayer)
1081 one_test = LayeredDocFileSuite(
1082- path, setUp=setUp, tearDown=tearDown, layer=layer,
1083- stdout_logging_level=logging.WARNING)
1084+ path,
1085+ setUp=lambda test: setUp(test, future=True), tearDown=tearDown,
1086+ layer=layer, stdout_logging_level=logging.WARNING)
1087 suite.addTest(one_test)
1088
1089 return suite
1090
1091=== modified file 'lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt'
1092--- lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt 2016-01-26 15:47:37 +0000
1093+++ lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt 2018-06-30 16:32:46 +0000
1094@@ -30,7 +30,7 @@
1095
1096 >>> user_browser.open(
1097 ... 'http://bugs.launchpad.dev/tomcat/+bug/2/+affects-new-product')
1098- >>> print user_browser.title
1099+ >>> print(user_browser.title)
1100 Register project affected by...
1101 >>> user_browser.getControl('Bug URL').value = (
1102 ... 'http://bugs.foo.org/bugs/show_bug.cgi?id=421')
1103@@ -39,7 +39,7 @@
1104 >>> user_browser.getControl('Project summary').value = 'The Bar Project'
1105 >>> user_browser.getControl('Continue').click()
1106
1107- >>> print user_browser.title
1108+ >>> print(user_browser.title)
1109 Register project affected by...
1110
1111 >>> print_feedback_messages(user_browser.contents)
1112@@ -73,7 +73,7 @@
1113
1114 >>> user_browser.goBack()
1115 >>> user_browser.getControl('Use Existing Project').click()
1116- >>> print user_browser.title
1117+ >>> print(user_browser.title)
1118 Register project affected by...
1119 >>> print_feedback_messages(user_browser.contents)
1120 There is 1 error.
1121@@ -106,7 +106,7 @@
1122 >>> user_browser.getControl('Project ID').value = 'bazfoo'
1123 >>> user_browser.getControl('Project summary').value = 'The Foo Project'
1124 >>> user_browser.getControl('Continue').click()
1125- >>> print user_browser.title
1126+ >>> print(user_browser.title)
1127 Register project affected by...
1128 >>> print_feedback_messages(user_browser.contents)
1129 There is 1 error.
1130
1131=== modified file 'lib/lp/bugs/stories/bug-also-affects/xx-bug-also-affects.txt'
1132--- lib/lp/bugs/stories/bug-also-affects/xx-bug-also-affects.txt 2016-01-26 15:47:37 +0000
1133+++ lib/lp/bugs/stories/bug-also-affects/xx-bug-also-affects.txt 2018-06-30 16:32:46 +0000
1134@@ -87,7 +87,7 @@
1135
1136 >>> browser.open('http://localhost/firefox/+bug/1')
1137 >>> browser.getLink(url='+distrotask').click()
1138- >>> print browser.url
1139+ >>> print(browser.url)
1140 http://bugs.launchpad.dev/firefox/+bug/1/+distrotask
1141
1142 >>> browser.getControl(name='field.distribution').value = ['debian']
1143@@ -95,7 +95,7 @@
1144 >>> browser.getControl('URL').value = (
1145 ... 'http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=123')
1146 >>> browser.getControl('Continue').click()
1147- >>> print browser.url
1148+ >>> print(browser.url)
1149 http://bugs.launchpad.dev/debian/+source/alsa-utils/+bug/1
1150
1151 If we try to add an Ubuntu task together with a bug watch we get an
1152@@ -107,7 +107,7 @@
1153 >>> browser.getControl('URL').value = (
1154 ... 'https://bugzilla.mozilla.org/show_bug.cgi?id=84')
1155 >>> browser.getControl('Continue').click()
1156- >>> print browser.url
1157+ >>> print(browser.url)
1158 http://bugs.launchpad.dev/debian/+source/alsa-utils/+bug/1/+distrotask
1159
1160 >>> print_feedback_messages(browser.contents)
1161@@ -121,20 +121,20 @@
1162
1163 >>> browser.getControl('URL').value = ''
1164 >>> browser.getControl('Continue').click()
1165- >>> print browser.url
1166+ >>> print(browser.url)
1167 http://bugs.launchpad.dev/ubuntu/+source/alsa-utils/+bug/1
1168
1169 It's not possible to change a bugtask to a existing one.
1170
1171 >>> browser.getLink(
1172 ... url='ubuntu/+source/mozilla-firefox/+bug/1/+editstatus').click()
1173- >>> print browser.url
1174+ >>> print(browser.url)
1175 http://bugs.../ubuntu/+source/mozilla-firefox/+bug/1/+editstatus
1176
1177 >>> browser.getControl(name="ubuntu_mozilla-firefox.target.package"
1178 ... ).value = 'alsa-utils'
1179 >>> browser.getControl('Save Changes').click()
1180- >>> print browser.url
1181+ >>> print(browser.url)
1182 http://bugs.../ubuntu/+source/mozilla-firefox/+bug/1/+editstatus
1183
1184 >>> print_feedback_messages(browser.contents)
1185@@ -144,7 +144,7 @@
1186 >>> browser.getControl(name="ubuntu_mozilla-firefox.target.package"
1187 ... ).value = 'pmount'
1188 >>> browser.getControl('Save Changes').click()
1189- >>> print browser.url
1190+ >>> print(browser.url)
1191 http://bugs.launchpad.dev/ubuntu/+source/pmount/+bug/1
1192
1193 We want to make people aware of that they should link bugtasks to bug
1194@@ -165,7 +165,7 @@
1195 >>> browser.getControl('Distribution').value = ['debian']
1196 >>> browser.getControl('Source Package Name').value = 'pmount'
1197 >>> browser.getControl('Continue').click()
1198- >>> print browser.url
1199+ >>> print(browser.url)
1200 http://bugs.launchpad.dev/ubuntu/+source/pmount/+bug/1/+distrotask
1201
1202 >>> print_feedback_messages(browser.contents)
1203@@ -181,7 +181,7 @@
1204 notification will still be displayed.
1205
1206 >>> browser.getControl('Continue').click()
1207- >>> print browser.url
1208+ >>> print(browser.url)
1209 http://bugs.launchpad.dev/ubuntu/+source/pmount/+bug/1/+distrotask
1210
1211 >>> print_feedback_messages(browser.contents)
1212@@ -191,10 +191,10 @@
1213 redirected to the bug page.
1214
1215 >>> browser.getControl('Add Anyway').click()
1216- >>> print browser.url
1217+ >>> print(browser.url)
1218 http://bugs.launchpad.dev/debian/+source/pmount/+bug/1
1219
1220- >>> print browser.contents
1221+ >>> print(browser.contents)
1222 <...
1223 ...>pmount (Debian)</a>...
1224 ...
1225@@ -230,7 +230,7 @@
1226 >>> browser.getLink(url='+choose-affected-product').click()
1227 >>> browser.getControl(name='field.product').value = other_product_name
1228 >>> browser.getControl('Continue').click()
1229- >>> print browser.url
1230+ >>> print(browser.url)
1231 http://bugs.launchpad.dev/proprietary-product/+bug/.../+choose-affected-product
1232
1233 >>> print_feedback_messages(browser.contents)
1234@@ -257,7 +257,7 @@
1235 >>> user_browser.getControl('Project').value
1236 Traceback (most recent call last):
1237 ...
1238- LookupError: label 'Project'
1239+ LookupError: label u'Project'
1240
1241 >>> user_browser.getControl(name='field.product').value
1242 'evolution'
1243@@ -266,7 +266,7 @@
1244 product, though.
1245
1246 >>> user_browser.getLink('Choose another project').click()
1247- >>> print user_browser.url
1248+ >>> print(user_browser.url)
1249 http://bugs.launchpad.dev/ubuntu/+source/evolution/+bug/6/+choose-affected-product?field.product=evolution
1250
1251 >>> user_browser.getControl('Project').value
1252@@ -276,7 +276,7 @@
1253 to the bug page:
1254
1255 >>> cancel_link = user_browser.getLink('Cancel')
1256- >>> print cancel_link.url
1257+ >>> print(cancel_link.url)
1258 http://bugs.launchpad.dev/ubuntu/+source/evolution/+bug/6
1259
1260 But we'll choose Thunderbird.
1261@@ -311,7 +311,7 @@
1262 tracker.
1263
1264 >>> user_browser.getControl('Add to Bug Report').click()
1265- >>> print user_browser.url
1266+ >>> print(user_browser.url)
1267 http://bugs.launchpad.dev/thunderbird/+bug/6
1268
1269 Let's add the evolution task as well.
1270@@ -319,12 +319,12 @@
1271 >>> user_browser.open(
1272 ... 'http://launchpad.dev/ubuntu/+source/evolution/+bug/6')
1273 >>> user_browser.getLink(url='+choose-affected-product').click()
1274- >>> print user_browser.url
1275+ >>> print(user_browser.url)
1276 http://.../ubuntu/+source/evolution/+bug/6/+choose-affected-product
1277
1278 >>> user_browser.getControl('Add to Bug Report').click()
1279
1280- >>> print user_browser.url
1281+ >>> print(user_browser.url)
1282 http://bugs.launchpad.dev/evolution/+bug/6
1283
1284
1285@@ -336,14 +336,14 @@
1286 >>> user_browser.open(
1287 ... 'http://launchpad.dev/debian/+source/mozilla-firefox/+bug/3')
1288 >>> user_browser.getLink(url='+choose-affected-product').click()
1289- >>> print user_browser.url
1290+ >>> print(user_browser.url)
1291 http://.../debian/+source/mozilla-firefox/+bug/3/+choose-affected-product
1292
1293 >>> user_browser.getControl('Project').value
1294 ''
1295
1296 >>> user_browser.getControl('Continue').click()
1297- >>> print user_browser.url
1298+ >>> print(user_browser.url)
1299 http://.../debian/+source/mozilla-firefox/+bug/3/+choose-affected-product
1300
1301 We get a nice error message.
1302@@ -357,7 +357,7 @@
1303
1304 >>> user_browser.getControl('Project').value = 'no-such-product'
1305 >>> user_browser.getControl('Continue').click()
1306- >>> print user_browser.url
1307+ >>> print(user_browser.url)
1308 http://.../debian/+source/mozilla-firefox/+bug/3/+choose-affected-product
1309
1310 >>> print_feedback_messages(user_browser.contents)
1311@@ -365,7 +365,7 @@
1312 There is no project in Launchpad named "no-such-product"...
1313
1314 >>> search_link = user_browser.getLink('search for it')
1315- >>> print search_link.url
1316+ >>> print(search_link.url)
1317 http://bugs.launchpad.dev/projects
1318
1319 Since we don't restrict the input, the user can write anything, so we
1320@@ -375,9 +375,9 @@
1321 ... 'http://launchpad.dev/debian/+source/mozilla-firefox/+bug/3'
1322 ... '/+choose-affected-product')
1323
1324- >>> user_browser.getControl('Project').value = 'N\xc3\xb6 Such Product&<>'
1325+ >>> user_browser.getControl('Project').value = b'N\xc3\xb6 Such Product&<>'
1326 >>> user_browser.getControl('Continue').click()
1327- >>> print user_browser.url
1328+ >>> print(user_browser.url)
1329 http://.../debian/+source/mozilla-firefox/+bug/3/+choose-affected-product
1330
1331 >>> print_feedback_messages(user_browser.contents)
1332@@ -406,7 +406,7 @@
1333 Launchpad redirects to the newly created bugtask page, with a row for
1334 the new bug watch.
1335
1336- >>> print user_browser.url
1337+ >>> print(user_browser.url)
1338 http://bugs.launchpad.dev/alsa-utils/+bug/3
1339
1340 >>> affects_table = find_tags_by_class(
1341@@ -427,12 +427,12 @@
1342 And now we try to add the same upstream again.
1343
1344 >>> user_browser.getLink(url='+choose-affected-product').click()
1345- >>> print user_browser.url
1346+ >>> print(user_browser.url)
1347 http://bugs.launchpad.dev/alsa-utils/+bug/3/+choose-affected-product
1348
1349 >>> user_browser.getControl('Project').value = 'alsa-utils'
1350 >>> user_browser.getControl('Continue').click()
1351- >>> print user_browser.url
1352+ >>> print(user_browser.url)
1353 http://bugs.launchpad.dev/alsa-utils/+bug/3/+choose-affected-product
1354
1355 We get a nice error message.
1356@@ -446,20 +446,20 @@
1357 >>> user_browser.getControl('Project').value = 'evolution'
1358 >>> user_browser.getControl('Continue').click()
1359 >>> user_browser.getControl('Add to Bug Report').click()
1360- >>> print user_browser.url
1361+ >>> print(user_browser.url)
1362 http://bugs.launchpad.dev/evolution/+bug/3
1363
1364 But if we try to change it to the target of an existing upstream
1365 bugtask, our validator springs into action.
1366
1367 >>> user_browser.getLink(url='evolution/+bug/3/+editstatus').click()
1368- >>> print user_browser.url
1369+ >>> print(user_browser.url)
1370 http://bugs.launchpad.dev/evolution/+bug/3/+editstatus
1371
1372 >>> user_browser.getControl(name='evolution.target.product').value = (
1373 ... 'alsa-utils')
1374 >>> user_browser.getControl('Save Changes').click()
1375- >>> print user_browser.url
1376+ >>> print(user_browser.url)
1377 http://bugs.launchpad.dev/evolution/+bug/3/+editstatus
1378
1379 >>> print_feedback_messages(user_browser.contents)
1380@@ -482,7 +482,7 @@
1381 ... '+choose-affected-product')
1382 >>> user_browser.getControl('Project').value = 'gnome-terminal'
1383 >>> user_browser.getControl('Continue').click()
1384- >>> print user_browser.url
1385+ >>> print(user_browser.url)
1386 http://bugs.launchpad.dev/firefox/+bug/4/+choose-affected-product
1387
1388 >>> user_browser.getControl('I have the URL').selected = True
1389@@ -493,19 +493,19 @@
1390 that points back to the bug page:
1391
1392 >>> cancel_link = user_browser.getLink('Cancel')
1393- >>> print cancel_link.url
1394+ >>> print(cancel_link.url)
1395 http://bugs.launchpad.dev/firefox/+bug/4
1396
1397 But we're happy, so we add the bug watch.
1398
1399 >>> user_browser.getControl('Add to Bug Report').click()
1400- >>> print user_browser.url
1401+ >>> print(user_browser.url)
1402 http://bugs.launchpad.dev/gnome-terminal/+bug/4
1403
1404 >>> bug_watches = find_portlet(
1405 ... user_browser.contents, 'Remote bug watches')
1406 >>> for li in bug_watches('li'):
1407- ... print li.findAll('a')[0].renderContents()
1408+ ... print(li.findAll('a')[0].renderContents())
1409 gnome-bugzilla #42
1410
1411 It's possible to supply an HTTPS URL, even though the bug tracker's base
1412@@ -516,14 +516,14 @@
1413 ... '+choose-affected-product')
1414 >>> user_browser.getControl('Project').value = 'netapplet'
1415 >>> user_browser.getControl('Continue').click()
1416- >>> print user_browser.url
1417+ >>> print(user_browser.url)
1418 http://bugs.launchpad.dev/firefox/+bug/4/+choose-affected-product
1419
1420 >>> user_browser.getControl('I have the URL').selected = True
1421 >>> user_browser.getControl(name='field.bug_url').value = (
1422 ... u'https://bugzilla.gnome.org/bugs/show_bug.cgi?id=84')
1423 >>> user_browser.getControl('Add to Bug Report').click()
1424- >>> print user_browser.url
1425+ >>> print(user_browser.url)
1426 http://bugs.launchpad.dev/netapplet/+bug/4
1427
1428 The URL was automatically converted to HTTP:
1429@@ -531,7 +531,7 @@
1430 >>> bug_watches = find_portlet(
1431 ... user_browser.contents, 'Remote bug watches')
1432 >>> for li in bug_watches('li'):
1433- ... print li.findAll('a')[0]['href']
1434+ ... print(li.findAll('a')[0]['href'])
1435 http://bugzilla.gnome.org/bugs/show_bug.cgi?id=42
1436 http://bugzilla.gnome.org/bugs/show_bug.cgi?id=84
1437
1438@@ -543,18 +543,18 @@
1439 ... '+choose-affected-product')
1440 >>> user_browser.getControl('Project').value = 'alsa-utils'
1441 >>> user_browser.getControl('Continue').click()
1442- >>> print user_browser.url
1443+ >>> print(user_browser.url)
1444 http://bugs.launchpad.dev/firefox/+bug/4/+choose-affected-product
1445
1446 >>> user_browser.getControl('I have the URL').selected = True
1447 >>> user_browser.getControl(name='field.bug_url').value = (
1448 ... u'http://bugs.unknown/42')
1449 >>> user_browser.getControl('Add to Bug Report').click()
1450- >>> print user_browser.url
1451+ >>> print(user_browser.url)
1452 http://bugs.launchpad.dev/firefox/+bug/4/+choose-affected-product
1453
1454 >>> for message in find_tags_by_class(user_browser.contents, 'message'):
1455- ... print message.renderContents()
1456+ ... print(message.renderContents())
1457 There is 1 error.
1458 Launchpad does not recognize the bug tracker at this URL.
1459
1460@@ -565,7 +565,7 @@
1461 >>> user_browser.getControl(name='field.bug_url').value = (
1462 ... u"http://new.trac/ticket/42")
1463 >>> user_browser.getControl('Add to Bug Report').click()
1464- >>> print user_browser.url
1465+ >>> print(user_browser.url)
1466 http://bugs.launchpad.dev/firefox/+bug/4/+choose-affected-product
1467
1468 >>> print_feedback_messages(user_browser.contents)
1469@@ -576,7 +576,7 @@
1470 As before, if we change our mind, we can back out if we want.
1471
1472 >>> cancel_link = user_browser.getLink('Cancel')
1473- >>> print cancel_link.url
1474+ >>> print(cancel_link.url)
1475 http://bugs.launchpad.dev/firefox/+bug/4
1476
1477 Now the user confirms they want us to register the bug tracker for them
1478@@ -586,7 +586,7 @@
1479
1480 The bug watch is linked, and we're redirected to the bug's page.
1481
1482- >>> print user_browser.url
1483+ >>> print(user_browser.url)
1484 http://bugs.launchpad.dev/alsa-utils/+bug/4
1485
1486 The bug tracker and bug watch were added. We can see that the bugtracker
1487@@ -596,7 +596,7 @@
1488 >>> bug_watches = find_portlet(
1489 ... user_browser.contents, 'Remote bug watches')
1490 >>> for li in bug_watches('li'):
1491- ... print li.findAll('a')[0].renderContents()
1492+ ... print(li.findAll('a')[0].renderContents())
1493 gnome-bugzilla #42
1494 gnome-bugzilla #84
1495 auto-new.trac #42
1496@@ -609,20 +609,20 @@
1497 ... '+choose-affected-product')
1498 >>> user_browser.getControl('Project').value = 'thunderbird'
1499 >>> user_browser.getControl('Continue').click()
1500- >>> print user_browser.url
1501+ >>> print(user_browser.url)
1502 http://bugs.launchpad.dev/firefox/+bug/4/+choose-affected-product
1503
1504 >>> user_browser.getControl('I have the URL').selected = True
1505 >>> user_browser.getControl(name='field.bug_url').value = (
1506 ... u'bugzilla.gnome.org/bugs/show_bug.cgi?id=168')
1507 >>> user_browser.getControl('Add to Bug Report').click()
1508- >>> print user_browser.url
1509+ >>> print(user_browser.url)
1510 http://bugs.launchpad.dev/thunderbird/+bug/4
1511
1512 >>> bug_watches = find_portlet(
1513 ... user_browser.contents, 'Remote bug watches')
1514 >>> for li in bug_watches('li'):
1515- ... print li.findAll('a')[0]['href']
1516+ ... print(li.findAll('a')[0]['href'])
1517 http://bugzilla.gnome.org/bugs/show_bug.cgi?id=168
1518 http://bugzilla.gnome.org/bugs/show_bug.cgi?id=42
1519 http://bugzilla.gnome.org/bugs/show_bug.cgi?id=84
1520@@ -659,19 +659,19 @@
1521 confirmation.
1522
1523 >>> user_browser.getControl('Add to Bug Report').click()
1524- >>> print user_browser.url
1525+ >>> print(user_browser.url)
1526 http://bugs.launchpad.dev/gnome-terminal/+bug/12
1527
1528 >>> def print_remote_bug_watches_portlet(browser):
1529 ... bug_watches = find_portlet(
1530 ... browser.contents, 'Remote bug watches')
1531 ... for li in bug_watches('li'):
1532- ... print ' '.join(extract_text(li).splitlines())
1533+ ... print(' '.join(extract_text(li).splitlines()))
1534 ... bug_watch_link = li.find('a', {'class': 'link-external'})
1535 ... if bug_watch_link is None:
1536- ... print ' --> None'
1537+ ... print(' --> None')
1538 ... else:
1539- ... print ' --> %s' % bug_watch_link.get('href')
1540+ ... print(' --> %s' % bug_watch_link.get('href'))
1541
1542 >>> import re
1543 >>> def print_assigned_bugtasks(browser):
1544@@ -687,10 +687,10 @@
1545 ... if assignee and not 'Unassigned' in assignee:
1546 ... assignee_link = cells[-2].a
1547 ... if assignee_link is None:
1548- ... print '%s -->\n %s' % (affects, assignee)
1549+ ... print('%s -->\n %s' % (affects, assignee))
1550 ... else:
1551- ... print '%s -->\n %s\n %s' % (
1552- ... affects, assignee, assignee_link['href'])
1553+ ... print('%s -->\n %s\n %s' % (
1554+ ... affects, assignee, assignee_link['href']))
1555
1556 >>> print_remote_bug_watches_portlet(user_browser)
1557 auto-dark-master-o-bugs...
1558@@ -702,7 +702,7 @@
1559 mailto:dark-master-o-bugs@mylittlepony.com
1560
1561 >>> user_browser.contents.count(
1562- ... 'mailto:dark-master-o-bugs@mylittlepony.com')
1563+ ... b'mailto:dark-master-o-bugs@mylittlepony.com')
1564 3
1565
1566 To evade harvesting, the email address above is obfuscated if you're not
1567@@ -718,5 +718,5 @@
1568 auto-dark-master-o-bugs
1569
1570 >>> anon_browser.contents.count(
1571- ... 'mailto:dark-master-o-bugs@mylittlepony.com')
1572+ ... b'mailto:dark-master-o-bugs@mylittlepony.com')
1573 0
1574
1575=== modified file 'lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt'
1576--- lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt 2012-06-12 16:09:33 +0000
1577+++ lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt 2018-06-30 16:32:46 +0000
1578@@ -8,7 +8,7 @@
1579 ... 'http://launchpad.dev/firefox/+bug/1/+choose-affected-product')
1580 >>> user_browser.getControl('Project').value = 'gnome-terminal'
1581 >>> user_browser.getControl('Continue').click()
1582- >>> print user_browser.contents.decode('ascii', 'ignore')
1583+ >>> print(user_browser.contents.decode('ascii', 'ignore'))
1584 <...GNOME Terminal uses
1585 <a href="http://bugzilla.gnome.org/bugs">GnomeGBug GTracker</a>
1586 to track its bugs...
1587@@ -30,7 +30,7 @@
1588 ... 'http://launchpad.dev/firefox/+bug/1/+choose-affected-product')
1589 >>> user_browser.getControl('Project').value = 'thunderbird'
1590 >>> user_browser.getControl('Continue').click()
1591- >>> print user_browser.contents.decode('ascii', 'ignore')
1592+ >>> print(user_browser.contents.decode('ascii', 'ignore'))
1593 <...Mozilla Thunderbird doesn't use Launchpad to track its bugs...
1594
1595 >>> print_upstream_linking_form(user_browser)
1596
1597=== modified file 'lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt'
1598--- lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt 2017-10-23 00:16:39 +0000
1599+++ lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt 2018-06-30 16:32:46 +0000
1600@@ -21,7 +21,7 @@
1601 >>> bugwatch_portlet = find_portlet(
1602 ... user_browser.contents, 'Remote bug watches')
1603 >>> for li_tag in bugwatch_portlet.findAll('li'):
1604- ... print li_tag.findAll('a')[0].renderContents()
1605+ ... print(li_tag.findAll('a')[0].renderContents())
1606 debbugs #42
1607
1608 If we add another bug watch, pointing to the same URL, the previous one
1609@@ -42,12 +42,12 @@
1610 >>> user_browser.getControl('URL').value = debian_bug
1611 >>> user_browser.getControl('Continue').click()
1612 >>> for tag in find_tags_by_class(user_browser.contents, 'message'):
1613- ... print tag
1614+ ... print(tag)
1615
1616 >>> bugwatch_portlet = find_portlet(
1617 ... user_browser.contents, 'Remote bug watches')
1618 >>> for li_tag in bugwatch_portlet.findAll('li'):
1619- ... print li_tag.findAll('a')[0].string
1620+ ... print(li_tag.findAll('a')[0].string)
1621 debbugs #42
1622
1623 Both the thunderbird and gnome-terminal Debian tasks are pointing to the
1624
1625=== modified file 'lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt'
1626--- lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt 2010-06-18 00:46:17 +0000
1627+++ lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt 2018-06-30 16:32:46 +0000
1628@@ -18,7 +18,7 @@
1629 general.
1630
1631 >>> text = find_tag_by_id(user_browser.contents, 'upstream-text')
1632- >>> print extract_text(text)
1633+ >>> print(extract_text(text))
1634 Mozilla Thunderbird
1635 doesn't use Launchpad to track its bugs. If you know this bug
1636 has been reported in another bug tracker, you can link to it;
1637@@ -42,7 +42,7 @@
1638 >>> user_browser.getControl('Continue').click()
1639
1640 >>> text = find_tag_by_id(user_browser.contents, 'upstream-text')
1641- >>> print extract_text(text)
1642+ >>> print(extract_text(text))
1643 Mozilla Thunderbird
1644 uses The Mozilla.org Bug Tracker to
1645 track its bugs. If you know this bug has been reported there,
1646@@ -60,7 +60,7 @@
1647 >>> user_browser.getControl('Continue').click()
1648
1649 >>> text = find_tag_by_id(user_browser.contents, 'upstream-text')
1650- >>> print extract_text(text)
1651+ >>> print(extract_text(text))
1652 GNOME Terminal uses GnomeGBug GTracker to track its bugs.
1653 If you know this bug has been reported there, you can link to it;
1654 Launchpad will keep track of its status for you.
1655@@ -80,7 +80,7 @@
1656 >>> scheme, netloc, path, params, query, fragment = urlparse(url)
1657 >>> [long_desc] = parse_qs(query)['long_desc']
1658
1659- >>> print long_desc
1660+ >>> print(long_desc)
1661 Originally reported at:
1662 http://bugs.launchpad.dev/bugs/13
1663 <BLANKLINE>
1664@@ -104,7 +104,7 @@
1665 >>> user_browser.getControl('Continue').click()
1666
1667 >>> text = find_tag_by_id(user_browser.contents, 'upstream-text')
1668- >>> print extract_text(text)
1669+ >>> print(extract_text(text))
1670 GNOME Terminal uses Debian Bug tracker to track its bugs.
1671 If you know this bug has been reported there, you can link to it;
1672 Launchpad will keep track of its status for you.
1673@@ -127,5 +127,5 @@
1674
1675 >>> admin_browser.open(
1676 ... 'http://launchpad.dev/thunderbird/+configure-bugtracker')
1677- >>> print admin_browser.getControl(name='field.remote_product').value
1678+ >>> print(admin_browser.getControl(name='field.remote_product').value)
1679 Thunderbird
1680
1681=== modified file 'lib/lp/bugs/stories/bug-privacy/xx-bug-privacy.txt'
1682--- lib/lp/bugs/stories/bug-privacy/xx-bug-privacy.txt 2016-01-26 15:47:37 +0000
1683+++ lib/lp/bugs/stories/bug-privacy/xx-bug-privacy.txt 2018-06-30 16:32:46 +0000
1684@@ -10,7 +10,7 @@
1685
1686 >>> browser.getControl("Private", index=1).selected = True
1687 >>> browser.getControl("Change").click()
1688- >>> print browser.url
1689+ >>> print(browser.url)
1690 http://bugs.launchpad.dev/debian/+source/mozilla-firefox/+bug/2
1691
1692 When we go back to the secrecy form, the previously set value is pre-selected.
1693@@ -40,17 +40,17 @@
1694 >>> browser.getControl("Submit Bug Report").click()
1695
1696 >>> bug_id = browser.url.split("/")[-1]
1697- >>> print browser.url.replace(bug_id, "BUG-ID")
1698+ >>> print(browser.url.replace(bug_id, "BUG-ID"))
1699 http://bugs.launchpad.dev/ubuntu/+source/evolution/+bug/BUG-ID
1700
1701- >>> print browser.contents
1702+ >>> print(browser.contents)
1703 <!DOCTYPE...
1704 ...Security-related bugs are by default private...
1705
1706 Foo Bar sees the private bug they filed.
1707
1708 >>> browser.open("http://launchpad.dev/ubuntu/+bugs")
1709- >>> print browser.contents.replace(bug_id, "BUG-ID")
1710+ >>> print(browser.contents.replace(bug_id, "BUG-ID"))
1711 <!DOCTYPE...
1712 ...
1713 ...Ubuntu...
1714
1715=== modified file 'lib/lp/bugs/stories/bug-privacy/xx-presenting-private-bugs.txt'
1716--- lib/lp/bugs/stories/bug-privacy/xx-presenting-private-bugs.txt 2012-07-17 14:29:17 +0000
1717+++ lib/lp/bugs/stories/bug-privacy/xx-presenting-private-bugs.txt 2018-06-30 16:32:46 +0000
1718@@ -5,7 +5,7 @@
1719
1720 >>> browser = setupBrowser(auth="Basic foo.bar@canonical.com:test")
1721 >>> browser.open("http://launchpad.dev/bugs/4")
1722- >>> print extract_text(find_tag_by_id(browser.contents, 'privacy'))
1723+ >>> print(extract_text(find_tag_by_id(browser.contents, 'privacy')))
1724 This report contains Public information...
1725
1726 But when marked private, it gains the standard Launchpad presentation
1727@@ -14,16 +14,16 @@
1728 >>> browser.open("http://bugs.launchpad.dev/firefox/+bug/4/+secrecy")
1729 >>> browser.getControl("Private", index=1).selected = True
1730 >>> browser.getControl("Change").click()
1731- >>> print browser.url
1732+ >>> print(browser.url)
1733 http://bugs.launchpad.dev/firefox/+bug/4
1734- >>> print extract_text(find_tag_by_id(browser.contents, 'privacy'))
1735+ >>> print(extract_text(find_tag_by_id(browser.contents, 'privacy')))
1736 This report contains Private information...
1737
1738 Bugs created before we started recording the date and time and who
1739 marked the bug private show only a simple message:
1740
1741 >>> browser.open("http://launchpad.dev/bugs/14")
1742- >>> print extract_text(find_tag_by_id(browser.contents, 'privacy'))
1743+ >>> print(extract_text(find_tag_by_id(browser.contents, 'privacy')))
1744 This report contains Private Security information...
1745
1746 But newer bugs that are filed private at creation time (like security
1747@@ -39,9 +39,9 @@
1748 >>> browser.getControl("Private Security").selected = True
1749 >>> browser.getControl("Submit Bug Report").click()
1750
1751- >>> print browser.url
1752+ >>> print(browser.url)
1753 http://bugs.launchpad.dev/firefox/+bug/...
1754- >>> print extract_text(find_tag_by_id(browser.contents, 'privacy'))
1755+ >>> print(extract_text(find_tag_by_id(browser.contents, 'privacy')))
1756 This report contains Private Security information...
1757
1758 XXX 20080708 mpt: Bug 246671 again.
1759
1760=== modified file 'lib/lp/bugs/stories/bug-release-management/xx-bug-release-management.txt'
1761--- lib/lp/bugs/stories/bug-release-management/xx-bug-release-management.txt 2012-10-04 23:49:42 +0000
1762+++ lib/lp/bugs/stories/bug-release-management/xx-bug-release-management.txt 2018-06-30 16:32:46 +0000
1763@@ -29,7 +29,7 @@
1764
1765 >>> feedback_msg = find_tags_by_class(
1766 ... admin_browser.contents, "informational message")[0]
1767- >>> print feedback_msg.renderContents()
1768+ >>> print(feedback_msg.renderContents())
1769 Approved nomination for Mozilla Firefox 1.0
1770
1771 After a productseries task has been created, it's editable.
1772@@ -58,7 +58,7 @@
1773
1774 >>> feedback_msg = find_tags_by_class(
1775 ... admin_browser.contents, "informational message")[0]
1776- >>> print feedback_msg.renderContents()
1777+ >>> print(feedback_msg.renderContents())
1778 Declined nomination for Ubuntu Hoary
1779
1780 Nominate a bug to a distribution release
1781@@ -102,7 +102,7 @@
1782 >>> nominater_browser.getControl("Aqua").selected = True
1783 >>> nominater_browser.getControl("Nominate").click()
1784 >>> for tag in find_tags_by_class(nominater_browser.contents, 'message'):
1785- ... print tag
1786+ ... print(tag)
1787 <div...Added nominations for: Poseidon Aqua...
1788
1789 Now, if the nominater, having the form open in another browser window,
1790@@ -114,7 +114,7 @@
1791
1792 >>> for tag in find_tags_by_class(nominater_other_browser.contents,
1793 ... 'message'):
1794- ... print tag.renderContents()
1795+ ... print(tag.renderContents())
1796 There is 1 error.
1797 This bug has already been nominated for these series: Aqua
1798
1799@@ -129,7 +129,7 @@
1800 >>> admin_browser.getControl("Target").click()
1801
1802 >>> for tag in find_tags_by_class(admin_browser.contents, 'message'):
1803- ... print tag
1804+ ... print(tag)
1805 <div...Targeted bug to: Poseidon Hydro...
1806
1807 Nominating a bug for a product series
1808@@ -168,7 +168,7 @@
1809 >>> nominater_browser.getControl("Nominate").click()
1810
1811 >>> for tag in find_tags_by_class(nominater_browser.contents, 'message'):
1812- ... print tag
1813+ ... print(tag)
1814 <div...Added nominations for: Widget beta...
1815
1816 Now, if the nominater, having the form open in another browser window,
1817@@ -178,7 +178,7 @@
1818
1819 >>> for tag in find_tags_by_class(nominater_other_browser.contents,
1820 ... 'message'):
1821- ... print tag.renderContents()
1822+ ... print(tag.renderContents())
1823 There is 1 error.
1824 This bug has already been nominated for these series: Beta
1825
1826@@ -192,7 +192,7 @@
1827 >>> admin_browser.getControl("Target").click()
1828
1829 >>> for tag in find_tags_by_class(admin_browser.contents, 'message'):
1830- ... print tag
1831+ ... print(tag)
1832 <div...Targeted bug to: Widget trunk...
1833
1834 When a bug is targeted to the current development release, the general
1835@@ -220,8 +220,8 @@
1836 >>> admin_browser.getControl('Bug Supervisor').value = 'no-priv'
1837 >>> admin_browser.getControl('Change').click()
1838
1839- >>> print extract_text(
1840- ... find_tag_by_id(admin_browser.contents, 'bug-supervisor'))
1841+ >>> print(extract_text(
1842+ ... find_tag_by_id(admin_browser.contents, 'bug-supervisor')))
1843 Bug supervisor:
1844 No Privileges Person
1845
1846@@ -307,8 +307,8 @@
1847 >>> admin_browser.getControl('Bug Supervisor').value = 'no-priv'
1848 >>> admin_browser.getControl('Change').click()
1849
1850- >>> print extract_text(find_tag_by_id(admin_browser.contents,
1851- ... 'bug-supervisor'))
1852+ >>> print(extract_text(find_tag_by_id(admin_browser.contents,
1853+ ... 'bug-supervisor')))
1854 Bug supervisor:
1855 No Privileges Person
1856
1857
1858=== modified file 'lib/lp/bugs/stories/bug-tags/xx-official-bug-tags.txt'
1859--- lib/lp/bugs/stories/bug-tags/xx-official-bug-tags.txt 2012-08-08 07:22:51 +0000
1860+++ lib/lp/bugs/stories/bug-tags/xx-official-bug-tags.txt 2018-06-30 16:32:46 +0000
1861@@ -7,7 +7,7 @@
1862 >>> admin_browser.open(
1863 ... 'http://bugs.launchpad.dev/firefox')
1864 >>> admin_browser.getLink('Edit official tags').click()
1865- >>> print admin_browser.url
1866+ >>> print(admin_browser.url)
1867 http://bugs.launchpad.dev/firefox/+manage-official-tags
1868
1869 Tags are entered into a textarea as a list of white-spaces separated
1870@@ -15,11 +15,11 @@
1871
1872 >>> admin_browser.getControl('Official Bug Tags').value = 'foo bar'
1873 >>> admin_browser.getControl('Save').click()
1874- >>> print admin_browser.url
1875+ >>> print(admin_browser.url)
1876 http://bugs.launchpad.dev/firefox
1877 >>> admin_browser.open(
1878 ... 'http://bugs.launchpad.dev/firefox/+manage-official-tags')
1879- >>> print admin_browser.getControl('Official Bug Tags').value
1880+ >>> print(admin_browser.getControl('Official Bug Tags').value)
1881 bar foo
1882
1883 The link as well as the edit form is only available for products and
1884@@ -27,7 +27,7 @@
1885
1886 >>> admin_browser.open(
1887 ... 'http://bugs.launchpad.dev/firefox/1.0')
1888- >>> print admin_browser.getLink('Edit official tags')
1889+ >>> print(admin_browser.getLink('Edit official tags'))
1890 Traceback (most recent call last):
1891 ...
1892 LinkNotFoundError
1893@@ -42,7 +42,7 @@
1894 administrators but not for ordinary users.
1895
1896 >>> browser.open('http://bugs.launchpad.dev/firefox')
1897- >>> print browser.getLink('Edit official tags')
1898+ >>> print(browser.getLink('Edit official tags'))
1899 Traceback (most recent call last):
1900 ...
1901 LinkNotFoundError
1902@@ -68,18 +68,18 @@
1903 >>> bug_super_browser.open(
1904 ... 'http://bugs.launchpad.dev/youbuntu')
1905 >>> bug_super_browser.getLink('Edit official tags').click()
1906- >>> print bug_super_browser.url
1907+ >>> print(bug_super_browser.url)
1908 http://bugs.launchpad.dev/youbuntu/+manage-official-tags
1909
1910 The bug supervisor can also set the tags for the product.
1911
1912 >>> bug_super_browser.getControl('Official Bug Tags').value = 'foo bar'
1913 >>> bug_super_browser.getControl('Save').click()
1914- >>> print bug_super_browser.url
1915+ >>> print(bug_super_browser.url)
1916 http://bugs.launchpad.dev/youbuntu
1917 >>> bug_super_browser.open(
1918 ... 'http://bugs.launchpad.dev/youbuntu/+manage-official-tags')
1919- >>> print bug_super_browser.getControl('Official Bug Tags').value
1920+ >>> print(bug_super_browser.getControl('Official Bug Tags').value)
1921 bar foo
1922
1923 Official Tags on Bug Pages
1924@@ -133,6 +133,6 @@
1925
1926 >>> browser.open(bug_url)
1927 >>> js = find_tag_by_id(browser.contents, 'available-official-tags-js')
1928- >>> print js
1929+ >>> print(js)
1930 <script...>var available_official_tags =
1931 ["eenie", "meenie", "miney", "moe"];</script>
1932
1933=== modified file 'lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt'
1934--- lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt 2012-12-10 13:43:47 +0000
1935+++ lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt 2018-06-30 16:32:46 +0000
1936@@ -32,7 +32,7 @@
1937 >>> anon_browser.getControl('Search', index=0).click()
1938
1939 >>> for tag in find_tags_by_class(anon_browser.contents, 'message'):
1940- ... print tag.renderContents()
1941+ ... print(tag.renderContents())
1942 &#x27;!!invalid!!&#x27; isn&#x27;t a valid tag name. Tags must start
1943 with a letter or number and be lowercase. The characters
1944 &quot;+&quot;, &quot;-&quot; and &quot;.&quot; are also allowed
1945@@ -58,7 +58,7 @@
1946
1947 Indeed, the markup is valid and correctly escaped:
1948
1949- >>> print find_tag_by_id(anon_browser.contents, 'field.tag').prettify()
1950+ >>> print(find_tag_by_id(anon_browser.contents, 'field.tag').prettify())
1951 <input class="textType" id="field.tag"
1952 name="field.tag" size="20" type="text"
1953 value='&lt;script&gt;alert("cheezburger");&lt;/script&gt;' />
1954@@ -66,7 +66,7 @@
1955 The error message is also valid and correctly escaped:
1956
1957 >>> for tag in find_tags_by_class(anon_browser.contents, 'message'):
1958- ... print tag.prettify()
1959+ ... print(tag.prettify())
1960 <div class="message">
1961 &#x27;&lt;script&gt;alert(&quot;cheezburger&quot;);&lt;/script&gt;&#x27; isn&#x27;t ...
1962 </div>
1963
1964=== modified file 'lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-listings-page.txt'
1965--- lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-listings-page.txt 2012-10-02 06:36:44 +0000
1966+++ lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-listings-page.txt 2018-06-30 16:32:46 +0000
1967@@ -4,11 +4,11 @@
1968
1969 >>> anon_browser.open('http://launchpad.dev/ubuntu/+bugs')
1970 >>> anon_browser.getLink(id='tags-content-link').click()
1971- >>> print anon_browser.url
1972+ >>> print(anon_browser.url)
1973 http://launchpad.dev/ubuntu/+bugtarget-portlet-tags-content
1974 >>> tags_portlet = find_tags_by_class(anon_browser.contents, 'data-list')[0]
1975 >>> for a_tag in tags_portlet('a'):
1976- ... print a_tag.renderContents()
1977+ ... print(a_tag.renderContents())
1978 crash
1979 pebcak
1980 dataloss
1981@@ -48,5 +48,5 @@
1982
1983 >>> anon_browser.open(
1984 ... 'http://launchpad.dev/tomcat/+bugtarget-portlet-tags-content')
1985- >>> print extract_text(anon_browser.contents)
1986+ >>> print(extract_text(anon_browser.contents))
1987 Tags
1988
1989=== modified file 'lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-page.txt'
1990--- lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-page.txt 2012-12-10 13:43:47 +0000
1991+++ lib/lp/bugs/stories/bug-tags/xx-tags-on-bug-page.txt 2018-06-30 16:32:46 +0000
1992@@ -3,7 +3,7 @@
1993 >>> user_browser.open('http://bugs.launchpad.dev/firefox/+bug/1')
1994 >>> user_browser.url
1995 'http://bugs.launchpad.dev/firefox/+bug/1'
1996- >>> print extract_text(find_tag_by_id(user_browser.contents, 'bug-tags'))
1997+ >>> print(extract_text(find_tag_by_id(user_browser.contents, 'bug-tags')))
1998 Add tags Tag help
1999
2000 Let's specify some tags:
2001@@ -19,7 +19,7 @@
2002 >>> user_browser.getControl('Change').click()
2003
2004 >>> for tag in find_tags_by_class(user_browser.contents, 'message'):
2005- ... print tag.renderContents()
2006+ ... print(tag.renderContents())
2007 There is 1 error.
2008 &#x27;!!invalid!!&#x27; isn&#x27;t a valid tag name. Tags must start
2009 with a letter or number and be lowercase. The characters
2010@@ -35,11 +35,11 @@
2011
2012 Now the tags will be displayed on the bug page:
2013
2014- >>> 'Tags:' in user_browser.contents
2015- True
2016- >>> 'foo' in user_browser.contents
2017- True
2018- >>> 'bar' in user_browser.contents
2019+ >>> b'Tags:' in user_browser.contents
2020+ True
2021+ >>> b'foo' in user_browser.contents
2022+ True
2023+ >>> b'bar' in user_browser.contents
2024 True
2025
2026 Simply changing the ordering of the bug tags won't cause anything to
2027
2028=== modified file 'lib/lp/bugs/stories/bugattachments/xx-attachments-to-bug-report.txt'
2029--- lib/lp/bugs/stories/bugattachments/xx-attachments-to-bug-report.txt 2015-10-06 06:48:01 +0000
2030+++ lib/lp/bugs/stories/bugattachments/xx-attachments-to-bug-report.txt 2018-06-30 16:32:46 +0000
2031@@ -11,7 +11,7 @@
2032
2033 >>> browser.open("http://bugs.launchpad.dev/redfish/+bug/11")
2034 >>> comment_1 = find_tags_by_class(browser.contents, 'boardComment')[0]
2035- >>> print extract_text(comment_1)
2036+ >>> print(extract_text(comment_1))
2037 Valentina Commissari (tsukimi)
2038 wrote
2039 on 2007-03-15:
2040@@ -42,7 +42,7 @@
2041
2042 >>> browser.open("http://bugs.launchpad.dev/redfish/+bug/11")
2043 >>> comment_0 = find_tags_by_class(browser.contents, 'boardComment')[0]
2044- >>> print extract_text(comment_0)
2045+ >>> print(extract_text(comment_0))
2046 Daniel Silverstone (kinnison)
2047 wrote
2048 on 2007-03-15:
2049@@ -51,9 +51,9 @@
2050 (8 bytes,
2051 text/plain)
2052 >>> link = browser.getLink('sample data')
2053- >>> print link.url
2054+ >>> print(link.url)
2055 http://bugs.launchpad.dev/jokosher/+bug/11/+attachment/.../+files/test.txt
2056- >>> print comment_0.find('a', text='Edit').parent
2057+ >>> print(comment_0.find('a', text='Edit').parent)
2058 <a class="sprite edit action-icon"
2059 href="/jokosher/+bug/11/+attachment/...">Edit</a>
2060
2061@@ -70,7 +70,7 @@
2062 ... description='a patch')
2063 >>> logout()
2064 >>> browser.open("http://bugs.launchpad.dev/redfish/+bug/11")
2065- >>> print extract_text(browser.contents)
2066+ >>> print(extract_text(browser.contents))
2067 Bug #11 ...
2068 ...Patches...
2069 ...a patch...
2070
2071=== modified file 'lib/lp/bugs/stories/bugattachments/xx-bugattachments.txt'
2072--- lib/lp/bugs/stories/bugattachments/xx-bugattachments.txt 2015-10-06 06:48:01 +0000
2073+++ lib/lp/bugs/stories/bugattachments/xx-bugattachments.txt 2018-06-30 16:32:46 +0000
2074@@ -36,21 +36,21 @@
2075
2076 >>> attachments = find_portlet(user_browser.contents, 'Bug attachments')
2077 >>> for li_tag in attachments.findAll('li', 'download-attachment'):
2078- ... print li_tag.a.renderContents()
2079+ ... print(li_tag.a.renderContents())
2080 Some information
2081
2082 >>> link = user_browser.getLink('Some information')
2083 >>> link.url
2084 'http://bugs.launchpad.dev/firefox/+bug/1/+attachment/.../+files/foo.txt'
2085
2086- >>> 'Added some information' in user_browser.contents
2087+ >>> b'Added some information' in user_browser.contents
2088 True
2089
2090 And that we stripped the leading and trailing whitespace correctly
2091
2092- >>> ' Some information ' in user_browser.contents
2093+ >>> b' Some information ' in user_browser.contents
2094 False
2095- >>> 'Some information' in user_browser.contents
2096+ >>> b'Some information' in user_browser.contents
2097 True
2098
2099 If no description is given it gets set to the attachment filename. It's
2100@@ -69,7 +69,7 @@
2101
2102 >>> attachments = find_portlet(user_browser.contents, 'Bug attachments')
2103 >>> for li_tag in attachments.findAll('li', 'download-attachment'):
2104- ... print li_tag.a.renderContents()
2105+ ... print(li_tag.a.renderContents())
2106 Some information
2107 bar.txt
2108
2109@@ -118,8 +118,8 @@
2110 ...where we see a message that we should double-check if this file
2111 is indeed not a patch.
2112
2113- >>> print extract_text(find_tags_by_class(
2114- ... user_browser.contents, 'documentDescription')[0])
2115+ >>> print(extract_text(find_tags_by_class(
2116+ ... user_browser.contents, 'documentDescription')[0]))
2117 This file looks like a patch.
2118 What is a patch?
2119
2120@@ -146,7 +146,7 @@
2121 'http://bugs.launchpad.dev/firefox/+bug/1'
2122 >>> attachments = find_portlet(user_browser.contents, 'Bug attachments')
2123 >>> for li_tag in attachments.findAll('li', 'download-attachment'):
2124- ... print li_tag.a.renderContents()
2125+ ... print(li_tag.a.renderContents())
2126 Some information
2127 bar.txt
2128 More data
2129@@ -174,8 +174,8 @@
2130 ...where we see a message asking us if we really ant to declare this file
2131 as a patch.
2132
2133- >>> print extract_text(find_tags_by_class(
2134- ... user_browser.contents, 'documentDescription')[0])
2135+ >>> print(extract_text(find_tags_by_class(
2136+ ... user_browser.contents, 'documentDescription')[0]))
2137 This file does not look like a patch.
2138 What is a patch?
2139
2140@@ -203,7 +203,7 @@
2141
2142 >>> patches = find_portlet(user_browser.contents, 'Patches')
2143 >>> for li_tag in patches.findAll('li', 'download-attachment'):
2144- ... print li_tag.a.renderContents()
2145+ ... print(li_tag.a.renderContents())
2146 A fix for this bug.
2147 A better icon for foo
2148
2149@@ -264,7 +264,7 @@
2150 >>> user_browser.url
2151 'http://bugs.launchpad.dev/firefox/+bug/1/+attachment/...'
2152
2153- >>> 'Edit attachment' in user_browser.contents
2154+ >>> b'Edit attachment' in user_browser.contents
2155 True
2156
2157 There's also an option to cancel, which takes you back to the bug
2158@@ -285,7 +285,7 @@
2159 >>> user_browser.url
2160 'http://bugs.launchpad.dev/firefox/+bug/1'
2161
2162- >>> 'Another title' in user_browser.contents
2163+ >>> b'Another title' in user_browser.contents
2164 True
2165
2166 We can edit the attachment to be a patch.
2167@@ -303,8 +303,8 @@
2168 >>> user_browser.url
2169 'http://bugs.launchpad.dev/firefox/+bug/1/+attachment/.../+confirm-is-patch'
2170
2171- >>> print extract_text(find_tags_by_class(
2172- ... user_browser.contents, 'documentDescription')[0])
2173+ >>> print(extract_text(find_tags_by_class(
2174+ ... user_browser.contents, 'documentDescription')[0]))
2175 This file does not look like a patch.
2176 What is a patch?
2177
2178@@ -331,7 +331,7 @@
2179
2180 >>> patches = find_portlet(user_browser.contents, 'Patches')
2181 >>> for li_tag in patches.findAll('li', 'download-attachment'):
2182- ... print li_tag.a.renderContents()
2183+ ... print(li_tag.a.renderContents())
2184 Another title
2185 A fix for this bug.
2186 A better icon for foo
2187@@ -343,7 +343,7 @@
2188
2189 >>> attachments = find_portlet(user_browser.contents, 'Bug attachments')
2190 >>> for li_tag in attachments.findAll('li', 'download-attachment'):
2191- ... print li_tag.a.renderContents()
2192+ ... print(li_tag.a.renderContents())
2193 bar.txt
2194 More data
2195
2196@@ -406,7 +406,7 @@
2197 ... "Show only bugs with patches available").selected = True
2198 >>> user_browser.getControl("Search", index=1).click()
2199
2200- >>> print user_browser.contents
2201+ >>> print(user_browser.contents)
2202 <!DOCTYPE...
2203 ...1...
2204 ...of
2205
2206=== modified file 'lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt'
2207--- lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt 2015-10-06 06:48:01 +0000
2208+++ lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt 2018-06-30 16:32:46 +0000
2209@@ -18,7 +18,7 @@
2210 >>> attachment_portlet = find_portlet(
2211 ... user_browser.contents, 'Bug attachments')
2212 >>> for li in attachment_portlet.findAll('li', 'download-attachment'):
2213- ... print li.a.renderContents()
2214+ ... print(li.a.renderContents())
2215 Great deal
2216
2217 There will also be a comment with a link to the attachment in its body.
2218@@ -37,7 +37,7 @@
2219
2220 >>> import re
2221 >>> user_browser.getLink(url=re.compile(r'[+]attachment/\d+$')).click()
2222- >>> print user_browser.title
2223+ >>> print(user_browser.title)
2224 Bug #2...
2225 >>> user_browser.getControl('Delete Attachment') is not None
2226 True
2227@@ -50,12 +50,12 @@
2228 >>> user_browser.url
2229 'http://.../+bug/2'
2230 >>> for message in find_tags_by_class(user_browser.contents, 'message'):
2231- ... print message.renderContents()
2232+ ... print(message.renderContents())
2233 Attachment
2234 "<a href="http://bugs.launchpad.dev/...+files/foo.txt">Great deal</a>"
2235 has been deleted.
2236
2237- >>> print find_portlet(user_browser.contents, 'Bug attachments')
2238+ >>> print(find_portlet(user_browser.contents, 'Bug attachments'))
2239 None
2240
2241 Since the attachment has been deleted, the comment referencing it will no
2242
2243=== modified file 'lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt'
2244--- lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt 2012-06-16 13:21:23 +0000
2245+++ lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt 2018-06-30 16:32:46 +0000
2246@@ -21,7 +21,7 @@
2247 ... user_browser.contents, 'boardCommentBody')[-1]
2248 >>> fileinfo = '(270 bytes, text/plain)'
2249 >>> for attachment in last_comment('li', 'download-attachment'):
2250- ... print extract_text(attachment)
2251+ ... print(extract_text(attachment))
2252 description text Edit
2253 (270 bytes, text/plain)
2254
2255@@ -52,7 +52,7 @@
2256 ... user_browser.contents, 'boardCommentBody')[-1]
2257 >>> fileinfo = '(270 bytes, text/plain)'
2258 >>> for attachment in last_comment('li', 'download-attachment'):
2259- ... print extract_text(attachment)
2260+ ... print(extract_text(attachment))
2261 description text Edit
2262 (2.6 KiB, text/plain)
2263
2264
2265=== modified file 'lib/lp/bugs/stories/bugs/bug-add-subscriber.txt'
2266--- lib/lp/bugs/stories/bugs/bug-add-subscriber.txt 2016-01-26 15:47:37 +0000
2267+++ lib/lp/bugs/stories/bugs/bug-add-subscriber.txt 2018-06-30 16:32:46 +0000
2268@@ -75,7 +75,7 @@
2269 >>> from lp.services.mail import stub
2270 >>> len(stub.test_emails)
2271 1
2272- >>> print stub.test_emails[0][2]
2273+ >>> print(stub.test_emails[0][2])
2274 MIME-Version: 1.0
2275 ...
2276 To: david.allouche@canonical.com
2277@@ -181,8 +181,8 @@
2278 entry in the activity log for Private Team.
2279
2280 >>> def print_row(row):
2281- ... print ' | '.join(
2282- ... extract_text(cell) for cell in row(('th', 'td')))
2283+ ... print(' | '.join(
2284+ ... extract_text(cell) for cell in row(('th', 'td'))))
2285 >>> user_browser.open(
2286 ... 'http://bugs.launchpad.dev/firefox/+bug/1/+activity')
2287 >>> main_content = find_main_content(user_browser.contents)
2288
2289=== modified file 'lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt'
2290--- lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt 2009-06-12 16:36:02 +0000
2291+++ lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt 2018-06-30 16:32:46 +0000
2292@@ -20,5 +20,5 @@
2293
2294 >>> main_content = find_main_content(user_browser.contents)
2295 >>> last_comment = main_content('div', 'boardCommentBody')[-1]
2296- >>> print last_comment.div.renderContents()
2297+ >>> print(last_comment.div.renderContents())
2298 <p>A comment with no change to the bug task.</p>
2299
2300=== modified file 'lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt'
2301--- lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt 2011-04-20 14:56:23 +0000
2302+++ lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt 2018-06-30 16:32:46 +0000
2303@@ -16,5 +16,5 @@
2304
2305 >>> for comment_div in find_tags_by_class(
2306 ... user_browser.contents, 'boardCommentBody'):
2307- ... print comment_div.div.renderContents()
2308+ ... print(comment_div.div.renderContents())
2309 <p>A new comment.</p>
2310
2311=== modified file 'lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt'
2312--- lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt 2010-09-29 11:15:46 +0000
2313+++ lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt 2018-06-30 16:32:46 +0000
2314@@ -17,16 +17,16 @@
2315 'http://bugs.launchpad.dev/debian/+source/mozilla-firefox/+bug/1'
2316
2317 >>> added_cve_link = user_browser.getLink('1991-9911')
2318- >>> print added_cve_link
2319+ >>> print(added_cve_link)
2320 <.../bugs/cve/1991-9911'>
2321
2322 >>> bugwatch_portlet = find_portlet(user_browser.contents,
2323 ... 'Remote bug watches')
2324 >>> added_bugwatch_link = bugwatch_portlet('a')[-2]
2325- >>> print added_bugwatch_link['href']
2326+ >>> print(added_bugwatch_link['href'])
2327 http://some.bugzilla/show_bug.cgi?id=9876
2328
2329- >>> print extract_text(added_bugwatch_link)
2330+ >>> print(extract_text(added_bugwatch_link))
2331 auto-some.bugzilla #9876
2332
2333 When extracting the remote bug URLs, we can use whatever text we want and
2334@@ -47,7 +47,7 @@
2335 >>> bugwatch_portlet = find_portlet(user_browser.contents,
2336 ... 'Remote bug watches')
2337 >>> added_bugwatch_link = bugwatch_portlet('a')[-2]
2338- >>> print extract_text(added_bugwatch_link)
2339+ >>> print(extract_text(added_bugwatch_link))
2340 auto-bugzilla.example.org #1235555
2341 >>> 'answers.launchpad.net' in extract_text(bugwatch_portlet)
2342 False
2343
2344=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-activity.txt'
2345--- lib/lp/bugs/stories/bugs/xx-bug-activity.txt 2015-06-27 04:10:49 +0000
2346+++ lib/lp/bugs/stories/bugs/xx-bug-activity.txt 2018-06-30 16:32:46 +0000
2347@@ -25,8 +25,8 @@
2348 The activity log itself is presented as a table.
2349
2350 >>> def print_row(row):
2351- ... print ' | '.join(
2352- ... extract_text(cell) for cell in row(('th', 'td')))
2353+ ... print(' | '.join(
2354+ ... extract_text(cell) for cell in row(('th', 'td'))))
2355
2356 >>> for row in main_content.table('tr'):
2357 ... print_row(row)
2358@@ -40,7 +40,7 @@
2359 >>> anon_browser.open(
2360 ... 'http://bugs.launchpad.dev/debian/+source/'
2361 ... 'mozilla-firefox/+bug/3')
2362- >>> print anon_browser.getLink('See full activity log').url
2363+ >>> print(anon_browser.getLink('See full activity log').url)
2364 http://.../+bug/3/+activity
2365
2366
2367@@ -54,8 +54,8 @@
2368 ... """Print all the comments on the page."""
2369 ... comment_divs = find_tags_by_class(page, 'boardComment')
2370 ... for div_tag in comment_divs[subset]:
2371- ... print extract_text(div_tag).replace("&#8594;", "=>")
2372- ... print '-' * 8
2373+ ... print(extract_text(div_tag).replace("&#8594;", "=>"))
2374+ ... print('-' * 8)
2375
2376 >>> user_browser.open(
2377 ... 'http://bugs.launchpad.dev/redfish/+bug/15/+addcomment')
2378
2379=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt'
2380--- lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt 2016-01-26 15:47:37 +0000
2381+++ lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt 2018-06-30 16:32:46 +0000
2382@@ -14,24 +14,24 @@
2383 the bug).
2384
2385 >>> user_browser.open(test_bug_url)
2386- >>> print extract_text(find_tag_by_id(
2387+ >>> print(extract_text(find_tag_by_id(
2388 ... user_browser.contents, 'affectsmetoo').find(
2389- ... None, 'static'))
2390+ ... None, 'static')))
2391 This bug affects 1 person. Does this bug affect you?
2392
2393 Next to the statement is a link containing an edit icon.
2394
2395 >>> edit_link = find_tag_by_id(
2396 ... user_browser.contents, 'affectsmetoo').a
2397- >>> print edit_link['href']
2398+ >>> print(edit_link['href'])
2399 +affectsmetoo
2400- >>> print edit_link.img['src']
2401+ >>> print(edit_link.img['src'])
2402 /@@/edit
2403
2404 The user is affected by this bug, so clicks the link.
2405
2406 >>> user_browser.getLink(url='+affectsmetoo').click()
2407- >>> print user_browser.url
2408+ >>> print(user_browser.url)
2409 http://bugs.launchpad.dev/.../+bug/.../+affectsmetoo
2410 >>> user_browser.getControl(name='field.affects').value
2411 ['YES']
2412@@ -43,9 +43,9 @@
2413 The bug page loads again, and now the text is changed, to make it
2414 clear to the user that they have marked this bug as affecting them.
2415
2416- >>> print extract_text(find_tag_by_id(
2417+ >>> print(extract_text(find_tag_by_id(
2418 ... user_browser.contents, 'affectsmetoo').find(
2419- ... None, 'static'))
2420+ ... None, 'static')))
2421 This bug affects you and 1 other person
2422
2423 On second thoughts, the user realises that this bug does not affect
2424@@ -60,9 +60,9 @@
2425
2426 Back at the bug page, the text changes once again.
2427
2428- >>> print extract_text(find_tag_by_id(
2429+ >>> print(extract_text(find_tag_by_id(
2430 ... user_browser.contents, 'affectsmetoo').find(
2431- ... None, 'static'))
2432+ ... None, 'static')))
2433 This bug affects 1 person, but not you
2434
2435
2436@@ -71,8 +71,8 @@
2437 Anonymous users just see the number of affected users.
2438
2439 >>> anon_browser.open(test_bug_url)
2440- >>> print extract_text(find_tag_by_id(
2441- ... anon_browser.contents, 'affectsmetoo'))
2442+ >>> print(extract_text(find_tag_by_id(
2443+ ... anon_browser.contents, 'affectsmetoo')))
2444 This bug affects 1 person
2445
2446 If no one is marked as affected by the bug, the message does not
2447@@ -83,7 +83,7 @@
2448 >>> logout()
2449
2450 >>> anon_browser.open(test_bug_url)
2451- >>> print find_tag_by_id(anon_browser.contents, 'affectsmetoo')
2452+ >>> print(find_tag_by_id(anon_browser.contents, 'affectsmetoo'))
2453 None
2454
2455
2456@@ -114,10 +114,10 @@
2457 The dynamic content is hidden by the presence of the "hidden" CSS
2458 class.
2459
2460- >>> print static_content.get('class')
2461+ >>> print(static_content.get('class'))
2462 static
2463
2464- >>> print dynamic_content.get('class')
2465+ >>> print(dynamic_content.get('class'))
2466 dynamic hidden
2467
2468 It is the responsibilty of Javascript running in the page to unhide
2469
2470=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-comment-attach-file.txt'
2471--- lib/lp/bugs/stories/bugs/xx-bug-comment-attach-file.txt 2013-09-27 04:13:23 +0000
2472+++ lib/lp/bugs/stories/bugs/xx-bug-comment-attach-file.txt 2018-06-30 16:32:46 +0000
2473@@ -17,7 +17,7 @@
2474 >>> user_browser.getControl(name='field.comment').value = "a test comment"
2475 >>> user_browser.getControl("Post Comment").click()
2476
2477- >>> print user_browser.url
2478+ >>> print(user_browser.url)
2479 http://bugs.launchpad.dev/firefox/+bug/1
2480
2481 >>> print_feedback_messages(user_browser.contents)
2482@@ -47,7 +47,7 @@
2483 >>> user_browser.getControl("Description").value = "some file"
2484 >>> user_browser.getControl("Post Comment").click()
2485
2486- >>> print user_browser.url
2487+ >>> print(user_browser.url)
2488 http://bugs.launchpad.dev/firefox/+bug/1
2489
2490 >>> print_feedback_messages(user_browser.contents)
2491@@ -62,7 +62,7 @@
2492 ... StringIO(""), "text/plain", "foo.txt")
2493 >>> user_browser.getControl("Post Comment").click()
2494
2495- >>> print user_browser.url
2496+ >>> print(user_browser.url)
2497 http://bugs.launchpad.dev/firefox/+bug/1/+addcomment
2498
2499 >>> print_feedback_messages(user_browser.contents)
2500@@ -74,7 +74,7 @@
2501
2502 >>> from lp.services.config import config
2503
2504- >>> print config.launchpad.max_attachment_size
2505+ >>> print(config.launchpad.max_attachment_size)
2506 1024
2507
2508 >>> user_browser.open(
2509@@ -96,7 +96,7 @@
2510 >>> user_browser.getControl("Description").value = "some file"
2511 >>> user_browser.getControl("Post Comment").click()
2512
2513- >>> print user_browser.url
2514+ >>> print(user_browser.url)
2515 http://bugs.launchpad.dev/firefox/+bug/1
2516
2517 >>> print_feedback_messages(user_browser.contents)
2518
2519=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-comments-truncated.txt'
2520--- lib/lp/bugs/stories/bugs/xx-bug-comments-truncated.txt 2016-01-26 15:47:37 +0000
2521+++ lib/lp/bugs/stories/bugs/xx-bug-comments-truncated.txt 2018-06-30 16:32:46 +0000
2522@@ -29,7 +29,7 @@
2523 ... soup = find_main_content(page)
2524 ... comment_divs = soup('div', 'boardCommentBody')
2525 ... for div_tag in comment_divs:
2526- ... print div_tag
2527+ ... print(div_tag)
2528 >>> print_comments(browser.contents) #doctest: -ELLIPSIS
2529 <div class="boardCommentBody">
2530 <a href="http://bugs.launchpad.dev/tomcat/+bug/2/comments/1/+download">Download
2531@@ -58,7 +58,7 @@
2532
2533 The whole comment is visible on this page:
2534
2535- >>> print browser.title
2536+ >>> print(browser.title)
2537 Comment #1 : Bug #2 (blackhole) : Bugs : Tomcat
2538
2539 >>> print_comments(browser.contents) #doctest: -ELLIPSIS
2540@@ -123,7 +123,7 @@
2541 u'Bug #2 (blackhole) ... : Bugs : Tomcat'
2542 >>> text = find_tags_by_class(
2543 ... user_browser.contents, 'boardCommentBody')[-1]
2544- >>> print extract_text(text.findAll('p')[-2])
2545+ >>> print(extract_text(text.findAll('p')[-2]))
2546 --
2547 ______________________
2548 human@example.org
2549@@ -138,7 +138,7 @@
2550 u'Bug #2 (blackhole) ... : Bugs : Tomcat'
2551 >>> text = find_tags_by_class(
2552 ... anon_browser.contents, 'boardCommentBody')[-1]
2553- >>> print extract_text(text.findAll('p')[-2])
2554+ >>> print(extract_text(text.findAll('p')[-2]))
2555 --
2556 ______________________
2557 &lt;email address hidden&gt;
2558@@ -155,7 +155,7 @@
2559 Pagetests cannot test CSS and JS behaviour. We can only check that the markup
2560 includes the hooks for the style and script.
2561
2562- >>> print text.findAll('p')[-2]
2563+ >>> print(text.findAll('p')[-2])
2564 <p><span class="foldable">--...
2565 &lt;email address hidden&gt;<br />
2566 Witty signatures rock!
2567@@ -169,7 +169,7 @@
2568 always displayed. Again we can continue with the anonymous user to
2569 see the markup.
2570
2571- >>> print text.findAll('p')[-3]
2572+ >>> print(text.findAll('p')[-3])
2573 <p>Somebody said sometime ago:<br />
2574 <span class="foldable-quoted">
2575 &gt; 1. Remove the letters c, j, q, x, w<br />
2576@@ -181,12 +181,12 @@
2577 starts with '-----BEGIN PGP'. There are two kinds of PGP blocks,
2578 the notice that the message is signed, and the signature.
2579
2580- >>> print text.findAll('p')[0]
2581+ >>> print(text.findAll('p')[0])
2582 <p><span class="foldable">-----BEGIN PGP SIGNED MESSAGE-----<br />
2583 Hash: SHA1
2584 </span></p>
2585
2586- >>> print text.findAll('p')[-1]
2587+ >>> print(text.findAll('p')[-1])
2588 <p><span class="foldable">-----BEGIN PGP SIGNATURE-----<br />
2589 Version: GnuPG v1.4.1 (GNU/Linux)<br />
2590 Comment: Using GnuPG with Thunderbird<br />
2591
2592=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-create-question.txt'
2593--- lib/lp/bugs/stories/bugs/xx-bug-create-question.txt 2016-01-26 15:47:37 +0000
2594+++ lib/lp/bugs/stories/bugs/xx-bug-create-question.txt 2018-06-30 16:32:46 +0000
2595@@ -60,7 +60,7 @@
2596 The bug status is Invalid for 'linux-source-2.6.15 (Ubuntu)'--It cannot
2597 be edited.
2598
2599- >>> print extract_text(content(['table'], {'class' : 'listing'})[0])
2600+ >>> print(extract_text(content(['table'], {'class' : 'listing'})[0]))
2601 Affects Status Importance Assigned to Milestone
2602 linux-source-2.6.15 (Ubuntu) ... Invalid Medium Unassigned ...
2603
2604@@ -82,15 +82,15 @@
2605
2606 They see their comment was appended to the bug report's messages.
2607
2608- >>> print extract_text(
2609- ... find_tags_by_class(str(content), 'boardCommentBody')[-1])
2610+ >>> print(extract_text(
2611+ ... find_tags_by_class(str(content), 'boardCommentBody')[-1]))
2612 This bug is a question.
2613
2614 No Privileges Person looks at the page heading and sees that Foo Bar is
2615 the bug owner. They see the link to the question in the 'Related
2616 questions' portlet, and uses it to go to the question page.
2617
2618- >>> print user_browser.url
2619+ >>> print(user_browser.url)
2620 http://bugs.launchpad.dev/ubuntu/.../+bug/10
2621
2622 >>> portlet = find_portlet(user_browser.contents, 'Related questions')
2623@@ -104,11 +104,11 @@
2624 No Privileges Person case see that the question was created from a bug.
2625 They use the link to Related bug to return to the bug.
2626
2627- >>> print user_browser.title
2628+ >>> print(user_browser.title)
2629 Question #... : Questions : linux-source-2.6.15 package : Ubuntu
2630
2631- >>> print extract_text(
2632- ... find_tag_by_id(user_browser.contents, 'original-bug'))
2633+ >>> print(extract_text(
2634+ ... find_tag_by_id(user_browser.contents, 'original-bug')))
2635 This question was originally filed as bug #10.
2636
2637 >>> user_browser.getLink('#10: another test bug').click()
2638@@ -129,7 +129,7 @@
2639 'Bug #9 ...'
2640
2641 >>> user_browser.getLink('Convert to a question').click()
2642- >>> print user_browser.title
2643+ >>> print(user_browser.title)
2644 Convert this bug to a question...
2645
2646 >>> find_main_content(user_browser.contents).p
2647@@ -199,7 +199,7 @@
2648 'Bug #12 ...'
2649
2650 >>> message = find_tag_by_id(user_browser.contents, 'bug-is-question')
2651- >>> print extract_text(message)
2652+ >>> print(extract_text(message))
2653 This bug report was converted into a question:...question #...
2654
2655
2656@@ -214,7 +214,7 @@
2657 'Bug #12 ... : Bugs : Jokosher'
2658
2659 >>> user_browser.getLink('Convert back to a bug').click()
2660- >>> print user_browser.title
2661+ >>> print(user_browser.title)
2662 Bug #12 - Convert this...
2663
2664 The 'Convert back to a bug' page explains what will happen if No
2665@@ -242,17 +242,17 @@
2666 Copy, Cut and Delete operations should work...
2667
2668 >>> portlet = find_portlet(user_browser.contents, 'Related questions')
2669- >>> print portlet
2670+ >>> print(portlet)
2671 None
2672
2673 >>> user_browser.getLink(
2674 ... 'Copy, Cut and Delete operations should work on '
2675 ... 'selections').click()
2676- >>> print user_browser.title
2677+ >>> print(user_browser.title)
2678 Question #... : Questions : Jokosher
2679
2680- >>> print extract_text(
2681- ... find_tag_by_id(user_browser.contents, 'question-status'))
2682+ >>> print(extract_text(
2683+ ... find_tag_by_id(user_browser.contents, 'question-status')))
2684 Status: Open
2685
2686 No Privileges Person uses their browser's back button to view the bug
2687@@ -260,7 +260,7 @@
2688
2689 >>> user_browser.goBack(count=1)
2690 >>> content = find_main_content(user_browser.contents)
2691- >>> print extract_text(content(['table'], {'class' : 'listing'})[0])
2692+ >>> print(extract_text(content(['table'], {'class' : 'listing'})[0]))
2693 Affects Status Importance Assigned to Milestone
2694 ... Jokosher ... Invalid Critical Unassigned ...
2695 Affecting: Jokosher
2696@@ -268,8 +268,8 @@
2697
2698 They read their comment that was appended to the bug report's messages.
2699
2700- >>> print extract_text(
2701- ... find_tags_by_class(str(content), 'boardComment')[-1])
2702+ >>> print(extract_text(
2703+ ... find_tags_by_class(str(content), 'boardComment')[-1]))
2704 No Privileges Person (no-priv)
2705 wrote
2706 ...
2707@@ -284,7 +284,7 @@
2708
2709 >>> user_browser.open(
2710 ... 'http://bugs.launchpad.dev/jokosher/+bug/12/+remove-question')
2711- >>> print user_browser.title
2712+ >>> print(user_browser.title)
2713 Bug #12 - Convert this...
2714
2715 >>> find_main_content(user_browser.contents).p
2716
2717=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-edit.txt'
2718--- lib/lp/bugs/stories/bugs/xx-bug-edit.txt 2012-08-03 01:42:13 +0000
2719+++ lib/lp/bugs/stories/bugs/xx-bug-edit.txt 2018-06-30 16:32:46 +0000
2720@@ -6,10 +6,10 @@
2721
2722 >>> user_browser.open(
2723 ... 'http://bugs.launchpad.dev/jokosher/+bug/11/+edit')
2724- >>> print user_browser.title
2725+ >>> print(user_browser.title)
2726 Edit details for bug #11 ...
2727 >>> main = find_main_content(user_browser.contents)
2728- >>> print extract_text(main.h1)
2729+ >>> print(extract_text(main.h1))
2730 Edit details for bug #11
2731
2732 And now we show that any logged-in user can edit public bugs.
2733@@ -26,9 +26,9 @@
2734 >>> browser.url
2735 'http://.../debian/+source/mozilla-firefox/+bug/3'
2736 >>> content = find_main_content(browser.contents)
2737- >>> print extract_text(content.h1)
2738+ >>> print(extract_text(content.h1))
2739 New Summary Edit
2740- >>> print extract_text(find_tag_by_id(content, 'maincontentsub'))
2741+ >>> print(extract_text(find_tag_by_id(content, 'maincontentsub')))
2742 Edit Bug Description New description. ...
2743
2744
2745@@ -72,9 +72,9 @@
2746
2747 >>> user_browser.url
2748 'http://bugs.launchpad.dev/firefox/+bug/1'
2749- >>> 'layout-test' in user_browser.contents
2750+ >>> b'layout-test' in user_browser.contents
2751 True
2752- >>> 'new-tag' in user_browser.contents
2753+ >>> b'new-tag' in user_browser.contents
2754 False
2755
2756 Now, let's add 'new-tag' again, and confirm it this time.
2757
2758=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt'
2759--- lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt 2012-02-07 07:20:50 +0000
2760+++ lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt 2018-06-30 16:32:46 +0000
2761@@ -4,5 +4,5 @@
2762
2763 >>> anon_browser.open('http://bugs.launchpad.dev/firefox/+bug/1')
2764 >>> content = find_main_content(anon_browser.contents)
2765- >>> print content.find('a', href='/+help-bugs/bug-heat.html')
2766+ >>> print(content.find('a', href='/+help-bugs/bug-heat.html'))
2767 <a href="/+help-bugs/bug-heat.html" target="help" class="sprite flame">0</a>
2768
2769=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt'
2770--- lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt 2015-09-14 16:38:15 +0000
2771+++ lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt 2018-06-30 16:32:46 +0000
2772@@ -13,7 +13,7 @@
2773 >>> main_content = find_main_content(user_browser.contents)
2774 >>> new_comment = main_content('div', 'boardCommentBody')[-1]
2775 >>> new_comment_text = extract_text(new_comment.div)
2776- >>> print new_comment_text
2777+ >>> print(new_comment_text)
2778 This comment will not be visible when the test completes.
2779
2780 Admin users can set a message's visible attribute to False.
2781@@ -26,7 +26,7 @@
2782 >>> login('foo.bar@canonical.com')
2783 >>> bug_11 = getUtility(IBugSet).get(11)
2784 >>> message = bug_11.messages[-1]
2785- >>> print message.text_contents
2786+ >>> print(message.text_contents)
2787 This comment will not be visible when the test completes.
2788 >>> bug_message = getUtility(IBugMessageSet).getByBugAndMessage(
2789 ... bug_11, message)
2790@@ -44,7 +44,7 @@
2791 >>> main_content = find_main_content(test_browser.contents)
2792 >>> last_comment = main_content('div', 'boardCommentBody')[-1]
2793 >>> last_comment_text = extract_text(last_comment.div)
2794- >>> print last_comment_text
2795+ >>> print(last_comment_text)
2796 This title, however, is the same as the bug title and so it will
2797 be suppressed in the UI.
2798
2799@@ -70,13 +70,13 @@
2800 >>> main_content = find_main_content(admin_browser.contents)
2801 >>> last_comment = main_content('div', 'boardCommentBody')[-1]
2802 >>> last_comment_text = extract_text(last_comment.div)
2803- >>> print last_comment_text
2804+ >>> print(last_comment_text)
2805 This comment will not be visible when the test completes.
2806
2807 Admin users will see the hidden message highlighted with an
2808 'adminHiddenComment' style.
2809
2810- >>> print last_comment.parent['class']
2811+ >>> print(last_comment.parent['class'])
2812 boardComment adminHiddenComment
2813
2814 Admin users can also reach the message via direct link, and it is
2815@@ -86,14 +86,14 @@
2816 ... 'http://bugs.launchpad.dev'
2817 ... '/jokosher/+bug/11/comments/%d' % (int(latest_index[1:]) + 1))
2818 >>> contents = extract_text(admin_browser.contents)
2819- >>> print contents
2820+ >>> print(contents)
2821 Comment #7 : Bug #11 ...
2822 This comment will not be visible when the test completes.
2823 ...
2824 >>> main_content = find_main_content(admin_browser.contents)
2825 >>> last_comment = main_content('div', 'boardCommentBody')[-1]
2826 >>> last_comment_text = extract_text(last_comment.div)
2827- >>> print last_comment.parent['class']
2828+ >>> print(last_comment.parent['class'])
2829 boardComment adminHiddenComment
2830
2831 Also for the owner of comment the message is still visible in the bug page.
2832@@ -104,13 +104,13 @@
2833 >>> main_content = find_main_content(user_browser.contents)
2834 >>> last_comment = main_content('div', 'boardCommentBody')[-1]
2835 >>> last_comment_text = extract_text(last_comment.div)
2836- >>> print last_comment_text
2837+ >>> print(last_comment_text)
2838 This comment will not be visible when the test completes.
2839
2840 Owner of the comment will see the hidden message highlighted with an
2841 'adminHiddenComment' style.
2842
2843- >>> print last_comment.parent['class']
2844+ >>> print(last_comment.parent['class'])
2845 boardComment adminHiddenComment
2846
2847 Owner of the comment can also reach the message via direct link, and it is
2848@@ -120,12 +120,12 @@
2849 ... 'http://bugs.launchpad.dev'
2850 ... '/jokosher/+bug/11/comments/%d' % (int(latest_index[1:]) + 1))
2851 >>> contents = extract_text(user_browser.contents)
2852- >>> print contents
2853+ >>> print(contents)
2854 Comment #7 : Bug #11 ...
2855 This comment will not be visible when the test completes.
2856 ...
2857 >>> main_content = find_main_content(user_browser.contents)
2858 >>> last_comment = main_content('div', 'boardCommentBody')[-1]
2859 >>> last_comment_text = extract_text(last_comment.div)
2860- >>> print last_comment.parent['class']
2861+ >>> print(last_comment.parent['class'])
2862 boardComment adminHiddenComment
2863
2864=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-index-lots-of-comments.txt'
2865--- lib/lp/bugs/stories/bugs/xx-bug-index-lots-of-comments.txt 2016-04-29 13:25:26 +0000
2866+++ lib/lp/bugs/stories/bugs/xx-bug-index-lots-of-comments.txt 2018-06-30 16:32:46 +0000
2867@@ -34,8 +34,8 @@
2868
2869 With a warning telling the user where the comments have gone:
2870
2871- >>> print extract_text(first_tag_by_class(
2872- ... user_browser.contents, 'informational message'))
2873+ >>> print(extract_text(first_tag_by_class(
2874+ ... user_browser.contents, 'informational message')))
2875 Displaying first 1
2876 and last 2
2877 comments.
2878@@ -45,8 +45,8 @@
2879 The add comment box is present but hidden so people don't accidentally
2880 reply to the wrong message.
2881
2882- >>> print find_tag_by_id(
2883- ... user_browser.contents, 'add-comment-form-container')
2884+ >>> print(find_tag_by_id(
2885+ ... user_browser.contents, 'add-comment-form-container'))
2886 <div id="add-comment-form-container" class="hidden">...
2887 <div id="add-comment-form">...</div>...
2888 </div>
2889@@ -65,7 +65,7 @@
2890 >>> len(comments)
2891 7
2892
2893- >>> print find_tag_by_id(user_browser.contents, 'add-comment-form').name
2894+ >>> print(find_tag_by_id(user_browser.contents, 'add-comment-form').name)
2895 div
2896
2897 Anonymous users have a slightly different experience. If the comment
2898@@ -73,8 +73,8 @@
2899 is also removed.
2900
2901 >>> anon_browser.open('http://launchpad.dev/bugs/11')
2902- >>> print find_tag_by_id(
2903- ... anon_browser.contents, 'add-comment-login-first')
2904+ >>> print(find_tag_by_id(
2905+ ... anon_browser.contents, 'add-comment-login-first'))
2906 None
2907
2908 When an anonymous user views all comments, the "you must log in" note
2909@@ -83,9 +83,9 @@
2910 >>> anon_browser.getLink('View all 6 comments').click()
2911 >>> add_comment_link = find_tag_by_id(
2912 ... anon_browser.contents, 'add-comment-login-first')
2913- >>> print extract_text(add_comment_link)
2914+ >>> print(extract_text(add_comment_link))
2915 To post a comment you must log in.
2916- >>> print add_comment_link.a.get('href')
2917+ >>> print(add_comment_link.a.get('href'))
2918 +login?comments=all
2919
2920 Restore the configuration to its previous setting.
2921
2922=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-index.txt'
2923--- lib/lp/bugs/stories/bugs/xx-bug-index.txt 2015-06-27 04:10:49 +0000
2924+++ lib/lp/bugs/stories/bugs/xx-bug-index.txt 2018-06-30 16:32:46 +0000
2925@@ -30,7 +30,7 @@
2926 highlighted.
2927
2928 >>> anon_browser.open('http://launchpad.dev/firefox/+bug/1')
2929- >>> print anon_browser.contents
2930+ >>> print(anon_browser.contents)
2931 <!DOCTYPE...
2932 ...
2933 ...<tr class="highlight" id="...">
2934@@ -42,12 +42,12 @@
2935 ...<tr>
2936 ...mozilla-firefox (Ubuntu)...
2937 ...
2938- >>> anon_browser.contents.count('<tr class="highlight"')
2939+ >>> anon_browser.contents.count(b'<tr class="highlight"')
2940 1
2941
2942 >>> anon_browser.open(
2943 ... 'http://launchpad.dev/debian/+source/mozilla-firefox/+bug/1')
2944- >>> print anon_browser.contents
2945+ >>> print(anon_browser.contents)
2946 <!DOCTYPE...
2947 ...
2948 ...<tr>
2949@@ -59,17 +59,17 @@
2950 ...<tr>
2951 ...mozilla-firefox (Ubuntu)...
2952 ...
2953- >>> anon_browser.contents.count('<tr class="highlight"')
2954+ >>> anon_browser.contents.count(b'<tr class="highlight"')
2955 1
2956
2957 If the context is a distribution package, the package name has a
2958 tooltip containing the package details.
2959
2960- >>> print anon_browser.getLink('mozilla-firefox (Ubuntu)').attrs['title']
2961+ >>> print(anon_browser.getLink('mozilla-firefox (Ubuntu)').attrs['title'])
2962 Latest release: 0.9, uploaded to main on 2004-09-27 11:57:13+00:00...
2963 by Mark Shuttleworth (mark), maintained by Mark Shuttleworth (mark)
2964
2965- >>> print anon_browser.getLink('mozilla-firefox (Debian)').attrs['title']
2966+ >>> print(anon_browser.getLink('mozilla-firefox (Debian)').attrs['title'])
2967 No current release for this source package in Debian
2968
2969 (XXX 20080623 mpt: Projects and distributions should similarly have a tooltip
2970@@ -80,7 +80,7 @@
2971
2972 >>> user_browser.open(
2973 ... "http://launchpad.dev/debian/+source/mozilla-firefox/+bug/2")
2974- >>> print user_browser.contents
2975+ >>> print(user_browser.contents)
2976 <!DOCTYPE...
2977 ...
2978 ...Tomcat...
2979@@ -100,7 +100,7 @@
2980
2981 >>> user_browser.open(
2982 ... "http://launchpad.dev/ubuntu/+source/mozilla-firefox/+bug/1")
2983- >>> print extract_text(find_tag_by_id(user_browser.contents, 'task17'))
2984+ >>> print(extract_text(find_tag_by_id(user_browser.contents, 'task17')))
2985 Affecting: mozilla-firefox (Ubuntu)
2986 Filed here by: Foo Bar
2987 When: 2004-01-17
2988@@ -110,18 +110,18 @@
2989 The bug page includes a link to report another bug.
2990
2991 >>> user_browser.open('http://bugs.launchpad.dev/firefox/+bug/1')
2992- >>> print user_browser.getLink('Report a bug').url
2993+ >>> print(user_browser.getLink('Report a bug').url)
2994 http://bugs.launchpad.dev/firefox/+filebug
2995
2996 >>> user_browser.open(
2997 ... 'http://launchpad.dev/ubuntu/+source/mozilla-firefox/+bug/1')
2998- >>> print user_browser.getLink('Report a bug').url
2999+ >>> print(user_browser.getLink('Report a bug').url)
3000 http://launchpad.dev/ubuntu/+source/mozilla-firefox/+filebug
3001
3002 There's also a link on the page that will take the user to the "Add
3003 attachment or patch" page, for use when JavaScript isn't available.
3004
3005- >>> print user_browser.getLink('Add attachment or patch').url
3006+ >>> print(user_browser.getLink('Add attachment or patch').url)
3007 http://bugs.launchpad.dev/ubuntu/+source/.../+bug/1/+addcomment
3008
3009
3010@@ -132,7 +132,7 @@
3011 redirected to the default context.
3012
3013 >>> browser.open('http://bugs.launchpad.dev/jokosher/+bug/10')
3014- >>> print browser.url
3015+ >>> print(browser.url)
3016 http://bugs.launchpad.dev/ubuntu/+source/linux-source-2.6.15/+bug/10
3017
3018
3019@@ -154,8 +154,8 @@
3020 On the bug page, for every bug task there's one expander.
3021
3022 >>> browser.open(bug_url)
3023- >>> print len(find_tags_by_class(
3024- ... browser.contents, 'bugtask-expander'))
3025+ >>> print(len(find_tags_by_class(
3026+ ... browser.contents, 'bugtask-expander')))
3027 1
3028
3029 We add four more tasks.
3030@@ -168,8 +168,8 @@
3031 And the expander appears five times.
3032
3033 >>> browser.open(bug_url)
3034- >>> print len(find_tags_by_class(
3035- ... browser.contents, 'bugtask-expander'))
3036+ >>> print(len(find_tags_by_class(
3037+ ... browser.contents, 'bugtask-expander')))
3038 5
3039
3040 But on pages with more than ten bug tasks, we don't include the expander
3041@@ -181,7 +181,7 @@
3042 >>> logout()
3043
3044 >>> browser.open(bug_url)
3045- >>> print len(find_tags_by_class(
3046- ... browser.contents, 'bugtask-expander'))
3047+ >>> print(len(find_tags_by_class(
3048+ ... browser.contents, 'bugtask-expander')))
3049 0
3050
3051
3052=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-obfuscation.txt'
3053--- lib/lp/bugs/stories/bugs/xx-bug-obfuscation.txt 2012-02-21 22:30:41 +0000
3054+++ lib/lp/bugs/stories/bugs/xx-bug-obfuscation.txt 2018-06-30 16:32:46 +0000
3055@@ -25,10 +25,10 @@
3056 >>> anon_browser.open(
3057 ... 'http://bugs.launchpad.dev'
3058 ... '/debian/sarge/+source/mozilla-firefox/+bug/3')
3059- >>> print anon_browser.title
3060+ >>> print(anon_browser.title)
3061 Bug #3 ...
3062
3063- >>> 'user@domain.org' in anon_browser.contents
3064+ >>> b'user@domain.org' in anon_browser.contents
3065 False
3066
3067 >>> description = find_tag_by_id(
3068
3069=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-personal-subscriptions-advanced-features.txt'
3070--- lib/lp/bugs/stories/bugs/xx-bug-personal-subscriptions-advanced-features.txt 2012-10-09 10:28:02 +0000
3071+++ lib/lp/bugs/stories/bugs/xx-bug-personal-subscriptions-advanced-features.txt 2018-06-30 16:32:46 +0000
3072@@ -15,7 +15,7 @@
3073 >>> bug_notification_level_control = user_browser.getControl(
3074 ... name='field.bug_notification_level')
3075 >>> for control in bug_notification_level_control.controls:
3076- ... print control.optionValue
3077+ ... print(control.optionValue)
3078 Discussion
3079 Details
3080 Lifecycle
3081@@ -24,10 +24,10 @@
3082 this case, they want to subscribe to just metadata updates:
3083
3084 >>> bug_notification_level_control.getControl(
3085- ... 'any change is made to this bug, other than a new comment '
3086- ... 'being added').click()
3087+ ... b'any change is made to this bug, other than a new comment '
3088+ ... b'being added').click()
3089 >>> user_browser.getControl('Continue').click()
3090
3091 >>> for message in find_tags_by_class(user_browser.contents, 'message'):
3092- ... print extract_text(message)
3093+ ... print(extract_text(message))
3094 You have subscribed to this bug report.
3095
3096=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-single-comment-view.txt'
3097--- lib/lp/bugs/stories/bugs/xx-bug-single-comment-view.txt 2017-10-23 00:16:39 +0000
3098+++ lib/lp/bugs/stories/bugs/xx-bug-single-comment-view.txt 2018-06-30 16:32:46 +0000
3099@@ -10,7 +10,7 @@
3100 ... soup = find_main_content(browser.contents)
3101 ... comment_details = soup('div', 'boardCommentDetails')
3102 ... for details in comment_details:
3103- ... print details.find('strong').string
3104+ ... print(details.find('strong').string)
3105
3106 >>> print_comment_titles(browser.contents)
3107 Fantastic idea, I'd really like to see this
3108
3109=== modified file 'lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt'
3110--- lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt 2015-10-06 06:48:01 +0000
3111+++ lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt 2018-06-30 16:32:46 +0000
3112@@ -55,14 +55,14 @@
3113 >>> anon_browser.open('http://launchpad.dev/bugs/1/+text')
3114 >>> anon_browser.url
3115 'http://launchpad.dev/bugs/1/+text'
3116- >>> print anon_browser.headers['content-type']
3117+ >>> print(anon_browser.headers['content-type'])
3118 text/plain;charset=utf-8
3119
3120 The textual description contains basic information about that bug, along with
3121 all tasks related to that bug, presented in an easy-to-digest format:
3122
3123- >>> text_bug = anon_browser.contents
3124- >>> print text_bug
3125+ >>> text_bug = anon_browser.contents.decode('UTF-8')
3126+ >>> print(text_bug)
3127 bug: 1
3128 title: Firefox does not support SVG
3129 date-reported: Thu, 01 Jan 2004 20:58:04 -0000
3130@@ -151,7 +151,7 @@
3131 >>> attachments_text = text_bug[text_bug.find('attachments:'):]
3132 >>> attachment_2 = attachments_text.split('\n')[2]
3133 >>> attachment_2
3134- ' http://bugs.launchpad.dev/.../file%20with%20space.txt text/plain;
3135+ u' http://bugs.launchpad.dev/.../file%20with%20space.txt text/plain;
3136 name="file with space.txt"'
3137
3138
3139@@ -169,14 +169,14 @@
3140 >>> anon_browser.url
3141 'http://launchpad.dev/firefox/+bug/1/+text'
3142
3143- >>> print anon_browser.headers['content-type']
3144+ >>> print(anon_browser.headers['content-type'])
3145 text/plain;charset=utf-8
3146
3147 The textual report contains the same information as the report provided by the
3148 parent bug context:
3149
3150- >>> text_bug_task = anon_browser.contents
3151- >>> print text_bug_task
3152+ >>> text_bug_task = anon_browser.contents.decode('UTF-8')
3153+ >>> print(text_bug_task)
3154 bug: 1
3155 title: Firefox does not support SVG
3156 ...
3157@@ -213,8 +213,8 @@
3158 ... assert(len(bug_task_lines) == len(bug_lines))
3159 ... for line_no in range(len(bug_task_lines)):
3160 ... if bug_lines[line_no] != bug_task_lines[line_no]:
3161- ... print bug_lines[line_no]
3162- ... print bug_task_lines[line_no]
3163+ ... print(bug_lines[line_no])
3164+ ... print(bug_task_lines[line_no])
3165 http://bugs.launchpad.dev/bugs/1/+attachment/.../+files/file_a.txt text/html
3166 http://bugs.launchpad.dev/firefox/+bug/.../+files/file_a.txt text/html
3167 http://bugs.launchpad.dev/bugs/1/.../+files/file%20with%20space.txt...
3168@@ -230,10 +230,10 @@
3169 >>> anon_browser.open('http://launchpad.dev/bugs/6/+text')
3170 >>> anon_browser.url
3171 'http://launchpad.dev/bugs/6/+text'
3172- >>> print anon_browser.headers['content-type']
3173+ >>> print(anon_browser.headers['content-type'])
3174 text/plain;charset=utf-8
3175
3176- >>> print anon_browser.contents
3177+ >>> print(anon_browser.contents)
3178 bug: 6
3179 ...
3180 duplicate-of: 5
3181@@ -245,10 +245,10 @@
3182 >>> anon_browser.open('http://launchpad.dev/bugs/5/+text')
3183 >>> anon_browser.url
3184 'http://launchpad.dev/bugs/5/+text'
3185- >>> print anon_browser.headers['content-type']
3186+ >>> print(anon_browser.headers['content-type'])
3187 text/plain;charset=utf-8
3188
3189- >>> print anon_browser.contents
3190+ >>> print(anon_browser.contents)
3191 bug: 5
3192 ...
3193 duplicate-of:
3194@@ -268,10 +268,10 @@
3195 >>> anon_browser.open('http://launchpad.dev/firefox/+bugs-text')
3196 >>> anon_browser.url
3197 'http://launchpad.dev/firefox/+bugs-text'
3198- >>> print anon_browser.headers['content-type']
3199+ >>> print(anon_browser.headers['content-type'])
3200 text/plain;charset=utf-8
3201
3202- >>> print anon_browser.contents
3203+ >>> print(anon_browser.contents)
3204 5
3205 4
3206
3207@@ -283,10 +283,10 @@
3208 >>> search_parameters = 'field.status:list=FIXRELEASED'
3209 >>> url = base_url + '?' + search_parameters
3210 >>> anon_browser.open(url)
3211- >>> print anon_browser.headers['content-type']
3212+ >>> print(anon_browser.headers['content-type'])
3213 text/plain;charset=utf-8
3214
3215- >>> print anon_browser.contents
3216+ >>> print(anon_browser.contents)
3217 1
3218
3219 Searching for bugs in a component of a distribution works too.
3220@@ -295,16 +295,16 @@
3221 >>> search_parameters = 'field.component=1'
3222 >>> url = base_url + '?' + search_parameters
3223 >>> anon_browser.open(url)
3224- >>> print anon_browser.headers['content-type']
3225+ >>> print(anon_browser.headers['content-type'])
3226 text/plain;charset=utf-8
3227
3228- >>> print anon_browser.contents
3229+ >>> print(anon_browser.contents)
3230 10
3231
3232 This page is also available for project groups.
3233
3234 >>> anon_browser.open('http://launchpad.dev/mozilla/+bugs-text')
3235- >>> print anon_browser.contents
3236+ >>> print(anon_browser.contents)
3237 15
3238 5
3239 4
3240@@ -315,7 +315,7 @@
3241 When a bug is private, the textual description reflects this:
3242
3243 >>> admin_browser.open('http://launchpad.dev/bugs/14/+text')
3244- >>> print admin_browser.contents
3245+ >>> print(admin_browser.contents)
3246 bug: 14
3247 title: jokosher exposes personal details in its actions portlet
3248 date-reported: Thu, 09 Aug 2007 11:39:16 -0000
3249
3250=== modified file 'lib/lp/bugs/stories/bugs/xx-bugs-advanced-search-upstream-status.txt'
3251--- lib/lp/bugs/stories/bugs/xx-bugs-advanced-search-upstream-status.txt 2012-10-02 06:36:44 +0000
3252+++ lib/lp/bugs/stories/bugs/xx-bugs-advanced-search-upstream-status.txt 2018-06-30 16:32:46 +0000
3253@@ -26,7 +26,7 @@
3254 >>> upstream_status = anon_browser.getControl(
3255 ... name='field.status_upstream')
3256 >>> upstream_status.displayValue = [
3257- ... 'Show bugs that need to be forwarded to an upstream bug tracker']
3258+ ... b'Show bugs that need to be forwarded to an upstream bug tracker']
3259 >>> anon_browser.getControl('Search', index=0).click()
3260 >>> print_bugtasks(anon_browser.contents)
3261 2 Blackhole Trash folder Ubuntu Medium New
3262@@ -50,8 +50,8 @@
3263 ... BugTaskStatus.INVALID, getUtility(ILaunchBag).user)
3264
3265 >>> for bugtask in bug_two.bugtasks:
3266- ... print "%s, %s" % (
3267- ... bugtask.target.bugtargetdisplayname, bugtask.status.title)
3268+ ... print("%s, %s" % (
3269+ ... bugtask.target.bugtargetdisplayname, bugtask.status.title))
3270 Tomcat, Invalid
3271 Ubuntu, New
3272 Ubuntu Hoary, New
3273@@ -64,9 +64,9 @@
3274 >>> upstream_status = anon_browser.getControl(
3275 ... name='field.status_upstream')
3276 >>> upstream_status.displayValue = [
3277- ... 'Show bugs that need to be forwarded to an upstream bug tracker']
3278+ ... b'Show bugs that need to be forwarded to an upstream bug tracker']
3279 >>> anon_browser.getControl('Search', index=0).click()
3280- >>> print anon_browser.contents
3281+ >>> print(anon_browser.contents)
3282 <!DOCTYPE...
3283 ...No results...
3284
3285@@ -79,7 +79,7 @@
3286 >>> upstream_status = anon_browser.getControl(
3287 ... name='field.status_upstream')
3288 >>> upstream_status.displayValue = [
3289- ... 'Show bugs that are not known to affect upstream']
3290+ ... b'Show bugs that are not known to affect upstream']
3291 >>> anon_browser.getControl('Search', index=0).click()
3292 >>> print_bugtasks(anon_browser.contents)
3293 10 another test bug linux-source-2.6.15 (Ubuntu) Medium New
3294@@ -110,7 +110,7 @@
3295 >>> upstream_status = anon_browser.getControl(
3296 ... name='field.status_upstream')
3297 >>> upstream_status.displayValue = [
3298- ... 'Show bugs that are resolved upstream']
3299+ ... b'Show bugs that are resolved upstream']
3300 >>> anon_browser.getControl('Search', index=0).click()
3301 >>> print_bugtasks(anon_browser.contents)
3302 1 Firefox does not support SVG mozilla-firefox (Ubuntu) Medium New
3303@@ -124,8 +124,8 @@
3304 >>> upstream_status = anon_browser.getControl(
3305 ... name='field.status_upstream')
3306 >>> upstream_status.displayValue = [
3307- ... 'Show bugs that are resolved upstream',
3308- ... 'Show bugs that are not known to affect upstream'
3309+ ... b'Show bugs that are resolved upstream',
3310+ ... b'Show bugs that are not known to affect upstream'
3311 ... ]
3312
3313 >>> anon_browser.getControl('Search', index=0).click()
3314
3315=== modified file 'lib/lp/bugs/stories/bugs/xx-bugs.txt'
3316--- lib/lp/bugs/stories/bugs/xx-bugs.txt 2014-11-24 09:16:35 +0000
3317+++ lib/lp/bugs/stories/bugs/xx-bugs.txt 2018-06-30 16:32:46 +0000
3318@@ -2,14 +2,14 @@
3319 specifically Hoary.
3320
3321 >>> browser.open('http://localhost/ubuntu/hoary/+bugs')
3322- >>> print browser.title
3323+ >>> print(browser.title)
3324 Hoary (5.04) : Bugs : Ubuntu
3325
3326 This page checks that we can see a list of bugs on the distributions, in
3327 this case Ubuntu.
3328
3329 >>> browser.open('http://localhost/ubuntu/+bugs')
3330- >>> print browser.title
3331+ >>> print(browser.title)
3332 Bugs : Ubuntu...
3333
3334 Comments are intended to be contributions to a bug report that further
3335@@ -33,7 +33,7 @@
3336 >>> user_browser.url
3337 'http://bugs.launchpad.dev/debian/+source/mozilla-firefox/+bug/2'
3338
3339- >>> print user_browser.contents
3340+ >>> print(user_browser.contents)
3341 <...
3342 ...This is a test comment...
3343
3344
3345=== modified file 'lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.txt'
3346--- lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.txt 2013-04-11 01:27:33 +0000
3347+++ lib/lp/bugs/stories/bugs/xx-bugtask-assignee-widget.txt 2018-06-30 16:32:46 +0000
3348@@ -1,10 +1,10 @@
3349 The bug task edit page now features a new and improved assignee
3350 widget, which makes it easier to "take" a task.
3351
3352- >>> print http(r"""
3353+ >>> print(http(br"""
3354 ... GET /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1
3355 ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
3356- ... """)
3357+ ... """))
3358 HTTP/1.1 200 Ok
3359 ...
3360 ...Assigned to...
3361@@ -14,7 +14,7 @@
3362 So, taking the task is now as simple as selecting the "me" radio
3363 button:
3364
3365- >>> print http(r"""
3366+ >>> print(http(br"""
3367 ... POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1
3368 ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
3369 ... Referer: https://launchpad.dev/
3370@@ -69,17 +69,17 @@
3371 ...
3372 ... Save Changes
3373 ... -----------------------------19759086281403130373932339922--
3374- ... """)
3375+ ... """))
3376 HTTP/1.1 303 See Other
3377 ...
3378
3379 In this example, we were logged in as Foo Bar, so the task is now
3380 automagically assigned to Foo Bar.
3381
3382- >>> print http(r"""
3383+ >>> print(http(br"""
3384 ... GET /ubuntu/+source/mozilla-firefox/+bug/1 HTTP/1.1
3385 ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
3386- ... """)
3387+ ... """))
3388 HTTP/1.1 200 Ok
3389 ...
3390 ...mozilla-firefox (Ubuntu)...Foo Bar...
3391@@ -87,7 +87,7 @@
3392
3393 But, you can also assign the task to another person, of course:
3394
3395- >>> print http(r"""
3396+ >>> print(http(br"""
3397 ... POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1
3398 ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
3399 ... Referer: https://launchpad.dev/
3400@@ -143,16 +143,16 @@
3401 ...
3402 ... Save Changes
3403 ... -----------------------------19759086281403130373932339922--
3404- ... """)
3405+ ... """))
3406 HTTP/1.1 303 See Other
3407 ...
3408
3409 In this case, we assigned the task to Sample Person:
3410
3411- >>> print http(r"""
3412+ >>> print(http(br"""
3413 ... GET /ubuntu/+source/mozilla-firefox/+bug/1 HTTP/1.1
3414 ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
3415- ... """)
3416+ ... """))
3417 HTTP/1.1 200 Ok
3418 ...
3419 ...mozilla-firefox (Ubuntu)...Sample Person...
3420@@ -161,7 +161,7 @@
3421 Lastly, the widget also allows you to simply assign the task to nobody
3422 (to, "give up" the task, you might say)
3423
3424- >>> print http(r"""
3425+ >>> print(http(br"""
3426 ... POST /ubuntu/+source/mozilla-firefox/+bug/1/+editstatus HTTP/1.1
3427 ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
3428 ... Referer: https://launchpad.dev/
3429@@ -217,16 +217,16 @@
3430 ...
3431 ... Save Changes
3432 ... -----------------------------19759086281403130373932339922--
3433- ... """)
3434+ ... """))
3435 HTTP/1.1 303 See Other
3436 ...
3437
3438 And now the bug task is unassigned:
3439
3440- >>> print http(r"""
3441+ >>> print(http(br"""
3442 ... GET /ubuntu/+source/mozilla-firefox/+bug/1 HTTP/1.1
3443 ... Authorization: Basic Zm9vLmJhckBjYW5vbmljYWwuY29tOnRlc3Q=
3444- ... """)
3445+ ... """))
3446 HTTP/1.1 200 Ok
3447 ...
3448 ...mozilla-firefox (Ubuntu)...
3449
3450=== modified file 'lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt'
3451--- lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt 2014-11-29 06:41:25 +0000
3452+++ lib/lp/bugs/stories/bugs/xx-distribution-bugs-page.txt 2018-06-30 16:32:46 +0000
3453@@ -22,7 +22,7 @@
3454
3455 >>> user_browser.open('http://bugs.launchpad.dev/ubuntu/+bugs')
3456 >>> user_browser.getLink('Subscribe to bug mail').click()
3457- >>> print user_browser.url
3458+ >>> print(user_browser.url)
3459 http://bugs.launchpad.dev/ubuntu/+subscribe
3460
3461
3462@@ -41,7 +41,7 @@
3463 >>> anon_browser.url
3464 'http://.../+bugs?field.status_upstream=resolved_upstream'
3465
3466- >>> print find_main_content(anon_browser.contents)
3467+ >>> print(find_main_content(anon_browser.contents))
3468 <...
3469 <p>There are currently no open bugs.</p>
3470 ...
3471@@ -78,7 +78,7 @@
3472 see which bugs will expire if they are not confirmed.
3473
3474 >>> expirable_bugs_link.click()
3475- >>> print anon_browser.title
3476+ >>> print(anon_browser.title)
3477 Expirable bugs : Bugs : Ubuntu
3478
3479 Debian does not use Launchpad to track bugs; the anonymous user cannot
3480
3481=== modified file 'lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt'
3482--- lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt 2009-06-12 16:36:02 +0000
3483+++ lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt 2018-06-30 16:32:46 +0000
3484@@ -12,6 +12,6 @@
3485 ... 'http://bugs.launchpad.dev/ubuntu/+source/alsa-utils/')
3486 >>> portlet = find_portlet(anon_browser.contents,
3487 ... '"alsa-utils" versions published in Ubuntu')
3488- >>> print portlet
3489+ >>> print(portlet)
3490 <div class="portlet" id="portlet-publishing-details">
3491 ...
3492
3493=== modified file 'lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt'
3494--- lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt 2014-11-29 06:41:25 +0000
3495+++ lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt 2018-06-30 16:32:46 +0000
3496@@ -22,7 +22,7 @@
3497
3498 >>> user_browser.open('http://bugs.launchpad.dev/ubuntu/warty')
3499 >>> user_browser.getLink('Subscribe to bug mail').click()
3500- >>> print user_browser.url
3501+ >>> print(user_browser.url)
3502 http://bugs.launchpad.dev/ubuntu/warty/+subscribe
3503
3504
3505@@ -40,7 +40,7 @@
3506 >>> anon_browser.url
3507 'http://.../+bugs?field.status_upstream=resolved_upstream'
3508
3509- >>> print find_main_content(anon_browser.contents)
3510+ >>> print(find_main_content(anon_browser.contents))
3511 <...
3512 <p>There are currently no open bugs.</p>
3513 ...
3514@@ -58,6 +58,6 @@
3515 see which bugs will expire if they are not confirmed.
3516
3517 >>> expirable_bugs_link.click()
3518- >>> print anon_browser.title
3519+ >>> print(anon_browser.title)
3520 Expirable bugs : Warty (4.10) : Bugs : Ubuntu
3521
3522
3523=== modified file 'lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt'
3524--- lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt 2012-07-31 09:41:51 +0000
3525+++ lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt 2018-06-30 16:32:46 +0000
3526@@ -11,13 +11,13 @@
3527 ... 'debian/+source/mozilla-firefox/+bug/8/+secrecy')
3528 >>> admin_browser.getControl('Private', index=1).selected = True
3529 >>> admin_browser.getControl('Change').click()
3530- >>> print admin_browser.url
3531+ >>> print(admin_browser.url)
3532 http://bugs.launchpad.dev/debian/+source/mozilla-firefox/+bug/8
3533
3534- >>> print admin_browser.title
3535+ >>> print(admin_browser.title)
3536 Bug #8 ...Printing doesn't work...
3537
3538- >>> print extract_text(find_tag_by_id(admin_browser.contents, 'privacy'))
3539+ >>> print(extract_text(find_tag_by_id(admin_browser.contents, 'privacy')))
3540 This report contains Private information...
3541
3542 Next we mark another bug as a duplicate of the private bug:
3543@@ -33,21 +33,21 @@
3544
3545 >>> def print_messages(browser):
3546 ... for tag in find_tags_by_class(browser.contents, 'message'):
3547- ... print tag.renderContents()
3548+ ... print(tag.renderContents())
3549
3550- >>> print find_tag_by_id(
3551- ... admin_browser.contents, 'duplicate-of').renderContents()
3552+ >>> print(find_tag_by_id(
3553+ ... admin_browser.contents, 'duplicate-of').renderContents())
3554 bug #8
3555
3556 But when accessing it as an unprivileged user the title of the private
3557 bug cannot be found in the messages on the duplicate bug page:
3558
3559 >>> user_browser.open(admin_browser.url)
3560- >>> print find_tag_by_id(user_browser.contents, 'duplicate-of')
3561+ >>> print(find_tag_by_id(user_browser.contents, 'duplicate-of'))
3562 None
3563
3564 The same is true when viewing the duplicate bug anonymously:
3565
3566 >>> anon_browser.open(admin_browser.url)
3567- >>> print find_tag_by_id(anon_browser.contents, 'duplicate-of')
3568+ >>> print(find_tag_by_id(anon_browser.contents, 'duplicate-of'))
3569 None
3570
3571=== modified file 'lib/lp/bugs/stories/bugs/xx-front-page-bug-lists.txt'
3572--- lib/lp/bugs/stories/bugs/xx-front-page-bug-lists.txt 2012-08-08 11:48:29 +0000
3573+++ lib/lp/bugs/stories/bugs/xx-front-page-bug-lists.txt 2018-06-30 16:32:46 +0000
3574@@ -46,11 +46,11 @@
3575 to the bug target and to the bug reporter's page.
3576
3577 >>> def print_bugs_links(bug_row):
3578- ... print "%s: %s" % (
3579+ ... print("%s: %s" % (
3580 ... bug_row.span.a.renderContents().strip(),
3581- ... bug_row.a.renderContents())
3582- ... print bug_row.a['href']
3583- ... print bug_row.span.a['href']
3584+ ... bug_row.a.renderContents()))
3585+ ... print(bug_row.a['href'])
3586+ ... print(bug_row.span.a['href'])
3587 >>> for li in reported_bugs('li'):
3588 ... print_bugs_links(li)
3589 Bigfixer: Bug #...: Summary for new bug ...
3590
3591=== modified file 'lib/lp/bugs/stories/bugs/xx-front-page-info.txt'
3592--- lib/lp/bugs/stories/bugs/xx-front-page-info.txt 2015-06-15 08:35:10 +0000
3593+++ lib/lp/bugs/stories/bugs/xx-front-page-info.txt 2018-06-30 16:32:46 +0000
3594@@ -19,7 +19,7 @@
3595 >>> anon_browser.open(
3596 ... 'http://bugs.launchpad.dev/test-project/+bugs')
3597 >>> uses_malone_p = find_tag_by_id(anon_browser.contents, 'no-malone')
3598- >>> print extract_text(uses_malone_p)
3599+ >>> print(extract_text(uses_malone_p))
3600 Test-project must be configured in order for Launchpad to forward bugs to
3601 the project's developers.
3602
3603@@ -33,7 +33,7 @@
3604 ... 'http://bugs.launchpad.dev/test-project/+bugs')
3605 >>> enable_tracker = find_tag_by_id(
3606 ... admin_browser.contents, 'no-malone-edit')
3607- >>> print extract_text(enable_tracker)
3608+ >>> print(extract_text(enable_tracker))
3609 Configure Bugs
3610
3611 The +bugs page for a project using Launchpad for bug tracking
3612@@ -49,13 +49,13 @@
3613 >>> anon_browser.open('http://bugs.launchpad.dev/uses-malone/+bugs')
3614 >>> bug_supervisor = find_tag_by_id(
3615 ... anon_browser.contents, 'bug-supervisor')
3616- >>> print extract_text(bug_supervisor)
3617+ >>> print(extract_text(bug_supervisor))
3618 Bug supervisor:
3619 None set
3620
3621 >>> bug_list = find_tag_by_id(
3622 ... anon_browser.contents, 'bugs-table-listing')
3623- >>> print extract_text(bug_list)
3624+ >>> print(extract_text(bug_list))
3625 There are currently no open bugs.
3626
3627 Projects that use an external bug tracker will list the tracker on a
3628@@ -69,7 +69,7 @@
3629 >>> anon_browser.open(
3630 ... 'http://bugs.launchpad.dev/test-project/+bugs')
3631 >>> tracker_text = find_tag_by_id(anon_browser.contents, 'bugtracker')
3632- >>> print extract_text(tracker_text)
3633+ >>> print(extract_text(tracker_text))
3634 Bugs are tracked in tracker.example.com/.
3635
3636 Projects that are linked to an Ubuntu distro source package and that
3637@@ -84,7 +84,7 @@
3638 >>> logout()
3639 >>> anon_browser.open(
3640 ... 'http://bugs.launchpad.dev/test-project/+bugs')
3641- >>> print extract_text(
3642- ... find_tag_by_id(anon_browser.contents, 'also-in-ubuntu'))
3643+ >>> print(extract_text(
3644+ ... find_tag_by_id(anon_browser.contents, 'also-in-ubuntu')))
3645 Ubuntu also tracks bugs for packages derived from this project:
3646 test-project-package in Ubuntu.
3647
3648=== modified file 'lib/lp/bugs/stories/bugs/xx-front-page-search.txt'
3649--- lib/lp/bugs/stories/bugs/xx-front-page-search.txt 2016-01-26 15:47:37 +0000
3650+++ lib/lp/bugs/stories/bugs/xx-front-page-search.txt 2018-06-30 16:32:46 +0000
3651@@ -25,7 +25,7 @@
3652 >>> anon_browser.getControl('All projects').selected = True
3653 >>> anon_browser.getControl(name='field.searchtext').value = 'test bug'
3654 >>> anon_browser.getControl('Search Bug Reports').click()
3655- >>> print anon_browser.title
3656+ >>> print(anon_browser.title)
3657 Search all bug reports
3658 >>> print_bugtasks(anon_browser.contents)
3659 3 Bug Title Test
3660@@ -86,7 +86,7 @@
3661 'test bug'
3662
3663 >>> for message in find_tags_by_class(anon_browser.contents, 'message'):
3664- ... print message.renderContents()
3665+ ... print(message.renderContents())
3666 Please enter a project name
3667
3668 An error message will be displayed also if the project isn't registered
3669@@ -102,7 +102,7 @@
3670 >>> anon_browser.getControl(name='field.searchtext').value
3671 'test bug'
3672 >>> for message in find_tags_by_class(anon_browser.contents, 'message'):
3673- ... print message.renderContents()
3674+ ... print(message.renderContents())
3675 There is no project named &#x27;invalid&#x27; registered in Launchpad
3676
3677 If the user doesn't know what name to write, they can use the 'Choose'
3678@@ -123,7 +123,7 @@
3679 >>> anon_browser.getControl(name='field.scope.target').value = 'evolution'
3680 >>> anon_browser.getControl(name='field.searchtext').value = 'test bug'
3681 >>> anon_browser.getControl('Search Bug Reports').click()
3682- >>> print anon_browser.title
3683+ >>> print(anon_browser.title)
3684 Bugs : Evolution...
3685 >>> anon_browser.url
3686 'http://bugs.launchpad.dev/evolution/+bugs?field.searchtext=test+bug...'
3687@@ -138,7 +138,7 @@
3688 >>> anon_browser.getControl(name='field.scope.target').value = 'gnome'
3689 >>> anon_browser.getControl(name='field.searchtext').value = 'test bug'
3690 >>> anon_browser.getControl('Search Bug Reports').click()
3691- >>> print anon_browser.title
3692+ >>> print(anon_browser.title)
3693 Bugs : GNOME
3694 >>> anon_browser.url
3695 'http://bugs.launchpad.dev/gnome/+bugs?field.searchtext=test+bug...'
3696@@ -153,7 +153,7 @@
3697 >>> anon_browser.getControl(name='field.scope.target').value = 'ubuntu'
3698 >>> anon_browser.getControl(name='field.searchtext').value = 'test bug'
3699 >>> anon_browser.getControl('Search Bug Reports').click()
3700- >>> print anon_browser.title
3701+ >>> print(anon_browser.title)
3702 Bugs : Ubuntu...
3703 >>> anon_browser.url
3704 'http://bugs.launchpad.dev/ubuntu/+bugs?field.searchtext=test+bug...'
3705
3706=== modified file 'lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt'
3707--- lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt 2012-05-11 12:53:36 +0000
3708+++ lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt 2018-06-30 16:32:46 +0000
3709@@ -10,7 +10,7 @@
3710 >>> anon_browser.open('http://bugs.launchpad.dev/')
3711 >>> statistics = find_portlet(
3712 ... anon_browser.contents, 'Statistics')
3713- >>> print extract_text(statistics)
3714+ >>> print(extract_text(statistics))
3715 Statistics
3716 15 bugs reported across 7 projects
3717 including 12 links to 8 bug trackers
3718
3719=== modified file 'lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt'
3720--- lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt 2016-01-26 15:47:37 +0000
3721+++ lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt 2018-06-30 16:32:46 +0000
3722@@ -9,8 +9,8 @@
3723 ... 'http://bugs.launchpad.dev/jokosher/+bug/11/+editstatus')
3724 >>> user_browser.getControl('Status').value = ['Incomplete']
3725 >>> user_browser.getControl('Save Changes').click()
3726- >>> print extract_text(
3727- ... find_tags_by_class(user_browser.contents, 'statusINCOMPLETE')[0])
3728+ >>> print(extract_text(
3729+ ... find_tags_by_class(user_browser.contents, 'statusINCOMPLETE')[0]))
3730 Incomplete
3731
3732 No Privileges Person can now search for the bug using the advanced
3733@@ -40,8 +40,8 @@
3734 The bug No Privileges Person examined earlier does not have any new
3735 information, so they do not see it in the list.
3736
3737- >>> print extract_text(
3738- ... find_tag_by_id(user_browser.contents, 'bugs-table-listing'))
3739+ >>> print(extract_text(
3740+ ... find_tag_by_id(user_browser.contents, 'bugs-table-listing')))
3741 No results for search
3742
3743 No Privileges Person can supply new information by posting a new
3744@@ -91,8 +91,8 @@
3745 stating that the bug report will be marked for expiration.
3746
3747 >>> user_browser.open('http://bugs.launchpad.dev/jokosher/+bug/11')
3748- >>> print extract_text(
3749- ... find_tag_by_id(user_browser.contents, 'can-expire'))
3750+ >>> print(extract_text(
3751+ ... find_tag_by_id(user_browser.contents, 'can-expire')))
3752 This bug report will be marked for expiration in 59 days if no further
3753 activity occurs.
3754 (find out why)
3755@@ -121,8 +121,8 @@
3756 >>> logout()
3757
3758 >>> user_browser.open('http://bugs.launchpad.dev/jokosher/+bug/11')
3759- >>> print extract_text(
3760- ... find_tag_by_id(user_browser.contents, 'can-expire'))
3761+ >>> print(extract_text(
3762+ ... find_tag_by_id(user_browser.contents, 'can-expire')))
3763 This bug report was marked for expiration 1 days ago.
3764 (find out why)
3765
3766@@ -153,7 +153,7 @@
3767 the bug they set to Incomplete previously.
3768
3769 >>> expirable_bugs_link.click()
3770- >>> print user_browser.title
3771+ >>> print(user_browser.title)
3772 Expirable bugs : Bugs : Jokosher
3773
3774 >>> contents = find_main_content(user_browser.contents)
3775@@ -171,7 +171,7 @@
3776 >>> user_browser.getControl('Search', index=0).type
3777 Traceback (most recent call last):
3778 ...
3779- LookupError: label 'Search'
3780+ LookupError: label u'Search'
3781
3782 The 'Report a bug' link is also not present.
3783
3784@@ -201,7 +201,7 @@
3785 >>> user_browser.getLink('Make Jokosher use autoaudiosink').click()
3786 >>> user_browser.getControl('Status').value = ['Confirmed']
3787 >>> user_browser.getControl('Save Changes', index=0).click()
3788- >>> print find_tag_by_id(user_browser.contents, 'can-expire')
3789+ >>> print(find_tag_by_id(user_browser.contents, 'can-expire'))
3790 None
3791
3792 >>> user_browser.getLink('Bugs').click()
3793@@ -231,14 +231,14 @@
3794 ... 'http://bugs.launchpad.dev/debian/+source/mozilla-firefox/+bug/8')
3795 >>> user_browser.getControl('Status').value = ['Incomplete']
3796 >>> user_browser.getControl('Save Changes', index=0).click()
3797- >>> print find_tag_by_id(user_browser.contents, 'can-expire')
3798+ >>> print(find_tag_by_id(user_browser.contents, 'can-expire'))
3799 None
3800
3801 If No Privileges Person hacks the URL to see a listing of Debian's
3802 expirable bugs they read that Debian does not use bug expiration.
3803
3804 >>> user_browser.open('http://bugs.launchpad.dev/debian/+expirable-bugs')
3805- >>> print extract_text(find_main_content(user_browser.contents).p)
3806+ >>> print(extract_text(find_main_content(user_browser.contents).p))
3807 This project has not enabled bug expiration. No bugs can expire.
3808 Project administrator's may choose to enable bug expiration by
3809 updating the project's details. See Bugs/Expiry.
3810@@ -273,7 +273,7 @@
3811
3812 >>> user_browser.open('http://bugs.launchpad.dev/jokosher')
3813 >>> user_browser.getControl('Search', index=0).click()
3814- >>> print user_browser.url
3815+ >>> print(user_browser.url)
3816 http://bugs.launchpad.dev/jokosher/+bugs?...&field.status%3Alist=INCOMPLETE_WITH_RESPONSE&field.status%3Alist=INCOMPLETE_WITHOUT_RESPONSE...
3817 >>> ('<a href="http://bugs.launchpad.dev/jokosher/+bug/11" class="bugtitle">' in
3818 ... str(find_tag_by_id(user_browser.contents, 'bugs-table-listing')))
3819
3820=== modified file 'lib/lp/bugs/stories/bugs/xx-link-bug-to-branch.txt'
3821--- lib/lp/bugs/stories/bugs/xx-link-bug-to-branch.txt 2010-12-21 19:28:29 +0000
3822+++ lib/lp/bugs/stories/bugs/xx-link-bug-to-branch.txt 2018-06-30 16:32:46 +0000
3823@@ -7,10 +7,10 @@
3824 >>> user_browser.open(
3825 ... "http://bugs.launchpad.dev/firefox/+bug/1")
3826 >>> user_browser.getLink('Link a related branch').click()
3827- >>> print user_browser.url
3828+ >>> print(user_browser.url)
3829 http://bugs.launchpad.dev/firefox/+bug/1/+addbranch
3830- >>> print extract_text(find_tag_by_id(
3831- ... user_browser.contents, 'maincontent'))
3832+ >>> print(extract_text(find_tag_by_id(
3833+ ... user_browser.contents, 'maincontent')))
3834 Add a branch to bug #1...
3835 Linking a Bazaar branch to a bug allows you to notify others of
3836 work to fix this bug.
3837@@ -26,9 +26,9 @@
3838 This takes us back to the main page where this branch is now listed as
3839 a related branch.
3840
3841- >>> print user_browser.url
3842+ >>> print(user_browser.url)
3843 http://bugs.launchpad.dev/firefox/+bug/1
3844- >>> print extract_text(user_browser.contents)
3845+ >>> print(extract_text(user_browser.contents))
3846 Bug #1...
3847 Successfully registered branch main for this bug.
3848 ...
3849@@ -42,8 +42,8 @@
3850 ... 'http://code.launchpad.dev/~name12/firefox/main/+bug/1/+delete')
3851 >>> link = user_browser.getLink(url=delete_branch_link_url)
3852 >>> link.click()
3853- >>> print extract_text(find_tag_by_id(
3854- ... user_browser.contents, 'maincontent'))
3855+ >>> print(extract_text(find_tag_by_id(
3856+ ... user_browser.contents, 'maincontent')))
3857 Remove bug branch link...
3858 Are you sure you want to remove the link between Bug #1: Firefox does
3859 not support SVG and the branch lp://dev/~name12/firefox/main?
3860
3861=== modified file 'lib/lp/bugs/stories/bugs/xx-malone-homepage.txt'
3862--- lib/lp/bugs/stories/bugs/xx-malone-homepage.txt 2010-07-27 12:42:00 +0000
3863+++ lib/lp/bugs/stories/bugs/xx-malone-homepage.txt 2018-06-30 16:32:46 +0000
3864@@ -4,14 +4,14 @@
3865 >>> browser.url
3866 'http://bugs.launchpad.dev/'
3867
3868- >>> print browser.title
3869+ >>> print(browser.title)
3870 Launchpad Bugs
3871
3872 There are a few related pages linked in a portlet:
3873
3874 >>> related_pages = find_portlet(browser.contents, 'Related pages')
3875 >>> for link in related_pages.findAll('a'):
3876- ... print "%s\n --> %s" % (extract_text(link), link.get('href'))
3877+ ... print("%s\n --> %s" % (extract_text(link), link.get('href')))
3878 Bug trackers
3879 --> http://bugs.launchpad.dev/bugs/bugtrackers
3880 CVE tracker
3881
3882=== modified file 'lib/lp/bugs/stories/bugs/xx-numbered-comments.txt'
3883--- lib/lp/bugs/stories/bugs/xx-numbered-comments.txt 2012-12-11 05:41:50 +0000
3884+++ lib/lp/bugs/stories/bugs/xx-numbered-comments.txt 2018-06-30 16:32:46 +0000
3885@@ -14,10 +14,10 @@
3886 ... person_node = comment.find(
3887 ... lambda node: 'person' in node.get('class', ''))
3888 ... comment_node = comment.find(None, 'comment-text')
3889- ... print "%s: %s\n %s" % (
3890+ ... print("%s: %s\n %s" % (
3891 ... extract_text(number_node),
3892 ... extract_text(person_node),
3893- ... extract_text(comment_node)[:50])
3894+ ... extract_text(comment_node)[:50]))
3895 #1: Valentina Commissari (tsukimi)
3896 The solution to this is to make Jokosher use autoa
3897 #2: Diogo Matsubara (matsubara)
3898
3899=== modified file 'lib/lp/bugs/stories/bugs/xx-portlets-bug-milestones.txt'
3900--- lib/lp/bugs/stories/bugs/xx-portlets-bug-milestones.txt 2012-07-10 01:13:08 +0000
3901+++ lib/lp/bugs/stories/bugs/xx-portlets-bug-milestones.txt 2018-06-30 16:32:46 +0000
3902@@ -12,7 +12,7 @@
3903 >>> anon_browser.open("http://bugs.launchpad.dev/firefox")
3904 >>> portlet = find_portlet(
3905 ... anon_browser.contents, "Milestone-targeted bugs")
3906- >>> print portlet
3907+ >>> print(portlet)
3908 None
3909
3910 To enable the portlet, a bugtask needs to have a milestone associated with it.
3911@@ -22,7 +22,7 @@
3912 >>> from zope.component import getUtility
3913 >>> from lp.bugs.interfaces.bugtask import IBugTaskSet
3914 >>> ff_bugtask = getUtility(IBugTaskSet).get(13)
3915- >>> print ff_bugtask.bug.id
3916+ >>> print(ff_bugtask.bug.id)
3917 4
3918
3919 >>> from lp.registry.interfaces.milestone import IMilestoneSet
3920@@ -30,7 +30,7 @@
3921 >>> firefox = getUtility(IProductSet).getByName('firefox')
3922 >>> ff_milestone = getUtility(IMilestoneSet).getByNameAndProduct(
3923 ... "1.0", firefox)
3924- >>> print ff_milestone.name
3925+ >>> print(ff_milestone.name)
3926 1.0
3927
3928 The bugtask milestone is set to the Firefox 1.0 milestone.
3929@@ -44,7 +44,7 @@
3930 >>> anon_browser.open("http://bugs.launchpad.dev/firefox")
3931 >>> portlet = find_portlet(
3932 ... anon_browser.contents, "Milestone-targeted bugs")
3933- >>> print extract_text(portlet)
3934+ >>> print(extract_text(portlet))
3935 Milestone-targeted bugs
3936 1
3937 1.0
3938@@ -61,7 +61,7 @@
3939 >>> anon_browser.open("http://bugs.launchpad.dev/debian/sarge/+bugs")
3940 >>> portlet = find_portlet(
3941 ... anon_browser.contents, "Milestone-targeted bugs")
3942- >>> print extract_text(portlet)
3943+ >>> print(extract_text(portlet))
3944 Milestone-targeted bugs
3945 1
3946 3.1
3947
3948=== modified file 'lib/lp/bugs/stories/bugs/xx-portlets-bug-series.txt'
3949--- lib/lp/bugs/stories/bugs/xx-portlets-bug-series.txt 2012-07-10 01:13:08 +0000
3950+++ lib/lp/bugs/stories/bugs/xx-portlets-bug-series.txt 2018-06-30 16:32:46 +0000
3951@@ -6,7 +6,7 @@
3952
3953 >>> anon_browser.open("http://bugs.launchpad.dev/debian/+bugs")
3954 >>> portlet = find_portlet(anon_browser.contents, "Series-targeted bugs")
3955- >>> print portlet
3956+ >>> print(portlet)
3957 None
3958
3959 Change debian to track bugs in Launchpad and the portlet becomes visible.
3960@@ -16,7 +16,7 @@
3961
3962 >>> anon_browser.open("http://bugs.launchpad.dev/debian/+bugs")
3963 >>> portlet = find_portlet(anon_browser.contents, "Series-targeted bugs")
3964- >>> print extract_text(portlet)
3965+ >>> print(extract_text(portlet))
3966 Series-targeted bugs
3967 1
3968 sarge
3969@@ -25,7 +25,7 @@
3970
3971 >>> anon_browser.open("http://bugs.launchpad.dev/debian/sarge/+bugs")
3972 >>> portlet = find_portlet(anon_browser.contents, "Series-targeted bugs")
3973- >>> print extract_text(portlet)
3974+ >>> print(extract_text(portlet))
3975 Series-targeted bugs
3976 1
3977 sarge
3978@@ -34,14 +34,14 @@
3979
3980 >>> anon_browser.open("http://bugs.launchpad.dev/ubuntu/+bugs")
3981 >>> portlet = find_portlet(anon_browser.contents, "Series-targeted bugs")
3982- >>> print extract_text(portlet)
3983+ >>> print(extract_text(portlet))
3984 Series-targeted bugs
3985 1
3986 hoary
3987 1
3988 warty
3989
3990- >>> print anon_browser.getLink("hoary").url
3991+ >>> print(anon_browser.getLink("hoary").url)
3992 http://bugs.launchpad.dev/ubuntu/hoary/+bugs
3993
3994 The same portlet is also available for project and project series
3995@@ -49,14 +49,14 @@
3996
3997 >>> anon_browser.open("http://bugs.launchpad.dev/firefox/+bugs")
3998 >>> portlet = find_portlet(anon_browser.contents, "Series-targeted bugs")
3999- >>> print extract_text(portlet)
4000+ >>> print(extract_text(portlet))
4001 Series-targeted bugs
4002 1
4003 1.0
4004
4005 >>> anon_browser.open("http://bugs.launchpad.dev/firefox/1.0/+bugs")
4006 >>> portlet = find_portlet(anon_browser.contents, "Series-targeted bugs")
4007- >>> print extract_text(portlet)
4008+ >>> print(extract_text(portlet))
4009 Series-targeted bugs
4010 1
4011 1.0
4012
4013=== modified file 'lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt'
4014--- lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt 2014-11-29 06:41:25 +0000
4015+++ lib/lp/bugs/stories/bugs/xx-product-bugs-page.txt 2018-06-30 16:32:46 +0000
4016@@ -61,7 +61,7 @@
4017 >>> anon_browser.url
4018 'http://.../+bugs?field.status_upstream=resolved_upstream'
4019
4020- >>> print find_main_content(anon_browser.contents)
4021+ >>> print(find_main_content(anon_browser.contents))
4022 <...
4023 <p>There are currently no open bugs.</p>
4024 ...
4025@@ -81,7 +81,7 @@
4026 see which bugs will expire if they are not confirmed.
4027
4028 >>> expirable_bugs_link.click()
4029- >>> print anon_browser.title
4030+ >>> print(anon_browser.title)
4031 Expirable bugs : Bugs : Jokosher
4032
4033 Product series may also have a link to expirable bugs. Jokosher's trunk
4034@@ -90,7 +90,7 @@
4035 >>> anon_browser.open('http://bugs.launchpad.dev/jokosher/trunk')
4036 >>> expirable_bugs_link = anon_browser.getLink('Incomplete bugs')
4037 >>> expirable_bugs_link.click()
4038- >>> print anon_browser.title
4039+ >>> print(anon_browser.title)
4040 Expirable bugs : Series trunk : Bugs : Jokosher
4041
4042 Thunderbird has not enabled bug expiration; the anonymous user
4043@@ -112,7 +112,7 @@
4044 >>> anon_browser.open('http://bugs.launchpad.dev/firefox')
4045 >>> tags_portlet = find_tag_by_id(anon_browser.contents, 'portlet-tags')
4046 >>> anon_browser.getLink(id='tags-content-link').click()
4047- >>> print extract_text(anon_browser.contents)
4048+ >>> print(extract_text(anon_browser.contents))
4049 Tags
4050 1
4051 layout-test
4052
4053=== modified file 'lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt'
4054--- lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt 2011-01-20 20:41:30 +0000
4055+++ lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt 2018-06-30 16:32:46 +0000
4056@@ -4,5 +4,5 @@
4057 for the ProjectGroup.
4058
4059 >>> anon_browser.open('http://bugs.launchpad.dev/gnome')
4060- >>> print anon_browser.title
4061+ >>> print(anon_browser.title)
4062 Bugs : GNOME
4063
4064=== modified file 'lib/lp/bugs/stories/bugs/xx-remote-bug-comments.txt'
4065--- lib/lp/bugs/stories/bugs/xx-remote-bug-comments.txt 2014-05-29 22:22:36 +0000
4066+++ lib/lp/bugs/stories/bugs/xx-remote-bug-comments.txt 2018-06-30 16:32:46 +0000
4067@@ -10,7 +10,7 @@
4068 ... user_browser.contents, 'remoteBugComment', only_first=True)
4069 >>> details = remote_bug_comment.find(
4070 ... attrs={'class': 'boardCommentDetails'})
4071- >>> print extract_text(details)
4072+ >>> print(extract_text(details))
4073 In
4074 Debian Bug tracker #308994,
4075 josh (jbuhl-nospam)
4076@@ -21,7 +21,7 @@
4077 Remote comments are decorated with the bug watch icon, to distinguish
4078 them from comments posted directly by Launchpad users.
4079
4080- >>> print details.find('img')['src']
4081+ >>> print(details.find('img')['src'])
4082 /@@/bug-remote
4083
4084 Since it's possible to reply to imported comments and have them
4085@@ -31,14 +31,14 @@
4086
4087 >>> activity = remote_bug_comment.find(
4088 ... attrs={'class': 'boardCommentActivity'})
4089- >>> print extract_text(activity)
4090+ >>> print(extract_text(activity))
4091 Reply on Debian Bug tracker...
4092
4093 When javascript is not available, the link simply takes us to the
4094 individual comment page, where the inline form is displayed.
4095
4096 >>> user_browser.getLink('Reply on Debian Bug tracker').click()
4097- >>> print user_browser.url
4098+ >>> print(user_browser.url)
4099 http://bugs.launchpad.dev/redfish/+bug/15/comments/1
4100
4101 We enter a comment, and submit the form.
4102@@ -51,7 +51,7 @@
4103
4104 >>> new_bug_comment = find_tags_by_class(
4105 ... user_browser.contents, 'remoteBugComment')[-1]
4106- >>> print extract_text(new_bug_comment)
4107+ >>> print(extract_text(new_bug_comment))
4108 In
4109 Debian Bug tracker #308994,
4110 ...
4111@@ -64,7 +64,7 @@
4112 to the remote bug tracker.
4113
4114 >>> activity = new_bug_comment.find(attrs={'class': 'boardCommentActivity'})
4115- >>> print extract_text(activity.findAll('td')[1])
4116+ >>> print(extract_text(activity.findAll('td')[1]))
4117 Awaiting synchronization
4118
4119 When the comment is synchronized, it receives a remote comment id, and
4120@@ -78,7 +78,7 @@
4121 >>> login('foo.bar@canonical.com')
4122 >>> bug_15 = getUtility(IBugSet).get(15)
4123 >>> message = bug_15.messages[-1]
4124- >>> print message.text_contents
4125+ >>> print(message.text_contents)
4126 A reply comment.
4127 >>> bug_message = getUtility(IBugMessageSet).getByBugAndMessage(
4128 ... bug_15, message)
4129@@ -90,7 +90,7 @@
4130 >>> user_browser.open('http://bugs.launchpad.dev/redfish/+bug/15')
4131 >>> last_bug_comment = find_tags_by_class(
4132 ... user_browser.contents, 'remoteBugComment')[-1]
4133- >>> print extract_text(last_bug_comment)
4134+ >>> print(extract_text(last_bug_comment))
4135 In
4136 Debian Bug tracker #308994,
4137 ...
4138
4139=== modified file 'lib/lp/bugs/stories/bugs/xx-switch-to-malone.txt'
4140--- lib/lp/bugs/stories/bugs/xx-switch-to-malone.txt 2011-09-20 01:33:04 +0000
4141+++ lib/lp/bugs/stories/bugs/xx-switch-to-malone.txt 2018-06-30 16:32:46 +0000
4142@@ -16,7 +16,7 @@
4143 ... '/+source/evolution/+bug/7/+editstatus')
4144 >>> main = find_main_content(user_browser.contents)
4145 >>> read_only_icon = main.find('span', {'class': 'sprite read-only'})
4146- >>> print extract_text(read_only_icon.parent)
4147+ >>> print(extract_text(read_only_icon.parent))
4148 Unknown
4149
4150 If the project switches to use Launchpad as its bug tracker, the
4151@@ -34,5 +34,5 @@
4152 ... '/debian/+source/evolution/+bug/7/+editstatus')
4153 >>> main = find_main_content(user_browser.contents)
4154 >>> read_only_icon = main.find('span', {'class': 'sprite read-only'})
4155- >>> print extract_text(read_only_icon.parent)
4156+ >>> print(extract_text(read_only_icon.parent))
4157 Unknown
4158
4159=== modified file 'lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt'
4160--- lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt 2015-07-21 09:04:01 +0000
4161+++ lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt 2018-06-30 16:32:46 +0000
4162@@ -12,7 +12,7 @@
4163 >>> user_browser.getControl('Package')
4164 Traceback (most recent call last):
4165 ...
4166- AmbiguityError: label 'Package'
4167+ AmbiguityError: label u'Package'
4168
4169 Still, the ids of the fields are unique.
4170
4171
4172=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-bug-importance-change.txt'
4173--- lib/lp/bugs/stories/bugtask-management/xx-bug-importance-change.txt 2016-01-26 15:47:37 +0000
4174+++ lib/lp/bugs/stories/bugtask-management/xx-bug-importance-change.txt 2018-06-30 16:32:46 +0000
4175@@ -5,7 +5,7 @@
4176
4177 >>> admin_browser.open('http://bugs.launchpad.dev/bugs/10')
4178 >>> importance_control = admin_browser.getControl('Importance')
4179- >>> print '\n'.join(importance_control.displayOptions)
4180+ >>> print('\n'.join(importance_control.displayOptions))
4181 Undecided
4182 Critical
4183 High
4184@@ -63,7 +63,7 @@
4185 For a product owner.
4186
4187 >>> login(ANONYMOUS)
4188- >>> print firefox.owner.name
4189+ >>> print(firefox.owner.name)
4190 name12
4191
4192 >>> login("foo.bar@canonical.com")
4193
4194=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt'
4195--- lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt 2016-01-26 15:47:37 +0000
4196+++ lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt 2018-06-30 16:32:46 +0000
4197@@ -14,7 +14,7 @@
4198 ... 'mozilla-firefox/+bug/1/+editstatus')
4199
4200 >>> status_control = user_browser.getControl('Status')
4201- >>> print status_control.displayValue
4202+ >>> print(status_control.displayValue)
4203 ['New']
4204
4205 An unprivileged user can confirm the bug:
4206@@ -22,7 +22,7 @@
4207 >>> status_control.displayValue = ['Confirmed']
4208 >>> user_browser.getControl('Save Changes').click()
4209
4210- >>> print user_browser.url
4211+ >>> print(user_browser.url)
4212 http://bugs.launchpad.dev/ubuntu/+source/mozilla-firefox/+bug/1
4213 >>> print_highlighted_bugtask(user_browser)
4214 mozilla-firefox (Ubuntu) ... Confirmed Medium Unassigned ...
4215@@ -35,7 +35,7 @@
4216 ... 'mozilla-firefox/+bug/1/+editstatus')
4217
4218 >>> status_control = user_browser.getControl('Status')
4219- >>> print status_control.displayValue
4220+ >>> print(status_control.displayValue)
4221 ['Confirmed']
4222
4223 >>> status_control.displayValue = ["Won't Fix"]
4224@@ -57,7 +57,8 @@
4225 ... 'test@canonical.com')
4226 >>> admin_browser.getControl('Change').click()
4227
4228- >>> print extract_text(find_tag_by_id(admin_browser.contents, 'bug-supervisor'))
4229+ >>> print(extract_text(
4230+ ... find_tag_by_id(admin_browser.contents, 'bug-supervisor')))
4231 Bug supervisor:
4232 Sample Person
4233
4234@@ -71,13 +72,13 @@
4235 ... 'mozilla-firefox/+bug/1/+editstatus')
4236
4237 >>> status_control = bug_supervisor_browser.getControl('Status')
4238- >>> print status_control.displayValue
4239+ >>> print(status_control.displayValue)
4240 ['Confirmed']
4241
4242 >>> status_control.displayValue = ["Won't Fix"]
4243 >>> bug_supervisor_browser.getControl('Save Changes').click()
4244
4245- >>> print bug_supervisor_browser.url
4246+ >>> print(bug_supervisor_browser.url)
4247 http://bugs.launchpad.dev/ubuntu/+source/mozilla-firefox/+bug/1
4248 >>> print_highlighted_bugtask(bug_supervisor_browser)
4249 mozilla-firefox (Ubuntu) ... Won't Fix Medium Unassigned ...
4250@@ -90,20 +91,20 @@
4251 ... 'mozilla-firefox/+bug/1/+editstatus')
4252
4253 >>> status_control = user_browser.getControl('Status')
4254- >>> print status_control.displayValue
4255+ >>> print(status_control.displayValue)
4256 ["Won't Fix"]
4257
4258 And a regular user can change other aspects of the bug:
4259
4260 >>> package_control = user_browser.getControl(
4261 ... name='ubuntu_mozilla-firefox.target.package')
4262- >>> print package_control.value
4263+ >>> print(package_control.value)
4264 mozilla-firefox
4265
4266 >>> package_control.value = 'iceweasel'
4267 >>> user_browser.getControl('Save Changes').click()
4268
4269- >>> print bug_supervisor_browser.url
4270+ >>> print(bug_supervisor_browser.url)
4271 http://bugs.launchpad.dev/ubuntu/+source/mozilla-firefox/+bug/1
4272 >>> print_highlighted_bugtask(bug_supervisor_browser)
4273 mozilla-firefox (Ubuntu) ... Won't Fix Medium Unassigned ...
4274@@ -115,13 +116,13 @@
4275 ... 'iceweasel/+bug/1/+editstatus')
4276
4277 >>> status_control = bug_supervisor_browser.getControl('Status')
4278- >>> print status_control.displayValue
4279+ >>> print(status_control.displayValue)
4280 ["Won't Fix"]
4281
4282 >>> status_control.displayValue = ["Triaged"]
4283 >>> bug_supervisor_browser.getControl('Save Changes').click()
4284
4285- >>> print bug_supervisor_browser.url
4286+ >>> print(bug_supervisor_browser.url)
4287 http://bugs.launchpad.dev/ubuntu/+source/iceweasel/+bug/1
4288 >>> print_highlighted_bugtask(bug_supervisor_browser)
4289 iceweasel (Ubuntu) ... Triaged Medium Unassigned ...
4290
4291=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-bugtask-edit-forms.txt'
4292--- lib/lp/bugs/stories/bugtask-management/xx-bugtask-edit-forms.txt 2016-01-26 15:47:37 +0000
4293+++ lib/lp/bugs/stories/bugtask-management/xx-bugtask-edit-forms.txt 2018-06-30 16:32:46 +0000
4294@@ -12,33 +12,33 @@
4295 respective bug task.
4296
4297 >>> admin_browser.open('http://bugs.launchpad.dev/firefox/+bug/1')
4298- >>> print extract_text(
4299- ... find_tag_by_id(admin_browser.contents, 'affected-software'))
4300+ >>> print(extract_text(
4301+ ... find_tag_by_id(admin_browser.contents, 'affected-software')))
4302 Affects Status Importance Assigned to...
4303 Mozilla Firefox... New Low Mark Shuttleworth...
4304 mozilla-firefox (Debian)... Confirmed Low debbugs #304014...
4305 mozilla-firefox (Ubuntu)... New Medium Unassigned
4306 ...
4307
4308- >>> print admin_browser.getLink('New', index=0).url
4309+ >>> print(admin_browser.getLink('New', index=0).url)
4310 http://bugs.launchpad.dev/firefox/+bug/1/+editstatus
4311- >>> print admin_browser.getLink('Low', index=0).url
4312+ >>> print(admin_browser.getLink('Low', index=0).url)
4313 http://bugs.launchpad.dev/firefox/+bug/1/+editstatus
4314
4315- >>> print admin_browser.getLink('Confirmed').url
4316+ >>> print(admin_browser.getLink('Confirmed').url)
4317 Traceback (most recent call last):
4318 ...
4319 LinkNotFoundError
4320
4321- >>> print admin_browser.getLink('Low', index=1).url
4322+ >>> print(admin_browser.getLink('Low', index=1).url)
4323 http://bugs.launchpad.dev/debian/+source/mozilla-firefox/+bug/1/+editstatus
4324- >>> print admin_browser.getLink('New', index=1).url
4325+ >>> print(admin_browser.getLink('New', index=1).url)
4326 http://bugs...dev/ubuntu/+source/mozilla-firefox/+bug/1/+editstatus
4327- >>> print admin_browser.getLink('Medium').url
4328+ >>> print(admin_browser.getLink('Medium').url)
4329 http://bugs...dev/ubuntu/+source/mozilla-firefox/+bug/1/+editstatus
4330
4331 >>> admin_browser.getLink('New').click()
4332- >>> print extract_text(admin_browser.contents)
4333+ >>> print(extract_text(admin_browser.contents))
4334 Edit status...
4335 ...
4336 Affecting: Mozilla Firefox
4337
4338=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-change-assignee.txt'
4339--- lib/lp/bugs/stories/bugtask-management/xx-change-assignee.txt 2016-01-26 15:47:37 +0000
4340+++ lib/lp/bugs/stories/bugtask-management/xx-change-assignee.txt 2018-06-30 16:32:46 +0000
4341@@ -39,8 +39,8 @@
4342 ... name="firefox.assignee", index=0)
4343 >>> assign_to_control.value = "cprov"
4344 >>> admin_browser.getControl("Save Changes", index=0).click()
4345- >>> print extract_text(
4346- ... first_tag_by_class(admin_browser.contents, 'warning message'))
4347+ >>> print(extract_text(
4348+ ... first_tag_by_class(admin_browser.contents, 'warning message')))
4349 Celso Providelo
4350 did not previously have any assigned bugs in
4351 Mozilla Firefox.
4352@@ -58,8 +58,8 @@
4353 ... name="jokosher.assignee", index=0)
4354 >>> assign_to_control.value = "cprov"
4355 >>> admin_browser.getControl("Save Changes", index=0).click()
4356- >>> print extract_text(
4357- ... first_tag_by_class(admin_browser.contents, 'warning message'))
4358+ >>> print(extract_text(
4359+ ... first_tag_by_class(admin_browser.contents, 'warning message')))
4360 Celso Providelo
4361 did not previously have any assigned bugs in Jokosher.
4362 If this bug was assigned by mistake, you may change the assignment.
4363@@ -82,10 +82,10 @@
4364 ... name="jokosher.assignee.option", index=0)
4365 >>> assignee_control.value = ["jokosher.assignee.assign_to_me"]
4366 >>> user_browser.getControl("Save Changes", index=0).click()
4367- >>> print user_browser.url
4368+ >>> print(user_browser.url)
4369 http://bugs.launchpad.dev/jokosher/+bug/11
4370- >>> print first_tag_by_class(
4371- ... user_browser.contents, 'warning message')
4372+ >>> print(first_tag_by_class(
4373+ ... user_browser.contents, 'warning message'))
4374 None
4375
4376
4377@@ -120,11 +120,11 @@
4378 Traceback (most recent call last):
4379 ...
4380 ItemNotFoundError: insufficient items with name
4381- 'jokosher.assignee.assign_to'
4382+ u'jokosher.assignee.assign_to'
4383 >>> user_browser.getControl(name="jokosher.assignee", index=0)
4384 Traceback (most recent call last):
4385 ...
4386- LookupError: name 'jokosher.assignee'
4387+ LookupError: name u'jokosher.assignee'
4388
4389 Once no_priv is a member of a team, the option is shown.
4390
4391
4392=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-change-milestone.txt'
4393--- lib/lp/bugs/stories/bugtask-management/xx-change-milestone.txt 2016-01-26 15:47:37 +0000
4394+++ lib/lp/bugs/stories/bugtask-management/xx-change-milestone.txt 2018-06-30 16:32:46 +0000
4395@@ -14,7 +14,7 @@
4396 use, but the bug is not yet targeted to that milestone.
4397
4398 >>> table = find_tag_by_id(owner_browser.contents, 'affected-software')
4399- >>> print extract_text(table)
4400+ >>> print(extract_text(table))
4401 Affects Status Importance Assigned to Milestone
4402 ... Mozilla Firefox ... New Low Mark Shuttleworth
4403 ...
4404@@ -32,7 +32,7 @@
4405 >>> milestone_control.displayValue = ['Mozilla Firefox 1.0']
4406 >>> owner_browser.getControl('Save Changes', index=0).click()
4407 >>> table = find_tag_by_id(owner_browser.contents, 'affected-software')
4408- >>> print extract_text(table)
4409+ >>> print(extract_text(table))
4410 Affects Status Importance Assigned to Milestone
4411 ... Mozilla Firefox ... New Low Mark Shuttleworth ... 1.0
4412 ...
4413@@ -84,7 +84,7 @@
4414
4415 >>> admin_browser.open('http://launchpad.dev/firefox/+bug/1')
4416 >>> table = find_tag_by_id(admin_browser.contents, 'affected-software')
4417- >>> print extract_text(table)
4418+ >>> print(extract_text(table))
4419 Affects Status Importance Assigned to Milestone
4420 ... Mozilla Firefox ... New Low Mark Shuttleworth ... 1.0
4421 ...
4422@@ -99,7 +99,7 @@
4423 >>> milestone_control.displayValue = ['Ubuntu 5.04.rc1']
4424 >>> admin_browser.getControl('Save Changes', index=3).click()
4425 >>> table = find_tag_by_id(admin_browser.contents, 'affected-software')
4426- >>> print extract_text(table)
4427+ >>> print(extract_text(table))
4428 Affects Status Importance Assigned to Milestone
4429 ... Mozilla Firefox ... New Low Mark Shuttleworth ... 1.0
4430 ...
4431
4432=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt'
4433--- lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt 2016-01-26 15:47:37 +0000
4434+++ lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt 2018-06-30 16:32:46 +0000
4435@@ -31,7 +31,7 @@
4436
4437 >>> def print_widget_visibility(user, url):
4438 ... status, importance = widget_visibility(user, url)
4439- ... print 'Status: %s\nImportance: %s' % (status, importance)
4440+ ... print('Status: %s\nImportance: %s' % (status, importance))
4441
4442
4443 == "Normal" (not Email Address) bugtasks ==
4444
4445=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-subscribe-while-editing.txt'
4446--- lib/lp/bugs/stories/bugtask-management/xx-subscribe-while-editing.txt 2015-07-21 09:04:01 +0000
4447+++ lib/lp/bugs/stories/bugtask-management/xx-subscribe-while-editing.txt 2018-06-30 16:32:46 +0000
4448@@ -12,7 +12,7 @@
4449
4450 >>> browser.getControl("Save Changes").click()
4451
4452- >>> print browser.contents
4453+ >>> print(browser.contents)
4454 <!DOCTYPE...
4455 ...You have subscribed to this bug report...
4456
4457
4458=== modified file 'lib/lp/bugs/stories/bugtask-management/xx-view-editable-bug-task.txt'
4459--- lib/lp/bugs/stories/bugtask-management/xx-view-editable-bug-task.txt 2012-10-03 04:52:37 +0000
4460+++ lib/lp/bugs/stories/bugtask-management/xx-view-editable-bug-task.txt 2018-06-30 16:32:46 +0000
4461@@ -31,5 +31,5 @@
4462
4463 >>> browser = setupBrowser(auth="Basic test@canonical.com:test")
4464 >>> browser.open("http://launchpad.dev/firefox/+bug/6/+editstatus")
4465- >>> print browser.title
4466+ >>> print(browser.title)
4467 Edit status ...
4468
4469=== modified file 'lib/lp/bugs/stories/bugtask-searches/xx-advanced-people-filters.txt'
4470--- lib/lp/bugs/stories/bugtask-searches/xx-advanced-people-filters.txt 2014-11-29 06:41:25 +0000
4471+++ lib/lp/bugs/stories/bugtask-searches/xx-advanced-people-filters.txt 2018-06-30 16:32:46 +0000
4472@@ -16,10 +16,10 @@
4473
4474 >>> browser.open('http://launchpad.dev/firefox/+bugs?advanced=1')
4475 >>> assignee_widget = find_tag_by_id(browser.contents, 'field.assignee')
4476- >>> print assignee_widget['onkeypress']
4477+ >>> print(assignee_widget['onkeypress'])
4478 selectWidget('assignee_option', event)
4479
4480- >>> print find_tag_by_id(browser.contents, 'assignee_option')
4481+ >>> print(find_tag_by_id(browser.contents, 'assignee_option'))
4482 <input...type="radio"...>
4483
4484
4485@@ -120,7 +120,7 @@
4486 >>> anon_browser.getControl('Commenter').value = 'non-existent'
4487 >>> anon_browser.getControl('Search', index=0).click()
4488 >>> for message in find_tags_by_class(anon_browser.contents, 'message'):
4489- ... print message.renderContents()
4490+ ... print(message.renderContents())
4491 There&#x27;s no person with the name or email address &#x27;non-existent&#x27;.
4492
4493 Entering an existing person shows all bugs that person has commented on.
4494@@ -177,7 +177,7 @@
4495 >>> anon_browser.getControl('Subscriber').value = 'non-existent'
4496 >>> anon_browser.getControl('Search', index=0).click()
4497 >>> for message in find_tags_by_class(anon_browser.contents, 'message'):
4498- ... print message.renderContents()
4499+ ... print(message.renderContents())
4500 There&#x27;s no person with the name or email address &#x27;non-existent&#x27;.
4501
4502 Entering an existing person shows all bugs for packages or products that
4503@@ -187,7 +187,7 @@
4504 >>> subscriber = 'no-priv@canonical.com'
4505 >>> anon_browser.getControl('Subscriber').value = subscriber
4506 >>> anon_browser.getControl('Search', index=0).click()
4507- >>> print extract_text(find_main_content(anon_browser.contents))
4508+ >>> print(extract_text(find_main_content(anon_browser.contents)))
4509 Advanced search
4510 ...
4511 No results for search
4512@@ -199,7 +199,7 @@
4513 >>> browser = setupBrowser(auth='Basic test@canonical.com:test')
4514 >>> browser.open('http://bugs.launchpad.dev/firefox/')
4515 >>> browser.getLink('Report a bug').click()
4516- >>> print extract_text(find_main_content(browser.contents))
4517+ >>> print(extract_text(find_main_content(browser.contents)))
4518 Report a bug...
4519
4520 >>> report_bug_url = browser.url
4521@@ -228,7 +228,7 @@
4522
4523 >>> browser.open(bug_1_url)
4524 >>> browser.getLink('Subscribe someone else').click()
4525- >>> print extract_text(find_main_content(browser.contents))
4526+ >>> print(extract_text(find_main_content(browser.contents)))
4527 Subscribe someone else to bug #...
4528
4529 >>> browser.getControl('Person').value = subscriber
4530@@ -244,14 +244,14 @@
4531 >>> anon_browser.getControl('Search', index=0).click()
4532 >>> from lp.bugs.tests.bug import extract_bugtasks
4533 >>> for bugtask in extract_bugtasks(anon_browser.contents):
4534- ... print 'Task:' + bugtask
4535+ ... print('Task:' + bugtask)
4536 Task:...Test Bug 1...Undecided...New
4537
4538 Next we'll subscribe our user to the second bug we've just registered:
4539
4540 >>> browser.open(bug_2_url)
4541 >>> browser.getLink('Subscribe someone else').click()
4542- >>> print extract_text(find_main_content(browser.contents))
4543+ >>> print(extract_text(find_main_content(browser.contents)))
4544 Subscribe someone else to bug #...
4545
4546 >>> browser.getControl('Person').value = subscriber
4547@@ -266,7 +266,7 @@
4548 >>> anon_browser.getControl('Subscriber').value = subscriber
4549 >>> anon_browser.getControl('Search', index=0).click()
4550 >>> for bugtask in extract_bugtasks(anon_browser.contents):
4551- ... print 'Task:' + bugtask
4552+ ... print('Task:' + bugtask)
4553 Task:...Test Bug 1...Undecided...New
4554 Task:...Test Bug 2...Undecided...New
4555
4556
4557=== modified file 'lib/lp/bugs/stories/bugtask-searches/xx-distribution-statistics-portlet.txt'
4558--- lib/lp/bugs/stories/bugtask-searches/xx-distribution-statistics-portlet.txt 2010-10-05 22:04:38 +0000
4559+++ lib/lp/bugs/stories/bugtask-searches/xx-distribution-statistics-portlet.txt 2018-06-30 16:32:46 +0000
4560@@ -11,45 +11,45 @@
4561 >>> from lp.testing.service_usage_helpers import set_service_usage
4562 >>> set_service_usage('debian', bug_tracking_usage='LAUNCHPAD')
4563
4564- >>> print http(r"""
4565+ >>> print(http(br"""
4566 ... GET /debian/+bugs?field.status%3Alist=New&field.status%3Alist=Confirmed&field.importance%3Alist=Critical&search=Search HTTP/1.1
4567 ... Authorization: Basic dGVzdEBjYW5vbmljYWwuY29tOnRlc3Q=
4568- ... """)
4569+ ... """))
4570 HTTP/1.1 200 Ok
4571 ...No results for search...
4572
4573 Viewing bugs "assigned to me", as Sample Person:
4574
4575- >>> print http(r"""
4576+ >>> print(http(br"""
4577 ... GET /debian/+bugs?field.status%3Alist=New&field.status%3Alist=Confirmed&field.assignee=name12&search=Search HTTP/1.1
4578 ... Authorization: Basic dGVzdEBjYW5vbmljYWwuY29tOnRlc3Q=
4579- ... """)
4580+ ... """))
4581 HTTP/1.1 200 Ok
4582 ...1 result...
4583
4584 Viewing untriaged bugs as Sample Person:
4585
4586- >>> print http(r"""
4587+ >>> print(http(br"""
4588 ... GET /debian/+bugs?field.status%3Alist=New&search=Search HTTP/1.1
4589 ... Authorization: Basic dGVzdEBjYW5vbmljYWwuY29tOnRlc3Q=
4590- ... """)
4591+ ... """))
4592 HTTP/1.1 200 Ok
4593 ...1 result...
4594
4595 Viewing unassigned bugs as Sample Person:
4596
4597- >>> print http(r"""
4598+ >>> print(http(br"""
4599 ... GET /debian/+bugs?field.status%3Alist=New&field.status%3Alist=Confirmed&field.status-empty-marker=1&field.importance-empty-marker=1&field.assignee=&assignee_option=none&search=Search HTTP/1.1
4600 ... Authorization: Basic dGVzdEBjYW5vbmljYWwuY29tOnRlc3Q=
4601- ... """)
4602+ ... """))
4603 HTTP/1.1 200 Ok
4604 ...2 results...
4605
4606 Viewing open reported bugs as Sample Person:
4607
4608- >>> print http(r"""
4609+ >>> print(http(br"""
4610 ... GET /debian/+bugs?search=Search HTTP/1.1
4611 ... Authorization: Basic dGVzdEBjYW5vbmljYWwuY29tOnRlc3Q=
4612- ... """)
4613+ ... """))
4614 HTTP/1.1 200 Ok
4615 ...3 results...
4616
4617=== modified file 'lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt'
4618--- lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt 2017-10-23 00:16:39 +0000
4619+++ lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt 2018-06-30 16:32:46 +0000
4620@@ -183,7 +183,7 @@
4621 instead of displaying an empty table.
4622
4623 >>> user_browser.open("http://launchpad.dev/firefox/+bugs?field.searchtext=fdsadsf&search=Search&advanced=&milestone=1&status=10&status=20&assignee=all")
4624- >>> print user_browser.contents
4625+ >>> print(user_browser.contents)
4626 <...
4627 ...No results for search...
4628 ...
4629@@ -193,7 +193,7 @@
4630
4631 >>> set_service_usage('iso-codes', bug_tracking_usage='LAUNCHPAD')
4632 >>> user_browser.open("http://launchpad.dev/iso-codes/+bugs")
4633- >>> print user_browser.contents
4634+ >>> print(user_browser.contents)
4635 <...
4636 ...There are currently no open bugs...
4637 ...
4638@@ -209,7 +209,7 @@
4639 ... badge_cell = row.find(None, {'class': 'bug-related-icons'})
4640 ... spans = badge_cell.findAll('span')
4641 ... for span in spans:
4642- ... print " Badge:", span.get('alt')
4643+ ... print(" Badge:", span.get('alt'))
4644
4645 For instance, these are the badges on the firefox bug listing:
4646
4647@@ -225,7 +225,7 @@
4648 >>> browser.open(
4649 ... 'http://bugs.launchpad.dev/debian/sarge/+source/mozilla-firefox')
4650 >>> milestone = find_tags_by_class(browser.contents, 'sprite milestone')
4651- >>> print milestone[0]
4652+ >>> print(milestone[0])
4653 <a href="http://launchpad.dev/debian/+milestone/3.1" alt="milestone 3.1"
4654 title="Linked to milestone 3.1" class="sprite milestone"></a>
4655
4656
4657=== modified file 'lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt'
4658--- lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt 2012-10-02 06:36:44 +0000
4659+++ lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt 2018-06-30 16:32:46 +0000
4660@@ -28,14 +28,14 @@
4661 ... query_string_after, keep_blank_values=True)
4662 ... for term_before, term_after in zip(query_before, query_after):
4663 ... if term_before != term_after:
4664- ... print '%s --> %s' % (
4665+ ... print('%s --> %s' % (
4666 ... '='.join(term_before),
4667- ... '='.join(term_after))
4668+ ... '='.join(term_after)))
4669
4670 >>> from lazr.uri import URI
4671 >>> uri = URI(anon_browser.url)
4672
4673- >>> print uri.path
4674+ >>> print(uri.path)
4675 /ubuntu/+bugs
4676
4677 >>> print_query_changes(query, uri.query)
4678@@ -63,7 +63,7 @@
4679 >>> anon_browser.open(url)
4680
4681 >>> uri = URI(anon_browser.url)
4682- >>> print uri.path
4683+ >>> print(uri.path)
4684 /bugs/+bugs
4685
4686 >>> print_query_changes(query, uri.query)
4687@@ -95,7 +95,7 @@
4688 >>> anon_browser.open(url)
4689
4690 >>> uri = URI(anon_browser.url)
4691- >>> print uri.path
4692+ >>> print(uri.path)
4693 /~mark/+assignedbugs
4694
4695 >>> print_query_changes(query, uri.query)
4696@@ -112,7 +112,7 @@
4697 >>> anon_browser.open(url)
4698
4699 >>> uri = URI(anon_browser.url)
4700- >>> print uri.path
4701+ >>> print(uri.path)
4702 /~mark/+reportedbugs
4703
4704 >>> print_query_changes(query, uri.query)
4705@@ -130,7 +130,7 @@
4706 >>> anon_browser.open(url)
4707
4708 >>> uri = URI(anon_browser.url)
4709- >>> print uri.path
4710+ >>> print(uri.path)
4711 /~mark/+subscribedbugs
4712
4713 >>> print_query_changes(query, uri.query)
4714
4715=== modified file 'lib/lp/bugs/stories/bugtask-searches/xx-person-bugs.txt'
4716--- lib/lp/bugs/stories/bugtask-searches/xx-person-bugs.txt 2012-02-22 22:17:46 +0000
4717+++ lib/lp/bugs/stories/bugtask-searches/xx-person-bugs.txt 2018-06-30 16:32:46 +0000
4718@@ -6,10 +6,10 @@
4719
4720 >>> anon_browser.open('http://launchpad.dev/~name12')
4721 >>> anon_browser.getLink('Bugs').click()
4722- >>> print anon_browser.title
4723+ >>> print(anon_browser.title)
4724 Bugs : Sample Person
4725
4726- >>> print anon_browser.url
4727+ >>> print(anon_browser.url)
4728 http://bugs.launchpad.dev/~name12
4729
4730 Note that we may see each bug more than once in case it's reported
4731@@ -48,7 +48,7 @@
4732 virtual host:
4733
4734 >>> anon_browser.open('http://bugs.launchpad.dev/~name12')
4735- >>> print anon_browser.title
4736+ >>> print(anon_browser.title)
4737 Bugs : Sample Person
4738
4739
4740@@ -63,10 +63,10 @@
4741 .............
4742
4743 >>> anon_browser.getLink('Assigned bugs').click()
4744- >>> print anon_browser.title
4745+ >>> print(anon_browser.title)
4746 Assigned bugs : Bugs : Sample Person
4747
4748- >>> print anon_browser.url
4749+ >>> print(anon_browser.url)
4750 http://bugs.launchpad.dev/~name12/+assignedbugs
4751
4752 >>> print_bugtasks(anon_browser.contents)
4753@@ -82,10 +82,10 @@
4754 ..............
4755
4756 >>> anon_browser.getLink('Commented bugs').click()
4757- >>> print anon_browser.title
4758+ >>> print(anon_browser.title)
4759 Commented bugs : Bugs : Sample Person
4760
4761- >>> print anon_browser.url
4762+ >>> print(anon_browser.url)
4763 http://bugs.launchpad.dev/~name12/+commentedbugs
4764
4765 No Privileges Person has commented on two bugs, which will be returned
4766@@ -105,10 +105,10 @@
4767 .............
4768
4769 >>> anon_browser.getLink('Reported bugs').click()
4770- >>> print anon_browser.title
4771+ >>> print(anon_browser.title)
4772 Reported bugs : Bugs : Sample Person
4773
4774- >>> print anon_browser.url
4775+ >>> print(anon_browser.url)
4776 http://bugs.launchpad.dev/~name12/+reportedbugs
4777
4778 >>> print_bugtasks(anon_browser.contents)
4779@@ -136,10 +136,10 @@
4780 ...............
4781
4782 >>> anon_browser.getLink('Subscribed bugs').click()
4783- >>> print anon_browser.title
4784+ >>> print(anon_browser.title)
4785 Subscribed bugs : Bugs : Sample Person
4786
4787- >>> print anon_browser.url
4788+ >>> print(anon_browser.url)
4789 http://bugs.launchpad.dev/~name12/+subscribedbugs
4790
4791 >>> print_bugtasks(anon_browser.contents)
4792@@ -164,25 +164,25 @@
4793 all the menu links point to the bugs site.
4794
4795 >>> anon_browser.open('http://launchpad.dev/~name12/+assignedbugs')
4796- >>> print anon_browser.getLink('Commented bugs').url
4797+ >>> print(anon_browser.getLink('Commented bugs').url)
4798 http://bugs.launchpad.dev/~name12/+commentedbugs
4799
4800- >>> print anon_browser.getLink('Reported bugs').url
4801+ >>> print(anon_browser.getLink('Reported bugs').url)
4802 http://bugs.launchpad.dev/~name12/+reportedbugs
4803
4804- >>> print anon_browser.getLink('Subscribed bugs').url
4805+ >>> print(anon_browser.getLink('Subscribed bugs').url)
4806 http://bugs.launchpad.dev/~name12/+subscribedbugs
4807
4808- >>> print anon_browser.getLink('All related bugs').url
4809+ >>> print(anon_browser.getLink('All related bugs').url)
4810 http://bugs.launchpad.dev/~name12
4811
4812- >>> print anon_browser.getLink('Subscribed packages').url
4813+ >>> print(anon_browser.getLink('Subscribed packages').url)
4814 http://bugs.launchpad.dev/~name12/+packagebugs
4815
4816 >>> anon_browser.open('http://launchpad.dev/~name12/+commentedbugs')
4817- >>> print anon_browser.getLink('Assigned bugs').url
4818+ >>> print(anon_browser.getLink('Assigned bugs').url)
4819 http://bugs.launchpad.dev/~name12/+assignedbugs
4820
4821- >>> print anon_browser.getLink('Affecting bugs').url
4822+ >>> print(anon_browser.getLink('Affecting bugs').url)
4823 http://bugs.launchpad.dev/~name12/+affectingbugs
4824
4825
4826=== modified file 'lib/lp/bugs/stories/bugtask-searches/xx-unexpected-form-data.txt'
4827--- lib/lp/bugs/stories/bugtask-searches/xx-unexpected-form-data.txt 2009-06-12 16:36:02 +0000
4828+++ lib/lp/bugs/stories/bugtask-searches/xx-unexpected-form-data.txt 2018-06-30 16:32:46 +0000
4829@@ -24,7 +24,7 @@
4830 When a UnexpectedFormData is raised, we display a custom error page to the
4831 user.
4832
4833- >>> output = str(http(r"""
4834+ >>> output = str(http(br"""
4835 ... GET /ubuntu/+bugs?search=Search&field.status=Fred HTTP/1.1
4836 ... """))
4837 >>> 'HTTP/1.1 500 Internal Server Error' in output
4838
4839=== modified file 'lib/lp/bugs/stories/bugtracker/bugtrackers-index.txt'
4840--- lib/lp/bugs/stories/bugtracker/bugtrackers-index.txt 2012-12-11 05:41:50 +0000
4841+++ lib/lp/bugs/stories/bugtracker/bugtrackers-index.txt 2018-06-30 16:32:46 +0000
4842@@ -5,7 +5,7 @@
4843 page, with the addition of a breadcrumb itself.
4844
4845 >>> user_browser.open('http://launchpad.dev/bugs/bugtrackers')
4846- >>> print user_browser.title
4847+ >>> print(user_browser.title)
4848 Bug trackers registered in Launchpad
4849
4850 The page presents a table with all bugtrackers currently registered:
4851@@ -14,14 +14,14 @@
4852 ... table = find_tag_by_id(browser.contents, 'trackers')
4853 ... for row in table.tbody.findAll('tr'):
4854 ... title, location, linked, type, watches = row.findAll('td')
4855- ... print '------------------------'
4856- ... print '\n'.join([
4857+ ... print('------------------------')
4858+ ... print('\n'.join([
4859 ... extract_text(title),
4860 ... extract_text(location),
4861 ... ' --> %s' % (location.a and location.a.get('href')),
4862 ... ' '.join(extract_text(linked).split()),
4863 ... extract_text(type),
4864- ... extract_text(watches)])
4865+ ... extract_text(watches)]))
4866
4867 >>> print_tracker_table(user_browser)
4868 ------------------------
4869@@ -76,7 +76,7 @@
4870 >>> user_browser.getLink("Debian Bug tracker").click()
4871 >>> nav = find_tags_by_class(user_browser.contents,
4872 ... 'batch-navigation-index')
4873- >>> print extract_text(nav[0])
4874+ >>> print(extract_text(nav[0]))
4875 1 &rarr; 5 of 5 results
4876
4877 The listing also displays projects and projects linked to bug trackers.
4878
4879=== modified file 'lib/lp/bugs/stories/bugtracker/xx-bugtracker-remote-bug.txt'
4880--- lib/lp/bugs/stories/bugtracker/xx-bugtracker-remote-bug.txt 2012-07-17 14:29:17 +0000
4881+++ lib/lp/bugs/stories/bugtracker/xx-bugtracker-remote-bug.txt 2018-06-30 16:32:46 +0000
4882@@ -24,7 +24,7 @@
4883 * Answers - http://answers.launchpad.dev/
4884 Main heading: Remote Bug #42 in The Mozilla.org Bug Tracker
4885
4886- >>> print extract_text(find_tag_by_id(browser.contents, 'watchedbugs'))
4887+ >>> print(extract_text(find_tag_by_id(browser.contents, 'watchedbugs')))
4888 Bug #1: Firefox does not support SVG
4889 Bug #2: Blackhole Trash folder
4890
4891@@ -32,7 +32,7 @@
4892 the list page and redirect the user directly to that bug's page:
4893
4894 >>> browser.open('http://launchpad.dev/bugs/bugtrackers/mozilla.org/2000')
4895- >>> print browser.url
4896+ >>> print(browser.url)
4897 http://bugs.launchpad.dev/firefox/+bug/1
4898
4899 If there are no bug watches for a particular remote bug, then a Not
4900@@ -77,14 +77,14 @@
4901 * Answers - http://answers.launchpad.dev/
4902 Main heading: Remote Bug #42 in The Mozilla.org Bug Tracker
4903
4904- >>> print extract_text(find_tag_by_id(anon_browser.contents, 'watchedbugs'))
4905+ >>> print(extract_text(find_tag_by_id(anon_browser.contents, 'watchedbugs')))
4906 Bug #1: (Private)
4907 Bug #2: Blackhole Trash folder
4908
4909 The bug title is still provided if the user can view the private bug:
4910
4911 >>> browser.open('http://launchpad.dev/bugs/bugtrackers/mozilla.org/42')
4912- >>> print extract_text(find_tag_by_id(browser.contents, 'watchedbugs'))
4913+ >>> print(extract_text(find_tag_by_id(browser.contents, 'watchedbugs')))
4914 Bug #1: Firefox does not support SVG
4915 Bug #2: Blackhole Trash folder
4916
4917
4918=== modified file 'lib/lp/bugs/stories/bugtracker/xx-bugtracker.txt'
4919--- lib/lp/bugs/stories/bugtracker/xx-bugtracker.txt 2016-07-04 17:11:29 +0000
4920+++ lib/lp/bugs/stories/bugtracker/xx-bugtracker.txt 2018-06-30 16:32:46 +0000
4921@@ -15,7 +15,7 @@
4922 >>> user_browser.url
4923 'http://bugs.launchpad.dev/bugs/bugtrackers/+newbugtracker'
4924
4925- >>> print user_browser.title
4926+ >>> print(user_browser.title)
4927 Register an external bug tracker...
4928
4929 In case the user gets cold feet, there is always a cancel link that
4930@@ -30,7 +30,7 @@
4931 requires manual set up of a bug archive mirror.
4932
4933 >>> for control in user_browser.getControl('Bug Tracker Type').controls:
4934- ... print control.optionValue
4935+ ... print(control.optionValue)
4936 Bugzilla
4937 Roundup
4938 Trac
4939@@ -60,7 +60,7 @@
4940 'http://bugs.launchpad.dev/bugs/bugtrackers/+newbugtracker'
4941
4942 >>> for message in find_tags_by_class(user_browser.contents, 'message'):
4943- ... print extract_text(message)
4944+ ... print(extract_text(message))
4945 There is 1 error.
4946 Invalid name 'testmantis!'. Names must be at least two characters ...
4947
4948@@ -76,7 +76,7 @@
4949 'http://bugs.launchpad.dev/bugs/bugtrackers/+newbugtracker'
4950
4951 >>> for message in find_tags_by_class(user_browser.contents, 'message'):
4952- ... print extract_text(message)
4953+ ... print(extract_text(message))
4954 There is 1 error.
4955 http://bugzilla.mozilla.org/ is already registered in Launchpad
4956 as &quot;The Mozilla.org Bug Tracker&quot; (mozilla.org).
4957@@ -103,7 +103,7 @@
4958 'http://bugs.launchpad.dev/bugs/bugtrackers/+newbugtracker'
4959
4960 >>> for message in find_tags_by_class(user_browser.contents, 'message'):
4961- ... print extract_text(message)
4962+ ... print(extract_text(message))
4963 There is 1 error.
4964 http://alias.example.com/ is already registered in Launchpad
4965 as &quot;GnomeGBug GTracker&quot; (gnome-bugzilla).
4966@@ -117,7 +117,7 @@
4967 >>> user_browser.url
4968 'http://bugs.launchpad.dev/bugs/bugtrackers/testmantis'
4969
4970- >>> print user_browser.title
4971+ >>> print(user_browser.title)
4972 Test Mantis Tracker : Bug trackers
4973
4974 >>> 'Test Mantis Tracker' in user_browser.contents
4975@@ -136,10 +136,10 @@
4976 >>> anon_bugtracker_url_list = find_tag_by_id(
4977 ... anon_browser.contents, 'bugtracker-urls')
4978
4979- >>> print extract_text(user_bugtracker_url_list)
4980+ >>> print(extract_text(user_bugtracker_url_list))
4981 mailto:bugs@example.com
4982
4983- >>> print extract_text(anon_bugtracker_url_list)
4984+ >>> print(extract_text(anon_bugtracker_url_list))
4985 mailto:&lt;email address hidden&gt;
4986
4987 The `Summary` and `Contact Details` fields are optional - creating a
4988@@ -193,7 +193,7 @@
4989 >>> user_browser.url
4990 'http://bugs.launchpad.dev/bugs/bugtrackers/testmantis/+edit'
4991
4992- >>> print user_browser.title
4993+ >>> print(user_browser.title)
4994 Change details for the...
4995
4996 >>> user_browser.getControl('Name').value = 'testbugzilla'
4997@@ -235,7 +235,7 @@
4998 &quot;what? my wife does this stuff&quot; is not a valid URI
4999
5000 >>> user_browser.getControl('Location', index=0).value = (
The diff has been truncated for viewing.