text: # The MIT License (MIT)
  # Copyright (c) 2019 by the xcube development team and contributors
  #
  # Permission is hereby granted, free of charge, to any person obtaining a copy of
  # this software and associated documentation files (the "Software"), to deal in
  # the Software without restriction, including without limitation the rights to
  # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
  # of the Software, and to permit persons to whom the Software is furnished to do
  # so, subject to the following conditions:
  #
  # The above copyright notice and this permission notice shall be included in all
  # copies or substantial portions of the Software.
  #
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  # SOFTWARE.
  
  import xarray as xr
  
  
  def dump_dataset(dataset: xr.Dataset,
                   var_names=None,
                   show_var_encoding=False) -> str:
      """
      Dumps a dataset or variables into a text string.
  
      :param dataset: input dataset
      :param var_names: names of variables to be dumped
      :param show_var_encoding: also dump variable encodings?
      :return: the dataset dump
      """
      lines = []
      if not var_names:
          lines.append(str(dataset))
          if show_var_encoding:
              for var_name, var in dataset.coords.items():
                  if var.encoding:
                      lines.append(dump_var_encoding(var, header=f"Encoding for coordinate variable {var_name!r}:"))
              for var_name, var in dataset.data_vars.items():
                  if var.encoding:
                      lines.append(dump_var_encoding(var, header=f"Encoding for data variable {var_name!r}:"))
      else:
          for var_name in var_names:
              var = dataset[var_name]
              lines.append(str(var))
              if show_var_encoding and var.encoding:
                  lines.append(dump_var_encoding(var))
      return "\n".join(lines)
  
  
  def dump_var_encoding(var: xr.DataArray, header="Encoding:", indent=4) -> str:
      """
      Dump the encoding information of a variable into a text string.
  
      :param var: Dataset variable.
      :param header: Title/header string.
      :param indent: Indention in spaces.
      :return: the variable dump
      """
      lines = [header]
      max_len = 0
      for k in var.encoding:
          max_len = max(max_len, len(k))
      indent_spaces = indent * " "
      for k, v in var.encoding.items():
          tab_spaces = (2 + max_len - len(k)) * " "
          lines.append(f"{indent_spaces}{k}:{tab_spaces}{v!r}")
      return "\n".join(lines)
  