class_docstr: Abstract base class for subcommands
  
  Subclasses should implement an ``invoke(self, args)`` method that accepts
  a set of argparse processed arguments as input.
  
  Subclasses should also define the following class attributes:
  
  * ``name`` a name for this subcommand
  
  * ``help`` a help string for argparse to use for this subcommand
  
  * ``args`` the parameters to pass to ``parser.add_argument``
  
  The format of the ``args`` should be a sequence of tuples of the form:
  
  .. code-block:: python
  
      ('argname', Argument(
          metavar='ARGNAME',
          nargs='+',
      ))
  
  Example:
  
      A simple subcommand "foo" might look like this:
  
      .. code-block:: python
  
          class Foo(Subcommand):
  
              name = "foo"
              help = "performs the Foo action"
              args = (
                  ('--yell', Argument(
                      action='store_true',
                      help="Make it loud",
                  )),
              )
  
              def invoke(self, args):
                  if args.yell:
                      print("FOO!")
                  else:
                      print("foo")
  
      Then executing ``bokeh foo --yell`` would print ``FOO!`` at the console.
docstr: Initialize the subcommand with its parser
  
  Args:
      parser (Parser) : an Argparse ``Parser`` instance to configure
          with the args for this subcommand.
  
  This method will automatically add all the arguments described in
  ``self.args``. Subclasses can perform any additional customizations
  on ``self.parser``.
code: def __init__(self, parser: ArgumentParser) -> None:
      """Initialize the subcommand with its parser
  
      Args:
          parser (Parser) : an Argparse ``Parser`` instance to configure
              with the args for this subcommand.
  
      This method will automatically add all the arguments described in
      ``self.args``. Subclasses can perform any additional customizations
      on ``self.parser``.
  
      """
      self.parser = parser
      for arg in self.args:
          flags, spec = arg
          if not isinstance(flags, tuple):
              flags = (flags,)
          if not isinstance(spec, dict):
              kwargs = dict(entries(spec))
          else:
              # NOTE: allow dict for run time backwards compatibility, but don't include in types
              kwargs = spec
          self.parser.add_argument(*flags, **kwargs)
  
file_path: bokeh/src/bokeh/command/subcommand.py
imports: from __future__ import annotations
  import logging
  from abc import ABCMeta, abstractmethod
  from argparse import ArgumentParser, Namespace
  from typing import TYPE_CHECKING, Any, ClassVar, Literal, Sequence, Union
  from ..util.dataclasses import NotRequired, Unspecified, dataclass, entries
label_desc: Use image node_id 1 to create a new Subcommand object  with example: obj = Subcommand(parser)