class_docstr: Manage sibling configuration
  
  This command offers four different actions: 'query', 'add', 'remove',
  'configure', 'enable'. 'query' is the default action and can be used to obtain
  information about (all) known siblings. 'add' and 'configure' are highly
  similar actions, the only difference being that adding a sibling
  with a name that is already registered will fail, whereas
  re-configuring a (different) sibling under a known name will not
  be considered an error. 'enable' can be used to complete access
  configuration for non-Git sibling (aka git-annex special remotes).
  Lastly, the 'remove' action allows for the
  removal (or de-configuration) of a registered sibling.
  
  For each sibling (added, configured, or queried) all known sibling
  properties are reported. This includes:
  
  "name"
      Name of the sibling
  
  "path"
      Absolute path of the dataset
  
  "url"
      For regular siblings at minimum a "fetch" URL, possibly also a
      "pushurl"
  
  Additionally, any further configuration will also be reported using
  a key that matches that in the Git configuration.
  
  By default, sibling information is rendered as one line per sibling
  following this scheme::
  
    <dataset_path>: <sibling_name>(<+|->) [<access_specification]
  
  where the `+` and `-` labels indicate the presence or absence of a
  remote data annex at a particular remote, and `access_specification`
  contains either a URL and/or a type label for the sibling.
code: def custom_result_renderer(res, **kwargs):
      from datalad.ui import ui
  
      # should we attempt to remove an unknown sibling, complain like Git does
      if (
          res["status"] == "notneeded"
          and res["action"] == "remove-sibling"
      ):
          ui.message(
              '{warn}: No sibling "{name}" in dataset {path}'.format(
                  warn=ac.color_word(
                      "Warning", ac.LOG_LEVEL_COLORS["WARNING"]
                  ),
                  **res,
              )
          )
          return
      if res["status"] != "ok" or not res.get("action", "").endswith(
          "-sibling"
      ):
          generic_result_renderer(res)
          return
      path = (
          op.relpath(res["path"], res["refds"])
          if res.get("refds", None)
          else res["path"]
      )
      got_url = "url" in res
      spec = "{}{}{}{}".format(
          res.get("url", ""),
          " (" if got_url else "",
          res.get("annex-externaltype", "git"),
          ")" if got_url else "",
      )
      ui.message(
          "{path}: {name}({with_annex}) [{spec}]".format(
              **dict(
                  res,
                  path=path,
                  # TODO report '+' for special remotes
                  with_annex="+"
                  if "annex-uuid" in res
                  else ("-" if res.get("annex-ignore", None) else "?"),
                  spec=spec,
              )
          )
      )
  
imports: import logging
  import os
  import os.path
  from urllib.parse import urlparse
  import datalad.support.ansi_colors
  from datalad.distribution.dataset import Dataset, require_dataset
  from datalad.distribution.update import Update
  from datalad.downloaders.credentials import UserPassword
  from datalad.interface.base import Interface, build_doc, eval_results
  from datalad.interface.common_opts import annex_group_opt, annex_groupwanted_opt, annex_required_opt, annex_wanted_opt, as_common_datasrc, inherit_opt, location_description, publish_by_default, publish_depends, recursion_flag, recursion_limit
  from datalad.interface.results import get_status_dict
  from datalad.interface.utils import generic_result_renderer
  from datalad.support.annexrepo import AnnexRepo
  from datalad.support.constraints import EnsureBool, EnsureChoice, EnsureNone, EnsureStr
  from datalad.support.exceptions import AccessDeniedError, AccessFailedError, CapturedException, CommandError, DownloadError, InsufficientArgumentsError, RemoteNotAvailableError
  from datalad.support.gitrepo import GitRepo
  from datalad.support.network import RI, URL, PathRI
  from datalad.support.param import Parameter
  from datalad.utils import Path, ensure_list, slash_join
  from .dataset import EnsureDataset, datasetmethod
label_desc: Use image node_id 2 for calling the Siblings obj's underlying member method code with example usage: obj.custom_result_renderer(res) without return types