launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #22510
[Merge] lp:~cjwatson/launchpad/code-doctests-future-imports into lp:launchpad
Colin Watson has proposed merging lp:~cjwatson/launchpad/code-doctests-future-imports into lp:launchpad.
Commit message:
Convert doctests under lp.code to Launchpad's preferred __future__ imports.
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/code-doctests-future-imports/+merge/345470
--
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~cjwatson/launchpad/code-doctests-future-imports into lp:launchpad.
=== removed file 'lib/lp/code/browser/tests/test_views.py'
--- lib/lp/code/browser/tests/test_views.py 2017-10-04 01:16:22 +0000
+++ lib/lp/code/browser/tests/test_views.py 1970-01-01 00:00:00 +0000
@@ -1,42 +0,0 @@
-# Copyright 2009-2017 Canonical Ltd. This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-"""Run the view tests."""
-
-from __future__ import absolute_import, print_function, unicode_literals
-
-import logging
-import os
-import unittest
-
-from lp.testing.layers import LaunchpadFunctionalLayer
-from lp.testing.systemdocs import (
- LayeredDocFileSuite,
- setUp,
- tearDown,
- )
-
-
-here = os.path.dirname(os.path.realpath(__file__))
-
-
-def test_suite():
- suite = unittest.TestSuite()
- testsdir = os.path.abspath(here)
-
- # Add tests using default setup/teardown
- filenames = [filename
- for filename in os.listdir(testsdir)
- if filename.endswith('.txt')]
- # Sort the list to give a predictable order.
- filenames.sort()
- for filename in filenames:
- path = filename
- one_test = LayeredDocFileSuite(
- path, setUp=setUp, tearDown=tearDown,
- layer=LaunchpadFunctionalLayer,
- stdout_logging_level=logging.WARNING
- )
- suite.addTest(one_test)
-
- return suite
=== modified file 'lib/lp/code/doc/branch-karma.txt'
--- lib/lp/code/doc/branch-karma.txt 2012-08-08 07:23:58 +0000
+++ lib/lp/code/doc/branch-karma.txt 2018-05-13 10:12:08 +0000
@@ -12,7 +12,7 @@
>>> code_karma_actions = code_category.karmaactions
>>> for summary in sorted(
... [action.summary for action in code_karma_actions]):
- ... print summary
+ ... print(summary)
A new revision by the user is available through Launchpad.
Reviewer commented on a code review.
User approved a branch for merging.
=== modified file 'lib/lp/code/doc/branch-merge-proposal-notifications.txt'
--- lib/lp/code/doc/branch-merge-proposal-notifications.txt 2015-09-11 14:48:53 +0000
+++ lib/lp/code/doc/branch-merge-proposal-notifications.txt 2018-05-13 10:12:08 +0000
@@ -83,9 +83,9 @@
values for the email headers and footers.
>>> [reason] = recipients.values()
- >>> print reason.mail_header
+ >>> print(reason.mail_header)
Subscriber
- >>> print reason.getReason()
+ >>> print(reason.getReason())
You are subscribed to branch ...
@@ -122,25 +122,25 @@
An email is sent to subscribers of either branch and the default reviewer.
>>> for notification in notifications:
- ... print notification['X-Envelope-To']
+ ... print(notification['X-Envelope-To'])
source@xxxxxxxxxxx
target@xxxxxxxxxxx
target_owner@xxxxxxxxxxx
>>> notification = notifications[0]
- >>> print notification['From']
+ >>> print(notification['From'])
Eric <eric@xxxxxxxxxxx>
- >>> print notification['Subject']
+ >>> print(notification['Subject'])
[Merge] lp://dev/~person-name... into lp://dev/~person-name...
- >>> print notification['X-Launchpad-Project']
+ >>> print(notification['X-Launchpad-Project'])
product-name...
- >>> print notification['X-Launchpad-Branch']
+ >>> print(notification['X-Launchpad-Branch'])
~person-name...
- >>> print notification['X-Launchpad-Message-Rationale']
+ >>> print(notification['X-Launchpad-Message-Rationale'])
Subscriber
- >>> print notification['X-Launchpad-Message-For']
+ >>> print(notification['X-Launchpad-Message-For'])
source-subscriber
- >>> print notification.get_payload(decode=True)
+ >>> print(notification.get_payload(decode=True))
Eric has proposed merging
lp://dev/~person-name...into lp://dev/~person-name...
--
@@ -178,16 +178,16 @@
>>> notifications = pop_notifications(
... sort_key=lambda n: n.get('X-Envelope-To'))
>>> for notification in notifications:
- ... print "%s, %s, %s" % (
+ ... print("%s, %s, %s" % (
... notification['X-Envelope-To'],
... notification['X-Launchpad-Message-Rationale'],
- ... notification['X-Launchpad-Message-For'])
+ ... notification['X-Launchpad-Message-For']))
bob@xxxxxxxxxxx, Reviewer, bob
mary@xxxxxxxxxxx, Reviewer, mary
source@xxxxxxxxxxx, Subscriber, source-subscriber
target@xxxxxxxxxxx, Subscriber, target-subscriber
>>> notification = notifications[0]
- >>> print notification.get_payload()[0].get_payload(decode=True)
+ >>> print(notification.get_payload()[0].get_payload(decode=True))
Eric has proposed merging
lp://dev/~person-name...into lp://dev/~person-name...
<BLANKLINE>
=== modified file 'lib/lp/code/doc/branch-notifications.txt'
--- lib/lp/code/doc/branch-notifications.txt 2018-02-02 10:06:24 +0000
+++ lib/lp/code/doc/branch-notifications.txt 2018-05-13 10:12:08 +0000
@@ -48,22 +48,22 @@
>>> len(notifications)
1
>>> branch_notification = notifications[0]
- >>> print branch_notification['To']
+ >>> print(branch_notification['To'])
Sample Person <test@xxxxxxxxxxxxx>
- >>> print branch_notification['From']
+ >>> print(branch_notification['From'])
foo@xxxxxxxxxxxxx
- >>> print branch_notification['Subject']
+ >>> print(branch_notification['Subject'])
Subject line
- >>> print branch_notification['X-Launchpad-Project']
+ >>> print(branch_notification['X-Launchpad-Project'])
firefox
- >>> print branch_notification['X-Launchpad-Branch']
+ >>> print(branch_notification['X-Launchpad-Branch'])
~name12/firefox/main
- >>> print branch_notification['X-Launchpad-Message-Rationale']
+ >>> print(branch_notification['X-Launchpad-Message-Rationale'])
Subscriber
- >>> print branch_notification['X-Launchpad-Message-For']
+ >>> print(branch_notification['X-Launchpad-Message-For'])
name12
>>> notification_body = branch_notification.get_payload(decode=True)
- >>> print notification_body #doctest: -NORMALIZE_WHITESPACE
+ >>> print(notification_body) #doctest: -NORMALIZE_WHITESPACE
The contents.
<BLANKLINE>
--
@@ -153,7 +153,7 @@
And to make sure we have them:
>>> for subscription in branch.subscriptions:
- ... print subscription.person.name
+ ... print(subscription.person.name)
no-priv
name12
carlos
@@ -183,7 +183,7 @@
>>> for email in recipients.getEmails():
... subscription, header = recipients.getReason(email)
... if subscription.notification_level in interested_levels:
- ... print email, subscription.max_diff_lines.title, header
+ ... print(email, subscription.max_diff_lines.title, header)
carlos@xxxxxxxxxxxxx Don't send diffs Subscriber
celso.providelo@xxxxxxxxxxxxx 1000 lines Subscriber
daf@xxxxxxxxxxxxx 5000 lines Subscriber
@@ -205,7 +205,7 @@
... attachment = '\n' + root[1].get_payload(decode=True)
... else:
... body = email.get_payload(decode=True)
- ... print 'To: %s\n%s%s' % (email['To'], body, attachment)
+ ... print('To: %s\n%s%s' % (email['To'], body, attachment))
We need to create some sufficiently large diffs to compare against.
@@ -230,11 +230,11 @@
There are also some useful headers for filtering emails.
- >>> print msg['X-Launchpad-Branch']
+ >>> print(msg['X-Launchpad-Branch'])
~name12/firefox/main
- >>> print msg['X-Launchpad-Branch-Revision-Number']
+ >>> print(msg['X-Launchpad-Branch-Revision-Number'])
1234
- >>> print msg['X-Launchpad-Project']
+ >>> print(msg['X-Launchpad-Project'])
firefox
>>> print_to_and_body(notifications.pop(0))
To: Celso Providelo <celso.providelo@xxxxxxxxxxxxx>
@@ -389,7 +389,7 @@
>>> for email in recipients.getEmails():
... subscription, header = recipients.getReason(email)
... if subscription.notification_level in interested_levels:
- ... print email, subscription.max_diff_lines.title, header
+ ... print(email, subscription.max_diff_lines.title, header)
david.allouche@xxxxxxxxxxxxx 500 lines Subscriber
foo.bar@xxxxxxxxxxxxx 5000 lines Subscriber @vcs-imports
robertc@xxxxxxxxxxxxxxxxx 5000 lines Subscriber @vcs-imports
@@ -406,8 +406,8 @@
... body = body.decode(email.get_param('charset'))
... else:
... body = body.decode('iso-8859-1')
- ... print u'To: %s\nFrom: %s\nSubject: %s\n%s' % (
- ... email['To'], email['From'], email['Subject'], body)
+ ... print(u'To: %s\nFrom: %s\nSubject: %s\n%s' % (
+ ... email['To'], email['From'], email['Subject'], body))
It is the form infrastructure that fires off the ObjectModifedEvent,
so we'll fake that bit here. The page tests will check the emails
=== modified file 'lib/lp/code/doc/branch-xmlrpc.txt'
--- lib/lp/code/doc/branch-xmlrpc.txt 2017-05-23 12:42:38 +0000
+++ lib/lp/code/doc/branch-xmlrpc.txt 2018-05-13 10:12:08 +0000
@@ -27,7 +27,7 @@
>>> results = public_codehosting_api.resolve_lp_path(
... '~vcs-imports/evolution/main')
- >>> print results.keys()
+ >>> print(results.keys())
['urls']
@@ -37,7 +37,7 @@
>>> results = public_codehosting_api.resolve_lp_path(
... '~vcs-imports/evolution/main')
>>> for url in results['urls']:
- ... print url
+ ... print(url)
bzr+ssh://bazaar.launchpad.dev/~vcs-imports/evolution/main
http://bazaar.launchpad.dev/~vcs-imports/evolution/main
=== modified file 'lib/lp/code/doc/branch.txt'
--- lib/lp/code/doc/branch.txt 2015-09-25 12:12:20 +0000
+++ lib/lp/code/doc/branch.txt 2018-05-13 10:12:08 +0000
@@ -78,12 +78,12 @@
The 'get' method on the branch set fetches branches by ID.
>>> branch = factory.makeAnyBranch(name='foobar')
- >>> print branch_lookup.get(branch.id).name
+ >>> print(branch_lookup.get(branch.id).name)
foobar
It returns None if there is no branch with the specified ID.
- >>> print branch_lookup.get(-1)
+ >>> print(branch_lookup.get(-1))
None
@@ -108,10 +108,10 @@
The registrant of the branch is the user that originally registered the
branch, whereas the owner is the current owner of the branch.
- >>> print new_branch.registrant.name
+ >>> print(new_branch.registrant.name)
registrant
- >>> print new_branch.owner.name
+ >>> print(new_branch.owner.name)
registrant
A user can create a branch where the owner is either themselves, or a
@@ -126,10 +126,10 @@
>>> team = factory.makeTeam(name='new-owner', owner=new_branch.owner)
>>> new_branch.setOwner(new_owner=team, user=new_branch.owner)
- >>> print new_branch.registrant.name
+ >>> print(new_branch.registrant.name)
registrant
- >>> print new_branch.owner.name
+ >>> print(new_branch.owner.name)
new-owner
Branch names must start with a number or a letter (upper or lower case)
@@ -205,17 +205,17 @@
... 'imported', owner=vcs_imports, branch_type=BranchType.IMPORTED)
>>> for branch in branchset.getRecentlyChangedBranches(5):
- ... print branch.unique_name
+ ... print(branch.unique_name)
~user/product/young
~user/product/middling
~user/product/oldest
>>> for branch in branchset.getRecentlyImportedBranches(5):
- ... print branch.unique_name
+ ... print(branch.unique_name)
~vcs-imports/product/imported
>>> for branch in branchset.getRecentlyRegisteredBranches(3):
- ... print branch.unique_name
+ ... print(branch.unique_name)
~vcs-imports/product/imported
~user/product/young
~user/product/middling
@@ -250,7 +250,7 @@
If no branch is found for the specified URL, getByUrl returns None.
>>> not_there_url = factory.getUniqueURL()
- >>> print branch_lookup.getByUrl(not_there_url)
+ >>> print(branch_lookup.getByUrl(not_there_url))
None
@@ -295,7 +295,7 @@
>>> subscription.branch == branch and subscription.person == subscriber
True
- >>> print subscription.notification_level.name
+ >>> print(subscription.notification_level.name)
FULL
>>> subscription.max_diff_lines == BranchSubscriptionDiffSize.FIVEKLINES
@@ -311,7 +311,7 @@
True
>>> from lp.services.webapp import canonical_url
- >>> print canonical_url(subscription)
+ >>> print(canonical_url(subscription))
http://code...dev/~user/product/subscribed/+subscription/subscriber
The settings for a subscription can be changed by re-subscribing.
@@ -346,7 +346,7 @@
>>> def print_names(persons):
... """Print the name of each person on a new line."""
... for person in persons:
- ... print person.person.name
+ ... print(person.person.name)
>>> subscription = branch2.subscribe(
... subscriber,
@@ -386,7 +386,7 @@
... in references
... ])
>>> for name in listing:
- ... print name
+ ... print(name)
branch.stacked_on
branchjob.branch
branchmergeproposal.dependent_branch
=== modified file 'lib/lp/code/doc/codeimport-event.txt'
--- lib/lp/code/doc/codeimport-event.txt 2012-12-26 01:32:19 +0000
+++ lib/lp/code/doc/codeimport-event.txt 2018-05-13 10:12:08 +0000
@@ -32,9 +32,9 @@
>>> from lp.code.interfaces.codeimportevent import ICodeImportEvent
>>> def verify_event(event):
... if verifyObject(ICodeImportEvent, removeSecurityProxy(event)):
- ... print event.event_type.name
+ ... print(event.event_type.name)
... else:
- ... print "verifyObject failed"
+ ... print("verifyObject failed")
To help us test the output of the items() method, we define a helper
function that do not print values which are potentially unstable
@@ -42,12 +42,12 @@
>>> def print_items(event):
... if len(event.items()) == 0:
- ... print '<nothing>'
+ ... print('<nothing>')
... for k, v in sorted(event.items()):
... if k.name == 'CODE_IMPORT':
- ... print k.name, '<muted>'
+ ... print(k.name, '<muted>')
... else:
- ... print k.name, repr(v)
+ ... print(k.name, repr(v))
We want to concisely check that calling the CodeImportEventSet factory
methods with required arguments set to None raise an AssertionError.
@@ -67,7 +67,7 @@
... else:
... raise
... else:
- ... print "No exception raised, expected: %s" % (exc_type,)
+ ... print("No exception raised, expected: %s" % (exc_type,))
All CodeImportEvent creation methods explicitly check that their
arguments are not None. See the implementation of CodeImportEventSet for
@@ -108,7 +108,7 @@
>>> verify_event(svn_create_event)
CREATE
- >>> print svn_create_event.person.name
+ >>> print(svn_create_event.person.name)
no-priv
>>> svn_create_event.code_import == svn_import
@@ -206,7 +206,7 @@
>>> verify_event(modify_event)
MODIFY
- >>> print modify_event.person.name
+ >>> print(modify_event.person.name)
no-priv
>>> modify_event.code_import == svn_import
@@ -230,7 +230,7 @@
>>> old_event_set_len = len(list(event_set.getAll()))
>>> token = event_set.beginModify(svn_import)
- >>> print event_set.newModify(svn_import, nopriv, token)
+ >>> print(event_set.newModify(svn_import, nopriv, token))
None
>>> len(list(event_set.getAll())) == old_event_set_len
@@ -251,7 +251,7 @@
>>> verify_event(request_event)
REQUEST
- >>> print request_event.person.name
+ >>> print(request_event.person.name)
no-priv
>>> print_items(request_event)
@@ -287,10 +287,10 @@
>>> verify_event(online_event)
ONLINE
- >>> print online_event.machine.hostname
+ >>> print(online_event.machine.hostname)
bazaar-importer
- >>> print online_event.person
+ >>> print(online_event.person)
None
>>> print_items(online_event)
@@ -305,10 +305,10 @@
>>> verify_event(online_event)
ONLINE
- >>> print online_event.machine.hostname
+ >>> print(online_event.machine.hostname)
apollo
- >>> print online_event.person.name
+ >>> print(online_event.person.name)
ddaa
>>> print_items(online_event)
@@ -333,7 +333,7 @@
>>> verify_event(offline_event)
OFFLINE
- >>> print offline_event.machine.hostname
+ >>> print(offline_event.machine.hostname)
bazaar-importer
>>> print_items(offline_event)
@@ -359,10 +359,10 @@
>>> verify_event(offline_event)
OFFLINE
- >>> print offline_event.machine.hostname
+ >>> print(offline_event.machine.hostname)
apollo
- >>> print offline_event.person.name
+ >>> print(offline_event.person.name)
ddaa
>>> print_items(offline_event)
@@ -388,10 +388,10 @@
>>> verify_event(quiesce_event)
QUIESCE
- >>> print quiesce_event.machine.hostname
+ >>> print(quiesce_event.machine.hostname)
bazaar-importer
- >>> print quiesce_event.person.name
+ >>> print(quiesce_event.person.name)
ddaa
>>> print_items(quiesce_event)
@@ -414,10 +414,10 @@
>>> verify_event(start_event)
START
- >>> print start_event.machine.hostname
+ >>> print(start_event.machine.hostname)
bazaar-importer
- >>> print start_event.code_import == svn_import
+ >>> print(start_event.code_import == svn_import)
True
>>> start_event.items()
@@ -440,10 +440,10 @@
>>> verify_event(finish_event)
FINISH
- >>> print finish_event.machine.hostname
+ >>> print(finish_event.machine.hostname)
bazaar-importer
- >>> print finish_event.code_import == svn_import
+ >>> print(finish_event.code_import == svn_import)
True
>>> finish_event.items()
@@ -466,13 +466,13 @@
>>> verify_event(kill_event)
KILL
- >>> print kill_event.code_import == svn_import
+ >>> print(kill_event.code_import == svn_import)
True
- >>> print kill_event.person
+ >>> print(kill_event.person)
None
- >>> print kill_event.machine.hostname
+ >>> print(kill_event.machine.hostname)
bazaar-importer
>>> kill_event.items()
@@ -503,13 +503,13 @@
>>> verify_event(reclaim_event)
RECLAIM
- >>> print reclaim_event.code_import == svn_import
+ >>> print(reclaim_event.code_import == svn_import)
True
- >>> print reclaim_event.person
+ >>> print(reclaim_event.person)
None
- >>> print reclaim_event.machine.hostname
+ >>> print(reclaim_event.machine.hostname)
bazaar-importer
The job id is the only datum stored in the key-value data associated
=== modified file 'lib/lp/code/doc/codeimport-job.txt'
--- lib/lp/code/doc/codeimport-job.txt 2017-10-04 03:00:14 +0000
+++ lib/lp/code/doc/codeimport-job.txt 2018-05-13 10:12:08 +0000
@@ -59,7 +59,7 @@
>>> new_import_branch = branch_lookup.getByUniqueName(
... '~vcs-imports/evolution/import')
>>> new_import = code_import_set.getByBranch(new_import_branch)
- >>> print new_import.review_status.name
+ >>> print(new_import.review_status.name)
NEW
The other one has review_status set to REVIEWED.
@@ -67,7 +67,7 @@
>>> reviewed_import_branch = branch_lookup.getByUniqueName(
... '~vcs-imports/gnome-terminal/import')
>>> reviewed_import = code_import_set.getByBranch(reviewed_import_branch)
- >>> print reviewed_import.review_status.name
+ >>> print(reviewed_import.review_status.name)
REVIEWED
Some workflow methods expect the user that is requesting the action. We
@@ -145,12 +145,12 @@
>>> unproxied_new_import = removeSecurityProxy(new_import)
>>> unproxied_new_import.review_status = CodeImportReviewStatus.REVIEWED
>>> new_job = workflow.newJob(new_import)
- >>> print new_import.import_job
+ >>> print(new_import.import_job)
<security proxied ...CodeImportJob instance at 0x...>
Jobs are always created in PENDING state.
- >>> print new_job.state.name
+ >>> print(new_job.state.name)
PENDING
When the code import is associated to existing CodeImportResult objects,
@@ -169,7 +169,7 @@
>>> unproxied_new_import.review_status = CodeImportReviewStatus.INVALID
>>> workflow.deletePendingJob(new_import)
- >>> print new_import.import_job
+ >>> print(new_import.import_job)
None
@@ -192,12 +192,12 @@
This records the requesting user in the job object and sets its date due
for running as soon as possible.
- >>> print pending_job.requesting_user.name
+ >>> print(pending_job.requesting_user.name)
no-priv
The job request is also recorded in the CodeImportEvent audit trail.
- >>> print new_events.summary()
+ >>> print(new_events.summary())
REQUEST ~vcs-imports/gnome-terminal/import no-priv
Once a job has been requested by a user, it cannot be requested a
@@ -231,7 +231,7 @@
The event is also recorded in the CodeImportEvent audit trail.
- >>> print new_events.summary()
+ >>> print(new_events.summary())
START ~vcs-imports/gnome-terminal/import bazaar-importer
=== modified file 'lib/lp/code/doc/codeimport-machine.txt'
--- lib/lp/code/doc/codeimport-machine.txt 2012-12-26 01:32:19 +0000
+++ lib/lp/code/doc/codeimport-machine.txt 2018-05-13 10:12:08 +0000
@@ -36,16 +36,16 @@
>>> sample_machine.hostname
u'bazaar-importer'
- >>> print sample_machine.state.name
+ >>> print(sample_machine.state.name)
ONLINE
getByHostname looks for a machine of the given hostname, and returns
None if there is no machine by that name in the database.
- >>> print machine_set.getByHostname('bazaar-importer')
+ >>> print(machine_set.getByHostname('bazaar-importer'))
<...CodeImportMachine...>
- >>> print machine_set.getByHostname('unlikely-to-exist')
+ >>> print(machine_set.getByHostname('unlikely-to-exist'))
None
@@ -57,13 +57,13 @@
canonical URL for set based views.
>>> from lp.services.webapp import canonical_url
- >>> print canonical_url(machine_set)
+ >>> print(canonical_url(machine_set))
http://code.launchpad.dev/+code-imports/+machines
A single code import machine is identified by the hostname of the
machine directly after the canonical URL of the code import machine set.
- >>> print canonical_url(sample_machine)
+ >>> print(canonical_url(sample_machine))
http://code.launchpad.dev/+code-imports/+machines/bazaar-importer
@@ -75,7 +75,7 @@
or OFFLINE states, but are in the OFFLINE state by default.
>>> new_machine = machine_set.new('frobisher')
- >>> print new_machine.state.name
+ >>> print(new_machine.state.name)
OFFLINE
If they are created in the ONLINE state, an ONLINE event is created in
@@ -90,10 +90,10 @@
>>> new_events = NewEvents()
>>> new_machine2 = machine_set.new(
... 'innocent', CodeImportMachineState.ONLINE)
- >>> print new_machine2.state.name
+ >>> print(new_machine2.state.name)
ONLINE
- >>> print new_events.summary()
+ >>> print(new_events.summary())
ONLINE innocent
@@ -103,7 +103,7 @@
Directly setting the state information on CodeImportMachines is not
permitted.
- >>> print new_machine.state.name
+ >>> print(new_machine.state.name)
OFFLINE
>>> new_machine.state = CodeImportMachineState.ONLINE
@@ -125,10 +125,10 @@
>>> new_events = NewEvents()
>>> new_machine.setOnline()
- >>> print new_machine.state.name
+ >>> print(new_machine.state.name)
ONLINE
- >>> print new_events.summary()
+ >>> print(new_events.summary())
ONLINE frobisher
@@ -142,10 +142,10 @@
>>> new_events = NewEvents()
>>> new_machine.setOffline(CodeImportMachineOfflineReason.STOPPED)
- >>> print new_machine.state.name
+ >>> print(new_machine.state.name)
OFFLINE
- >>> print new_events.summary()
+ >>> print(new_events.summary())
OFFLINE frobisher
>>> [new_event] = new_events
@@ -167,7 +167,7 @@
>>> new_machine.setOnline()
>>> new_events = NewEvents()
>>> new_machine.setQuiescing(admin, "1.1.42 rollout")
- >>> print new_events.summary()
+ >>> print(new_events.summary())
QUIESCE frobisher name16
>>> [new_event] = new_events
@@ -237,12 +237,12 @@
>>> online_machine = new_machine_with_state(ONLINE)
>>> online_machine.setQuiescing(admin, "Because.")
- >>> print online_machine.state.name
+ >>> print(online_machine.state.name)
QUIESCING
>>> online_machine = new_machine_with_state(ONLINE)
>>> online_machine.setOffline(some_reason)
- >>> print online_machine.state.name
+ >>> print(online_machine.state.name)
OFFLINE
>>> online_machine = new_machine_with_state(ONLINE)
@@ -256,7 +256,7 @@
>>> quiescing_machine = new_machine_with_state(QUIESCING)
>>> quiescing_machine.setOnline()
- >>> print quiescing_machine.state.name
+ >>> print(quiescing_machine.state.name)
ONLINE
>>> quiescing_machine = new_machine_with_state(QUIESCING)
@@ -267,7 +267,7 @@
>>> quiescing_machine = new_machine_with_state(QUIESCING)
>>> quiescing_machine.setOffline(some_reason)
- >>> print quiescing_machine.state.name
+ >>> print(quiescing_machine.state.name)
OFFLINE
=== modified file 'lib/lp/code/doc/codeimport-result.txt'
--- lib/lp/code/doc/codeimport-result.txt 2012-12-26 01:32:19 +0000
+++ lib/lp/code/doc/codeimport-result.txt 2018-05-13 10:12:08 +0000
@@ -61,27 +61,27 @@
CodeImportResult objects themselves have no behaviour, they are just
read-only records of what happened.
- >>> print new_result.machine.hostname
+ >>> print(new_result.machine.hostname)
odin
- >>> print new_result.requesting_user
+ >>> print(new_result.requesting_user)
None
- >>> print new_result.log_excerpt
+ >>> print(new_result.log_excerpt)
log data
In order to read the actual log file, the transaction needs to be committed
for the Librarian to save the file.
- >>> print new_result.log_file.read()
+ >>> print(new_result.log_file.read())
several
lines
of
log data
- >>> print new_result.status.name
+ >>> print(new_result.status.name)
SUCCESS
A helper property exists to give the duration of the job run.
- >>> print new_result.job_duration
+ >>> print(new_result.job_duration)
4:00:00
=== modified file 'lib/lp/code/doc/codeimport.txt'
--- lib/lp/code/doc/codeimport.txt 2016-11-12 02:24:09 +0000
+++ lib/lp/code/doc/codeimport.txt 2018-05-13 10:12:08 +0000
@@ -59,7 +59,7 @@
... TargetRevisionControlSystems,
... )
>>> for item in RevisionControlSystems:
- ... print item.title
+ ... print(item.title)
Concurrent Versions System
Subversion via CSCVS
Subversion via bzr-svn
@@ -67,7 +67,7 @@
Mercurial
Bazaar
>>> for item in TargetRevisionControlSystems:
- ... print item.title
+ ... print(item.title)
Bazaar
Git
@@ -105,13 +105,13 @@
3
>>> import email
>>> message = email.message_from_string(stub.test_emails[0][2])
- >>> print message['subject']
+ >>> print(message['subject'])
New code import: ~import-person/widget/trunk-cvs
- >>> print message['X-Launchpad-Message-Rationale']
+ >>> print(message['X-Launchpad-Message-Rationale'])
Operator @vcs-imports
- >>> print message['X-Launchpad-Message-For']
+ >>> print(message['X-Launchpad-Message-For'])
vcs-imports
- >>> print message.get_payload(decode=True)
+ >>> print(message.get_payload(decode=True))
A new CVS code import has been requested by Code Import Person:
http://code.launchpad.dev/~import-person/widget/trunk-cvs
from
@@ -230,7 +230,7 @@
>>> code_import = factory.makeProductCodeImport(
... svn_branch_url='http://svn.example.com/project')
- >>> print code_import.review_status.title
+ >>> print(code_import.review_status.title)
Reviewed
When an import operator updates the code import emails are sent out to
@@ -336,9 +336,9 @@
By default, code imports are created with an unspecified update interval.
- >>> print cvs_import.update_interval
+ >>> print(cvs_import.update_interval)
None
- >>> print svn_import.update_interval
+ >>> print(svn_import.update_interval)
None
When the update interval interval is unspecified, the effective update
@@ -442,16 +442,16 @@
site:
>>> from lp.services.webapp import canonical_url
- >>> print canonical_url(code_import_set)
+ >>> print(canonical_url(code_import_set))
http://code.launchpad.dev/+code-imports
The code imports themselves have a canonical URL that is subordinate of
the branches, though they cannot currently be viewed that way in the webapp,
only over the API.
- >>> print canonical_url(svn_import.branch)
+ >>> print(canonical_url(svn_import.branch))
http://code.launchpad.dev/~import-person/widget/trunk-svn
- >>> print canonical_url(svn_import)
+ >>> print(canonical_url(svn_import))
http://code.launchpad.dev/~import-person/widget/trunk-svn/+code-import
@@ -507,8 +507,8 @@
>>> login('david.allouche@xxxxxxxxxxxxx')
>>> data = {'cvs_root': ':pserver:anoncvs@xxxxxxxxxxxxxxx:/var/cvsroot'}
>>> modify_event = cvs_import.updateFromData(data, nopriv)
- >>> print make_email_body_for_code_import_update(
- ... cvs_import, modify_event, None)
+ >>> print(make_email_body_for_code_import_update(
+ ... cvs_import, modify_event, None))
~import-person/widget/trunk-cvs is now being imported from:
hello from :pserver:anoncvs@xxxxxxxxxxxxxxx:/var/cvsroot
instead of:
@@ -518,8 +518,8 @@
>>> data = {'url': 'git://git.example.com/goodbye.git'}
>>> modify_event = git_import.updateFromData(data, nopriv)
- >>> print make_email_body_for_code_import_update(
- ... git_import, modify_event, None)
+ >>> print(make_email_body_for_code_import_update(
+ ... git_import, modify_event, None))
~import-person/widget/trunk-git is now being imported from:
git://git.example.com/goodbye.git
instead of:
@@ -529,8 +529,8 @@
>>> data = {'url': 'http://svn.example.com/for-bzr-svn/trunk'}
>>> modify_event = svn_import.updateFromData(data, nopriv)
- >>> print make_email_body_for_code_import_update(
- ... svn_import, modify_event, None)
+ >>> print(make_email_body_for_code_import_update(
+ ... svn_import, modify_event, None))
~import-person/widget/trunk-svn is now being imported from:
http://svn.example.com/for-bzr-svn/trunk
instead of:
@@ -541,20 +541,20 @@
>>> data = {'whiteboard': 'stuff'}
>>> modify_event = cvs_import.updateFromData(data, nopriv)
- >>> print make_email_body_for_code_import_update(
- ... cvs_import, modify_event, 'stuff')
+ >>> print(make_email_body_for_code_import_update(
+ ... cvs_import, modify_event, 'stuff'))
The branch whiteboard was changed to:
<BLANKLINE>
stuff
- >>> print cvs_import.branch.whiteboard
+ >>> print(cvs_import.branch.whiteboard)
stuff
Setting the whiteboard to None is how it is deleted.
>>> data = {'whiteboard': None}
>>> modify_event = cvs_import.updateFromData(data, nopriv)
- >>> print make_email_body_for_code_import_update(
- ... cvs_import, modify_event, '')
+ >>> print(make_email_body_for_code_import_update(
+ ... cvs_import, modify_event, ''))
The branch whiteboard was deleted.
- >>> print cvs_import.branch.whiteboard
+ >>> print(cvs_import.branch.whiteboard)
None
=== modified file 'lib/lp/code/doc/codereviewcomment.txt'
--- lib/lp/code/doc/codereviewcomment.txt 2015-10-06 06:48:01 +0000
+++ lib/lp/code/doc/codereviewcomment.txt 2018-05-13 10:12:08 +0000
@@ -93,7 +93,7 @@
--...
You are the owner of lp://dev/~...
----------------------------------------
- >>> print notifications[0]['X-Launchpad-Branch']
+ >>> print(notifications[0]['X-Launchpad-Branch'])
~person-name.../product-name.../branch...
>>> notifications[0]['Message-Id'] == comment.message.rfc822msgid
True
=== modified file 'lib/lp/code/doc/revision.txt'
--- lib/lp/code/doc/revision.txt 2013-06-20 05:50:00 +0000
+++ lib/lp/code/doc/revision.txt 2018-05-13 10:12:08 +0000
@@ -113,7 +113,7 @@
... BranchRevision, BranchRevision.branch == branch)
>>> for branch_revision in sorted(ancestry,
... key=lambda r:(r.sequence, r.revision.id), reverse=True):
- ... print branch_revision.sequence, branch_revision.revision.id
+ ... print(branch_revision.sequence, branch_revision.revision.id)
6 9
5 8
4 11
@@ -136,7 +136,7 @@
of the branch.
>>> for revision_id in sorted(ancestry):
- ... print revision_id
+ ... print(revision_id)
foo@localhost-20051031165758-48acedf2b6a2e898
foo@localhost-20051031170008-098959758bf79803
foo@localhost-20051031170239-5fce7d6bd3f01efc
@@ -150,7 +150,7 @@
history of the branch.
>>> for revision_id in history:
- ... print revision_id
+ ... print(revision_id)
test@xxxxxxxxxxxxx-20051031165248-6f1bb97973c2b4f4
test@xxxxxxxxxxxxx-20051031165338-5f2f3d6b10bb3bf0
foo@localhost-20051031165758-48acedf2b6a2e898
@@ -185,7 +185,7 @@
>>> revno_6.branch == branch
True
>>> rev_id = revno_6.revision.revision_id
- >>> print rev_id
+ >>> print(rev_id)
foo@localhost-20051031170357-1301ad6d387feb23
We remove the last revision from the branch. This is similar to what
@@ -205,7 +205,7 @@
>>> from lp.code.interfaces.revision import IRevisionSet
>>> revision = getUtility(IRevisionSet).getByRevisionId(
... 'foo@localhost-20051031170357-1301ad6d387feb23')
- >>> print revision.revision_id
+ >>> print(revision.revision_id)
foo@localhost-20051031170357-1301ad6d387feb23
@@ -222,17 +222,17 @@
... revision_author='ddaa@localhost',
... parent_ids=['rev-1', 'rev-2'],
... properties={u'key': u'value'})
- >>> print revision.revision_id
+ >>> print(revision.revision_id)
rev-3
- >>> print revision.log_body
+ >>> print(revision.log_body)
commit message
- >>> print revision.revision_date
+ >>> print(revision.revision_date)
2005-03-08 12:00:00+00:00
- >>> print revision.revision_author.name
+ >>> print(revision.revision_author.name)
ddaa@localhost
>>> for parent_id in revision.parent_ids:
- ... print parent_id
+ ... print(parent_id)
rev-1
rev-2
- >>> print revision.getProperties()
+ >>> print(revision.getProperties())
{u'key': u'value'}
=== modified file 'lib/lp/code/doc/xmlrpc-codeimport-scheduler.txt'
--- lib/lp/code/doc/xmlrpc-codeimport-scheduler.txt 2012-12-26 01:32:19 +0000
+++ lib/lp/code/doc/xmlrpc-codeimport-scheduler.txt 2018-05-13 10:12:08 +0000
@@ -55,8 +55,8 @@
>>> from lp.code.interfaces.codeimportmachine import (
... ICodeImportMachineSet)
- >>> print getUtility(ICodeImportMachineSet).getByHostname(
- ... 'doesnt-exist-yet')
+ >>> print(getUtility(ICodeImportMachineSet).getByHostname(
+ ... 'doesnt-exist-yet'))
None
>>> codeimportscheduler.getJobForMachine('doesnt-exist-yet', 1)
0
=== modified file 'lib/lp/code/tests/test_doc.py'
--- lib/lp/code/tests/test_doc.py 2017-10-04 01:53:48 +0000
+++ lib/lp/code/tests/test_doc.py 2018-05-13 10:12:08 +0000
@@ -1,4 +1,4 @@
-# Copyright 2009-2017 Canonical Ltd. This software is licensed under the
+# Copyright 2009-2018 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""
@@ -32,7 +32,7 @@
def branchscannerSetUp(test):
"""Setup the user for the branch scanner tests."""
switch_dbuser("branchscanner")
- setUp(test)
+ setUp(test, future=True)
def zopelessLaunchpadSecuritySetUp(test):
@@ -44,7 +44,7 @@
functionality used in the webapp, it needs to use the
LaunchpadSecurityPolicy.
"""
- setGlobs(test)
+ setGlobs(test, future=True)
test.old_security_policy = setSecurityPolicy(LaunchpadSecurityPolicy)
@@ -66,22 +66,27 @@
),
'codeimport-result.txt': LayeredDocFileSuite(
'../doc/codeimport-result.txt',
- setUp=setUp, tearDown=tearDown, layer=LaunchpadFunctionalLayer,
+ setUp=lambda test: setUp(test, future=True), tearDown=tearDown,
+ layer=LaunchpadFunctionalLayer,
),
'branch-merge-proposal-notifications.txt': LayeredDocFileSuite(
'../doc/branch-merge-proposal-notifications.txt',
- setUp=setUp, tearDown=tearDown, layer=LaunchpadZopelessLayer,
+ setUp=lambda test: setUp(test, future=True), tearDown=tearDown,
+ layer=LaunchpadZopelessLayer,
),
'branch-notifications.txt': LayeredDocFileSuite(
'../doc/branch-notifications.txt',
- setUp=setUp, tearDown=tearDown, layer=LaunchpadZopelessLayer,
+ setUp=lambda test: setUp(test, future=True), tearDown=tearDown,
+ layer=LaunchpadZopelessLayer,
),
'codereviewcomment.txt': LayeredDocFileSuite(
'../doc/codereviewcomment.txt',
- setUp=setUp, tearDown=tearDown, layer=LaunchpadZopelessLayer,
+ setUp=lambda test: setUp(test, future=True), tearDown=tearDown,
+ layer=LaunchpadZopelessLayer,
),
}
def test_suite():
- return build_test_suite(here, special)
+ return build_test_suite(
+ here, special, setUp=lambda test: setUp(test, future=True))
=== modified file 'lib/lp/testing/systemdocs.py'
--- lib/lp/testing/systemdocs.py 2012-12-26 01:32:19 +0000
+++ lib/lp/testing/systemdocs.py 2018-05-13 10:12:08 +0000
@@ -1,4 +1,4 @@
-# Copyright 2009-2011 Canonical Ltd. This software is licensed under the
+# Copyright 2009-2018 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""Infrastructure for setting up doctests."""
@@ -187,7 +187,10 @@
sys.stdout = old_stdout
-def setGlobs(test):
+# XXX cjwatson 2018-05-13: Once all doctests are made safe for the standard
+# __future__ imports, the `future=True` behaviour should become
+# unconditional.
+def setGlobs(test, future=False):
"""Add the common globals for testing system documentation."""
test.globs['ANONYMOUS'] = ANONYMOUS
test.globs['login'] = login
@@ -208,10 +211,16 @@
test.globs['launchpadlib_credentials_for'] = launchpadlib_credentials_for
test.globs['oauth_access_token_for'] = oauth_access_token_for
-
-def setUp(test):
+ if future:
+ import __future__
+ for future_item in (
+ 'absolute_import', 'print_function', 'unicode_literals'):
+ test.globs[future_item] = getattr(__future__, future_item)
+
+
+def setUp(test, future=False):
"""Setup the common globals and login for testing system documentation."""
- setGlobs(test)
+ setGlobs(test, future=future)
# Set up an anonymous interaction.
login(ANONYMOUS)
Follow ups