Skip to content

Commit 24a6e66

Browse files
authored
Chore: add external models to sushi project (#898)
* Chore: add external models to sushi project * fix tests
1 parent 6fcbd5b commit 24a6e66

6 files changed

Lines changed: 52 additions & 30 deletions

File tree

examples/sushi/models/customers.sql

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,26 @@ MODEL (
66
tags (pii, fact)
77
);
88

9+
CREATE SCHEMA IF NOT EXISTS raw;
10+
CREATE TABLE IF NOT EXISTS raw.marketing AS (
11+
SELECT 1 AS customer_id, 'active' AS status
12+
);
13+
CREATE TABLE IF NOT EXISTS raw.demographics AS (
14+
SELECT 1 AS customer_id, '00000' AS zip
15+
);
16+
17+
WITH distinct_marketing AS (
18+
SELECT DISTINCT
19+
customer_id,
20+
status
21+
FROM raw.marketing
22+
)
923
SELECT DISTINCT
10-
customer_id::INT AS customer_id
24+
o.customer_id::INT AS customer_id,
25+
COALESCE(m.status, 'UNKNOWN') AS status,
26+
d.zip
1127
FROM sushi.orders AS o
28+
LEFT JOIN distinct_marketing AS m
29+
ON o.customer_id = m.customer_id
30+
LEFT JOIN raw.demographics AS d
31+
ON o.customer_id = d.customer_id

examples/sushi/schema.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
- name: raw.marketing
2+
description: Table containing marketing information
3+
columns:
4+
customer_id: int
5+
status: text
6+
- name: raw.demographics
7+
description: Table containing demographics information
8+
columns:
9+
customer_id: int
10+
zip: text

tests/conftest.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@ def ignore_local_config_files():
3131
yield
3232

3333

34-
@pytest.fixture
35-
def context(tmpdir) -> Context:
36-
return Context(paths=str(tmpdir))
37-
38-
3934
@pytest.fixture
4035
def duck_conn() -> duckdb.DuckDBPyConnection:
4136
return duckdb.connect()

tests/core/test_integration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -798,10 +798,10 @@ def validate_environment_views(
798798
) -> None:
799799
adapter = context.engine_adapter
800800
for snapshot in snapshots:
801-
if snapshot.is_embedded:
801+
if snapshot.is_symbolic:
802802
continue
803-
804803
view_name = snapshot.qualified_view_name.for_environment(environment=environment)
804+
805805
assert adapter.table_exists(view_name)
806806
assert select_all(
807807
snapshot.table_name(is_dev=environment != c.PROD, for_read=True), adapter

tests/core/test_schema_loader.py

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,26 @@
1-
import os
2-
31
import pandas as pd
4-
import pytest
52
from sqlglot import exp
63

7-
from sqlmesh.core import constants as c
4+
from sqlmesh.core.config import Config, DuckDBConnectionConfig, GatewayConfig
5+
from sqlmesh.core.context import Context
86
from sqlmesh.core.dialect import parse
97
from sqlmesh.core.model import load_model
108
from sqlmesh.core.snapshot import SnapshotChangeCategory
119

1210

13-
@pytest.fixture(autouse=True)
14-
def cleanup(sushi_context):
15-
yield
16-
os.remove(sushi_context.path / c.SCHEMA_YAML)
17-
11+
def test_create_external_models(tmpdir, assert_exp_eq):
12+
config = Config(gateways=GatewayConfig(connection=DuckDBConnectionConfig()))
13+
context = Context(paths=[tmpdir], config=config)
1814

19-
def test_create_external_models(sushi_context, assert_exp_eq):
2015
fruits = pd.DataFrame(
2116
[
2217
{"id": 1, "name": "apple"},
2318
{"id": 2, "name": "banana"},
2419
]
2520
)
2621

27-
cursor = sushi_context.engine_adapter.cursor
22+
cursor = context.engine_adapter.cursor
23+
cursor.execute("CREATE SCHEMA sushi")
2824
cursor.execute("CREATE TABLE sushi.raw_fruits AS SELECT * FROM fruits")
2925

3026
model = load_model(
@@ -40,12 +36,12 @@ def test_create_external_models(sushi_context, assert_exp_eq):
4036
)
4137
)
4238

43-
sushi_context.upsert_model(model)
44-
sushi_context.create_external_models()
45-
assert sushi_context.models["sushi.fruits"].columns_to_types == {
39+
context.upsert_model(model)
40+
context.create_external_models()
41+
assert context.models["sushi.fruits"].columns_to_types == {
4642
"name": exp.DataType.build("UNKNOWN")
4743
}
48-
sushi_context.load()
44+
context.load()
4945

5046
model = load_model(
5147
parse(
@@ -60,27 +56,27 @@ def test_create_external_models(sushi_context, assert_exp_eq):
6056
)
6157
)
6258

63-
sushi_context.upsert_model(model)
64-
raw_fruits = sushi_context.models["sushi.raw_fruits"]
59+
context.upsert_model(model)
60+
raw_fruits = context.models["sushi.raw_fruits"]
6561
assert raw_fruits.kind.is_symbolic
6662
assert raw_fruits.kind.is_external
6763
assert raw_fruits.columns_to_types == {
6864
"id": exp.DataType.build("BIGINT"),
6965
"name": exp.DataType.build("VARCHAR"),
7066
}
7167

72-
snapshot = sushi_context.snapshots["sushi.raw_fruits"]
68+
snapshot = context.snapshots["sushi.raw_fruits"]
7369
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
7470

75-
fruits = sushi_context.models["sushi.fruits"]
71+
fruits = context.models["sushi.fruits"]
7672
assert not fruits.kind.is_symbolic
7773
assert not fruits.kind.is_external
7874
assert fruits.columns_to_types == {
7975
"id": exp.DataType.build("BIGINT"),
8076
"name": exp.DataType.build("VARCHAR"),
8177
}
8278
assert_exp_eq(
83-
fruits.render_query(snapshots=sushi_context.snapshots),
79+
fruits.render_query(snapshots=context.snapshots),
8480
"""
8581
SELECT
8682
raw_fruits.id AS id,

tests/integrations/github/cicd/test_github_controller.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,11 @@ def test_delete_pr_environment(
121121
controller = github_pr_synchronized_approvers_controller
122122
controller._context._engine_adapter = mock_engine_adapter = mocker.MagicMock()
123123
controller.delete_pr_environment()
124-
assert mock_engine_adapter.method_calls == [
124+
assert sorted(mock_engine_adapter.method_calls, key=str) == [
125+
call.drop_schema(schema_name="raw__hello_world_2", ignore_if_not_exists=True, cascade=True),
125126
call.drop_schema(
126127
schema_name="sushi__hello_world_2", ignore_if_not_exists=True, cascade=True
127-
)
128+
),
128129
]
129130

130131

0 commit comments

Comments
 (0)