Skip to content

Commit 34c8dff

Browse files
committed
refactor: convert ConstraintTypes to ConstraintType StrEnum
1 parent 5766b34 commit 34c8dff

7 files changed

Lines changed: 30 additions & 27 deletions

File tree

README.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ user = await User.get(uid)
2727

2828
# query
2929
users = await User.find(constraints=[
30-
constraint("status", ConstraintTypes.EQUALS, "active")
30+
constraint("status", ConstraintType.EQUALS, "active")
3131
])
3232

3333
# update
@@ -43,7 +43,7 @@ if await User.exists(uid):
4343

4444
# count
4545
active_count = await User.count(constraints=[
46-
constraint("status", ConstraintTypes.EQUALS, "active")
46+
constraint("status", ConstraintType.EQUALS, "active")
4747
])
4848
```
4949

@@ -178,11 +178,11 @@ user = await User.create(name="Ada Lovelace", email="ada@example.com")
178178
user = await User.get("1234567890x1234567890")
179179

180180
# query with constraints
181-
from bubble_data_api_client import constraint, ConstraintTypes
181+
from bubble_data_api_client import constraint, ConstraintType
182182

183183
active_users = await User.find(constraints=[
184-
constraint("status", ConstraintTypes.EQUALS, "active"),
185-
constraint("age", ConstraintTypes.GREATER_THAN, 18),
184+
constraint("status", ConstraintType.EQUALS, "active"),
185+
constraint("age", ConstraintType.GREATER_THAN, 18),
186186
])
187187

188188
# update
@@ -235,14 +235,14 @@ user, created = await User.create_or_update(
235235
Build type-safe queries using Bubble's constraint system:
236236

237237
```python
238-
from bubble_data_api_client import constraint, ConstraintTypes
238+
from bubble_data_api_client import constraint, ConstraintType
239239

240240
constraints = [
241-
constraint("status", ConstraintTypes.EQUALS, "active"),
242-
constraint("age", ConstraintTypes.GREATER_THAN, 21),
243-
constraint("tags", ConstraintTypes.CONTAINS, "premium"),
244-
constraint("email", ConstraintTypes.IS_NOT_EMPTY),
245-
constraint("category", ConstraintTypes.IN, ["A", "B", "C"]),
241+
constraint("status", ConstraintType.EQUALS, "active"),
242+
constraint("age", ConstraintType.GREATER_THAN, 21),
243+
constraint("tags", ConstraintType.CONTAINS, "premium"),
244+
constraint("email", ConstraintType.IS_NOT_EMPTY),
245+
constraint("category", ConstraintType.IN, ["A", "B", "C"]),
246246
]
247247

248248
results = await User.find(constraints=constraints)
@@ -314,7 +314,7 @@ This library is async-only, but you can use it in sync code:
314314

315315
```python
316316
import asyncio
317-
from bubble_data_api_client import BubbleBaseModel, constraint, ConstraintTypes
317+
from bubble_data_api_client import BubbleBaseModel, constraint, ConstraintType
318318

319319
class User(BubbleBaseModel, typename="user"):
320320
name: str
@@ -327,8 +327,8 @@ user = asyncio.run(User.get("1234567890x1234567890"))
327327
# or wrap multiple operations
328328
async def main():
329329
constraints = [
330-
constraint("is_verified", ConstraintTypes.EQUALS, True),
331-
constraint("account_type", ConstraintTypes.EQUALS, "premium"),
330+
constraint("is_verified", ConstraintType.EQUALS, True),
331+
constraint("account_type", ConstraintType.EQUALS, "premium"),
332332
]
333333
users = await User.find(constraints=constraints)
334334
for user in users:

src/bubble_data_api_client/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
configure,
77
set_config_provider,
88
)
9-
from bubble_data_api_client.constraints import Constraint, ConstraintTypes, constraint
9+
from bubble_data_api_client.constraints import Constraint, ConstraintType, constraint
1010
from bubble_data_api_client.pool import client_scope, close_clients
1111
from bubble_data_api_client.types import (
1212
BubbleField,
@@ -28,7 +28,7 @@
2828
"RawClient",
2929
# query building
3030
"Constraint",
31-
"ConstraintTypes",
31+
"ConstraintType",
3232
"constraint",
3333
# client lifecycle
3434
"client_scope",

src/bubble_data_api_client/client/orm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from pydantic import Field
77

88
from bubble_data_api_client.client.raw_client import RawClient
9-
from bubble_data_api_client.constraints import Constraint, ConstraintTypes, constraint
9+
from bubble_data_api_client.constraints import Constraint, ConstraintType, constraint
1010
from bubble_data_api_client.types import BubbleField, OnMultiple
1111

1212

@@ -50,7 +50,7 @@ async def get_many(cls, uids: list[str]) -> dict[str, typing.Self]:
5050
if not uids:
5151
return {}
5252
items: list[typing.Self] = await cls.find(
53-
constraints=[constraint(BubbleField.ID, ConstraintTypes.IN, uids)],
53+
constraints=[constraint(BubbleField.ID, ConstraintType.IN, uids)],
5454
)
5555
return {item.uid: item for item in items}
5656

src/bubble_data_api_client/client/raw_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import httpx
88

9-
from bubble_data_api_client.constraints import Constraint, ConstraintTypes, constraint
9+
from bubble_data_api_client.constraints import Constraint, ConstraintType, constraint
1010
from bubble_data_api_client.exceptions import InvalidOnMultipleError, MultipleMatchesError, PartialFailureError
1111
from bubble_data_api_client.transport import Transport
1212
from bubble_data_api_client.types import BubbleField, CreateOrUpdateResult, OnMultiple
@@ -179,7 +179,7 @@ async def create_or_update(
179179

180180
# build equals constraints from match fields to find existing thing
181181
constraints: list[Constraint] = [
182-
constraint(key=key, constraint_type=ConstraintTypes.EQUALS, value=value) for key, value in match.items()
182+
constraint(key=key, constraint_type=ConstraintType.EQUALS, value=value) for key, value in match.items()
183183
]
184184

185185
# for dedupe strategies, sort by created date to determine oldest/newest

src/bubble_data_api_client/constraints.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import typing
2+
from enum import StrEnum
23

34

45
# all constraints are of the form:
@@ -25,7 +26,9 @@ def constraint(
2526

2627

2728
# https://manual.bubble.io/core-resources/api/the-bubble-api/the-data-api/data-api-requests#constraint-types
28-
class ConstraintTypes:
29+
class ConstraintType(StrEnum):
30+
"""Constraint types for Bubble Data API queries."""
31+
2932
# Use to test strict equality
3033
EQUALS = "equals"
3134
NOT_EQUAL = "not equal"
@@ -55,6 +58,6 @@ class ConstraintTypes:
5558
EMPTY = "empty"
5659
NOT_EMPTY = "not empty"
5760

58-
# Use to test if the current thing is within a radius from a central address.#
61+
# Use to test if the current thing is within a radius from a central address.
5962
# To use this, the value sent with the constraint must have an address and a range.
6063
GEOGRAPHIC_SEARCH = "geographic_search"

src/tests/integration/test_orm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22

33
from bubble_data_api_client.client.orm import BubbleBaseModel
4-
from bubble_data_api_client.constraints import ConstraintTypes, constraint
4+
from bubble_data_api_client.constraints import ConstraintType, constraint
55
from bubble_data_api_client.types import BubbleField
66

77

@@ -36,7 +36,7 @@ async def test_orm_integration():
3636

3737
# find
3838
things = await IntegrationTestModel.find(
39-
constraints=[constraint(BubbleField.ID, ConstraintTypes.EQUALS, thing3.uid)]
39+
constraints=[constraint(BubbleField.ID, ConstraintType.EQUALS, thing3.uid)]
4040
)
4141
assert len(things) == 1
4242
assert isinstance(things[0], IntegrationTestModel)

src/tests/unit/test_constraints.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from bubble_data_api_client.constraints import ConstraintTypes, constraint
1+
from bubble_data_api_client.constraints import ConstraintType, constraint
22
from bubble_data_api_client.types import BubbleField
33

44

55
def test_constraint_with_value():
66
"""Test constraint factory with a value."""
7-
result = constraint(BubbleField.ID, ConstraintTypes.IN, ["uid1", "uid2"])
7+
result = constraint(BubbleField.ID, ConstraintType.IN, ["uid1", "uid2"])
88
assert result == {
99
"key": "_id",
1010
"constraint_type": "in",
@@ -14,7 +14,7 @@ def test_constraint_with_value():
1414

1515
def test_constraint_without_value():
1616
"""Test constraint factory without a value."""
17-
result = constraint("field", ConstraintTypes.IS_EMPTY)
17+
result = constraint("field", ConstraintType.IS_EMPTY)
1818
assert result == {
1919
"key": "field",
2020
"constraint_type": "is_empty",

0 commit comments

Comments
 (0)