Skip to content

Commit 42c9267

Browse files
committed
[POP-7487] Add materialize adapter for dbt 1.0+
1 parent 2892797 commit 42c9267

17 files changed

+198
-535
lines changed

.github/workflows/deploy.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ jobs:
3131

3232
- uses: actions/setup-python@v4
3333
with:
34-
python-version: '3.8'
34+
python-version: '3.11'
3535

3636
- name: Install poetry
3737
run: curl -sSL https://install.python-poetry.org | python3 -
3838

3939
- name: Generate requirements file
40-
run: bash ./bin/generate_requirements.sh ${{ matrix.version }} ${{ matrix.adapter }}
40+
run: python3 ./bin/generate_requirements.py ${{ matrix.version }} ${{ matrix.adapter }}
4141

4242
# snowflake adapter for dbt < 1.1 does not have prebuilt arm64 wheels, and building it
4343
# from source is very ardious and time consuming (due to pyarrow), so only build for

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ in the lock file).
5353
As part of our CD process, we then handle generating a per adapter requirements file
5454
from these two files.
5555

56+
### Requirements
57+
58+
* Python 3.11+
59+
* [poetry](https://python-poetry.org/)
60+
5661
### Building Images Locally
5762

5863
Docker images can be built locally via the `./bin/build.sh` script, which takes two

bin/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ BASE_DIR=${SCRIPT_DIR}/..
1313
version=$1
1414
adapter=$2
1515

16-
"${SCRIPT_DIR}"/generate_requirements.sh "${version}" "${adapter}"
16+
python3 "${SCRIPT_DIR}"/generate_requirements.py "${version}" "${adapter}"
1717

1818
if [ -z "${adapter}" ]; then
1919
requirements_file="requirements.txt"

bin/generate_requirements.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#!/usr/bin/env python3
2+
3+
from argparse import ArgumentParser
4+
from pathlib import Path
5+
import shutil
6+
from subprocess import run, STDOUT
7+
from tempfile import TemporaryDirectory
8+
9+
current_dir = Path(__file__).resolve().parent
10+
base_requirements_dir = current_dir.parent / "requirements"
11+
12+
parser = ArgumentParser()
13+
parser.add_argument("version", type=str, help="Version of dbt to generate requirements for")
14+
parser.add_argument("adapter", type=str, help="Adapter to generate requirements for", nargs='?')
15+
args = parser.parse_args()
16+
17+
version = args.version # type: str
18+
adapter = args.adapter # type: str | None
19+
20+
requirements_dir = base_requirements_dir / str(args.version)
21+
22+
if not requirements_dir.exists():
23+
raise SystemExit(f"Version {args.version} not found")
24+
25+
with TemporaryDirectory(prefix="docker-dbt-") as tmpdir:
26+
tmpdir_path = Path(tmpdir)
27+
28+
if adapter is None:
29+
print(f"Building requirements for {version}")
30+
shutil.copy(requirements_dir / "pyproject.toml", tmpdir_path / "pyproject.toml")
31+
requirements_file = "requirements.txt"
32+
else:
33+
contents = (requirements_dir / "pyproject.toml").read_text()
34+
if adapter not in contents:
35+
raise SystemExit(f"Adapter {adapter} for {version} not found")
36+
37+
print(f"Building requirements for {version}/{adapter}")
38+
39+
extra_requirements = []
40+
if adapter == "materialize":
41+
extra_requirements = ["postgres"]
42+
43+
with (requirements_dir / "pyproject.toml").open("r") as f, (tmpdir_path / "pyproject.toml").open("w") as g:
44+
for line in f:
45+
if not line.startswith('dbt-') or any(val in line for val in ['core', 'rpc', adapter] + extra_requirements):
46+
g.write(line)
47+
48+
requirements_file = f"requirements-{adapter}.txt"
49+
50+
shutil.copy(requirements_dir / "poetry.lock", tmpdir_path / "poetry.lock")
51+
print("Updating poetry.lock file")
52+
result = run(["poetry", "-q", "lock"], cwd=tmpdir_path)
53+
if result.returncode != 0:
54+
print(result.stdout.decode("utf-8"))
55+
print(result.stderr.decode("utf-8"))
56+
raise SystemExit("Failed to update poetry.lock file")
57+
print("Exporting requirements file")
58+
result = run(["poetry", "export", "-o", f"{requirements_dir / requirements_file}"], cwd=tmpdir_path)
59+
if result.returncode != 0:
60+
print(result.stdout.decode("utf-8"))
61+
print(result.stderr.decode("utf-8"))
62+
raise SystemExit("Failed to export requirements file")

bin/generate_requirements.sh

Lines changed: 0 additions & 55 deletions
This file was deleted.

0 commit comments

Comments
 (0)