Skip to content

Commit 530a59e

Browse files
authored
Fix for multiple primary keys (#15)
* Fix for multiple primary keys * remove format edits * Add publish workflow
1 parent 6d88368 commit 530a59e

File tree

4 files changed

+73
-15
lines changed

4 files changed

+73
-15
lines changed

.github/workflows/publish.yaml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: Upload Python Package to PyPI when a Release is Created
2+
3+
on:
4+
release:
5+
types: [created]
6+
7+
jobs:
8+
pypi-publish:
9+
name: Publish release to PyPI
10+
runs-on: ubuntu-latest
11+
environment:
12+
name: pypi
13+
url: https://pypi.org/p/weiser-ai
14+
permissions:
15+
id-token: write
16+
steps:
17+
- uses: actions/checkout@v4
18+
- name: Set up Python
19+
uses: actions/setup-python@v4
20+
with:
21+
python-version: "3.x"
22+
- name: Install dependencies
23+
run: |
24+
python -m pip install --upgrade pip
25+
pip install setuptools wheel
26+
- name: Build package
27+
run: |
28+
python setup.py sdist bdist_wheel # Could also be python -m build
29+
- name: Publish package distributions to PyPI
30+
uses: pypa/gh-action-pypi-publish@release/v1

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "cube_dbt"
3-
version = "0.6.1"
3+
version = "0.6.2"
44
description = "dbt integration for Cube"
55
authors = [
66
{name = "Artyom Keydunov", email = "[email protected]"},

src/cube_dbt/model.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,10 @@ def _init_columns(self) -> None:
1919
self._detect_primary_key()
2020

2121
def _detect_primary_key(self) -> None:
22-
candidates = list(
22+
self._primary_key = list(
2323
column for column in self._columns
2424
if column.primary_key
2525
)
26-
27-
if len(candidates) > 1:
28-
column_names = list(column.name for column in candidates)
29-
raise RuntimeError(f"More than one primary key column found in {self.name}: {', '.join(column_names)}")
30-
31-
self._primary_key = candidates[0] if len(candidates) == 1 else None
3226

3327
@property
3428
def name(self) -> str:
@@ -58,7 +52,7 @@ def column(self, name: str) -> Column:
5852
return next(column for column in self._columns if column.name == name)
5953

6054
@property
61-
def primary_key(self) -> Column or None:
55+
def primary_key(self) -> list[Column]:
6256
self._init_columns()
6357
return self._primary_key
6458

tests/test_model.py

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def test_detect_primary_key_no_columns(self):
6262
}
6363
}
6464
model = Model(model_dict)
65-
assert model.primary_key == None
65+
assert len(model.primary_key) == 0
6666

6767
def test_detect_primary_key_one_column(self):
6868
"""
@@ -87,8 +87,8 @@ def test_detect_primary_key_one_column(self):
8787
}
8888
}
8989
model = Model(model_dict)
90-
assert model.primary_key != None
91-
assert model.primary_key.name == 'id'
90+
assert len(model.primary_key) == 1
91+
assert model.primary_key[0].name == "id"
9292

9393
def test_detect_primary_key_two_columns(self):
9494
"""
@@ -115,8 +115,9 @@ def test_detect_primary_key_two_columns(self):
115115
}
116116
}
117117
model = Model(model_dict)
118-
with raises(RuntimeError):
119-
model.primary_key
118+
assert len(model.primary_key) == 2
119+
assert model.primary_key[0].name is not None
120+
assert model.primary_key[1].name is not None
120121

121122
def test_as_cube(self):
122123
model_dict = {
@@ -285,4 +286,37 @@ def test_as_dimensions_render_when_empty(self):
285286
}
286287

287288
model = Model(model_dict)
288-
assert model.as_dimensions() == ''
289+
assert model.as_dimensions() == ''
290+
291+
def test_as_dimensions_render_two_primary_keys(self):
292+
model_dict = {
293+
"name": "model",
294+
"columns": {
295+
"id": {
296+
"name": "id",
297+
"description": "",
298+
"meta": {},
299+
"data_type": "numeric",
300+
"tags": ["primary_key"],
301+
},
302+
"status": {
303+
"name": "status",
304+
"description": "",
305+
"meta": {},
306+
"data_type": None,
307+
"tags": ["primary_key"],
308+
},
309+
},
310+
}
311+
model = Model(model_dict)
312+
assert (
313+
model.as_dimensions() == """- name: id
314+
sql: id
315+
type: number
316+
primary_key: true
317+
- name: status
318+
sql: status
319+
type: string
320+
primary_key: true
321+
"""
322+
)

0 commit comments

Comments
 (0)