docs: def download_version(version, url=None, verbose=False, binary=False):
      """Download, extract, and build Cassandra tarball.
  
      if binary == True, download precompiled tarball, otherwise build from source tarball.
      """
      assert_jdk_valid_for_cassandra_version(version)
  
      archive_url = ARCHIVE
      if CCM_CONFIG.has_option('repositories', 'cassandra'):
          archive_url = CCM_CONFIG.get('repositories', 'cassandra')
  
      if binary:
          archive_url = "%s/%s/apache-cassandra-%s-bin.tar.gz" % (archive_url, version.split('-')[0], version) if url is None else url
      else:
          archive_url = "%s/%s/apache-cassandra-%s-src.tar.gz" % (archive_url, version.split('-')[0], version) if url is None else url
      _, target = tempfile.mkstemp(suffix=".tar.gz", prefix="ccm-")
      try:
          __download(archive_url, target, show_progress=verbose)
          common.info("Extracting {} as version {} ...".format(target, version))
          tar = tarfile.open(target)
          dir = tar.next().name.split("/")[0]  # pylint: disable=all
          tar.extractall(path=__get_dir())
          tar.close()
          target_dir = os.path.join(__get_dir(), version)
          if os.path.exists(target_dir):
              rmdirs(target_dir)
          shutil.move(os.path.join(__get_dir(), dir), target_dir)
  
          if binary:
              # Binary installs don't have a build.xml that is needed
              # for pulling the version from. Write the version number
              # into a file to read later in common.get_version_from_build()
              with open(os.path.join(target_dir, '0.version.txt'), 'w') as f:
                  f.write(version)
          else:
              compile_version(version, target_dir, verbose=verbose)
  
      except urllib.error.URLError as e:
          msg = "Invalid version {}".format(version) if url is None else "Invalid url {}".format(url)
          msg = msg + " (underlying error is: {})".format(str(e))
          raise ArgumentError(msg)
      except tarfile.ReadError as e:
          raise ArgumentError("Unable to uncompress downloaded file: {}".format(str(e)))
      except CCMError as e:
          # wipe out the directory if anything goes wrong. Otherwise we will assume it has been compiled the next time it runs.
          try:
              rmdirs(target_dir)
              common.error("Deleted {} due to error".format(target_dir))
          except:
              raise CCMError("Building C* version {} failed. Attempted to delete {} but failed. This will need to be manually deleted".format(version, target_dir))
          raise e