← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~cjwatson/launchpad:pre-commit-update into launchpad:master

 

Colin Watson has proposed merging ~cjwatson/launchpad:pre-commit-update into launchpad:master.

Commit message:
Update pre-commit hooks

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/435740

`pyupgrade` no longer has a Python-2-compatible mode, so I dropped the `--py3-plus` option; and I fixed a few new `shellcheck` warnings manually.
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:pre-commit-update into launchpad:master.
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 8c58be9..20f050e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -2,7 +2,7 @@
 # See https://pre-commit.com/hooks.html for more hooks
 repos:
 -   repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.3.0
+    rev: v4.4.0
     hooks:
     -   id: check-added-large-files
     -   id: check-ast
@@ -24,17 +24,17 @@ repos:
     -   id: no-commit-to-branch
         args: [--branch, master, --branch, db-devel]
 -   repo: https://github.com/asottile/pyupgrade
-    rev: v2.37.3
+    rev: v3.3.1
     hooks:
     -   id: pyupgrade
-        args: [--keep-percent-format, --py3-plus]
+        args: [--keep-percent-format]
         exclude: |
           (?x)^(
             lib/contrib/.*
             |utilities/community-contributions\.py
           )$
 -   repo: https://github.com/psf/black
-    rev: 22.8.0
+    rev: 22.12.0
     hooks:
       - id: black
         exclude: |
@@ -43,25 +43,25 @@ repos:
             |utilities/community-contributions\.py
           )$
 -   repo: https://github.com/PyCQA/isort
-    rev: 5.10.1
+    rev: 5.11.4
     hooks:
     -   id: isort
         name: isort
         args: [--profile, black]
 -   repo: https://github.com/PyCQA/flake8
-    rev: 5.0.4
+    rev: 6.0.0
     hooks:
     -   id: flake8
         exclude: ^lib/contrib/
         additional_dependencies:
           - flake8-absolute-import==1.0.0.1
 -   repo: https://github.com/pre-commit/mirrors-eslint
-    rev: v8.23.1
+    rev: v8.31.0
     hooks:
     -   id: eslint
         args: [--quiet]
 -   repo: https://github.com/keewis/blackdoc
-    rev: v0.3.7
+    rev: v0.3.8
     hooks:
     -   id: blackdoc
         args: ["-l", "78"]
@@ -73,11 +73,11 @@ repos:
         args: [--allow-option-flag, IGNORE_EXCEPTION_MODULE_IN_PYTHON2]
         exclude: ^doc/.*
 -   repo: https://github.com/shellcheck-py/shellcheck-py
-    rev: v0.8.0.4
+    rev: v0.9.0.2
     hooks:
     -   id: shellcheck
 -   repo: https://github.com/codespell-project/codespell
-    rev: v2.2.1
+    rev: v2.2.2
     hooks:
     -   id: codespell
         files: ^doc/.*\.rst$
diff --git a/cronscripts/publishing/cron.base-ppa.sh b/cronscripts/publishing/cron.base-ppa.sh
index 0065021..e663fac 100644
--- a/cronscripts/publishing/cron.base-ppa.sh
+++ b/cronscripts/publishing/cron.base-ppa.sh
@@ -15,8 +15,10 @@ if [ "$LOCKFILEOPTIONS" == "" ]; then
    LOCKFILEOPTIONS="-r1"
 fi
 
-# Claim the lockfile.
-if ! lockfile $LOCKFILEOPTIONS $LOCKFILE; then
+# Claim the lockfile.  ($LOCKFILEOPTIONS is deliberately unquoted, since it
+# may expand to either zero words or one word.)
+# shellcheck disable=SC2086
+if ! lockfile $LOCKFILEOPTIONS "$LOCKFILE"; then
   echo "Could not claim lock file."
   exit 1
 fi
diff --git a/lib/lp/app/browser/doc/menu.rst b/lib/lp/app/browser/doc/menu.rst
index d50a767..8b24ff5 100644
--- a/lib/lp/app/browser/doc/menu.rst
+++ b/lib/lp/app/browser/doc/menu.rst
@@ -45,6 +45,7 @@ are usually bound to a view.
     ...
     ...     # A hack that reveals secret of how facets work.
     ...     __launchpad_facetname__ = "overview"
+    ...
 
     # Menus are normally registered using the menu ZCML directive.
     >>> provideAdapter(
diff --git a/lib/lp/app/browser/doc/watermark.rst b/lib/lp/app/browser/doc/watermark.rst
index 7746f59..37ea3f7 100644
--- a/lib/lp/app/browser/doc/watermark.rst
+++ b/lib/lp/app/browser/doc/watermark.rst
@@ -123,5 +123,6 @@ for the context and the heading is rendered in H1.
     >>> @implementer(IMajorHeadingView)
     ... class HeadingView(TrivialView):
     ...     pass
+    ...
     >>> print(get_hierarchy(widget, viewcls=HeadingView).heading())
     <h1...><a...>Widget</a></h1>
diff --git a/lib/lp/app/browser/tests/test_launchpadform_doc.py b/lib/lp/app/browser/tests/test_launchpadform_doc.py
index 15293e2..5e679ab 100644
--- a/lib/lp/app/browser/tests/test_launchpadform_doc.py
+++ b/lib/lp/app/browser/tests/test_launchpadform_doc.py
@@ -118,6 +118,7 @@ def doctest_custom_widget_with_setUpFields_override():
         ...
         ...     def setRenderedValue(self, value):
         ...         self.value = value
+        ...
         >>> class CustomView(LaunchpadFormView):
         ...     custom_widget_my_bool = CustomStubWidget
         ...
diff --git a/lib/lp/app/doc/badges.rst b/lib/lp/app/doc/badges.rst
index f48f84a..0bee5ae 100644
--- a/lib/lp/app/doc/badges.rst
+++ b/lib/lp/app/doc/badges.rst
@@ -197,6 +197,7 @@ determination methods to use the results of an alternative query.
     ...     def blueprints(self):
     ...         print("Foo.blueprints")
     ...         return []
+    ...
 
 Now define the adapter for the Foo content class.
 
@@ -271,6 +272,7 @@ branches in the batch and that is used to construct the DecoratedBranch.
     ...
     ...     def isBlueprintBadgeVisible(self):
     ...         return False
+    ...
 
     >>> delegating_foo = DelegatingFoo(foo)
     >>> delegating_foo
diff --git a/lib/lp/app/doc/hierarchical-menu.rst b/lib/lp/app/doc/hierarchical-menu.rst
index 29915ba..fdf7f7b 100644
--- a/lib/lp/app/doc/hierarchical-menu.rst
+++ b/lib/lp/app/doc/hierarchical-menu.rst
@@ -38,6 +38,7 @@ First, we need a hierarchy of objects to build upon:
     ...             self.path = name
     ...         self.inside = parent
     ...         self.rootsite = None
+    ...
 
     >>> class Root(BaseContent):
     ...     """The site root."""
@@ -46,14 +47,17 @@ First, we need a hierarchy of objects to build upon:
     >>> @implementer(ICookbook)
     ... class Cookbook(BaseContent):
     ...     pass
+    ...
 
     >>> @implementer(IRecipe)
     ... class Recipe(BaseContent):
     ...     pass
+    ...
 
     >>> @implementer(ICooker)
     ... class Cooker(BaseContent):
     ...     pass
+    ...
 
 Today we'll be cooking with Spam!
 
diff --git a/lib/lp/app/doc/launchpadform.rst b/lib/lp/app/doc/launchpadform.rst
index 345b6bc..996ec23 100644
--- a/lib/lp/app/doc/launchpadform.rst
+++ b/lib/lp/app/doc/launchpadform.rst
@@ -61,6 +61,7 @@ example schema:
     ...     name = "fred"
     ...     displayname = "Fred"
     ...     password = "password"
+    ...
 
 
 A form that handles all fields in the schema needs only set the
diff --git a/lib/lp/app/doc/launchpadformharness.rst b/lib/lp/app/doc/launchpadformharness.rst
index 91e0c7d..ab1165c 100644
--- a/lib/lp/app/doc/launchpadformharness.rst
+++ b/lib/lp/app/doc/launchpadformharness.rst
@@ -20,6 +20,7 @@ To demonstrate its use we'll create a sample schema and view class:
     ... class HarnessTest:
     ...     string = None
     ...     number = 0
+    ...
 
     >>> class HarnessTestView(LaunchpadFormView):
     ...     schema = IHarnessTest
diff --git a/lib/lp/app/doc/menus.rst b/lib/lp/app/doc/menus.rst
index 10f0bba..3534dba 100644
--- a/lib/lp/app/doc/menus.rst
+++ b/lib/lp/app/doc/menus.rst
@@ -55,6 +55,7 @@ for traversable objects.
     ...         self.path = name
     ...         self.inside = parent
     ...         self.rootsite = None
+    ...
 
     >>> class Root(BaseContent):
     ...     """The root of 'cookery', a vhost and facet."""
@@ -63,10 +64,12 @@ for traversable objects.
     >>> @implementer(ICookbook)
     ... class Cookbook(BaseContent):
     ...     pass
+    ...
 
     >>> @implementer(IRecipe)
     ... class Recipe(BaseContent):
     ...     pass
+    ...
 
 
 Content views associates with menus
@@ -124,14 +127,17 @@ content object's menu.
     >>> @implementer(IRecipeEditMenuMarker)
     ... class RecipeEditInstructionsView(LaunchpadView):
     ...     """View for editing recipe instructions on the cookery facet."""
+    ...
 
     >>> @implementer(IRecipeEditMenuMarker)
     ... class RecipeEditIngredientsView(LaunchpadView):
     ...     """View for editing recipe ingedients on the cookery facet."""
+    ...
 
     >>> @implementer(IRecipeJournalMenuMarker)
     ... class RecipeReadJournalView(LaunchpadView):
     ...     """View for reading a recipe's journal on the cookery facet."""
+    ...
 
     >>> class RecipeQuestionsAllView(LaunchpadView):
     ...     """View for all questions of a recipe on the questions facet."""
@@ -1085,6 +1091,7 @@ that the comment refers to.
     >>> @implementer(IComment)
     ... class Comment(BaseContent):
     ...     pass
+    ...
 
     # This is usually done in ZCML by browser:defaultView.
 
diff --git a/lib/lp/app/doc/tales.rst b/lib/lp/app/doc/tales.rst
index 99bfb3e..eb27ee5 100644
--- a/lib/lp/app/doc/tales.rst
+++ b/lib/lp/app/doc/tales.rst
@@ -1466,6 +1466,7 @@ Test the 'fmt:url' namespace for canonical urls.
     ...     path = "bonobo/saki"
     ...     inside = None
     ...     rootsite = None
+    ...
 
     >>> object_having_url = ObjectThatHasUrl()
     >>> print(test_tales("foo/fmt:url", foo=object_having_url))
diff --git a/lib/lp/archiveuploader/tests/static-translations.rst b/lib/lp/archiveuploader/tests/static-translations.rst
index f6f2e99..a1be2b6 100644
--- a/lib/lp/archiveuploader/tests/static-translations.rst
+++ b/lib/lp/archiveuploader/tests/static-translations.rst
@@ -41,6 +41,7 @@ publishing behaviour using a mock PackageUploadCustom object:
     ...         self.customformat = (
     ...             PackageUploadCustomFormat.STATIC_TRANSLATIONS
     ...         )
+    ...
 
 
     >>> bat = getUtility(IDistributionSet)["ubuntu"]["breezy-autotest"]
diff --git a/lib/lp/bugs/doc/checkwatches.rst b/lib/lp/bugs/doc/checkwatches.rst
index 036044d..47205b8 100644
--- a/lib/lp/bugs/doc/checkwatches.rst
+++ b/lib/lp/bugs/doc/checkwatches.rst
@@ -74,6 +74,7 @@ require no action from the Launchpad end.
     ...             body=socket.timeout("Connection timed out."),
     ...         )
     ...         yield
+    ...
 
     >>> with CaptureOops() as capture, timeout_requests():
     ...     updater = CheckwatchesMaster(transaction.manager)
diff --git a/lib/lp/bugs/doc/externalbugtracker-bug-imports.rst b/lib/lp/bugs/doc/externalbugtracker-bug-imports.rst
index cd79b89..574e139 100644
--- a/lib/lp/bugs/doc/externalbugtracker-bug-imports.rst
+++ b/lib/lp/bugs/doc/externalbugtracker-bug-imports.rst
@@ -26,6 +26,7 @@ methods.
     ...
     ...     def getBugTargetName(self, remote_bug):
     ...         return self._bugs[remote_bug]["package"]
+    ...
 
     >>> from lp.bugs.interfaces.bugtracker import BugTrackerType
     >>> from lp.registry.interfaces.distribution import IDistributionSet
diff --git a/lib/lp/bugs/doc/externalbugtracker-comment-imports.rst b/lib/lp/bugs/doc/externalbugtracker-comment-imports.rst
index dee5c8b..257c3d8 100644
--- a/lib/lp/bugs/doc/externalbugtracker-comment-imports.rst
+++ b/lib/lp/bugs/doc/externalbugtracker-comment-imports.rst
@@ -83,6 +83,7 @@ ExternalBugTracker class which implements these three methods.
     ...             rfc822msgid=comment_id,
     ...         )
     ...         return message
+    ...
 
     >>> external_bugtracker = CommentImportingExternalBugTracker(
     ...     "http://example.com/";
diff --git a/lib/lp/bugs/doc/externalbugtracker-comment-pushing.rst b/lib/lp/bugs/doc/externalbugtracker-comment-pushing.rst
index 4fa71bf..56c1374 100644
--- a/lib/lp/bugs/doc/externalbugtracker-comment-pushing.rst
+++ b/lib/lp/bugs/doc/externalbugtracker-comment-pushing.rst
@@ -74,6 +74,7 @@ ISupportsCommentPushing interface.
     ...
     ...         self.next_comment_id += 1
     ...         return remote_comment_id
+    ...
 
     >>> external_bugtracker = CommentPushingExternalBugTracker(
     ...     "http://example.com/";
diff --git a/lib/lp/bugs/doc/externalbugtracker-linking-back.rst b/lib/lp/bugs/doc/externalbugtracker-linking-back.rst
index e724a15..0b16fcc 100644
--- a/lib/lp/bugs/doc/externalbugtracker-linking-back.rst
+++ b/lib/lp/bugs/doc/externalbugtracker-linking-back.rst
@@ -25,6 +25,7 @@ about the bug.
     ...     ):
     ...         self.last_launchpad_bug_id = launchpad_bug_id
     ...         print("Setting Launchpad id for bug %s" % remote_bug)
+    ...
 
 The methods are called by the CheckwatchesMaster class:
 
diff --git a/lib/lp/bugs/doc/externalbugtracker.rst b/lib/lp/bugs/doc/externalbugtracker.rst
index 48206a5..94164ef 100644
--- a/lib/lp/bugs/doc/externalbugtracker.rst
+++ b/lib/lp/bugs/doc/externalbugtracker.rst
@@ -437,6 +437,7 @@ logged saying that comments won't be imported.
     ... class CommentImportExternalBugTracker(TimeUnknownExternalBugTracker):
     ...     baseurl = "http://whatever.com";
     ...     sync_comments = True
+    ...
 
     >>> checkwatches_master = CheckwatchesMaster(
     ...     transaction, syncable_gnome_products=[], logger=FakeLogger()
diff --git a/lib/lp/buildmaster/doc/buildfarmjobbehaviour.rst b/lib/lp/buildmaster/doc/buildfarmjobbehaviour.rst
index 6395a46..a7979b5 100644
--- a/lib/lp/buildmaster/doc/buildfarmjobbehaviour.rst
+++ b/lib/lp/buildmaster/doc/buildfarmjobbehaviour.rst
@@ -35,6 +35,7 @@ methods as well.
     ...
     ...     def dispatchBuildToWorker(self, logger):
     ...         print("Did something special to dispatch MySpecialBuild.")
+    ...
 
 For this documentation, we'll also need a dummy new build farm job.
 
@@ -45,6 +46,7 @@ For this documentation, we'll also need a dummy new build farm job.
     >>> @implementer(IMyNewBuildFarmJob)
     ... class MyNewBuildFarmJob:
     ...     pass
+    ...
 
 Custom behaviours are not normally instantiated directly, instead an adapter
 is specified for the specific IBuildFarmJob. Normally we'd add some ZCML to
diff --git a/lib/lp/registry/doc/hasowner-authorization.rst b/lib/lp/registry/doc/hasowner-authorization.rst
index f0733bf..77e0119 100644
--- a/lib/lp/registry/doc/hasowner-authorization.rst
+++ b/lib/lp/registry/doc/hasowner-authorization.rst
@@ -15,6 +15,7 @@ itself or a Launchpad admin.
     >>> @implementer(IHasOwner)
     ... class FooObject:
     ...     owner = salgado
+    ...
 
 Salgado is the owner of any FooObject we create, so he can edit it.
 
diff --git a/lib/lp/registry/tests/person_from_principal.rst b/lib/lp/registry/tests/person_from_principal.rst
index 5a6c1e5..9f729e0 100644
--- a/lib/lp/registry/tests/person_from_principal.rst
+++ b/lib/lp/registry/tests/person_from_principal.rst
@@ -27,6 +27,7 @@ time we adapt.
     ... class LaunchpadPrincipal:
     ...
     ...     person = cached_person
+    ...
 
     >>> person_from_principal(LaunchpadPrincipal()) is cached_person
     True
diff --git a/lib/lp/services/doc/looptuner.rst b/lib/lp/services/doc/looptuner.rst
index 2168338..2ce1f95 100644
--- a/lib/lp/services/doc/looptuner.rst
+++ b/lib/lp/services/doc/looptuner.rst
@@ -87,6 +87,7 @@ architectures, compilers used for the Python interpreter, etc.
     ...         self.last_chunk_size = chunk_size
     ...         self.clock += self.timings[self.iteration]
     ...         self.iteration += 1
+    ...
 
 
 In combination with that, we tweak LoopTuner to simulate the timings we gave
@@ -218,6 +219,7 @@ This variant of the LoopTuner simulates an overridable cost function:
     ...
     ...     def computeCost(self):
     ...         return self.cost_function(self.last_chunk_size)
+    ...
 
 
     >>> class CostedTuner(LoopTuner):
@@ -424,6 +426,7 @@ of the actual run-time.
     ...     def __call__(self, chunk_size):
     ...         print("Processing %d items." % (chunk_size))
     ...         self.iteration += 1
+    ...
 
 Aim for a low goal_seconds (to reduce test runtime), and only 3 iterations.
 
diff --git a/lib/lp/services/fields/doc/uri-field.rst b/lib/lp/services/fields/doc/uri-field.rst
index fc08dfd..4bdaf90 100644
--- a/lib/lp/services/fields/doc/uri-field.rst
+++ b/lib/lp/services/fields/doc/uri-field.rst
@@ -209,6 +209,7 @@ This widget is registered as an input widget:
     >>> @implementer(IURIFieldTest)
     ... class URIFieldTest:
     ...     field = None
+    ...
 
     >>> context = URIFieldTest()
     >>> field = IURIFieldTest["field"].bind(context)
diff --git a/lib/lp/services/mail/tests/incomingmail.rst b/lib/lp/services/mail/tests/incomingmail.rst
index aa92a98..7d68ac9 100644
--- a/lib/lp/services/mail/tests/incomingmail.rst
+++ b/lib/lp/services/mail/tests/incomingmail.rst
@@ -37,6 +37,7 @@ handle, and register them for some domains:
     ...     def process(self, mail, to_addr, filealias):
     ...         self.handledMails.append(mail["Message-Id"])
     ...         return True
+    ...
 
     >>> from lp.services.mail.handlers import mail_handlers
     >>> foo_handler = MockHandler()
@@ -257,6 +258,7 @@ attempting to process incoming mail.
     ...
     ...     def process(self, mail, to_addr, filealias):
     ...         raise TestOopsException()
+    ...
     >>> mail_handlers.add("oops.com", OopsHandler())
 
 And submit an email to the handler.
@@ -371,6 +373,7 @@ reporting in the web interface, are not ignored in the email interface.
     ... class UnauthorizedOopsHandler:
     ...     def process(self, mail, to_addr, filealias):
     ...         raise Unauthorized()
+    ...
     >>> mail_handlers.add("unauthorized.com", UnauthorizedOopsHandler())
 
     >>> msg = email.message_from_string(
@@ -434,6 +437,7 @@ Let's create and register a handler which raises a SQL error:
     ...     def process(self, mail, to_addr, filealias):
     ...         cur = cursor()
     ...         cur.execute("SELECT 1/0")
+    ...
     >>> mail_handlers.add("except.com", DBExceptionRaiser())
 
 Now we send a mail to the handler, which will cause an exception:
diff --git a/lib/lp/services/webapp/doc/canonical_url.rst b/lib/lp/services/webapp/doc/canonical_url.rst
index 33bec16..32123e4 100644
--- a/lib/lp/services/webapp/doc/canonical_url.rst
+++ b/lib/lp/services/webapp/doc/canonical_url.rst
@@ -96,17 +96,20 @@ interfaces.  First, we create some countryset, country and town objects.
     >>> @implementer(ICountrySet)
     ... class CountrySet:
     ...     pass
+    ...
     >>> countryset_instance = CountrySet()
 
     >>> @implementer(ICountry)
     ... class Country:
     ...     name = "England"
+    ...
     >>> country_instance = Country()
 
     >>> @implementer(ITown)
     ... class Town:
     ...     country = country_instance
     ...     name = "London"
+    ...
     >>> town_instance = Town()
 
 Next, we check there are no ICanonicalUrlData adapters for these objects.
@@ -231,6 +234,7 @@ an adapter.
     ...     @property
     ...     def inside(self):
     ...         return getUtility(ILaunchpadRoot)
+    ...
 
 The CountrySetUrl class needs to be accessible from zcml.  So, we put it
 in our temporary module.
@@ -322,6 +326,7 @@ ICanonicalUrlData, but its parent or its parent's parent (and so on) cannot.
     ...     def __init__(self, name, parent):
     ...         self.path = name
     ...         self.inside = parent
+    ...
     >>> unrooted_object = ObjectThatHasUrl("unrooted", object_that_has_no_url)
     >>> canonical_url(unrooted_object)
     Traceback (most recent call last):
@@ -418,6 +423,7 @@ zope.publisher.interfaces.http.IHTTPApplicationRequest.
     ...         ), "this is not a real IHTTPApplicationRequest"
     ...         assert not path_only, "not a real IHTTPApplicationRequest"
     ...         return self.applicationurl
+    ...
 
     >>> mandrill_request = FakeRequest("https://mandrill.example.org:23";)
     >>> print(canonical_url(country_instance))
diff --git a/lib/lp/services/webapp/doc/canonicalurl.rst b/lib/lp/services/webapp/doc/canonicalurl.rst
index fdb0d4e..803a590 100644
--- a/lib/lp/services/webapp/doc/canonicalurl.rst
+++ b/lib/lp/services/webapp/doc/canonicalurl.rst
@@ -29,6 +29,7 @@ First, we'll construct an example object hierarchy.
     ...         self.path = name
     ...         self.inside = parent
     ...         self.rootsite = None
+    ...
 
     >>> class Root(BaseContent):
     ...     pass
@@ -37,10 +38,12 @@ First, we'll construct an example object hierarchy.
     >>> @implementer(ICookbook)
     ... class Cookbook(BaseContent):
     ...     pass
+    ...
 
     >>> @implementer(IRecipe)
     ... class Recipe(BaseContent):
     ...     pass
+    ...
 
 Here is the structure of our hierarchy:
 
@@ -62,6 +65,7 @@ We'll try adapting our objects to a made-up interface, ICookingDirections.
     ... class CookingDirections:
     ...     def __init__(self, context):
     ...         self.context = context
+    ...
 
 Right now, none of our example objects can be turned into cooking
 directions.
@@ -137,6 +141,7 @@ First we need a named adapter to use:
     ... class LabelledCookbook:
     ...     def __init__(self, context):
     ...         self.context = context
+    ...
 
     >>> provideAdapter(
     ...     LabelledCookbook, [ICookbook], ILabelledCookbook, name="foo"
diff --git a/lib/lp/services/webapp/doc/menus.rst b/lib/lp/services/webapp/doc/menus.rst
index ca89778..f11fad5 100644
--- a/lib/lp/services/webapp/doc/menus.rst
+++ b/lib/lp/services/webapp/doc/menus.rst
@@ -27,6 +27,7 @@ Construct an example url hierarchy
     ...         self.path = name  # See ICanonicalUrlData.
     ...         self.inside = parent  # See ICanonicalUrlData.
     ...         self.rootsite = None  # See ICanonicalUrlData.
+    ...
 
 Here's a useful class that we can use to effectively register adapters
 for an object, without actually using adapter registries.  This comes
@@ -351,6 +352,7 @@ Next, we return the link as HTML.
     ... class InteractiveTestRequest(LaunchpadTestRequest):
     ...     principal = None
     ...     interaction = None
+    ...
     >>> request = InteractiveTestRequest()
     >>> login(ANONYMOUS, request)
 
@@ -647,6 +649,7 @@ object.
     >>> @implementer(IThingHavingFacets)
     ... class SomeThing:
     ...     pass
+    ...
     >>> something_with_facets = SomeThing()
     >>> IFacetMenu(something_with_facets, None) is None
     True
@@ -657,6 +660,7 @@ We also need to check that we have no IApplicationMenu adapter named
     >>> @implementer(IThingHavingMenus)
     ... class SomeOtherThing:
     ...     pass
+    ...
     >>> something_with_menus = SomeOtherThing()
     >>> print(queryAdapter(something_with_menus, IApplicationMenu, "foo"))
     None
@@ -761,6 +765,7 @@ link should appear linked. The request is also set as the menu's
     ...
     ...     def setPrincipal(self, principal):
     ...         self.principal = principal
+    ...
     >>> request = FakeRequest("http://launchpad.test/sesamestreet/+bar";)
     >>> view = LaunchpadView(house, request)
     >>> view.__launchpad_facetname__ = "bar"
diff --git a/lib/lp/services/webapp/doc/navigation.rst b/lib/lp/services/webapp/doc/navigation.rst
index e751322..2cf30a4 100644
--- a/lib/lp/services/webapp/doc/navigation.rst
+++ b/lib/lp/services/webapp/doc/navigation.rst
@@ -134,6 +134,7 @@ interface, we'll define one here.
     ...             return self.query_string
     ...         else:
     ...             return None
+    ...
 
     >>> request = Request()
 
@@ -149,6 +150,7 @@ interface, we'll define one here.
     ...
     ...     def __repr__(self):
     ...         return "<Thing '%s'>" % self.value
+    ...
 
     >>> @implementer(IThingSet)
     ... class ThingSet:
@@ -160,6 +162,7 @@ interface, we'll define one here.
     ...
     ...     def __repr__(self):
     ...         return "<ThingSet>"
+    ...
 
     >>> thingset = ThingSet()
 
diff --git a/lib/lp/services/webapp/doc/timeout.rst b/lib/lp/services/webapp/doc/timeout.rst
index 917871c..2e14f71 100644
--- a/lib/lp/services/webapp/doc/timeout.rst
+++ b/lib/lp/services/webapp/doc/timeout.rst
@@ -66,6 +66,7 @@ Same thing if a function decorated using @with_timeout is called.
     >>> @with_timeout()
     ... def wait_a_little():
     ...     time.sleep(1)
+    ...
     >>> wait_a_little()
     Traceback (most recent call last):
       ...
@@ -79,6 +80,7 @@ successfully.
     >>> @with_timeout(timeout=2)
     ... def wait_a_little_more():
     ...     time.sleep(1)
+    ...
     >>> wait_a_little_more()
 
     >>> def _timeout():
@@ -87,6 +89,7 @@ successfully.
     >>> @with_timeout(timeout=_timeout)
     ... def wait_a_little_again():
     ...     time.sleep(1)
+    ...
     >>> wait_a_little_again()
 
     >>> class Foo:
diff --git a/lib/lp/services/webapp/doc/zcmldirectives.rst b/lib/lp/services/webapp/doc/zcmldirectives.rst
index e6bf83d..49e5434 100644
--- a/lib/lp/services/webapp/doc/zcmldirectives.rst
+++ b/lib/lp/services/webapp/doc/zcmldirectives.rst
@@ -60,10 +60,12 @@ default view for the IFooLayer layer.
     >>> @implementer(IFoo)
     ... class FooObject:
     ...     pass
+    ...
     >>> fooobject = FooObject()
     >>> @implementer(IFooLayer)
     ... class Request:
     ...     pass
+    ...
     >>> request = Request()
 
     >>> class FooView:
diff --git a/lib/lp/services/webservice/doc/webservice-configuration.rst b/lib/lp/services/webservice/doc/webservice-configuration.rst
index b3e3099..07480ea 100644
--- a/lib/lp/services/webservice/doc/webservice-configuration.rst
+++ b/lib/lp/services/webservice/doc/webservice-configuration.rst
@@ -35,6 +35,7 @@ developer.
     >>> @implementer(ILaunchBag)
     ... class FakeLaunchBag:
     ...     developer = False
+    ...
     >>> the_launchbag = FakeLaunchBag()
     >>> provideUtility(the_launchbag, ILaunchBag)
 
diff --git a/lib/lp/testing/tests/test_pages.py b/lib/lp/testing/tests/test_pages.py
index 8b33e63..d819d62 100644
--- a/lib/lp/testing/tests/test_pages.py
+++ b/lib/lp/testing/tests/test_pages.py
@@ -30,10 +30,10 @@ class TestMakeStoryTest(unittest.TestCase):
 
     def test_dir_construction_and_trivial_running(self):
         test_filename = os.path.join(self.tempdir, "xx-foo.rst")
-        test_file = open(test_filename, "wt")
+        test_file = open(test_filename, "w")
         test_file.close()
         test_filename = os.path.join(self.tempdir, "xx-bar.rst")
-        test_file = open(test_filename, "wt")
+        test_file = open(test_filename, "w")
         test_file.close()
         # The test directory is looked up relative to the calling
         # module's path.
diff --git a/utilities/rocketfuel-setup b/utilities/rocketfuel-setup
index 3021e1b..2fd9679 100755
--- a/utilities/rocketfuel-setup
+++ b/utilities/rocketfuel-setup
@@ -117,11 +117,11 @@ for key in $REQUIRED_PPA_KEYS; do
    if ! sudo APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 \
        apt-key adv --list-keys --with-colons --fingerprint | grep -qE "^fpr:+$key"; then
      echo "Retrieving key $key."
-     if ! gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys $key; then
+     if ! gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys "$key"; then
        echo "Could not retrieve key $key."
        exit 1
      fi
-     if ! gpg --export -a $key | sudo apt-key add -; then
+     if ! gpg --export -a "$key" | sudo apt-key add -; then
        echo "Could not install key $key."
        exit 1
      fi