docs: def resolve_refs(uri, spec):
      """Resolve JSON references in a given dictionary.
  
      OpenAPI spec may contain JSON references to its nodes or external
      sources, so any attempt to rely that there's some expected attribute
      in the spec may fail. So we need to resolve JSON references before
      we use it (i.e. replace with referenced object). For details see:
  
          https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-02
  
      The input spec is modified in-place despite being returned from
      the function.
      """
      resolver = jsonschema.RefResolver(uri, spec)
  
      def _do_resolve(node):
          if isinstance(node, collections.Mapping) and '$ref' in node:
              with resolver.resolving(node['$ref']) as resolved:
                  result = deepcopy(resolved)
                  for key in resolved:
                      if key in node:
                          merge(result[key], node[key])
                  return result
          elif isinstance(node, collections.Mapping):
              for k, v in node.items():
                  node[k] = _do_resolve(v)
          elif isinstance(node, (list, tuple)):
              for i in range(len(node)):
                  node[i] = _do_resolve(node[i])
          return node
  
      return _do_resolve(spec)