snakedown 0.3.0

This is a snakedown. Hand over your docs, nice and clean, and nobody gets confused.
Documentation
use color_eyre::eyre::Result;
use std::fs;
use tempfile::tempdir;

use assert_cmd::cargo::cargo_bin_cmd;
use assert_cmd::prelude::*;
use walkdir::WalkDir;

use std::path::{Path, PathBuf};
use std::process::Command;

#[test]
fn test_skip_write_does_not_write() -> Result<()> {
    let tempdir = tempdir()?;

    let mut cmd = cargo_bin_cmd!();
    cmd.arg("-p")
        .arg("tests/test_pkg")
        .arg("-s")
        .arg(tempdir.path())
        .arg("-e")
        .arg("test_pkg/miss_spelled_ref.py")
        .arg("-e")
        .arg("test_pkg/excluded_file.py")
        .arg("--exclude")
        .arg("test_pkg/excluded_module")
        .arg("--skip-write")
        .arg("-vvv");
    let assertion = cmd.assert();

    assertion.success();

    let number_of_files = std::fs::read_dir(tempdir.path())?.count();

    assert_eq!(number_of_files, 0);

    Ok(())
}
#[test]
fn test_cli_with_all_options() -> Result<()> {
    let tempdir = tempdir()?;

    let mut cmd = cargo_bin_cmd!();
    cmd.arg("-p")
        .arg("tests/test_pkg")
        .arg("-s")
        .arg(tempdir.path())
        .arg("--skip-undoc")
        .arg("--skip-private")
        .arg("-e")
        .arg("test_pkg/miss_spelled_ref.py")
        .arg("-e")
        .arg("test_pkg/excluded_file.py")
        .arg("--exclude")
        .arg("test_pkg/excluded_module")
        .arg("-vv");
    let assertion = cmd.assert();

    assertion.success();

    Ok(())
}
#[test]
fn test_cli_with_zola() -> Result<()> {
    let tempdir = tempdir()?;

    let tmp_dir_path = tempdir.path();
    let target_dir = tmp_dir_path.join("zola_test_site");

    let origin = PathBuf::from("tests/zola_test_site/");

    copy_dir_recursive(&origin, tmp_dir_path)?;

    let mut cmd = cargo_bin_cmd!();
    cmd.arg("-p")
        .arg("tests/test_pkg")
        .arg("-s")
        .arg(&target_dir)
        .arg("--skip-undoc")
        .arg("--skip-private")
        .arg("-e")
        .arg("test_pkg/miss_spelled_ref.py")
        .arg("-e")
        .arg("test_pkg/excluded_file.py")
        .arg("--exclude")
        .arg("test_pkg/excluded_module")
        .arg("--ssg")
        .arg("zola")
        .arg("-vv");
    let snakedown_assertion = cmd.assert();

    snakedown_assertion.success();

    let zola_cmd_assert = Command::new("zola")
        .current_dir(&target_dir)
        .arg("build")
        .assert();

    zola_cmd_assert.success();

    Ok(())
}

fn copy_dir_recursive(src: &Path, dst: &Path) -> Result<()> {
    fs::create_dir_all(dst)?;

    for entry in WalkDir::new(src).into_iter().filter_map(|e| e.ok()) {
        let rel_path = entry.path().strip_prefix(src)?;
        let target_path = dst.join(rel_path);

        if entry.file_type().is_dir() {
            fs::create_dir_all(&target_path)?;
        } else {
            fs::copy(entry.path(), &target_path)?;
        }
    }

    Ok(())
}