docs: def build_parser(declared_args, doc, config=None, prog=None):
      """ Return the global :class:`argparse.ArgumentParser` used by all fedmsg
      commands.
  
      Extra arguments can be supplied with the `declared_args` argument.
      """
  
      config = config or copy.deepcopy(defaults)
      prog = prog or sys.argv[0]
  
      parser = argparse.ArgumentParser(
          description=textwrap.dedent(doc),
          formatter_class=argparse.RawDescriptionHelpFormatter,
          prog=prog,
      )
  
      parser.add_argument(
          '--io-threads',
          dest='io_threads',
          type=int,
          help="Number of io threads for 0mq to use",
          default=config['io_threads'],
      )
      parser.add_argument(
          '--topic-prefix',
          dest='topic_prefix',
          type=str,
          help="Prefix for the topic of each message sent.",
          default=config['topic_prefix'],
      )
      parser.add_argument(
          '--post-init-sleep',
          dest='post_init_sleep',
          type=float,
          help="Number of seconds to sleep after initializing.",
          default=config['post_init_sleep'],
      )
      parser.add_argument(
          '--config-filename',
          dest='config_filename',
          help="Config file to use.",
          default=None,
      )
      parser.add_argument(
          '--print-config',
          dest='print_config',
          help='Simply print out the configuration and exit.  No action taken.',
          default=False,
          action='store_true',
      )
      parser.add_argument(
          '--timeout',
          dest='timeout',
          help="Timeout in seconds for any blocking zmq operations.",
          type=float,
          default=config['timeout'],
      )
      parser.add_argument(
          '--high-water-mark',
          dest='high_water_mark',
          help="Limit on the number of messages in the queue before blocking.",
          type=int,
          default=config['high_water_mark'],
      )
      parser.add_argument(
          '--linger',
          dest='zmq_linger',
          help="Number of milliseconds to wait before timing out connections.",
          type=int,
          default=config['zmq_linger'],
      )
  
      for args, kwargs in declared_args:
          # Replace the hard-coded extra_args default with the config file value
          # (if it exists)
          if all([k in kwargs for k in ['dest', 'default']]):
              kwargs['default'] = config.get(
                  kwargs['dest'], kwargs['default'])
  
          # Having slurped smart defaults from the config file, add the CLI arg.
          parser.add_argument(*args, **kwargs)
  
      return parser