[python3] Don't explicitly inherit from object

Inheriting from object is implicit in Python 3.

Change-Id: I003daf95a7ed916843eb9e970e7b182c0ec08937
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/recipes-py/+/5416536
Commit-Queue: Chan Li <chanli@chromium.org>
Reviewed-by: Chan Li <chanli@chromium.org>
Auto-Submit: Rob Mohr <mohrr@google.com>
diff --git a/recipe_engine/config.py b/recipe_engine/config.py
index 33b9c22..6e9f883 100644
--- a/recipe_engine/config.py
+++ b/recipe_engine/config.py
@@ -86,7 +86,7 @@
   if not isinstance(obj, typearg):
     raise TypeError("Expected %r to be of type %r" % (obj, typearg))
 
-class ConfigContext(object):
+class ConfigContext:
   """A configuration context for a recipe module.
 
   Holds configuration schema and also acts as a config_ctx decorator.
@@ -279,12 +279,12 @@
   return ConfigContext(CONFIG_SCHEMA)
 
 
-class AutoHide(object):
+class AutoHide:
   pass
 AutoHide = AutoHide()
 
 
-class ConfigBase(object):
+class ConfigBase:
   """This is the root interface for all config schema types."""
 
   def __init__(self, hidden=AutoHide):
@@ -364,7 +364,7 @@
   return sorted(set(ret))
 
 
-class ConfigSchemaBase(object):
+class ConfigSchemaBase:
   """
   A ConfigSchema is an immutable object whose only purpose is to define a
   particular schema which can be re-used many times with no re-use issues.
diff --git a/recipe_engine/engine_types.py b/recipe_engine/engine_types.py
index 62fc5e9..615dfa9 100644
--- a/recipe_engine/engine_types.py
+++ b/recipe_engine/engine_types.py
@@ -224,7 +224,7 @@
     return self[key]  # __setitem__ can replace a list with a _StringSequence.
 
 
-class StepPresentation(object):
+class StepPresentation:
   """StepPresentation allows recipes to alter the presentation of their recipe
   step in both the Buildbucket Build message, as well as it's visual
   presentation on e.g. ci.chromium.org (i.e. 'milo' UI service).
@@ -544,7 +544,7 @@
 
 
 @attr.s(frozen=True)
-class ResourceCost(object):
+class ResourceCost:
   """A structure defining the resources that a given step may need.
 
   For use with `api.step`; attaching a ResourceCost to a step will allow the
diff --git a/recipe_engine/internal/autoroll_impl/candidate_algorithm.py b/recipe_engine/internal/autoroll_impl/candidate_algorithm.py
index 45cb147..1baac1d 100644
--- a/recipe_engine/internal/autoroll_impl/candidate_algorithm.py
+++ b/recipe_engine/internal/autoroll_impl/candidate_algorithm.py
@@ -76,7 +76,7 @@
   return cached
 
 
-class _ConfigFinder(object):
+class _ConfigFinder:
 
   def __init__(self, commit_lists_by_repo, new_repo_commit_list_getter):
     self._commit_lists_by_repo = commit_lists_by_repo
diff --git a/recipe_engine/internal/autoroll_impl/commit_list.py b/recipe_engine/internal/autoroll_impl/commit_list.py
index 3fc125d..fcadcd9 100644
--- a/recipe_engine/internal/autoroll_impl/commit_list.py
+++ b/recipe_engine/internal/autoroll_impl/commit_list.py
@@ -17,7 +17,7 @@
   pass
 
 
-class CommitList(object):
+class CommitList:
   """A seekable list of CommitMetadata objects for a single repo.
 
   This can also be used to obtain the list of commits 'rolled so far' for the
@@ -82,7 +82,7 @@
          git_backend.updates(dep.branch, dep.revision)),
     )
 
-  class _Cursor(object):
+  class _Cursor:
 
     def __init__(self, commit_list):
       self._commit_list = commit_list
diff --git a/recipe_engine/internal/autoroll_impl/roll_candidate.py b/recipe_engine/internal/autoroll_impl/roll_candidate.py
index 8226254..9b0341c 100644
--- a/recipe_engine/internal/autoroll_impl/roll_candidate.py
+++ b/recipe_engine/internal/autoroll_impl/roll_candidate.py
@@ -20,7 +20,7 @@
 _AUTOROLLER_PREFIX = 'Roll recipe dependencies'
 
 
-class RollCandidate(object):
+class RollCandidate:
   """RollCandidate holds a single, consistent recipes_cfg_pb2.RepoSpec
   representing a potential autoroll candidate.
   """
diff --git a/recipe_engine/internal/commands/doc/cmd.py b/recipe_engine/internal/commands/doc/cmd.py
index da6e81f..856ceb1 100644
--- a/recipe_engine/internal/commands/doc/cmd.py
+++ b/recipe_engine/internal/commands/doc/cmd.py
@@ -142,7 +142,7 @@
   for mi in mock_imports:
     combined_imports.update(mi)
 
-  class expando(object):
+  class expando:
     pass
 
   # expand combined_imports so it supports trivial lookups.
diff --git a/recipe_engine/internal/commands/doc/doc_markdown.py b/recipe_engine/internal/commands/doc/doc_markdown.py
index af318a9..8e4a8eb 100644
--- a/recipe_engine/internal/commands/doc/doc_markdown.py
+++ b/recipe_engine/internal/commands/doc/doc_markdown.py
@@ -18,7 +18,7 @@
   return GITILES
 
 
-class Printer(object):
+class Printer:
   def __init__(self, outf):
     self._outf = outf
     self._url = None
diff --git a/recipe_engine/internal/commands/test/fail_tracker.py b/recipe_engine/internal/commands/test/fail_tracker.py
index bab9ad9..68dfcb0 100644
--- a/recipe_engine/internal/commands/test/fail_tracker.py
+++ b/recipe_engine/internal/commands/test/fail_tracker.py
@@ -7,7 +7,7 @@
 
 import attr
 
-class ClosedFailFile(object):
+class ClosedFailFile:
   """Sentinel class that replaced the fail file after it's been closed."""
   pass
 
@@ -16,7 +16,7 @@
   pass
 
 @attr.s
-class FailTracker(object):
+class FailTracker:
   """Tracks which tests have failed since the last run.
 
   Saves the failures to a file, and loads them into an instance variable to run
diff --git a/recipe_engine/internal/commands/test/report.py b/recipe_engine/internal/commands/test/report.py
index f7e7eac..d6b1dfd 100644
--- a/recipe_engine/internal/commands/test/report.py
+++ b/recipe_engine/internal/commands/test/report.py
@@ -23,7 +23,7 @@
 
 
 @attr.s
-class Reporter(object):
+class Reporter:
   _recipe_deps = attr.ib()
 
   _use_emoji = attr.ib()
@@ -318,7 +318,7 @@
 
 
 @attr.s
-class PerWarningResult(object):
+class PerWarningResult:
   call_sites = attr.ib(factory=set)
   import_sites = attr.ib(factory=set)
 
diff --git a/recipe_engine/internal/commands/test/runner.py b/recipe_engine/internal/commands/test/runner.py
index 06a6481..31bc460 100644
--- a/recipe_engine/internal/commands/test/runner.py
+++ b/recipe_engine/internal/commands/test/runner.py
@@ -567,7 +567,7 @@
 
 
 @attr.s(frozen=True)
-class DescriptionWithCallback(object):
+class DescriptionWithCallback:
 
   description = attr.ib()
   callback = attr.ib()
diff --git a/recipe_engine/internal/engine.py b/recipe_engine/internal/engine.py
index 6710193..71e5563 100644
--- a/recipe_engine/internal/engine.py
+++ b/recipe_engine/internal/engine.py
@@ -51,7 +51,7 @@
 
 
 @attr.s(frozen=True, slots=True, repr=False)
-class _ActiveStep(object):
+class _ActiveStep:
   """The object type that we keep in RecipeEngine._step_stack."""
   step_data = attr.ib()    # type: StepData
   step_stream = attr.ib()  # type: StepStream
@@ -69,7 +69,7 @@
       self.step_data.presentation.finalize(self.step_stream)
       self.step_stream.close()
 
-class _MemoryProfiler(object):
+class _MemoryProfiler:
   """The memory profiler used in recipe engine that is backed by Pympler.
 
   Note: This class is currently not thread safe. The snapshot operation is not
@@ -129,7 +129,7 @@
     return [str(exception)]
 
 
-class RecipeEngine(object):
+class RecipeEngine:
   """
   Knows how to execute steps emitted by a recipe, holds global state such as
   step history and build properties. Each recipe module API has a reference to
diff --git a/recipe_engine/internal/engine_env.py b/recipe_engine/internal/engine_env.py
index 721c367..eb6d941 100644
--- a/recipe_engine/internal/engine_env.py
+++ b/recipe_engine/internal/engine_env.py
@@ -6,7 +6,7 @@
 from collections import defaultdict
 
 
-class FakeEnviron(object):
+class FakeEnviron:
   """This is a fake dictionary which is meant to emulate os.environ strictly for
   the purposes of interacting with merge_envs.
 
diff --git a/recipe_engine/internal/engine_step.py b/recipe_engine/internal/engine_step.py
index 06263a3..b1f2331 100644
--- a/recipe_engine/internal/engine_step.py
+++ b/recipe_engine/internal/engine_step.py
@@ -25,7 +25,7 @@
 
 
 @attr.s(frozen=True)
-class EnvAffix(object):
+class EnvAffix:
   """Expresses a mapping of environment keys to a list of paths.
 
   This is used as StepConfig's "env_prefixes" and "env_suffixes" value.
@@ -53,7 +53,7 @@
 
 
 @attr.s
-class StepConfig(object):
+class StepConfig:
   """StepConfig is the representation of a raw step as the recipe_engine sees
   it.  You should use the standard 'step' recipe module, which will construct
   and pass this data to the engine for you, instead. The only reason why you
diff --git a/recipe_engine/internal/fetch.py b/recipe_engine/internal/fetch.py
index 0e9c319..5306feb 100644
--- a/recipe_engine/internal/fetch.py
+++ b/recipe_engine/internal/fetch.py
@@ -33,7 +33,7 @@
   'revision author_email commit_timestamp message_lines spec roll_candidate')
 
 
-class Backend(object):
+class Backend:
   def __init__(self, checkout_dir, repo_url):
     """
     Args:
diff --git a/recipe_engine/internal/gitattr_checker.py b/recipe_engine/internal/gitattr_checker.py
index f0427d5..b90a227 100644
--- a/recipe_engine/internal/gitattr_checker.py
+++ b/recipe_engine/internal/gitattr_checker.py
@@ -112,7 +112,7 @@
   return _pattern2re(pattern), has_recipes
 
 
-class AttrChecker(object):
+class AttrChecker:
   def __init__(self, repo, shortcircuit=True):
     self._repo = repo
     # Shortcircuit means we only care about whether any of the files we check
diff --git a/recipe_engine/internal/proto_support.py b/recipe_engine/internal/proto_support.py
index 8e21951..7956e3b 100644
--- a/recipe_engine/internal/proto_support.py
+++ b/recipe_engine/internal/proto_support.py
@@ -43,7 +43,7 @@
 
 
 @attr.s(frozen=True)
-class _ProtoInfo(object):
+class _ProtoInfo:
   """_ProtoInfo holds information about the proto files found in a recipe repo.
   """
   # Native-slash-delimited path to the source file
@@ -248,7 +248,7 @@
 
 
 @attr.s
-class _DirMaker(object):
+class _DirMaker:
   """Helper class to make directories on disk, handling errors for directories
   which exist and only making a given directory once."""
   made_dirs = attr.ib(factory=set)
diff --git a/recipe_engine/internal/recipe_deps.py b/recipe_engine/internal/recipe_deps.py
index 8b6a84f..bdcaba5 100644
--- a/recipe_engine/internal/recipe_deps.py
+++ b/recipe_engine/internal/recipe_deps.py
@@ -79,7 +79,7 @@
 
 
 @attr.s(frozen=True)
-class RecipeDeps(object):
+class RecipeDeps:
   """Holds all of the dependency repos for the current recipe execution.
 
   If no '-O' override options were passed on the command line, you'll see a 1:1
@@ -248,7 +248,7 @@
 
 
 @attr.s(frozen=True)
-class RecipeRepo(object):
+class RecipeRepo:
   """This represents a 'recipe repo', i.e. a folder on disk which contains all
   of the requirements of a recipe repo:
     * an infra/config/recipes.cfg file
@@ -471,7 +471,7 @@
 
 
 @attr.s(frozen=True)
-class RecipeModule(object):
+class RecipeModule:
   repo = attr.ib(validator=attr_type(RecipeRepo))  # type: RecipeRepo
   name = attr.ib(validator=attr_type(str))
 
@@ -737,7 +737,7 @@
 
 
 @attr.s(frozen=True)
-class Recipe(object):
+class Recipe:
   # The repo in which this recipe is located.
   repo = attr.ib(validator=attr_type(RecipeRepo)) # type: RecipeRepo
 
@@ -1243,7 +1243,7 @@
     assert isinstance(test_data, BaseTestData)
 
   @attr.s(frozen=True)
-  class cache_entry(object):
+  class cache_entry:
     api = attr.ib(validator=optional(attr_superclass(RecipeApi)))
     test_api = attr.ib(validator=attr_superclass(RecipeTestApi))
 
diff --git a/recipe_engine/internal/recipe_module_importer.py b/recipe_engine/internal/recipe_module_importer.py
index d95f597..88fa64b 100644
--- a/recipe_engine/internal/recipe_module_importer.py
+++ b/recipe_engine/internal/recipe_module_importer.py
@@ -39,7 +39,7 @@
 import sys
 
 
-class RecipeModuleImporter(object):
+class RecipeModuleImporter:
   """This implements both the `find_module` and `load_module` halves of the
   import hook protocol.
 
diff --git a/recipe_engine/internal/resource_semaphore.py b/recipe_engine/internal/resource_semaphore.py
index 598775f..bd135ff 100644
--- a/recipe_engine/internal/resource_semaphore.py
+++ b/recipe_engine/internal/resource_semaphore.py
@@ -12,7 +12,7 @@
 
 
 @attr.s
-class ResourceWaiter(object):
+class ResourceWaiter:
   """Represents the machine's CPU, memory, disk and network as limited
   resources.
 
diff --git a/recipe_engine/internal/simple_cfg.py b/recipe_engine/internal/simple_cfg.py
index c37cade..caeab5f 100644
--- a/recipe_engine/internal/simple_cfg.py
+++ b/recipe_engine/internal/simple_cfg.py
@@ -51,7 +51,7 @@
 
 
 @attr.s(frozen=True)
-class SimpleDep(object):
+class SimpleDep:
   """Represents a single dependency (url, branch, revision).
 
   Equivalent to the recipes_cfg_pb2.DepSpec message.
@@ -69,7 +69,7 @@
 
 
 @attr.s(frozen=True)
-class SimpleRecipesCfg(object):
+class SimpleRecipesCfg:
   """Represents a `recipes.cfg` file.
 
   A subset of the recipes_cfg_pb2.RepoSpec message, just enough to load the
diff --git a/recipe_engine/internal/step_runner/__init__.py b/recipe_engine/internal/step_runner/__init__.py
index a7e1bcd..2137124 100644
--- a/recipe_engine/internal/step_runner/__init__.py
+++ b/recipe_engine/internal/step_runner/__init__.py
@@ -14,7 +14,7 @@
 
 
 @attr.s(frozen=True)
-class Step(object):
+class Step:
   """Step is the full definition of a step to run for a StepRunner."""
   # The full command line as a list of strings. cmd0 will be an absolute path to
   # an executable.
@@ -41,7 +41,7 @@
   luci_context = attr.ib(validator=attr_dict_type(str, Message))
 
 
-class StepRunner(object):
+class StepRunner:
   """A StepRunner is the interface to actually run steps and resolve
   placeholders.
 
diff --git a/recipe_engine/internal/stream/__init__.py b/recipe_engine/internal/stream/__init__.py
index 2aa2ca9..842d579 100644
--- a/recipe_engine/internal/stream/__init__.py
+++ b/recipe_engine/internal/stream/__init__.py
@@ -25,8 +25,8 @@
 from ..engine_step import StepConfig
 
 
-class StreamEngine(object):
-  class Stream(object):
+class StreamEngine:
+  class Stream:
     def write_line(self, line):
       raise NotImplementedError()
 
diff --git a/recipe_engine/internal/stream/luci.py b/recipe_engine/internal/stream/luci.py
index 3fdd4f3..3d64db3 100644
--- a/recipe_engine/internal/stream/luci.py
+++ b/recipe_engine/internal/stream/luci.py
@@ -31,7 +31,7 @@
 
 
 @attr.s
-class LUCIStepMarkdownWriter(object):
+class LUCIStepMarkdownWriter:
   _step_text = attr.ib(default='')
   def add_step_text(self, text):
     self._step_text += text
diff --git a/recipe_engine/internal/test/execute_test_case.py b/recipe_engine/internal/test/execute_test_case.py
index 032c2ce..6535684 100644
--- a/recipe_engine/internal/test/execute_test_case.py
+++ b/recipe_engine/internal/test/execute_test_case.py
@@ -9,7 +9,7 @@
 from ..attr_util import attr_type, attr_dict_type
 
 @attr.s(frozen=True, slots=True)
-class TestCaseResult(object):
+class TestCaseResult:
   # Raw Result of recipe.
   raw_result = attr.ib()  # type: result_pb2.RawResult
   # The log of each step that would have been run.
diff --git a/recipe_engine/internal/test/magic_check_fn.py b/recipe_engine/internal/test/magic_check_fn.py
index a61fc3f..18fecb4 100644
--- a/recipe_engine/internal/test/magic_check_fn.py
+++ b/recipe_engine/internal/test/magic_check_fn.py
@@ -417,7 +417,7 @@
 MISSING = object()
 
 
-class Checker(object):
+class Checker:
   def __init__(self, hook_context, *ignores):
     self.failed_checks = []
 
diff --git a/recipe_engine/internal/warn/cause.py b/recipe_engine/internal/warn/cause.py
index 4d9f6db..0547e8f 100644
--- a/recipe_engine/internal/warn/cause.py
+++ b/recipe_engine/internal/warn/cause.py
@@ -22,7 +22,7 @@
 from ...engine_types import freeze
 
 @attr.s(frozen=True)
-class Frame(object):
+class Frame:
   """Equivalent to warning_pb.Frame."""
   # Absolute file path that contains the code object frame is executing.
   file = attr.ib(
@@ -57,7 +57,7 @@
     )
 
 @attr.s(frozen=True)
-class CallSite(object):
+class CallSite:
   """Equivalent to warning_pb.CallSite."""
   # The frame of the call site. The frame will have empty value for all its
   # attributes if call site can't be attributed.
@@ -89,7 +89,7 @@
 
 
 @attr.s(frozen=True)
-class ImportSite(object):
+class ImportSite:
   """Equivalent to warning_pb.ImportSite"""
   # Name of the repo that recipe or recipe module is in
   repo = attr.ib(validator=attr_type(str))
diff --git a/recipe_engine/internal/warn/escape.py b/recipe_engine/internal/warn/escape.py
index bbfb259..74995e6 100644
--- a/recipe_engine/internal/warn/escape.py
+++ b/recipe_engine/internal/warn/escape.py
@@ -23,7 +23,7 @@
 from ..attr_util import attr_type
 
 @attr.s(frozen=True, slots=True)
-class FuncLoc(object):
+class FuncLoc:
   """An immutable class that describes the location of a function."""
   # Absolute path to the file containing this function's source
   file_path = attr.ib(validator=attr_type(str), converter=os.path.abspath)
diff --git a/recipe_engine/internal/warn/record.py b/recipe_engine/internal/warn/record.py
index 24bae06..35e263c 100644
--- a/recipe_engine/internal/warn/record.py
+++ b/recipe_engine/internal/warn/record.py
@@ -32,7 +32,7 @@
 
 
 @attr.s(frozen=True, slots=True)
-class _AnnotatedFrame(object):
+class _AnnotatedFrame:
   """A wrapper class over built-in frame which associates additional attributes
   with the wrapped frame.
   """
@@ -46,7 +46,7 @@
   skip_reason = attr.ib(validator=attr.validators.optional(attr_type(str)))
 
 @attr.s
-class WarningRecorder(object):
+class WarningRecorder:
   """A WarningRecorder records and analyzes warnings, preserves all unique
   causes for a given warning.
 
diff --git a/recipe_engine/post_process.py b/recipe_engine/post_process.py
index 14c035a..e4be845 100644
--- a/recipe_engine/post_process.py
+++ b/recipe_engine/post_process.py
@@ -16,7 +16,7 @@
 _filterRegexEntry = namedtuple('_filterRegexEntry', 'at_most at_least fields')
 
 
-class Filter(object):
+class Filter:
   """Filter is an implementation of a post_process callable which can remove
   unwanted data from a step OrderedDict."""
 
diff --git a/recipe_engine/post_process_inputs.py b/recipe_engine/post_process_inputs.py
index bed51a4..86cd983 100644
--- a/recipe_engine/post_process_inputs.py
+++ b/recipe_engine/post_process_inputs.py
@@ -142,7 +142,7 @@
 
 
 @attr.s
-class Step(object):
+class Step:
   """The representation of a step provided to post-process hooks.
 
   A `Step` has fields for all of the details of a step that would be recorded
diff --git a/recipe_engine/recipe_api.py b/recipe_engine/recipe_api.py
index b333afd..fc0bfaf 100644
--- a/recipe_engine/recipe_api.py
+++ b/recipe_engine/recipe_api.py
@@ -45,7 +45,7 @@
 from recipe_engine import recipe_test_api  # pylint: disable=unused-import
 
 
-class UnknownRequirementError(object):
+class UnknownRequirementError:
   """Raised by a requirement function when the referenced requirement is
   unknown.
   """
@@ -57,7 +57,7 @@
     self.name = req._name
 
 
-class UnresolvedRequirement(object):
+class UnresolvedRequirement:
   """Internal placeholder type for an unresolved module/recipe requirement."""
 
   def __init__(self, typ, name):
@@ -109,7 +109,7 @@
 
 
 @attr.s(frozen=True, slots=True)
-class LUCIContextClient(object):
+class LUCIContextClient:
   """A recipe engine client which reads/writes the LUCI_CONTEXT."""
   IDENT = 'lucictx'
   ENV_KEY = luci_context.ENV_KEY
@@ -118,7 +118,7 @@
                             factory=dict, converter=freeze)
 
 
-class PathsClient(object):
+class PathsClient:
   """A recipe engine client which exposes all known base paths.
 
   In particular, you can use this client to discover all known:
@@ -198,7 +198,7 @@
     return self._start_dir
 
 
-class PropertiesClient(object):
+class PropertiesClient:
   """A recipe engine client representing the recipe engine properties."""
 
   IDENT = 'properties'
@@ -210,7 +210,7 @@
     return copy.deepcopy(self._properties)
 
 
-class StepClient(object):
+class StepClient:
   """A recipe engine client representing step running and introspection."""
 
   IDENT = 'step'
@@ -268,7 +268,7 @@
 
 
 @attr.s(frozen=True, slots=True)
-class ConcurrencyClient(object):
+class ConcurrencyClient:
   IDENT = 'concurrency'
 
   supports_concurrency: bool = attr.ib()
@@ -278,7 +278,7 @@
     return self._spawn_impl(func, args, kwargs, greenlet_name)
 
 
-class WarningClient(object):
+class WarningClient:
   IDENT = 'warning'
 
   def __init__(self, recorder, recipe_deps: 'recipe_deps.RecipeDeps'):
@@ -467,7 +467,7 @@
     return "Infra Failure: Step({!r})".format(self.name)
 
 
-class RecipeApi(object):
+class RecipeApi:
   """
   Framework class for handling recipe_modules.
 
@@ -667,7 +667,7 @@
 # specify a default of None that will actually be respected.
 PROPERTY_SENTINEL = object()
 
-class BoundProperty(object):
+class BoundProperty:
   """
   A bound, named version of a Property.
 
@@ -851,7 +851,7 @@
       "No default specified and no value provided for '{}' from {} '{}'".format(
         self.name, self.__property_type, self.full_decl_name))
 
-class Property(object):
+class Property:
   def __init__(self, default=PROPERTY_SENTINEL, from_environ=None, help="",
                kind=None, param_name=None):
     """
diff --git a/recipe_engine/recipe_test_api.py b/recipe_engine/recipe_test_api.py
index 70c9310..1c90e8b 100644
--- a/recipe_engine/recipe_test_api.py
+++ b/recipe_engine/recipe_test_api.py
@@ -41,7 +41,7 @@
       dest_dict[k] = v
 
 
-class BaseTestData(object):
+class BaseTestData:
   def __init__(self, enabled=True):
     super(BaseTestData, self).__init__()
     self._enabled = enabled
@@ -458,7 +458,7 @@
   return inner
 
 
-class RecipeTestApi(object):
+class RecipeTestApi:
   """Provides testing interface for GenTest method.
 
   There are two primary components to the test api:
diff --git a/recipe_engine/step_data.py b/recipe_engine/step_data.py
index 523db4f..deec3e1 100644
--- a/recipe_engine/step_data.py
+++ b/recipe_engine/step_data.py
@@ -16,7 +16,7 @@
 
 
 @attr.s
-class _AttributeRaiser(object):
+class _AttributeRaiser:
   _step_name = attr.ib(validator=attr_type(basestring))
   _namespace = attr.ib(validator=attr_type(str))
   # `_finalized` doesn't use `attr.s` because of the shenanigans we do with
@@ -40,7 +40,7 @@
 
 
 @attr.s(frozen=True)
-class ExecutionResult(object):
+class ExecutionResult:
   # retcode is the integer returncode of the step, if the step ran and the
   # engine was able to wait() for it. Otherwise this is None.
   retcode = attr.ib(validator=attr_type((int, type(None))), default=None)
@@ -70,7 +70,7 @@
 
 
 @attr.s
-class StepData(object):
+class StepData:
   """StepData represents the result of running a step.
 
   For historical reasons, this object has dynamic properties depending on the
diff --git a/recipe_engine/third_party/logdog/stream.py b/recipe_engine/third_party/logdog/stream.py
index d526ef9..9f9eff1 100644
--- a/recipe_engine/third_party/logdog/stream.py
+++ b/recipe_engine/third_party/logdog/stream.py
@@ -94,7 +94,7 @@
     return json.dumps(obj, sort_keys=True, ensure_ascii=True, indent=None)
 
 
-class StreamProtocolRegistry(object):
+class StreamProtocolRegistry:
   """Registry of streamserver URI protocols and their client classes.
   """
 
@@ -138,11 +138,11 @@
 create = _default_registry.create
 
 
-class StreamClient(object):
+class StreamClient:
   """Abstract base class for a streamserver client.
   """
 
-  class _StreamBase(object):
+  class _StreamBase:
     """ABC for StreamClient streams."""
 
     def __init__(self, stream_client, params):
@@ -555,7 +555,7 @@
   """A StreamClient implementation that uses a UNIX domain socket.
   """
 
-  class SocketFile(object):
+  class SocketFile:
     """A write-only file-like object that writes to a UNIX socket."""
 
     def __init__(self, sock):
diff --git a/recipe_engine/util.py b/recipe_engine/util.py
index f8029d3..b9b5eea 100644
--- a/recipe_engine/util.py
+++ b/recipe_engine/util.py
@@ -47,7 +47,7 @@
   pass
 
 
-class ModuleInjectionSite(object):
+class ModuleInjectionSite:
   def __init__(self, owner_module=None):
     self.owner_module = owner_module
 
@@ -57,7 +57,7 @@
       % (module_name(self.owner_module), key))
 
 
-class Placeholder(object):
+class Placeholder:
   """Base class for command line argument placeholders. Do not use directly."""
   def __init__(self, name=None):
     if name is not None:
@@ -174,7 +174,7 @@
   else:
     raise ValueError('Expected either a function or string; got %r' % func)
 
-class StringListIO(object):
+class StringListIO:
   def __init__(self):
     self.lines = [StringIO()]
 
@@ -194,7 +194,7 @@
       self.lines[-1] = self.lines[-1].getvalue()
 
 
-class exponential_retry(object):
+class exponential_retry:
   """Decorator which retries the function if an exception is encountered.
 
   THIS FUNCTION IS DEPRECATED.Use the 'time' recipe module's version of this
diff --git a/recipe_modules/archive/api.py b/recipe_modules/archive/api.py
index e8227f3..cff331a 100644
--- a/recipe_modules/archive/api.py
+++ b/recipe_modules/archive/api.py
@@ -166,7 +166,7 @@
     self.m.path.mock_add_paths(output)
 
 
-class Package(object):
+class Package:
   """Used to gather a list of files to archive.
 
   Construct this with api.archive.package().
diff --git a/recipe_modules/cipd/api.py b/recipe_modules/cipd/api.py
index 8e8fa02..d594c07 100644
--- a/recipe_modules/cipd/api.py
+++ b/recipe_modules/cipd/api.py
@@ -26,7 +26,7 @@
 InstallMode = Literal['copy', 'symlink']
 
 
-class PackageDefinition(object):
+class PackageDefinition:
   DIR = namedtuple('DIR', ['path', 'exclusions'])
 
   def __init__(self,
@@ -162,7 +162,7 @@
     return output
 
 
-class EnsureFile(object):
+class EnsureFile:
   Package = namedtuple('Package', ['name', 'version'])
 
   def __init__(self):
@@ -190,7 +190,7 @@
     return '\n'.join(package_list)
 
 
-class Metadata(object):
+class Metadata:
   def __init__(self, key, value=None, value_from_file=None, content_type=None):
     """Constructs a metadata entry to attach to a package instance.
 
diff --git a/recipe_modules/file/api.py b/recipe_modules/file/api.py
index bcc98f9..6e6173e 100644
--- a/recipe_modules/file/api.py
+++ b/recipe_modules/file/api.py
@@ -12,7 +12,7 @@
 import os
 
 
-class SymlinkTree(object):
+class SymlinkTree:
   """A representation of a tree of symlinks."""
 
   def __init__(self, root, api, symlink_resource):
diff --git a/recipe_modules/futures/api.py b/recipe_modules/futures/api.py
index fa7aaed..605a245 100644
--- a/recipe_modules/futures/api.py
+++ b/recipe_modules/futures/api.py
@@ -15,7 +15,7 @@
 from recipe_engine.recipe_api import escape_all_warnings
 
 
-class _IWaitWrapper(object):
+class _IWaitWrapper:
   __slots__ = ('_waiter', '_greenlets_to_futures')
 
   def __init__(self, futures, timeout, count):
@@ -52,7 +52,7 @@
     """Raised from Future if the requested operation is not done in time."""
 
   @attr.s(frozen=True, slots=True)
-  class Future(object):
+  class Future:
     """Represents a unit of concurrent work.
 
     Modeled after Python 3's `concurrent.futures.Future`. We can expand this
diff --git a/recipe_modules/led/api.py b/recipe_modules/led/api.py
index 973a1ec..3bc73b8 100644
--- a/recipe_modules/led/api.py
+++ b/recipe_modules/led/api.py
@@ -32,7 +32,7 @@
   """
 
   @attr.s(frozen=True, slots=True)
-  class LedLaunchData(object):
+  class LedLaunchData:
     swarming_hostname = attr.ib()
     task_id = attr.ib()
     buildbucket_hostname = attr.ib()
@@ -53,7 +53,7 @@
         milo_host = "luci-milo-dev.appspot.com"
       return 'https://%s/b/%s' % (milo_host, self.build_id)
 
-  class LedResult(object):
+  class LedResult:
     """Holds the result of a led operation. Can be chained using |then|."""
 
     def __init__(self, result, module, led_build):
diff --git a/recipe_modules/led/test_api.py b/recipe_modules/led/test_api.py
index 631bbfc..bae5406 100644
--- a/recipe_modules/led/test_api.py
+++ b/recipe_modules/led/test_api.py
@@ -151,7 +151,7 @@
   StopApplyingMocks = object()
 
   @attr.s
-  class _MockEditData(object):
+  class _MockEditData:
     # Callable[
     #   [job.Definition, List[string], string],
     #   Union[None, StopApplyingMocks]
diff --git a/recipe_modules/resultdb/common.py b/recipe_modules/resultdb/common.py
index 61aa656..eaad8b3 100644
--- a/recipe_modules/resultdb/common.py
+++ b/recipe_modules/resultdb/common.py
@@ -11,7 +11,7 @@
 from PB.go.chromium.org.luci.resultdb.proto.v1 import test_result as test_result_pb2
 
 
-class Invocation(object):
+class Invocation:
   """A ResultDB invocation with contents.
 
   Reference: go/resultdb-concepts.
diff --git a/recipe_modules/scheduler/api.py b/recipe_modules/scheduler/api.py
index f7e8c7d..be98cc8 100644
--- a/recipe_modules/scheduler/api.py
+++ b/recipe_modules/scheduler/api.py
@@ -77,7 +77,7 @@
     """
     return int(self._invocation_id) if self._invocation_id else None
 
-  class Trigger(object):
+  class Trigger:
     """Generic Trigger accepted by LUCI Scheduler API.
 
     Don't instantiate Trigger itself. Use either BuildbucketTrigger or
diff --git a/recipe_modules/service_account/api.py b/recipe_modules/service_account/api.py
index 9413a7c..06759d4 100644
--- a/recipe_modules/service_account/api.py
+++ b/recipe_modules/service_account/api.py
@@ -15,7 +15,7 @@
 
 class ServiceAccountApi(recipe_api.RecipeApi):
 
-  class ServiceAccount(object):
+  class ServiceAccount:
     """Represents some service account available to the recipe.
 
     Grab an instance of this class via 'default()' or 'from_credentials_json()'.
diff --git a/recipe_modules/step/api.py b/recipe_modules/step/api.py
index 8212a83..5177cb0 100644
--- a/recipe_modules/step/api.py
+++ b/recipe_modules/step/api.py
@@ -211,7 +211,7 @@
   # To make migration smoother, we yield a hacky object which passes through
   # everything to the real presentation, except for `.presentation` which
   # returns the StepPresentation directly. Ick.
-  class _StepPresentationProxy(object):
+  class _StepPresentationProxy:
     def __init__(self, presentation):
       object.__setattr__(self, 'presentation', presentation)
 
diff --git a/recipe_modules/swarming/api.py b/recipe_modules/swarming/api.py
index 573c5df..224ede7 100644
--- a/recipe_modules/swarming/api.py
+++ b/recipe_modules/swarming/api.py
@@ -24,7 +24,7 @@
 LIST_BOTS_MANDATORY_FIELDS = 'items(bot_id,is_dead,quarantined,maintenance_msg)'
 
 
-class TaskRequest(object):
+class TaskRequest:
   """Describes a single Swarming request for a new task.
 
   A TaskRequest object is immutable and building it up follows the 'constructor'
@@ -326,7 +326,7 @@
     return ret
 
 
-  class TaskSlice(object):
+  class TaskSlice:
     """Describes a specification of a Swarming task slice.
 
     A TaskSlice object is immutable and building it up follows the 'constructor'
@@ -855,7 +855,7 @@
       }
 
 
-class TaskRequestMetadata(object):
+class TaskRequestMetadata:
   """Metadata of a requested task."""
 
   def __init__(self, swarming_server, task_json):
@@ -884,10 +884,10 @@
                                                       {}).get('invocation')
 
 
-class TaskResult(object):
+class TaskResult:
   """Result of a Swarming task."""
 
-  class CasOutputs(object):
+  class CasOutputs:
     """The cas outputs of a task."""
 
     def __init__(self, digest, instance):
@@ -1131,7 +1131,7 @@
       )
 
 
-class BotMetadata(object):
+class BotMetadata:
   """Metadata of a bot."""
 
   def __init__(self, swarming_server, bot_id, bot_json):
diff --git a/recipe_modules/time/api.py b/recipe_modules/time/api.py
index 8614ec9..2ebf51e 100644
--- a/recipe_modules/time/api.py
+++ b/recipe_modules/time/api.py
@@ -15,7 +15,7 @@
 from recipe_engine.internal.global_shutdown import GLOBAL_SHUTDOWN
 
 
-class exponential_retry(object):
+class exponential_retry:
   """Decorator which retries the function with exponential backoff.
 
   See TimeApi.exponential_retry for full documentation.
diff --git a/recipe_modules/tricium/legacy_analyzers.py b/recipe_modules/tricium/legacy_analyzers.py
index 75adeef..e59be69 100644
--- a/recipe_modules/tricium/legacy_analyzers.py
+++ b/recipe_modules/tricium/legacy_analyzers.py
@@ -10,7 +10,7 @@
 
 
 @attr.s(frozen=True)
-class LegacyAnalyzer(object):
+class LegacyAnalyzer:
   """LegacyAnalyzer is a specification for legacy "simple" Tricium analyzer.
 
   Legacy Tricium analyzers are executables packaged in CIPD packages.
@@ -44,7 +44,7 @@
   extra_args = attr.ib(validator=instance_of(list), default=[])
 
 
-class Analyzers(object):
+class Analyzers:
   """Specifications of common legacy analyzers.
 
   This is a namespace for common legacy analyzers that may be used across
diff --git a/recipe_modules/url/api.py b/recipe_modules/url/api.py
index 0dc59cc..f7239b1 100644
--- a/recipe_modules/url/api.py
+++ b/recipe_modules/url/api.py
@@ -34,7 +34,7 @@
   _PyCurlStatus = collections.namedtuple('_PyCurlStatus', (
       'status_code', 'success', 'size', 'error_body'))
 
-  class Response(object):
+  class Response:
     """Response is an HTTP response object."""
 
     def __init__(self, method, output, status, infra_step):
diff --git a/unittests/fake_recipe_deps.py b/unittests/fake_recipe_deps.py
index 802eeab..6e82cf6 100644
--- a/unittests/fake_recipe_deps.py
+++ b/unittests/fake_recipe_deps.py
@@ -57,7 +57,7 @@
 
 
 @attr.s
-class FakeRecipeRepo(object):
+class FakeRecipeRepo:
   """Manipulates a recipe repo on disk (as a git repository)."""
 
   # The FakeRecipeDeps which owns this repo.
@@ -182,7 +182,7 @@
     return os.path.isfile(os.path.join(self.path, path))
 
   @attr.s(slots=True)
-  class WriteableRecipe(object):
+  class WriteableRecipe:
     """Yielded from the `write_recipe` method. Used to generate a recipe on
     disk.
 
@@ -319,7 +319,7 @@
     self.recipes_py('doc')
 
   @attr.s(slots=True)
-  class WriteableModule(object):
+  class WriteableModule:
     """Yielded from the `write_module` method. Used to generate a recipe module
     on disk.
 
@@ -544,7 +544,7 @@
 
 
 @attr.s
-class FakeRecipeDeps(object):
+class FakeRecipeDeps:
   """FakeRecipeDeps is a heavyweight testing object which controls a collection
   of git repos on disk.
 
diff --git a/unittests/mock_recipe_deps.py b/unittests/mock_recipe_deps.py
index cfba981..ef09e08 100644
--- a/unittests/mock_recipe_deps.py
+++ b/unittests/mock_recipe_deps.py
@@ -25,7 +25,7 @@
 from recipe_engine.internal.recipe_deps import parse_deps_spec
 
 
-class MockRecipeDeps(object):
+class MockRecipeDeps:
   """A mock version of recipe_deps.RecipeDeps."""
 
   def __init__(self, modules_to_deps=None, recipes_to_deps=None):
@@ -67,7 +67,7 @@
         recipes_to_deps or {}
     )
 
-class MockRecipeRepo(object):
+class MockRecipeRepo:
   """A mock version of recipe_deps.RecipeRepo."""
 
   def __init__(self, rdeps, name, modules_to_deps, recipes_to_deps):
@@ -100,7 +100,7 @@
       for recipe_name, DEPS in recipes_to_deps.items()
     }
 
-class MockRecipeModule(object):
+class MockRecipeModule:
   """A mock version of recipe_deps.RecipeModule."""
 
   def __init__(self, repo, name, DEPS):
@@ -118,7 +118,7 @@
     # pylint: disable=invalid-name
     self.normalized_DEPS = parse_deps_spec(repo.name, DEPS)
 
-class MockRecipe(object):
+class MockRecipe:
   """A mock version of recipe_deps.Recipe."""
 
   def __init__(self, repo, name, DEPS):
diff --git a/unittests/test_test.py b/unittests/test_test.py
index 62e9027..ef4e457 100755
--- a/unittests/test_test.py
+++ b/unittests/test_test.py
@@ -29,7 +29,7 @@
 
 class Common(test_env.RecipeEngineUnitTest):
   @attr.s(frozen=True)
-  class JsonResult(object):
+  class JsonResult:
     text_output = attr.ib()
     data = attr.ib()