Skip to content

Commit 1bae0b2

Browse files
committed
prepare release 0.0.1a5
1 parent 5dacbb8 commit 1bae0b2

6 files changed

Lines changed: 189 additions & 129 deletions

File tree

pyproject.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "bubble-data-api-client"
3-
version = "0.0.1a4"
3+
version = "0.0.1a5"
44
description = "Python client for Bubble Data API"
55
readme = "README.md"
66
requires-python = ">=3.13"
@@ -11,12 +11,12 @@ dependencies = [
1111

1212
[dependency-groups]
1313
dev = [
14-
"coverage~=7.8",
15-
"pytest~=8.3",
16-
"pytest-asyncio~=1.0",
17-
"ruff~=0.11",
14+
"coverage~=7.10",
15+
"pytest~=8.4",
16+
"pytest-asyncio~=1.1",
17+
"ruff~=0.12",
1818
"respx~=0.22",
19-
"python-dotenv~=1.1.0",
19+
"python-dotenv~=1.1.1",
2020
"ipython~=9.4.0",
2121
]
2222

requirements.txt

Lines changed: 75 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ annotated-types==0.7.0 \
44
--hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \
55
--hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89
66
# via pydantic
7-
anyio==4.9.0 \
8-
--hash=sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028 \
9-
--hash=sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c
7+
anyio==4.10.0 \
8+
--hash=sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6 \
9+
--hash=sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1
1010
# via httpx
1111
asttokens==3.0.0 \
1212
--hash=sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7 \
1313
--hash=sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2
1414
# via stack-data
15-
certifi==2025.7.14 \
16-
--hash=sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2 \
17-
--hash=sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995
15+
certifi==2025.8.3 \
16+
--hash=sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407 \
17+
--hash=sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5
1818
# via
1919
# httpcore
2020
# httpx
@@ -24,31 +24,53 @@ colorama==0.4.6 ; sys_platform == 'win32' \
2424
# via
2525
# ipython
2626
# pytest
27-
coverage==7.9.2 \
28-
--hash=sha256:0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a \
29-
--hash=sha256:115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b \
30-
--hash=sha256:1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926 \
31-
--hash=sha256:256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6 \
32-
--hash=sha256:2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e \
33-
--hash=sha256:48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694 \
34-
--hash=sha256:55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5 \
35-
--hash=sha256:619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868 \
36-
--hash=sha256:6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584 \
37-
--hash=sha256:82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d \
38-
--hash=sha256:82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d \
39-
--hash=sha256:9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8 \
40-
--hash=sha256:985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038 \
41-
--hash=sha256:997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b \
42-
--hash=sha256:ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3 \
43-
--hash=sha256:bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46 \
44-
--hash=sha256:bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3 \
45-
--hash=sha256:bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14 \
46-
--hash=sha256:c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac \
47-
--hash=sha256:c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb \
48-
--hash=sha256:cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b \
49-
--hash=sha256:e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4 \
50-
--hash=sha256:f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b \
51-
--hash=sha256:f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd
27+
coverage==7.10.2 \
28+
--hash=sha256:0100b19f230df72c90fdb36db59d3f39232391e8d89616a7de30f677da4f532b \
29+
--hash=sha256:04c74f9ef1f925456a9fd23a7eef1103126186d0500ef9a0acb0bd2514bdc7cc \
30+
--hash=sha256:11333094c1bff621aa811b67ed794865cbcaa99984dedea4bd9cf780ad64ecba \
31+
--hash=sha256:12e52b5aa00aa720097d6947d2eb9e404e7c1101ad775f9661ba165ed0a28303 \
32+
--hash=sha256:14fb5b6641ab5b3c4161572579f0f2ea8834f9d3af2f7dd8fbaecd58ef9175cc \
33+
--hash=sha256:1a2e934e9da26341d342d30bfe91422bbfdb3f1f069ec87f19b2909d10d8dcc4 \
34+
--hash=sha256:228946da741558904e2c03ce870ba5efd9cd6e48cbc004d9a27abee08100a15a \
35+
--hash=sha256:248b5394718e10d067354448dc406d651709c6765669679311170da18e0e9af8 \
36+
--hash=sha256:2d358f259d8019d4ef25d8c5b78aca4c7af25e28bd4231312911c22a0e824a57 \
37+
--hash=sha256:2e980e4179f33d9b65ac4acb86c9c0dde904098853f27f289766657ed16e07b3 \
38+
--hash=sha256:5250bda76e30382e0a2dcd68d961afcab92c3a7613606e6269855c6979a1b0bb \
39+
--hash=sha256:52d708b5fd65589461381fa442d9905f5903d76c086c6a4108e8e9efdca7a7ed \
40+
--hash=sha256:5b9d538e8e04916a5df63052d698b30c74eb0174f2ca9cd942c981f274a18eaf \
41+
--hash=sha256:5c61675a922b569137cf943770d7ad3edd0202d992ce53ac328c5ff68213ccf4 \
42+
--hash=sha256:5d6e6d84e6dd31a8ded64759626627247d676a23c1b892e1326f7c55c8d61055 \
43+
--hash=sha256:651015dcd5fd9b5a51ca79ece60d353cacc5beaf304db750407b29c89f72fe2b \
44+
--hash=sha256:65b451949cb789c346f9f9002441fc934d8ccedcc9ec09daabc2139ad13853f7 \
45+
--hash=sha256:6eb586fa7d2aee8d65d5ae1dd71414020b2f447435c57ee8de8abea0a77d5074 \
46+
--hash=sha256:718044729bf1fe3e9eb9f31b52e44ddae07e434ec050c8c628bf5adc56fe4bdd \
47+
--hash=sha256:71d40b3ac0f26fa9ffa6ee16219a714fed5c6ec197cdcd2018904ab5e75bcfa3 \
48+
--hash=sha256:75cc1a3f8c88c69bf16a871dab1fe5a7303fdb1e9f285f204b60f1ee539b8fc0 \
49+
--hash=sha256:81bf6a32212f9f66da03d63ecb9cd9bd48e662050a937db7199dbf47d19831de \
50+
--hash=sha256:835f39e618099325e7612b3406f57af30ab0a0af350490eff6421e2e5f608e46 \
51+
--hash=sha256:8f34b09f68bdadec122ffad312154eda965ade433559cc1eadd96cca3de5c824 \
52+
--hash=sha256:916369b3b914186b2c5e5ad2f7264b02cff5df96cdd7cdad65dccd39aa5fd9f0 \
53+
--hash=sha256:95db3750dd2e6e93d99fa2498f3a1580581e49c494bddccc6f85c5c21604921f \
54+
--hash=sha256:95e23987b52d02e7c413bf2d6dc6288bd5721beb518052109a13bfdc62c8033b \
55+
--hash=sha256:96e5921342574a14303dfdb73de0019e1ac041c863743c8fe1aa6c2b4a257226 \
56+
--hash=sha256:9c1cd71483ea78331bdfadb8dcec4f4edfb73c7002c1206d8e0af6797853f5be \
57+
--hash=sha256:9f75dbf4899e29a37d74f48342f29279391668ef625fdac6d2f67363518056a1 \
58+
--hash=sha256:a3e853cc04987c85ec410905667eed4bf08b1d84d80dfab2684bb250ac8da4f6 \
59+
--hash=sha256:a7df481e7508de1c38b9b8043da48d94931aefa3e32b47dd20277e4978ed5b95 \
60+
--hash=sha256:a91e027d66eff214d88d9afbe528e21c9ef1ecdf4956c46e366c50f3094696d0 \
61+
--hash=sha256:abb57fdd38bf6f7dcc66b38dafb7af7c5fdc31ac6029ce373a6f7f5331d6f60f \
62+
--hash=sha256:aca7b5645afa688de6d4f8e89d30c577f62956fefb1bad021490d63173874186 \
63+
--hash=sha256:c2e117e64c26300032755d4520cd769f2623cde1a1d1c3515b05a3b8add0ade1 \
64+
--hash=sha256:ca07fa78cc9d26bc8c4740de1abd3489cf9c47cc06d9a8ab3d552ff5101af4c0 \
65+
--hash=sha256:d800705f6951f75a905ea6feb03fff8f3ea3468b81e7563373ddc29aa3e5d1ca \
66+
--hash=sha256:daaf98009977f577b71f8800208f4d40d4dcf5c2db53d4d822787cdc198d76e1 \
67+
--hash=sha256:e8415918856a3e7d57a4e0ad94651b761317de459eb74d34cc1bb51aad80f07e \
68+
--hash=sha256:e96649ac34a3d0e6491e82a2af71098e43be2874b619547c3282fc11d3840a4b \
69+
--hash=sha256:ea8d8fe546c528535c761ba424410bbeb36ba8a0f24be653e94b70c93fd8a8ca \
70+
--hash=sha256:f256173b48cc68486299d510a3e729a96e62c889703807482dbf56946befb5c8 \
71+
--hash=sha256:f287a25a8ca53901c613498e4a40885b19361a2fe8fbfdbb7f8ef2cad2a23f03 \
72+
--hash=sha256:f35481d42c6d146d48ec92d4e239c23f97b53a3f1fbd2302e7c64336f28641fe \
73+
--hash=sha256:fe024d40ac31eb8d5aae70215b41dafa264676caa4404ae155f77d2fa95c37bb
5274
decorator==5.2.1 \
5375
--hash=sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360 \
5476
--hash=sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a
@@ -159,34 +181,34 @@ pytest==8.4.1 \
159181
--hash=sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7 \
160182
--hash=sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c
161183
# via pytest-asyncio
162-
pytest-asyncio==1.0.0 \
163-
--hash=sha256:4f024da9f1ef945e680dc68610b52550e36590a67fd31bb3b4943979a1f90ef3 \
164-
--hash=sha256:d15463d13f4456e1ead2594520216b225a16f781e144f8fdf6c5bb4667c48b3f
184+
pytest-asyncio==1.1.0 \
185+
--hash=sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf \
186+
--hash=sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea
165187
python-dotenv==1.1.1 \
166188
--hash=sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc \
167189
--hash=sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab
168190
respx==0.22.0 \
169191
--hash=sha256:3c8924caa2a50bd71aefc07aa812f2466ff489f1848c96e954a5362d17095d91 \
170192
--hash=sha256:631128d4c9aba15e56903fb5f66fb1eff412ce28dd387ca3a81339e52dbd3ad0
171-
ruff==0.12.3 \
172-
--hash=sha256:023040a3499f6f974ae9091bcdd0385dd9e9eb4942f231c23c57708147b06311 \
173-
--hash=sha256:0262d50ba2767ed0fe212aa7e62112a1dcbfd46b858c5bf7bbd11f326998bafc \
174-
--hash=sha256:0a9153b000c6fe169bb307f5bd1b691221c4286c133407b8827c406a55282041 \
175-
--hash=sha256:12371aec33e1a3758597c5c631bae9a5286f3c963bdfb4d17acdd2d395406687 \
176-
--hash=sha256:2120d3aa855ff385e0e562fdee14d564c9675edbe41625c87eeab744a7830d12 \
177-
--hash=sha256:40dced4a79d7c264389de1c59467d5d5cefd79e7e06d1dfa2c75497b5269a5a6 \
178-
--hash=sha256:47552138f7206454eaf0c4fe827e546e9ddac62c2a3d2585ca54d29a890137a2 \
179-
--hash=sha256:560f13b6baa49785665276c963edc363f8ad4b4fc910a883e2625bdb14a83a9e \
180-
--hash=sha256:5f9c7c9c8f84c2d7f27e93674d27136fbf489720251544c4da7fb3d742e011b1 \
181-
--hash=sha256:6b16647cbb470eaf4750d27dddc6ebf7758b918887b56d39e9c22cce2049082b \
182-
--hash=sha256:883d844967bffff5ab28bba1a4d246c1a1b2933f48cb9840f3fdc5111c603b07 \
183-
--hash=sha256:a946cf1e7ba3209bdef039eb97647f1c77f6f540e5845ec9c114d3af8df873e7 \
184-
--hash=sha256:c4faaff1f90cea9d3033cbbcdf1acf5d7fb11d8180758feb31337391691f3df0 \
185-
--hash=sha256:dfd45e6e926deb6409d0616078a666ebce93e55e07f0fb0228d4b2608b2c248d \
186-
--hash=sha256:e1417051edb436230023575b149e8ff843a324557fe0a265863b7602df86722f \
187-
--hash=sha256:e2506961bf6ead54887ba3562604d69cb430f59b42133d36976421bc8bd45901 \
188-
--hash=sha256:f1b5a4b6668fd7b7ea3697d8d98857390b40c1320a63a178eee6be0899ea2d77 \
189-
--hash=sha256:fa6b24600cf3b750e48ddb6057e901dd5b9aa426e316addb2a1af185a7509882
193+
ruff==0.12.7 \
194+
--hash=sha256:06bfb01e1623bf7f59ea749a841da56f8f653d641bfd046edee32ede7ff6c606 \
195+
--hash=sha256:1fc3193f238bc2d7968772c82831a4ff69252f673be371fb49663f0068b7ec71 \
196+
--hash=sha256:2e1c2a3b8626339bb6369116e7030a4cf194ea48f49b64bb505732a7fce4f4e3 \
197+
--hash=sha256:32dec41817623d388e645612ec70d5757a6d9c035f3744a52c7b195a57e03860 \
198+
--hash=sha256:4000623300563c709458d0ce170c3d0d788c23a058912f28bbadc6f905d67afa \
199+
--hash=sha256:47ef751f722053a5df5fa48d412dbb54d41ab9b17875c6840a58ec63ff0c247c \
200+
--hash=sha256:5726f59b171111fa6a69d82aef48f00b56598b03a22f0f4170664ff4d8298efb \
201+
--hash=sha256:5d0bfe4e77fba61bf2ccadf8cf005d6133e3ce08793bbe870dd1c734f2699a3e \
202+
--hash=sha256:69ffe0e5f9b2cf2b8e289a3f8945b402a1b19eff24ec389f45f23c42a3dd6fb5 \
203+
--hash=sha256:74e6f5c04c4dd4aba223f4fe6e7104f79e0eebf7d307e4f9b18c18362124bccd \
204+
--hash=sha256:76e4f31529899b8c434c3c1dede98c4483b89590e15fb49f2d46183801565303 \
205+
--hash=sha256:789b7a03e72507c54fb3ba6209e4bb36517b90f1a3569ea17084e3fd295500fb \
206+
--hash=sha256:9c18f3d707ee9edf89da76131956aba1270c6348bfee8f6c647de841eac7194f \
207+
--hash=sha256:a07a5c8ffa2611a52732bdc67bf88e243abd84fe2d7f6daef3826b59abbfeda4 \
208+
--hash=sha256:a828a5fc25a3efd3e1ff7b241fd392686c9386f20e5ac90aa9234a5faa12c423 \
209+
--hash=sha256:c928f1b2ec59fb77dfdf70e0419408898b63998789cc98197e15f560b9e77f77 \
210+
--hash=sha256:dfce05101dbd11833a0776716d5d1578641b7fddb537fe7fa956ab85d1769b69 \
211+
--hash=sha256:e41df94a957d50083fd09b916d6e89e497246698c3f3d5c681c8b3e7b9bb4ac8
190212
sniffio==1.3.1 \
191213
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
192214
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc

src/bubble_data_api_client/client/raw_client.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import json
22
import types
33
import typing
4-
from typing import TypedDict
54

65
import httpx
76

87
from bubble_data_api_client.transport import Transport
98

109

1110
# all constraints are of the form:
12-
class BaseConstraint(TypedDict):
11+
class BaseConstraint(typing.TypedDict):
1312
key: str
1413
constraint_type: str
1514

@@ -22,7 +21,7 @@ class Constraint(BaseConstraint, total=False):
2221
# https://manual.bubble.io/core-resources/api/the-bubble-api/the-data-api/data-api-requests#sorting
2322
# in addition to 'sort_field' and 'descending', it is possible to have
2423
# multiple additional sort fields
25-
class AdditionalSortField(TypedDict):
24+
class AdditionalSortField(typing.TypedDict):
2625
sort_field: str
2726
descending: bool
2827

@@ -105,9 +104,21 @@ async def retrieve(self, typename: str, uid: str) -> httpx.Response:
105104
async def create(self, typename: str, data: typing.Any) -> httpx.Response:
106105
return await self._transport.post(url=f"/{typename}", json=data)
107106

107+
async def bulk_create(self, typename: str, data: list[typing.Any]) -> httpx.Response:
108+
return await self._transport.post_text(
109+
url=f"/{typename}/bulk",
110+
content="\n".join(json.dumps(item) for item in data),
111+
)
112+
108113
async def delete(self, typename: str, uid: str) -> httpx.Response:
109114
return await self._transport.delete(f"/{typename}/{uid}")
110115

116+
async def update(self, typename: str, uid: str, data: typing.Any) -> httpx.Response:
117+
return await self._transport.patch(f"/{typename}/{uid}", json=data)
118+
119+
async def replace(self, typename: str, uid: str, data: typing.Any) -> httpx.Response:
120+
return await self._transport.put(f"/{typename}/{uid}", json=data)
121+
111122
# https://manual.bubble.io/core-resources/api/the-bubble-api/the-data-api/data-api-requests#get-a-list-of-things
112123
async def list(
113124
self,

src/bubble_data_api_client/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__VERSION__ = "0.0.1a4"
1+
__VERSION__ = "0.0.1a5"

src/bubble_data_api_client/transport.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,16 @@ async def request(
6161
method: str,
6262
url: str,
6363
*,
64-
params: dict[str, str] | None = None,
64+
content: str | None = None,
6565
json: typing.Any = None,
66+
params: dict[str, str] | None = None,
6667
) -> httpx.Response:
6768
response: httpx.Response = await self._http.request(
6869
method=method,
6970
url=url,
70-
params=params,
71+
content=content,
7172
json=json,
73+
params=params,
7274
)
7375
response.raise_for_status()
7476
return response
@@ -92,3 +94,6 @@ async def delete(self, url: str) -> httpx.Response:
9294

9395
async def post(self, url: str, json: typing.Any) -> httpx.Response:
9496
return await self.request(method="POST", url=url, json=json)
97+
98+
async def post_text(self, url: str, content: str) -> httpx.Response:
99+
return await self.request(method="POST", url=url, content=content)

0 commit comments

Comments
 (0)