def create(source,
           requirement_files=None,
           force=False,
           keep_wheels=False,
           archive_destination_dir='.',
           python_versions=None,
           validate_archive=False,
           wheel_args='',
           archive_format='zip',
           build_tag=''):
    if validate_archive:
        _assert_virtualenv_is_installed()
    logger.info('Creating archive for %s...', source)
    processed_source = get_source(source)
    if os.path.isdir(processed_source) and not \
            os.path.isfile(os.path.join(processed_source, 'setup.py')):
        raise WagonError(
            'Source directory must contain a setup.py file')
    package_name, package_version = get_source_name_and_version(
        processed_source)
    tempdir = tempfile.mkdtemp()
    workdir = os.path.join(tempdir, package_name)
    wheels_path = os.path.join(workdir, DEFAULT_WHEELS_PATH)
    try:
        wheels = wheel(
            processed_source,
            requirement_files,
            wheels_path,
            wheel_args)
    finally:
        if processed_source != source:
            shutil.rmtree(processed_source, ignore_errors=True)
    platform = _get_platform_for_set_of_wheels(wheels_path)
    if is_verbose():
        logger.debug('Platform is: %s', platform)
    python_versions = _set_python_versions(python_versions)
    if not os.path.isdir(archive_destination_dir):
        os.makedirs(archive_destination_dir)
    archive_name = _set_archive_name(
        package_name, package_version, python_versions, platform, build_tag)
    archive_path = os.path.join(archive_destination_dir, archive_name)
    _handle_output_file(archive_path, force)
    _generate_metadata_file(
        workdir,
        archive_name,
        platform,
        python_versions,
        package_name,
        package_version,
        build_tag,
        source,
        wheels)
    _create_wagon_archive(workdir, archive_path, archive_format)
    if not keep_wheels:
        logger.debug('Removing work directory...')
        shutil.rmtree(tempdir, ignore_errors=True)
    if validate_archive:
        validate(archive_path)
    logger.info('Wagon created successfully at: %s', archive_path)
    return archive_path