docs: def files(self, entity_id, manifest=None, filename=None,
                read_file=False, channel=None):
          '''
          Get the files or file contents of a file for an entity.
  
          If all files are requested, a dictionary of filenames and urls for the
          files in the archive are returned.
  
          If filename is provided, the url of just that file is returned, if it
          exists.
  
          If filename is provided and read_file is true, the *contents* of the
          file are returned, if the file exists.
  
          @param entity_id The id of the entity to get files for
          @param manifest The manifest of files for the entity. Providing this
              reduces queries; if not provided, the manifest is looked up in the
              charmstore.
          @param filename The name of the file in the archive to get.
          @param read_file Whether to get the url for the file or the file
              contents.
          @param channel Optional channel name.
          '''
          if manifest is None:
              manifest_url = '{}/{}/meta/manifest'.format(self.url,
                                                          _get_path(entity_id))
              manifest_url = _add_channel(manifest_url, channel)
              manifest = self._get(manifest_url)
              manifest = manifest.json()
          files = {}
          for f in manifest:
              manifest_name = f['Name']
              file_url = self.file_url(_get_path(entity_id), manifest_name,
                                       channel=channel)
              files[manifest_name] = file_url
  
          if filename:
              file_url = files.get(filename, None)
              if file_url is None:
                  raise EntityNotFound(entity_id, filename)
              if read_file:
                  data = self._get(file_url)
                  return data.text
              else:
                  return file_url
          else:
              return files