floe-core 0.3.7

Core library for Floe, a YAML-driven technical ingestion tool.
Documentation
use std::path::{Path, PathBuf};

use floe_core::config::{
    ConfigBase, RootConfig, StorageDefinition, StorageResolver, StoragesConfig,
};
use floe_core::FloeResult;

fn base_root(definition: StorageDefinition) -> RootConfig {
    RootConfig {
        version: "0.1".to_string(),
        metadata: None,
        storages: Some(StoragesConfig {
            default: Some(definition.name.clone()),
            definitions: vec![definition],
        }),
        catalogs: None,
        env: None,
        domains: Vec::new(),
        report: None,
        entities: Vec::new(),
    }
}

#[test]
fn local_base_resolves_relative_paths() -> FloeResult<()> {
    let config = RootConfig {
        version: "0.1".to_string(),
        metadata: None,
        storages: None,
        catalogs: None,
        env: None,
        domains: Vec::new(),
        report: None,
        entities: Vec::new(),
    };
    let resolver = StorageResolver::from_path(&config, Path::new("/tmp/config.yml"))?;
    let resolved = resolver.resolve_path("entity", "source.path", None, "data/file.csv")?;
    assert_eq!(
        resolved.local_path,
        Some(PathBuf::from("/tmp/data/file.csv"))
    );
    Ok(())
}

#[test]
fn remote_s3_base_resolves_relative_paths() -> FloeResult<()> {
    let definition = StorageDefinition {
        name: "s3_raw".to_string(),
        fs_type: "s3".to_string(),
        bucket: Some("my-bucket".to_string()),
        region: None,
        account: None,
        container: None,
        prefix: None,
    };
    let config = base_root(definition);
    let base =
        ConfigBase::remote_from_uri(PathBuf::from("/tmp"), "s3://my-bucket/configs/demo.yml")?;
    let resolver = StorageResolver::new(&config, base)?;
    let resolved = resolver.resolve_path("entity", "source.path", None, "in/orders")?;
    assert_eq!(resolved.uri, "s3://my-bucket/configs/in/orders");
    Ok(())
}

#[test]
fn remote_gcs_base_resolves_relative_paths() -> FloeResult<()> {
    let definition = StorageDefinition {
        name: "gcs_raw".to_string(),
        fs_type: "gcs".to_string(),
        bucket: Some("my-bucket".to_string()),
        region: None,
        account: None,
        container: None,
        prefix: None,
    };
    let config = base_root(definition);
    let base =
        ConfigBase::remote_from_uri(PathBuf::from("/tmp"), "gs://my-bucket/configs/demo.yml")?;
    let resolver = StorageResolver::new(&config, base)?;
    let resolved = resolver.resolve_path("entity", "source.path", None, "in/orders")?;
    assert_eq!(resolved.uri, "gs://my-bucket/configs/in/orders");
    Ok(())
}

#[test]
fn remote_adls_base_resolves_relative_paths() -> FloeResult<()> {
    let definition = StorageDefinition {
        name: "adls_raw".to_string(),
        fs_type: "adls".to_string(),
        bucket: None,
        region: None,
        account: Some("acct".to_string()),
        container: Some("cont".to_string()),
        prefix: None,
    };
    let config = base_root(definition);
    let base = ConfigBase::remote_from_uri(
        PathBuf::from("/tmp"),
        "abfs://cont@acct.dfs.core.windows.net/configs/demo.yml",
    )?;
    let resolver = StorageResolver::new(&config, base)?;
    let resolved = resolver.resolve_path("entity", "source.path", None, "in/orders")?;
    assert_eq!(
        resolved.uri,
        "abfs://cont@acct.dfs.core.windows.net/configs/in/orders"
    );
    Ok(())
}

#[test]
fn remote_base_respects_explicit_prefix() -> FloeResult<()> {
    let definition = StorageDefinition {
        name: "s3_raw".to_string(),
        fs_type: "s3".to_string(),
        bucket: Some("my-bucket".to_string()),
        region: None,
        account: None,
        container: None,
        prefix: Some("lakehouse".to_string()),
    };
    let config = base_root(definition);
    let base =
        ConfigBase::remote_from_uri(PathBuf::from("/tmp"), "s3://my-bucket/configs/demo.yml")?;
    let resolver = StorageResolver::new(&config, base)?;
    let resolved = resolver.resolve_path("entity", "source.path", None, "in/orders")?;
    assert_eq!(resolved.uri, "s3://my-bucket/lakehouse/in/orders");
    Ok(())
}