Skip to content

Commit 61fe6f1

Browse files
committed
prepare release 0.0.1a6
1 parent 1bae0b2 commit 61fe6f1

11 files changed

Lines changed: 380 additions & 187 deletions

File tree

pyproject.toml

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

requirements.txt

Lines changed: 76 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -24,53 +24,53 @@ colorama==0.4.6 ; sys_platform == 'win32' \
2424
# via
2525
# ipython
2626
# pytest
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
27+
coverage==7.10.5 \
28+
--hash=sha256:0520dff502da5e09d0d20781df74d8189ab334a1e40d5bafe2efaa4158e2d9e7 \
29+
--hash=sha256:0666cf3d2c1626b5a3463fd5b05f5e21f99e6aec40a3192eee4d07a15970b07f \
30+
--hash=sha256:0913dd1613a33b13c4f84aa6e3f4198c1a21ee28ccb4f674985c1f22109f0aae \
31+
--hash=sha256:0be24d35e4db1d23d0db5c0f6a74a962e2ec83c426b5cac09f4234aadef38e4a \
32+
--hash=sha256:0d511dda38595b2b6934c2b730a1fd57a3635c6aa2a04cb74714cdfdd53846f4 \
33+
--hash=sha256:146fa1531973d38ab4b689bc764592fe6c2f913e7e80a39e7eeafd11f0ef6db2 \
34+
--hash=sha256:1b7181c0feeb06ed8a02da02792f42f829a7b29990fef52eff257fef0885d760 \
35+
--hash=sha256:1f64b8d3415d60f24b058b58d859e9512624bdfa57a2d1f8aff93c1ec45c429b \
36+
--hash=sha256:1f672efc0731a6846b157389b6e6d5d5e9e59d1d1a23a5c66a99fd58339914d5 \
37+
--hash=sha256:2968647e3ed5a6c019a419264386b013979ff1fb67dd11f5c9886c43d6a31fc2 \
38+
--hash=sha256:2b96bfdf7c0ea9faebce088a3ecb2382819da4fbc05c7b80040dbc428df6af44 \
39+
--hash=sha256:2d1b73023854068c44b0c554578a4e1ef1b050ed07cf8b431549e624a29a66ee \
40+
--hash=sha256:36d42b7396b605f774d4372dd9c49bed71cbabce4ae1ccd074d155709dd8f235 \
41+
--hash=sha256:384b34482272e960c438703cafe63316dfbea124ac62006a455c8410bf2a2262 \
42+
--hash=sha256:3f39cef43d08049e8afc1fde4a5da8510fc6be843f8dea350ee46e2a26b2f54c \
43+
--hash=sha256:42144e8e346de44a6f1dbd0a56575dd8ab8dfa7e9007da02ea5b1c30ab33a7db \
44+
--hash=sha256:44d43de99a9d90b20e0163f9770542357f58860a26e24dc1d924643bd6aa7cb4 \
45+
--hash=sha256:467dc74bd0a1a7de2bedf8deaf6811f43602cb532bd34d81ffd6038d6d8abe99 \
46+
--hash=sha256:54a1532c8a642d8cc0bd5a9a51f5a9dcc440294fd06e9dda55e743c5ec1a8f14 \
47+
--hash=sha256:556d23d4e6393ca898b2e63a5bca91e9ac2d5fb13299ec286cd69a09a7187fde \
48+
--hash=sha256:5661bf987d91ec756a47c7e5df4fbcb949f39e32f9334ccd3f43233bbb65e508 \
49+
--hash=sha256:5e78bd9cf65da4c303bf663de0d73bf69f81e878bf72a94e9af67137c69b9fe9 \
50+
--hash=sha256:6013a37b8a4854c478d3219ee8bc2392dea51602dd0803a12d6f6182a0061762 \
51+
--hash=sha256:609b60d123fc2cc63ccee6d17e4676699075db72d14ac3c107cc4976d516f2df \
52+
--hash=sha256:63d4bb2966d6f5f705a6b0c6784c8969c468dbc4bcf9d9ded8bff1c7e092451f \
53+
--hash=sha256:63df1fdaffa42d914d5c4d293e838937638bf75c794cf20bee12978fc8c4e3bc \
54+
--hash=sha256:66c644cbd7aed8fe266d5917e2c9f65458a51cfe5eeff9c05f15b335f697066e \
55+
--hash=sha256:68c5e0bc5f44f68053369fa0d94459c84548a77660a5f2561c5e5f1e3bed7031 \
56+
--hash=sha256:74d5b63fe3f5f5d372253a4ef92492c11a4305f3550631beaa432fc9df16fcff \
57+
--hash=sha256:8002dc6a049aac0e81ecec97abfb08c01ef0c1fbf962d0c98da3950ace89b869 \
58+
--hash=sha256:9a86281794a393513cf117177fd39c796b3f8e3759bb2764259a2abba5cce54b \
59+
--hash=sha256:a46473129244db42a720439a26984f8c6f834762fc4573616c1f37f13994b357 \
60+
--hash=sha256:a931a87e5ddb6b6404e65443b742cb1c14959622777f2a4efd81fba84f5d91ba \
61+
--hash=sha256:ad8fa9d5193bafcf668231294241302b5e683a0518bf1e33a9a0dfb142ec3031 \
62+
--hash=sha256:b08801e25e3b4526ef9ced1aa29344131a8f5213c60c03c18fe4c6170ffa2874 \
63+
--hash=sha256:b4fdc777e05c4940b297bf47bf7eedd56a39a61dc23ba798e4b830d585486ca5 \
64+
--hash=sha256:bc85eb2d35e760120540afddd3044a5bf69118a91a296a8b3940dfc4fdcfe1e2 \
65+
--hash=sha256:cebd8e906eb98bb09c10d1feed16096700b1198d482267f8bf0474e63a7b8d84 \
66+
--hash=sha256:cf33134ffae93865e32e1e37df043bef15a5e857d8caebc0099d225c579b0fa3 \
67+
--hash=sha256:d9cd64aca68f503ed3f1f18c7c9174cbb797baba02ca8ab5112f9d1c0328cd4b \
68+
--hash=sha256:eb90fe20db9c3d930fa2ad7a308207ab5b86bf6a76f54ab6a40be4012d88fcae \
69+
--hash=sha256:ed9749bb8eda35f8b636fb7632f1c62f735a236a5d4edadd8bbcc5ea0542e732 \
70+
--hash=sha256:ef3b83594d933020f54cf65ea1f4405d1f4e41a009c46df629dd964fcb6e907c \
71+
--hash=sha256:f2e57716a78bc3ae80b2207be0709a3b2b63b9f2dcf9740ee6ac03588a2015b6 \
72+
--hash=sha256:f4446a9547681533c8fa3e3c6cf62121eeee616e6a92bd9201c6edd91beffe13 \
73+
--hash=sha256:f9559b906a100029274448f4c8b8b0a127daa4dade5661dfd821b8c188058842
7474
decorator==5.2.1 \
7575
--hash=sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360 \
7676
--hash=sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a
@@ -122,9 +122,9 @@ packaging==25.0 \
122122
--hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \
123123
--hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f
124124
# via pytest
125-
parso==0.8.4 \
126-
--hash=sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18 \
127-
--hash=sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d
125+
parso==0.8.5 \
126+
--hash=sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a \
127+
--hash=sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887
128128
# via jedi
129129
pexpect==4.9.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' \
130130
--hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \
@@ -134,9 +134,9 @@ pluggy==1.6.0 \
134134
--hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \
135135
--hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746
136136
# via pytest
137-
prompt-toolkit==3.0.51 \
138-
--hash=sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07 \
139-
--hash=sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed
137+
prompt-toolkit==3.0.52 \
138+
--hash=sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855 \
139+
--hash=sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955
140140
# via ipython
141141
ptyprocess==0.7.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' \
142142
--hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \
@@ -190,25 +190,26 @@ python-dotenv==1.1.1 \
190190
respx==0.22.0 \
191191
--hash=sha256:3c8924caa2a50bd71aefc07aa812f2466ff489f1848c96e954a5362d17095d91 \
192192
--hash=sha256:631128d4c9aba15e56903fb5f66fb1eff412ce28dd387ca3a81339e52dbd3ad0
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
193+
ruff==0.12.10 \
194+
--hash=sha256:059e863ea3a9ade41407ad71c1de2badfbe01539117f38f763ba42a1206f7559 \
195+
--hash=sha256:141ce3d88803c625257b8a6debf4a0473eb6eed9643a6189b68838b43e78165a \
196+
--hash=sha256:189ab65149d11ea69a2d775343adf5f49bb2426fc4780f65ee33b423ad2e47f9 \
197+
--hash=sha256:1bef6161e297c68908b7218fa6e0e93e99a286e5ed9653d4be71e687dff101cf \
198+
--hash=sha256:1f68433c4fbc63efbfa3ba5db31727db229fa4e61000f452c540474b03de52a9 \
199+
--hash=sha256:2c6f4064c69d2542029b2a61d39920c85240c39837599d7f2e32e80d36401d6e \
200+
--hash=sha256:37b4a64f4062a50c75019c61c7017ff598cb444984b638511f48539d3a1c98db \
201+
--hash=sha256:4f1345fbf8fb0531cd722285b5f15af49b2932742fc96b633e883da8d841896b \
202+
--hash=sha256:7837eca8787f076f67aba2ca559cefd9c5cbc3a9852fd66186f4201b87c1563e \
203+
--hash=sha256:7d1a4e0bdfafcd2e3e235ecf50bf0176f74dd37902f241588ae1f6c827a36c56 \
204+
--hash=sha256:822d9677b560f1fdeab69b89d1f444bf5459da4aa04e06e766cf0121771ab844 \
205+
--hash=sha256:8b593cb0fb55cc8692dac7b06deb29afda78c721c7ccfed22db941201b7b8f7b \
206+
--hash=sha256:9de785e95dc2f09846c5e6e1d3a3d32ecd0b283a979898ad427a9be7be22b266 \
207+
--hash=sha256:ae479e1a18b439c59138f066ae79cc0f3ee250712a873d00dbafadaad9481e5b \
208+
--hash=sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc \
209+
--hash=sha256:d59e58586829f8e4a9920788f6efba97a13d1fa320b047814e8afede381c6839 \
210+
--hash=sha256:e67d96827854f50b9e3e8327b031647e7bcc090dbe7bb11101a81a3a2cbf1cc9 \
211+
--hash=sha256:ebb7333a45d56efc7c110a46a69a1b32365d5c5161e7244aaf3aa20ce62399c1 \
212+
--hash=sha256:f3fc21178cd44c98142ae7590f42ddcb587b8e09a3b849cbc84edb62ee95de60
212213
sniffio==1.3.1 \
213214
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
214215
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
@@ -223,9 +224,9 @@ traitlets==5.14.3 \
223224
# via
224225
# ipython
225226
# matplotlib-inline
226-
typing-extensions==4.14.1 \
227-
--hash=sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36 \
228-
--hash=sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76
227+
typing-extensions==4.15.0 \
228+
--hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
229+
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
229230
# via
230231
# pydantic
231232
# pydantic-core
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .config import configure
2+
3+
__all__ = ["configure"]
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import http
2+
import typing
3+
4+
import httpx
5+
from pydantic import BaseModel as PydanticBaseModel
6+
from pydantic import Field
7+
8+
from bubble_data_api_client.client.raw_client import RawClient
9+
from bubble_data_api_client.config import get_config
10+
11+
12+
def _get_client() -> RawClient:
13+
config = get_config()
14+
api_root = config.get("data_api_root_url")
15+
api_key = config.get("api_key")
16+
if not api_root:
17+
raise RuntimeError("data_api_root_url")
18+
if not api_key:
19+
raise RuntimeError("api_key")
20+
return RawClient(data_api_root_url=api_root, api_key=api_key)
21+
22+
23+
class BubbleBaseModel(PydanticBaseModel):
24+
_typename: typing.ClassVar[str]
25+
26+
uid: str = Field(..., alias="_id")
27+
28+
def __init_subclass__(cls, *, typename: str, **kwargs: typing.Any) -> None:
29+
super().__init_subclass__(**kwargs)
30+
cls._typename = typename
31+
32+
@classmethod
33+
async def create(cls, **data: typing.Any) -> typing.Self:
34+
async with _get_client() as client:
35+
response = await client.create(cls._typename, data)
36+
response.raise_for_status()
37+
uid = response.json()["id"]
38+
return cls(**data, _id=uid)
39+
40+
@classmethod
41+
async def get(cls, uid: str) -> typing.Self | None:
42+
async with _get_client() as client:
43+
try:
44+
response = await client.retrieve(cls._typename, uid)
45+
response.raise_for_status()
46+
return cls(**response.json()["response"])
47+
except httpx.HTTPStatusError as e:
48+
if e.response.status_code == http.HTTPStatus.NOT_FOUND:
49+
return None
50+
raise
51+
52+
async def save(self) -> None:
53+
async with _get_client() as client:
54+
data = self.model_dump(exclude={"uid"})
55+
response = await client.update(self._typename, self.uid, data)
56+
response.raise_for_status()
57+
58+
async def delete(self) -> None:
59+
async with _get_client() as client:
60+
response = await client.delete(self._typename, self.uid)
61+
response.raise_for_status()
62+
63+
@classmethod
64+
async def list(
65+
cls,
66+
*,
67+
constraints: list | None = None,
68+
cursor: int | None = None,
69+
limit: int | None = None,
70+
sort_field: str | None = None,
71+
descending: bool | None = None,
72+
exclude_remaining: bool | None = None,
73+
additional_sort_fields: list | None = None,
74+
) -> list[typing.Self]:
75+
async with _get_client() as client:
76+
response = await client.list(
77+
cls._typename,
78+
constraints=constraints,
79+
cursor=cursor,
80+
limit=limit,
81+
sort_field=sort_field,
82+
descending=descending,
83+
exclude_remaining=exclude_remaining,
84+
additional_sort_fields=additional_sort_fields,
85+
)
86+
response.raise_for_status()
87+
return [cls(**item) for item in response.json()["response"]["results"]]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import typing
2+
3+
_config: dict[str, typing.Any] = {
4+
"data_api_root_url": None,
5+
"api_key": None,
6+
}
7+
8+
9+
def configure(data_api_root_url: str, api_key: str) -> None:
10+
"""Configure the Bubble Data API client."""
11+
_config["data_api_root_url"] = data_api_root_url
12+
_config["api_key"] = api_key
13+
14+
15+
def get_config() -> typing.Mapping[str, str | None]:
16+
"""Get the current configuration."""
17+
return _config

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.1a5"
1+
__VERSION__ = "0.0.1a6"

src/tests/conftest.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
import pytest
1+
# load environment variables from a .env file for local testing
22
from dotenv import load_dotenv
33

44
load_dotenv()
55

6+
from collections.abc import AsyncGenerator # noqa: E402
7+
8+
import pytest # noqa: E402
9+
10+
from bubble_data_api_client import configure, settings # noqa: E402
11+
from bubble_data_api_client.client import raw_client # noqa: E402
12+
613

714
@pytest.fixture
815
def test_url() -> str:
@@ -12,3 +19,39 @@ def test_url() -> str:
1219
@pytest.fixture
1320
def test_api_key() -> str:
1421
return "123"
22+
23+
24+
@pytest.fixture(autouse=True)
25+
def auto_configure_client():
26+
"""Automatically configure the client for every test run."""
27+
if not settings.BUBBLE_DATA_API_ROOT_URL:
28+
raise RuntimeError("BUBBLE_DATA_API_ROOT_URL")
29+
if not settings.BUBBLE_API_KEY:
30+
raise RuntimeError("BUBBLE_API_KEY")
31+
32+
configure(
33+
data_api_root_url=settings.BUBBLE_DATA_API_ROOT_URL,
34+
api_key=settings.BUBBLE_API_KEY,
35+
)
36+
37+
38+
@pytest.fixture
39+
async def bubble_raw_client() -> AsyncGenerator[raw_client.RawClient]:
40+
"""Provide a raw client for testing the low-level API."""
41+
if not settings.BUBBLE_DATA_API_ROOT_URL:
42+
raise RuntimeError("BUBBLE_DATA_API_ROOT_URL")
43+
if not settings.BUBBLE_API_KEY:
44+
raise RuntimeError("BUBBLE_API_KEY")
45+
46+
async with raw_client.RawClient(
47+
data_api_root_url=settings.BUBBLE_DATA_API_ROOT_URL,
48+
api_key=settings.BUBBLE_API_KEY,
49+
) as client_instance:
50+
yield client_instance
51+
52+
53+
@pytest.fixture
54+
def typename() -> str:
55+
"""Return a test typename for integration tests."""
56+
# this typename should exist in the bubble app and should allow CRUD operations
57+
return "IntegrationTest"

0 commit comments

Comments
 (0)