docs: def download(dataset_label=None, destination_dir=None, dry_run=False):
      """Download sample data by data label. Warning: function with side effect!
  
      Labels can be listed by sample_data.data_urls.keys(). Returns downloaded files.
  
      :param dataset_label: label of data. If it is set to None, all data are downloaded
      :param destination_dir: output dir for data
      :param dry_run: runs function without downloading anything
      """
      if destination_dir is None:
          destination_dir = op.join(dataset_path(get_root=True), "medical", "orig")
  
      destination_dir = op.expanduser(destination_dir)
      logger.info("destination dir: {}".format(destination_dir))
  
      if dataset_label is None:
          dataset_label = data_urls.keys()
  
      if type(dataset_label) == str:
          dataset_label = [dataset_label]
  
      dataset_label = _expand_dataset_packages(dataset_label)
  
      for label in dataset_label:
          # make all data:url have length 3
          data_url, url, expected_hash, hash_path, relative_download_dir = get_dataset_meta(
              label
          )
          if relative_download_dir is None:
              label_destination_dir = destination_dir
          else:
              label_destination_dir = op.join(destination_dir, relative_download_dir)
          if not op.exists(label_destination_dir):
              logger.debug("creating directory {}".format(label_destination_dir))
              os.makedirs(label_destination_dir)
  
          if hash_path is None:
              hash_path = label
  
          path_to_hash = os.path.join(label_destination_dir, hash_path)
          try:
              computed_hash = checksum(path_to_hash)
          except Exception as e:
              # there is probably no checksumdir module
              logger.warning(e)
              logger.warning("problem with sample_data.checksum()")
              computed_hash = None
  
          logger.info("dataset: '" + label + "'")
          logger.info("path to hash: {}".format(path_to_hash))
          logger.info("expected hash: '" + str(expected_hash) + "'")
          logger.info("computed hash: '" + str(computed_hash) + "'")
          if (computed_hash is not None) and (expected_hash == computed_hash):
              logger.info("match ok - no download needed")
          else:
              logger.info("downloading")
              if not dry_run:
                  downzip(url, destination=label_destination_dir)
                  logger.info("finished")
                  downloaded_hash = checksum(
                      os.path.join(label_destination_dir, hash_path)
                  )
                  logger.info("downloaded hash: '" + str(downloaded_hash) + "'")
                  if downloaded_hash != expected_hash:
                      logger.warning(
                          "downloaded hash is different from expected hash\n"
                          + "expected hash: '"
                          + str(expected_hash)
                          + "'\n"
                          + "downloaded hash: '"
                          + str(downloaded_hash)
                          + "'\n"
                      )
              else:
                  logger.debug("dry run")