• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

supabase / etl / 26291956152

22 May 2026 01:54PM UTC coverage: 72.854% (-0.3%) from 73.187%
26291956152

push

github

web-flow
refactor: migrate to smaller example for Snowflake (#767)

0 of 164 new or added lines in 3 files covered. (0.0%)

52 existing lines in 6 files now uncovered.

32807 of 45031 relevant lines covered (72.85%)

41313.0 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/crates/xtask/src/commands/example.rs
1
use anyhow::{Result, bail};
2
use clap::Args;
3
use xshell::{Shell, cmd};
4

5
const KNOWN_EXAMPLES: &[&str] = &["bigquery", "clickhouse", "ducklake", "snowflake"];
6

7
#[derive(Args)]
8
pub(crate) struct ExampleArgs {
9
    /// Example name (bigquery, clickhouse, ducklake, snowflake).
10
    name: String,
11

12
    /// Extra arguments passed through to the example binary.
13
    #[arg(trailing_var_arg = true, allow_hyphen_values = true)]
14
    args: Vec<String>,
15
}
16

17
impl ExampleArgs {
NEW
18
    pub(crate) fn run(self) -> Result<()> {
×
NEW
19
        let name = &self.name;
×
20

NEW
21
        if !KNOWN_EXAMPLES.contains(&name.as_str()) {
×
NEW
22
            bail!("unknown example '{name}'. Available: {}", KNOWN_EXAMPLES.join(", "));
×
NEW
23
        }
×
24

NEW
25
        let db_host = env_or("TESTS_DATABASE_HOST", None);
×
NEW
26
        let db_port = env_or("TESTS_DATABASE_PORT", None);
×
NEW
27
        let db_username = env_or("TESTS_DATABASE_USERNAME", None);
×
NEW
28
        let db_password = env_or("TESTS_DATABASE_PASSWORD", None);
×
29

NEW
30
        let missing: Vec<&str> = [
×
NEW
31
            db_host.is_none().then_some("TESTS_DATABASE_HOST"),
×
NEW
32
            db_port.is_none().then_some("TESTS_DATABASE_PORT"),
×
NEW
33
            db_username.is_none().then_some("TESTS_DATABASE_USERNAME"),
×
NEW
34
        ]
×
NEW
35
        .into_iter()
×
NEW
36
        .flatten()
×
NEW
37
        .collect();
×
38

NEW
39
        if !missing.is_empty() && !has_flag(&self.args, "--db-host") {
×
NEW
40
            bail!(
×
41
                "missing environment variables: {}\n\nSet them in .env and run: source .env\nSee \
42
                 .env.example for details.",
NEW
43
                missing.join(", ")
×
44
            );
NEW
45
        }
×
46

NEW
47
        let mut extra: Vec<String> = Vec::new();
×
48

NEW
49
        inject(&mut extra, "--db-host", &db_host, &self.args);
×
NEW
50
        inject(&mut extra, "--db-port", &db_port, &self.args);
×
NEW
51
        inject(&mut extra, "--db-username", &db_username, &self.args);
×
NEW
52
        inject(&mut extra, "--db-password", &db_password, &self.args);
×
NEW
53
        inject(&mut extra, "--db-name", &Some("etl_testdata".to_owned()), &self.args);
×
NEW
54
        inject(&mut extra, "--publication", &Some("seed_pub".to_owned()), &self.args);
×
55

NEW
56
        match name.as_str() {
×
NEW
57
            "bigquery" => {
×
NEW
58
                inject_env(&mut extra, "--bq-project-id", "TESTS_BIGQUERY_PROJECT_ID", &self.args);
×
NEW
59
                inject_env(
×
NEW
60
                    &mut extra,
×
NEW
61
                    "--bq-sa-key-file",
×
NEW
62
                    "TESTS_BIGQUERY_SA_KEY_PATH",
×
NEW
63
                    &self.args,
×
NEW
64
                );
×
NEW
65
            }
×
NEW
66
            "clickhouse" => {
×
NEW
67
                inject_env(&mut extra, "--clickhouse-url", "TESTS_CLICKHOUSE_URL", &self.args);
×
NEW
68
                inject_env(&mut extra, "--clickhouse-user", "TESTS_CLICKHOUSE_USER", &self.args);
×
NEW
69
                inject_env(
×
NEW
70
                    &mut extra,
×
NEW
71
                    "--clickhouse-password",
×
NEW
72
                    "TESTS_CLICKHOUSE_PASSWORD",
×
NEW
73
                    &self.args,
×
NEW
74
                );
×
NEW
75
            }
×
NEW
76
            "snowflake" => {
×
NEW
77
                inject_env(
×
NEW
78
                    &mut extra,
×
NEW
79
                    "--snowflake-account",
×
NEW
80
                    "TESTS_SNOWFLAKE_ACCOUNT",
×
NEW
81
                    &self.args,
×
NEW
82
                );
×
NEW
83
                inject_env(&mut extra, "--snowflake-user", "TESTS_SNOWFLAKE_USER", &self.args);
×
NEW
84
                inject_env(
×
NEW
85
                    &mut extra,
×
NEW
86
                    "--snowflake-private-key-path",
×
NEW
87
                    "TESTS_SNOWFLAKE_PRIVATE_KEY_PATH",
×
NEW
88
                    &self.args,
×
NEW
89
                );
×
NEW
90
                inject_env(
×
NEW
91
                    &mut extra,
×
NEW
92
                    "--snowflake-private-key-passphrase",
×
NEW
93
                    "TESTS_SNOWFLAKE_PRIVATE_KEY_PASSPHRASE",
×
NEW
94
                    &self.args,
×
NEW
95
                );
×
NEW
96
                inject_env(
×
NEW
97
                    &mut extra,
×
NEW
98
                    "--snowflake-database",
×
NEW
99
                    "TESTS_SNOWFLAKE_DATABASE",
×
NEW
100
                    &self.args,
×
NEW
101
                );
×
NEW
102
                inject_env(&mut extra, "--snowflake-schema", "TESTS_SNOWFLAKE_SCHEMA", &self.args);
×
NEW
103
                inject_env(&mut extra, "--snowflake-role", "TESTS_SNOWFLAKE_ROLE", &self.args);
×
NEW
104
            }
×
NEW
105
            _ => {}
×
106
        }
107

NEW
108
        extra.extend(self.args.iter().cloned());
×
109

NEW
110
        let sh = Shell::new()?;
×
NEW
111
        let feature = name;
×
NEW
112
        cmd!(sh, "cargo run --bin {name} -p etl-examples --features {feature} -- {extra...}")
×
NEW
113
            .run()?;
×
114

NEW
115
        Ok(())
×
NEW
116
    }
×
117
}
118

NEW
119
fn env_or(key: &str, default: Option<&str>) -> Option<String> {
×
NEW
120
    std::env::var(key).ok().or_else(|| default.map(String::from))
×
NEW
121
}
×
122

NEW
123
fn has_flag(args: &[String], flag: &str) -> bool {
×
NEW
124
    args.iter().any(|a| a == flag || a.starts_with(&format!("{flag}=")))
×
NEW
125
}
×
126

NEW
127
fn inject_env(extra: &mut Vec<String>, flag: &str, env_var: &str, user_args: &[String]) {
×
NEW
128
    inject(extra, flag, &env_or(env_var, None), user_args);
×
NEW
129
}
×
130

NEW
131
fn inject(extra: &mut Vec<String>, flag: &str, value: &Option<String>, user_args: &[String]) {
×
NEW
132
    if has_flag(user_args, flag) {
×
NEW
133
        return;
×
NEW
134
    }
×
NEW
135
    if let Some(v) = value {
×
NEW
136
        extra.push(flag.to_owned());
×
NEW
137
        extra.push(v.clone());
×
NEW
138
    }
×
NEW
139
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc