← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~cjwatson/launchpad:reword-sqlobject-comments into launchpad:master

 

Colin Watson has proposed merging ~cjwatson/launchpad:reword-sqlobject-comments into launchpad:master.

Commit message:
Update/remove lots of comments/docstrings mentioning SQLObject

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/451740
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:reword-sqlobject-comments into launchpad:master.
diff --git a/database/schema/security.cfg b/database/schema/security.cfg
index ab71472..50328ff 100644
--- a/database/schema/security.cfg
+++ b/database/schema/security.cfg
@@ -3,9 +3,9 @@
 #
 # Possible permissions: SELECT, INSERT, UPDATE, EXECUTE
 #
-# Note that we cannot have INSERT only tables if we are using SQLObject, as it
-# creates new entries by first doing an insert (to get the id) and then
-# issuing an update
+# Note that we cannot have INSERT only tables if we are using Storm, as it
+# sometimes creates new entries by first doing an insert (to get the id) and
+# then issuing an update.
 [DEFAULT]
 public_schemas=
 
diff --git a/doc/reference/python.rst b/doc/reference/python.rst
index e3a76ab..5d877b3 100644
--- a/doc/reference/python.rst
+++ b/doc/reference/python.rst
@@ -298,7 +298,7 @@ queries or fragments, e.g.:
         FROM TeamParticipation
         INNER JOIN Person ON TeamParticipation.team = Person.id
         WHERE TeamParticipation.person = %s
-    """ % sqlvalues(personID)
+    """ % sqlvalues(person_id)
 
 This is also easy to cut-and-paste into ``psql`` for interactive testing,
 unlike if you use several lines of single quoted strings.
diff --git a/lib/lp/answers/browser/questiontarget.py b/lib/lp/answers/browser/questiontarget.py
index ed993fb..e9556fc 100644
--- a/lib/lp/answers/browser/questiontarget.py
+++ b/lib/lp/answers/browser/questiontarget.py
@@ -510,7 +510,7 @@ class SearchQuestionsView(UserSupportLanguagesMixin, LaunchpadFormView):
         to question or mdash if there is no related source package.
         """
         # XXX sinzui 2007-11-27 bug=164435:
-        # SQLObject can refetch the question, so we are comparing ids.
+        # Storm can refetch the question, so we are comparing ids.
         assert self.context.id == question.distribution.id, (
             "The question.distribution (%s) must be equal to the context (%s)"
             % (question.distribution, self.context)
diff --git a/lib/lp/answers/interfaces/question.py b/lib/lp/answers/interfaces/question.py
index dea2c45..00f27ff 100644
--- a/lib/lp/answers/interfaces/question.py
+++ b/lib/lp/answers/interfaces/question.py
@@ -482,8 +482,8 @@ class IQuestion(IHasOwner):
 
         Return the created IQuestionMessage.
 
-        (Note this method is named expireQuestion and not expire because of
-        conflicts with SQLObject.)
+        (Note this method is named expireQuestion and not expire because it
+        used to conflict with SQLObject.)
 
         This method should fire an IObjectCreatedEvent for the created
         IQuestionMessage and an IObjectModifiedEvent for the question.
diff --git a/lib/lp/app/validators/README.txt b/lib/lp/app/validators/README.txt
index 2efe490..bae777f 100644
--- a/lib/lp/app/validators/README.txt
+++ b/lib/lp/app/validators/README.txt
@@ -1,4 +1,2 @@
-Validators in this directory are either simple functions that correspond
-to database constraints such as valid_name(name), or they can be
-subclasses of sqlobject.include.validators.Validator such as
-PersonValidatorBase.
+Validators in this directory are simple functions that correspond to
+database constraints such as valid_name(name).
diff --git a/lib/lp/bugs/browser/tests/buglinktarget-views.rst b/lib/lp/bugs/browser/tests/buglinktarget-views.rst
index d3a139a..caebb44 100644
--- a/lib/lp/bugs/browser/tests/buglinktarget-views.rst
+++ b/lib/lp/bugs/browser/tests/buglinktarget-views.rst
@@ -94,7 +94,7 @@ IBugLinkTarget.
     >>> print(view.cancel_url)
     http://bugs.launchpad.test/bugs/cve/2005-2730
 
-After removing the bugs, it sends a SQLObjectModified event.
+After removing the bugs, it sends an ObjectModifiedEvent.
 
     >>> request = LaunchpadTestRequest(
     ...     method="POST",
diff --git a/lib/lp/bugs/model/bugtask.py b/lib/lp/bugs/model/bugtask.py
index d66c62a..2d9845e 100644
--- a/lib/lp/bugs/model/bugtask.py
+++ b/lib/lp/bugs/model/bugtask.py
@@ -932,7 +932,7 @@ class BugTask(StormBase):
         for synched_attr in self._CONJOINED_ATTRIBUTES:
             replica_attr_value = getattr(conjoined_replica, synched_attr)
             # Bypass our checks that prevent setting attributes on
-            # conjoined primaries by calling the underlying sqlobject
+            # conjoined primaries by calling the underlying Storm
             # setter methods directly.
             setattr(self, synched_attr, PassthroughValue(replica_attr_value))
 
diff --git a/lib/lp/bugs/model/bugtasksearch.py b/lib/lp/bugs/model/bugtasksearch.py
index 08fe8dc..d8170b6 100644
--- a/lib/lp/bugs/model/bugtasksearch.py
+++ b/lib/lp/bugs/model/bugtasksearch.py
@@ -334,8 +334,8 @@ def _build_query(params):
     # * a searchbuilder.any object, representing a set of acceptable
     #   filter values
     # * a searchbuilder.NULL object
-    # * an sqlobject
-    # * a dbschema item
+    # * a Storm instance
+    # * a `DBItem`
     # * None (meaning no filter criteria specified for that arg_name)
     #
     # XXX: kiko 2006-03-16:
diff --git a/lib/lp/buildmaster/interfaces/processor.py b/lib/lp/buildmaster/interfaces/processor.py
index 67f0a58..b9bb853 100644
--- a/lib/lp/buildmaster/interfaces/processor.py
+++ b/lib/lp/buildmaster/interfaces/processor.py
@@ -40,7 +40,7 @@ class ProcessorNotFound(NameLookupFailed):
 # 'devel' as their version.
 @exported_as_webservice_entry(publish_web_link=False, as_of="beta")
 class IProcessor(Interface):
-    """The SQLObject Processor Interface"""
+    """The Storm Processor Interface"""
 
     id = Attribute("The Processor ID")
     name = exported(
diff --git a/lib/lp/code/doc/codeimport-machine.rst b/lib/lp/code/doc/codeimport-machine.rst
index 1b7b523..22fedca 100644
--- a/lib/lp/code/doc/codeimport-machine.rst
+++ b/lib/lp/code/doc/codeimport-machine.rst
@@ -213,7 +213,7 @@ setQuiescing methods must fail.
 
 Since our scripts and daemons run at "READ COMMITTED" isolation level,
 there are races that we cannot easily detect within the limitation of
-SQLObject, when the watchdog process and the controller daemon
+Storm, when the watchdog process and the controller daemon
 concurrently call setOffline. Those undetected races will lead to the
 creation of redundant OFFLINE events with different reason values, where
 one of the reasons will be WATCHDOG. Those races should not have any
diff --git a/lib/lp/code/interfaces/branch.py b/lib/lp/code/interfaces/branch.py
index 0bf790f..16db888 100644
--- a/lib/lp/code/interfaces/branch.py
+++ b/lib/lp/code/interfaces/branch.py
@@ -1045,7 +1045,7 @@ class IBranchView(
 
         :param notification_levels: An iterable of
             `BranchSubscriptionNotificationLevel`s
-        :return: An SQLObject query result.
+        :return: A `ResultSet` of `BranchSubscription`s.
         """
 
     def getBranchRevision(sequence=None, revision=None, revision_id=None):
diff --git a/lib/lp/code/model/tests/test_codereviewkarma.py b/lib/lp/code/model/tests/test_codereviewkarma.py
index fc4cdce..4278a3c 100644
--- a/lib/lp/code/model/tests/test_codereviewkarma.py
+++ b/lib/lp/code/model/tests/test_codereviewkarma.py
@@ -56,7 +56,7 @@ class TestCodeReviewKarma(TestCaseWithFactory):
         # target as there would be other karma events for the branch
         # creations.
         self.karma_events = []
-        # The normal SQLObject events use the logged in person.
+        # The normal Storm events use the logged in person.
         login_person(registrant)
         source_branch.addLandingTarget(registrant, target_branch)
         self.assertOneKarmaEvent(registrant, "branchmergeproposed")
diff --git a/lib/lp/code/model/tests/test_revisionauthor.py b/lib/lp/code/model/tests/test_revisionauthor.py
index a256b90..37401f6 100644
--- a/lib/lp/code/model/tests/test_revisionauthor.py
+++ b/lib/lp/code/model/tests/test_revisionauthor.py
@@ -100,8 +100,8 @@ class TestRevisionAuthorMatching(MakeHarryTestCase):
         # Check a VALIDATED email address is used to link.
         harry = self._makeHarry(EmailAddressStatus.VALIDATED)
         author = self._createRevisionAuthor()
-        # Reget harry as the SQLObject cache has been flushed on
-        # transaction boundary.
+        # Reget harry as the Storm cache has been flushed on transaction
+        # boundary.
         harry = getUtility(IPersonSet).getByName("harry")
         self.assertEqual("harry@xxxxxxxxxxxxx", author.email)
         self.assertEqual(harry, author.person)
@@ -110,8 +110,8 @@ class TestRevisionAuthorMatching(MakeHarryTestCase):
         # Check a OLD email address is used to link.
         harry = self._makeHarry(EmailAddressStatus.OLD)
         author = self._createRevisionAuthor()
-        # Reget harry as the SQLObject cache has been flushed on
-        # transaction boundary.
+        # Reget harry as the Storm cache has been flushed on transaction
+        # boundary.
         harry = getUtility(IPersonSet).getByName("harry")
         self.assertEqual("harry@xxxxxxxxxxxxx", author.email)
         self.assertEqual(harry, author.person)
@@ -120,8 +120,8 @@ class TestRevisionAuthorMatching(MakeHarryTestCase):
         # Check a PREFERRED email address is used to link.
         harry = self._makeHarry(EmailAddressStatus.PREFERRED)
         author = self._createRevisionAuthor()
-        # Reget harry as the SQLObject cache has been flushed on
-        # transaction boundary.
+        # Reget harry as the Storm cache has been flushed on transaction
+        # boundary.
         harry = getUtility(IPersonSet).getByName("harry")
         self.assertEqual("harry@xxxxxxxxxxxxx", author.email)
         self.assertEqual(harry, author.person)
diff --git a/lib/lp/registry/browser/person.py b/lib/lp/registry/browser/person.py
index 4b4e920..c359df7 100644
--- a/lib/lp/registry/browser/person.py
+++ b/lib/lp/registry/browser/person.py
@@ -248,8 +248,8 @@ class RestrictedMembershipsPersonView(LaunchpadView):
         Private teams are filtered out if the user is not a member of them.
         """
         # This method returns a list as opposed to the database object's
-        # getLatestApprovedMembershipsForPerson which returns a sqlobject
-        # result set.
+        # getLatestApprovedMembershipsForPerson which returns a Storm
+        # ResultSet.
         membership_list = self.context.getLatestApprovedMembershipsForPerson()
         return [
             membership
@@ -265,8 +265,7 @@ class RestrictedMembershipsPersonView(LaunchpadView):
         Private teams are filtered out if the user is not a member of them.
         """
         # This method returns a list as opposed to the database object's
-        # teams_with_icons which returns a sqlobject
-        # result set.
+        # teams_with_icons which returns a Storm ResultSet.
         return [
             team
             for team in self.context.teams_with_icons
diff --git a/lib/lp/registry/model/distributionsourcepackage.py b/lib/lp/registry/model/distributionsourcepackage.py
index 67312ee..bc80a4f 100644
--- a/lib/lp/registry/model/distributionsourcepackage.py
+++ b/lib/lp/registry/model/distributionsourcepackage.py
@@ -91,8 +91,8 @@ class DistributionSourcePackage(
     HasDriversMixin,
     WebhookTargetMixin,
 ):
-    """This is a "Magic Distribution Source Package". It is not an
-    SQLObject, but instead it represents a source package with a particular
+    """This is a "Magic Distribution Source Package". It is not a
+    Storm model, but instead it represents a source package with a particular
     name in a particular distribution. You can then ask it all sorts of
     things about the releases that are published under its name, the latest
     or current release, etc.
diff --git a/lib/lp/registry/model/mailinglist.py b/lib/lp/registry/model/mailinglist.py
index fd26b09..f3fcaf5 100644
--- a/lib/lp/registry/model/mailinglist.py
+++ b/lib/lp/registry/model/mailinglist.py
@@ -336,8 +336,7 @@ class MailingList(StormBase):
             ), "Email already associated with another team."
 
     def _setAndNotifyDateActivated(self):
-        """Set the date_activated field and fire a
-        SQLObjectModified event.
+        """Set the date_activated field and fire an ObjectModifiedEvent.
 
         The date_activated field is only set once - repeated calls
         will not change the field's value.
diff --git a/lib/lp/registry/model/person.py b/lib/lp/registry/model/person.py
index 778f1dd..788333b 100644
--- a/lib/lp/registry/model/person.py
+++ b/lib/lp/registry/model/person.py
@@ -520,10 +520,9 @@ class Person(
         # mailing list.  This is because renaming a mailing list is not
         # trivial in Mailman 2.1 (see Mailman FAQ item 4.70).  We prohibit
         # such renames in the team edit details view, but just to be safe, we
-        # also assert that such an attempt is not being made here.  To do
-        # this, we must override the SQLObject method for setting the 'name'
-        # database column.  Watch out for when SQLObject is creating this row,
-        # because in that case self.name isn't yet available.
+        # also assert that such an attempt is not being made here.  Watch
+        # out for when Storm is creating this row, because in that case
+        # self.name isn't yet available.
         if self.name is None:
             mailing_list = None
         else:
@@ -535,7 +534,7 @@ class Person(
             or mailing_list.status == MailingListStatus.PURGED
         )
         assert can_rename, "Cannot rename teams with mailing lists"
-        # Everything's okay, so let SQLObject do the normal thing.
+        # Everything's okay, so let Storm do the normal thing.
         return value
 
     name = Unicode(name="name", allow_none=False, validator=_validate_name)
diff --git a/lib/lp/registry/model/pillar.py b/lib/lp/registry/model/pillar.py
index 496aceb..14d4fc8 100644
--- a/lib/lp/registry/model/pillar.py
+++ b/lib/lp/registry/model/pillar.py
@@ -100,7 +100,7 @@ class PillarNameSet:
         # We could attempt to do this in a single database query, but I
         # expect that doing two queries will be faster that OUTER JOINing
         # the Project, Product and Distribution tables (and this approach
-        # works better with SQLObject too.
+        # is easier with Storm too).
 
         # Retrieve information out of the PillarName table.
         query = """
diff --git a/lib/lp/registry/tests/test_teammembership.py b/lib/lp/registry/tests/test_teammembership.py
index ec7e3c9..5a5fb5b 100644
--- a/lib/lp/registry/tests/test_teammembership.py
+++ b/lib/lp/registry/tests/test_teammembership.py
@@ -821,7 +821,7 @@ class TestTeamMembership(TestCaseWithFactory):
             TeamMembershipStatus.DEACTIVATED,
             getUtility(IPersonSet).getByName("name16"),
         )
-        # Bypass SQLObject to make sure the update was really flushed to the
+        # Bypass Storm to make sure the update was really flushed to the
         # database.
         cur = cursor()
         cur.execute("SELECT status FROM teammembership WHERE id = %d" % tm.id)
diff --git a/lib/lp/services/database/doc/storm-security-proxies.rst b/lib/lp/services/database/doc/storm-security-proxies.rst
index e95fb66..600dcc2 100644
--- a/lib/lp/services/database/doc/storm-security-proxies.rst
+++ b/lib/lp/services/database/doc/storm-security-proxies.rst
@@ -1,5 +1,5 @@
-Demonstrate that SQLObject works with security proxies
-------------------------------------------------------
+Demonstrate that Storm works with security proxies
+--------------------------------------------------
 
 Do some imports.
 
diff --git a/lib/lp/services/database/multitablecopy.py b/lib/lp/services/database/multitablecopy.py
index de07713..b34e1dd 100644
--- a/lib/lp/services/database/multitablecopy.py
+++ b/lib/lp/services/database/multitablecopy.py
@@ -353,9 +353,9 @@ class MultiTableCopy:
             extracted.  The WHERE clause may refer to rows from table being
             extracted as "source."
         :param id_sequence: SQL sequence that should assign new identifiers
-            for the extracted rows.  Defaults to `source_table` with "_seq_id"
-            appended, which by SQLObject/Launchpad convention is the sequence
-            that provides `source_table`'s primary key values.  Used verbatim,
+            for the extracted rows.  Defaults to `source_table` with "_id_seq"
+            appended, which by Launchpad convention is the sequence that
+            provides `source_table`'s primary key values.  Used verbatim,
             without quoting.
         :param inert_where: Boolean SQL expression characterizing rows that
             are extracted, but should not poured back into `source_table`
diff --git a/lib/lp/services/database/sqlbase.py b/lib/lp/services/database/sqlbase.py
index 9cb0d1d..3a2f903 100644
--- a/lib/lp/services/database/sqlbase.py
+++ b/lib/lp/services/database/sqlbase.py
@@ -83,9 +83,6 @@ class StupidCache:
     This class is basically equivalent to Storm's standard Cache class
     with a very large size but without the overhead of maintaining the
     LRU list.
-
-    This provides caching behaviour equivalent to what we were using
-    under SQLObject.
     """
 
     def __init__(self, size):
@@ -485,25 +482,28 @@ def convert_storm_clause_to_string(storm_clause):
 def flush_database_updates():
     """Flushes all pending database updates.
 
-    When SQLObject's _lazyUpdate flag is set, then it's possible to have
-    changes written to objects that aren't flushed to the database, leading to
-    inconsistencies when doing e.g.::
+    Storm normally flushes changes to objects before it needs to issue the
+    next query, but there are situations where it doesn't realize that it
+    needs to do so.  One common case is when creating an object and
+    immediately fetching its ID, which is typically assigned by the database
+    based on a sequence when the row is inserted::
 
-        # Assuming the Beer table already has a 'Victoria Bitter' row...
-        assert Beer.select("name LIKE 'Vic%'").count() == 1  # This will pass
-        beer = Beer.byName('Victoria Bitter')
-        beer.name = 'VB'
-        assert Beer.select("name LIKE 'Vic%'").count() == 0  # This will fail
+        store = IStore(Beer)
+        beer = Beer(name="Victoria Bitter")
+        store.add(beer)
+        assert beer.id is not None  # This will fail
 
     To avoid this problem, use this function::
 
-        # Assuming the Beer table already has a 'Victoria Bitter' row...
-        assert Beer.select("name LIKE 'Vic%'").count() == 1  # This will pass
-        beer = Beer.byName('Victoria Bitter')
-        beer.name = 'VB'
+        store = IStore(Beer)
+        beer = Beer(name="Victoria Bitter")
+        store.add(beer)
         flush_database_updates()
-        assert Beer.select("name LIKE 'Vic%'").count() == 0  # This will pass
+        assert beer.id is not None  # This will pass
 
+    (You can also flush individual stores using `store.flush()`, which is
+    normally sufficient, but sometimes this function is a convenient
+    shorthand if you don't already have a store object handy.)
     """
     zstorm = getUtility(IZStorm)
     for name, store in zstorm.iterstores():
@@ -513,14 +513,13 @@ def flush_database_updates():
 def flush_database_caches():
     """Flush all database caches.
 
-    SQLObject caches field values from the database in SQLObject
-    instances.  If SQL statements are issued that change the state of
-    the database behind SQLObject's back, these cached values will be
-    invalid.
+    Storm caches field values from the database in Storm instances.  If SQL
+    statements are issued that change the state of the database behind
+    Storm's back, these cached values will be invalid.
 
-    This function iterates through all the objects in the SQLObject
-    connection's cache, and synchronises them with the database.  This
-    ensures that they all reflect the values in the database.
+    This function iterates through all the objects in the Storm connection's
+    cache, and synchronises them with the database.  This ensures that they
+    all reflect the values in the database.
     """
     zstorm = getUtility(IZStorm)
     for name, store in zstorm.iterstores():
diff --git a/lib/lp/services/messages/model/message.py b/lib/lp/services/messages/model/message.py
index ade6a5d..9f84932 100644
--- a/lib/lp/services/messages/model/message.py
+++ b/lib/lp/services/messages/model/message.py
@@ -720,8 +720,7 @@ class UserToUserEmail(StormBase):
         # On the other hand, we really don't need a UserToUserEmailSet for any
         # other purpose.  There isn't any other relationship that can be
         # inferred, so in this case I think it makes fine sense for the
-        # constructor to add self to the store.  Also, this closely mimics
-        # what the SQLObject compatibility layer does.
+        # constructor to add self to the store.
         Store.of(sender).add(self)
 
 
diff --git a/lib/lp/services/statistics/tests/test_update_stats.py b/lib/lp/services/statistics/tests/test_update_stats.py
index 577ff58..2b25e58 100644
--- a/lib/lp/services/statistics/tests/test_update_stats.py
+++ b/lib/lp/services/statistics/tests/test_update_stats.py
@@ -281,7 +281,7 @@ class UpdateTranslationStatsTest(unittest.TestCase):
 
         flush_database_caches()
 
-        # The transaction changed, we need to refetch SQLObjects.
+        # The transaction changed, we need to refetch Storm instances.
         ubuntu = self.distribution["ubuntu"]
         hoary = self.distroseriesset.queryByName(ubuntu, "hoary")
         spanish = self.languageset["es"]
diff --git a/lib/lp/services/tarfile_helpers.py b/lib/lp/services/tarfile_helpers.py
index ef10c54..09dc721 100644
--- a/lib/lp/services/tarfile_helpers.py
+++ b/lib/lp/services/tarfile_helpers.py
@@ -13,16 +13,6 @@ import tarfile
 import tempfile
 import time
 
-# A note about tarballs, BytesIO and unicode. SQLObject returns unicode
-# values for columns which are declared as StringCol. We have to be careful
-# not to pass unicode instances to the tarfile module, because when the
-# tarfile's filehandle is a BytesIO object, the BytesIO object gets upset
-# later when we ask it for its value and it tries to join together its
-# buffers. This is why the tarball code is sprinkled with ".encode('ascii')".
-# If we get separate StringCol and UnicodeCol column types, we won't need this
-# any longer.
-# -- Dafydd Harries, 2005-04-07.
-
 
 class LaunchpadWriteTarFile:
     """Convenience wrapper around the tarfile module.
diff --git a/lib/lp/services/worlddata/interfaces/language.py b/lib/lp/services/worlddata/interfaces/language.py
index 7f77f9b..63a3ce5 100644
--- a/lib/lp/services/worlddata/interfaces/language.py
+++ b/lib/lp/services/worlddata/interfaces/language.py
@@ -120,16 +120,10 @@ class ILanguage(Interface):
     )
 
     def addCountry(country):
-        """Add a country to a list of countries this language is spoken in.
-
-        Provided by SQLObject.
-        """
+        """Add a country to a list of countries this language is spoken in."""
 
     def removeCountry(country):
-        """Remove country from list of countries this language is spoken in.
-
-        Provided by SQLObject.
-        """
+        """Remove country from list of countries this language is spoken in."""
 
     visible = exported(
         Bool(
diff --git a/lib/lp/soyuz/model/distributionsourcepackagerelease.py b/lib/lp/soyuz/model/distributionsourcepackagerelease.py
index d6b3ffa..0d0de46 100644
--- a/lib/lp/soyuz/model/distributionsourcepackagerelease.py
+++ b/lib/lp/soyuz/model/distributionsourcepackagerelease.py
@@ -33,8 +33,8 @@ from lp.soyuz.model.publishing import (
 @implementer(IDistributionSourcePackageRelease)
 @delegate_to(ISourcePackageRelease, context="sourcepackagerelease")
 class DistributionSourcePackageRelease:
-    """This is a "Magic Distribution Source Package Release". It is not an
-    SQLObject, but it represents the concept of a specific source package
+    """This is a "Magic Distribution Source Package Release". It is not a
+    Storm model, but it represents the concept of a specific source package
     release in the distribution. You can then query it for useful
     information.
     """
diff --git a/lib/lp/soyuz/scripts/gina/README b/lib/lp/soyuz/scripts/gina/README
index 1208e80..7f84725 100644
--- a/lib/lp/soyuz/scripts/gina/README
+++ b/lib/lp/soyuz/scripts/gina/README
@@ -28,7 +28,7 @@ Using the Gina output:
     -> Tons of packages (13k binaries and 7k sources)*
     -> Person-related information (name, multiple mails, gpgkey, etc)
     
-    * the current implementation of Soyuz/SQLObject is quite slow to 
+    * the current implementation of Soyuz/Storm is quite slow to
       fetch all information from DB, so don't forget to use "renice" 
       to reduce the postgres and the zope priority if your machine is
       `normal' (non-dual-Xeon), otherwise it will CRASH (I'm serious).
diff --git a/lib/lp/testing/__init__.py b/lib/lp/testing/__init__.py
index 32256e1..9f9ccdc 100644
--- a/lib/lp/testing/__init__.py
+++ b/lib/lp/testing/__init__.py
@@ -579,7 +579,7 @@ class TestCase(testtools.TestCase, fixtures.TestWithFixtures):
         to another date value. Trickery is required because SQLBuilder truth
         semantics cause UTC_NOW to appear equal to all dates.
 
-        :param sql_object: a security-proxied SQLObject instance.
+        :param sql_object: a security-proxied Storm instance.
         :param attribute_name: the name of a database column in the table
             associated to this object.
         :param date: `datetime.datetime` object or `UTC_NOW`.
diff --git a/lib/lp/translations/doc/rosetta-karma.rst b/lib/lp/translations/doc/rosetta-karma.rst
index 9ae8415..48e08d9 100644
--- a/lib/lp/translations/doc/rosetta-karma.rst
+++ b/lib/lp/translations/doc/rosetta-karma.rst
@@ -3,8 +3,8 @@ Rosetta gives Karma to the users that do some kind of actions.
 This test documents when and why Rosetta does it.
 
 Note, that once we commit the transaction, we need to fetch again any
-SQLObject we need to use to be sure we have the right information. Seems
-like SQLObjects are not persistent between transactions.
+Storm instance we need to use to be sure we have the right information. Seems
+like Storm instances are not persistent between transactions.
 
     >>> import transaction
     >>> from lp.app.interfaces.launchpad import ILaunchpadCelebrities
diff --git a/lib/lp/translations/doc/translationmessage-destroy.rst b/lib/lp/translations/doc/translationmessage-destroy.rst
index 6c79ec3..05cf0ef 100644
--- a/lib/lp/translations/doc/translationmessage-destroy.rst
+++ b/lib/lp/translations/doc/translationmessage-destroy.rst
@@ -4,8 +4,7 @@ destroySelf
 (Note: this test runs as rosettaadmin to obtain the necessary
 privileges)
 
-With this method, we allow to remove a submission, it comes from SQLObject,
-but we test it here to be sure it appears in our public interface.
+With this method, we allow removing a submission.
 
 We will need extra permissions to use this method.
 
diff --git a/lib/lp/translations/model/distroserieslanguage.py b/lib/lp/translations/model/distroserieslanguage.py
index d147f4b..c2385f4 100644
--- a/lib/lp/translations/model/distroserieslanguage.py
+++ b/lib/lp/translations/model/distroserieslanguage.py
@@ -36,7 +36,7 @@ from lp.translations.utilities.rosettastats import RosettaStats
 class DistroSeriesLanguage(StormBase, RosettaStats):
     """See `IDistroSeriesLanguage`.
 
-    A SQLObject based implementation of IDistroSeriesLanguage.
+    A Storm implementation of IDistroSeriesLanguage.
     """
 
     __storm_table__ = "DistroSeriesLanguage"
diff --git a/lib/lp/translations/model/pofile.py b/lib/lp/translations/model/pofile.py
index 96196ca..9548b3e 100644
--- a/lib/lp/translations/model/pofile.py
+++ b/lib/lp/translations/model/pofile.py
@@ -1,7 +1,7 @@
 # Copyright 2009-2020 Canonical Ltd.  This software is licensed under the
 # GNU Affero General Public License version 3 (see the file LICENSE).
 
-"""`SQLObject` implementation of `IPOFile` interface."""
+"""Storm implementation of `IPOFile` interface."""
 
 __all__ = [
     "PlaceholderPOFile",
diff --git a/lib/lp/translations/model/potemplate.py b/lib/lp/translations/model/potemplate.py
index 87e79d5..8487230 100644
--- a/lib/lp/translations/model/potemplate.py
+++ b/lib/lp/translations/model/potemplate.py
@@ -1,7 +1,7 @@
 # Copyright 2009-2011 Canonical Ltd.  This software is licensed under the
 # GNU Affero General Public License version 3 (see the file LICENSE).
 
-"""`SQLObject` implementation of `IPOTemplate` interface."""
+"""Storm implementation of `IPOTemplate` interface."""
 
 __all__ = [
     "get_pofiles_for",
diff --git a/utilities/snakefood/Makefile b/utilities/snakefood/Makefile
index 06d92cc..7984534 100644
--- a/utilities/snakefood/Makefile
+++ b/utilities/snakefood/Makefile
@@ -4,11 +4,11 @@ default: lp-clustered.svg
 
 # Generate import dependency graph
 lp.sfood:
-	sfood -i -u -I $(LIB_DIR)/sqlobject -I $(LIB_DIR)/schoolbell \
+	sfood -i -u -I $(LIB_DIR)/schoolbell \
 	-I $(LIB_DIR)/contrib \
 	-I $(LIB_DIR)/canonical/not-used $(LIB_DIR)/canonical \
 	$(LIB_DIR)/lp 2>/dev/null | grep -v contrib/ \
-	| grep -v sqlobject | egrep -v 'BeautifulSoup|bs4' | grep -v psycopg \
+	| egrep -v 'BeautifulSoup|bs4' | grep -v psycopg \
 	| grep -v schoolbell | grep -v '/tests/' | grep -v '/ftests/' \
     | grep -v 'lp/services/config' > lp.sfood.tmp
 	mv lp.sfood.tmp lp.sfood