class_docstr: Helper class with a platform abstraction for GitHub-like services
      
class_docstr_tok: ["Helper","class","with","a","platform","abstraction","for","GitHub-like","services"]
docstr: Create a series of repos on the target platform
  
  This method handles common conditions in a uniform platform-agnostic
  fashion, and sets local sibling configurations for created/located
  repositories.
  
  Yields
  ------
  dict
    Result record
docstr_tok: ["Create","a","series","of","repos","on","the","target","platform","This","method","handles","common","conditions","in","a","uniform","platform-agnostic","fashion",",","and","sets","local","sibling","configurations","for","created\/located","repositories",".","Yields","--","--","--","dict","Result","record"]
code: def create_repos(
      self,
      dsrepo_map,
      siblingname,
      organization,
      private,
      dry_run,
      description,
      res_kwargs,
      existing,
      access_protocol,
      publish_depends,
  ):
      """Create a series of repos on the target platform
  
      This method handles common conditions in a uniform platform-agnostic
      fashion, and sets local sibling configurations for created/located
      repositories.
  
      Yields
      ------
      dict
        Result record
      """
      for d, reponame in dsrepo_map:
          res = self.create_repo(
              d,
              reponame,
              organization,
              private,
              dry_run,
              description,
              existing,
          )
          # blend reported results with standard properties
          res = dict(res, **res_kwargs)
  
          if res.get("preexisted") and existing == "skip":
              # we came here, despite initial checking for conflicting
              # sibling names. this means we found an unrelated repo
              res["status"] = "error"
              res["message"] = (
                  "A repository '%s' already exists at '%s', "
                  "use existing=reconfigure to use it as a sibling",
                  reponame,
                  self.api_url,
              )
  
          if "message" not in res:
              if not dry_run:
                  res["message"] = (
                      "sibling repository '%s' created at %s",
                      siblingname,
                      res.get("html_url"),
                  )
              else:
                  # can't know url when request was not made
                  res["message"] = (
                      "would create sibling '%s' and repository '%s%s'",
                      siblingname,
                      organization + "/" if organization else "",
                      reponame,
                  )
          # report to caller
          yield get_status_dict(**res)
  
          if res["status"] not in ("ok", "notneeded"):
              # something went wrong, do not proceed
              continue
  
          if dry_run:
              continue
  
          if res["status"] == "notneeded" and existing not in (
              "reconfigure",
              "replace",
          ):
              # nothing to do anymore, when no reconfiguration is desired
              continue
  
          # lastly configure the local datasets
          for var_name, var_value in self.extra_remote_settings.items():
              var = "remote.{}.{}".format(siblingname, var_name)
              if existing in ("reconfigure", "replace"):
                  d.config.set(var, var_value, scope="local")
              elif var not in d.config:
                  d.config.add(var, var_value, scope="local")
          yield from d.siblings(
              "configure",
              name=siblingname,
              url=res["ssh_url"]
              if access_protocol == "ssh"
              else res["clone_url"],
              pushurl=res["ssh_url"]
              if access_protocol == "https-ssh"
              else None,
              recursive=False,
              # TODO fetch=True, maybe only if one existed already
              publish_depends=publish_depends,
              return_type="generator",
              result_renderer="disabled",
          )
  
imports: import logging
  import re
  from urllib.parse import urljoin, urlparse
  import requests
  from datalad import cfg
  from datalad.distribution.dataset import EnsureDataset, require_dataset
  from datalad.downloaders.credentials import Token
  from datalad.downloaders.http import DEFAULT_USER_AGENT
  from datalad.interface.common_opts import publish_depends, recursion_flag, recursion_limit
  from datalad.interface.results import get_status_dict
  from datalad.support.constraints import EnsureChoice, EnsureNone, EnsureStr
  from datalad.support.param import Parameter
  from datalad.ui import ui
  from datalad.utils import todo_interface_for_extensions
label_desc: Use image node_id 11 for calling the _GitHubLike obj's underlying member method code with example usage: obj.create_repos(dsrepo_map, siblingname, organization, private, dry_run, description, res_kwargs, existing, access_protocol, publish_depends) without return types