Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions src/postgrest/src/postgrest/_async/request_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ def insert(
returning: ReturnMethod = ReturnMethod.representation,
upsert: bool = False,
default_to_null: bool = True,
) -> AsyncQueryRequestBuilder:
) -> AsyncSelectRequestBuilder:
"""Run an INSERT query.

Args:
Expand All @@ -344,7 +344,7 @@ def insert(
Otherwise, use the default value for the column.
Only applies for bulk inserts.
Returns:
:class:`AsyncQueryRequestBuilder`
:class:`AsyncSelectRequestBuilder`
"""
method, params, headers, json = pre_insert(
json,
Expand All @@ -363,7 +363,7 @@ def insert(
headers=headers,
json=json,
)
return AsyncQueryRequestBuilder(request)
return AsyncSelectRequestBuilder(request)

def upsert(
self,
Expand All @@ -374,7 +374,7 @@ def upsert(
ignore_duplicates: bool = False,
on_conflict: str = "",
default_to_null: bool = True,
) -> AsyncQueryRequestBuilder:
) -> AsyncSelectRequestBuilder:
"""Run an upsert (INSERT ... ON CONFLICT DO UPDATE) query.

Args:
Expand All @@ -388,7 +388,7 @@ def upsert(
not when merging with existing rows under `ignoreDuplicates: false`.
This also only applies when doing bulk upserts.
Returns:
:class:`AsyncQueryRequestBuilder`
:class:`AsyncSelectRequestBuilder`
"""
method, params, headers, json = pre_upsert(
json,
Expand All @@ -408,23 +408,23 @@ def upsert(
headers=headers,
json=json,
)
return AsyncQueryRequestBuilder(request)
return AsyncSelectRequestBuilder(request)

def update(
self,
json: JSON,
*,
count: Optional[CountMethod] = None,
returning: ReturnMethod = ReturnMethod.representation,
) -> AsyncFilterRequestBuilder:
) -> AsyncSelectRequestBuilder:
"""Run an UPDATE query.

Args:
json: The updated fields.
count: The method to use to get the count of rows returned.
returning: Either 'minimal' or 'representation'
Returns:
:class:`AsyncFilterRequestBuilder`
:class:`AsyncSelectRequestBuilder`
"""
method, params, headers, json = pre_update(
json,
Expand All @@ -441,21 +441,21 @@ def update(
headers=headers,
json=json,
)
return AsyncFilterRequestBuilder(request)
return AsyncSelectRequestBuilder(request)

def delete(
self,
*,
count: Optional[CountMethod] = None,
returning: ReturnMethod = ReturnMethod.representation,
) -> AsyncFilterRequestBuilder:
) -> AsyncSelectRequestBuilder:
"""Run a DELETE query.

Args:
count: The method to use to get the count of rows returned.
returning: Either 'minimal' or 'representation'
Returns:
:class:`AsyncFilterRequestBuilder`
:class:`AsyncSelectRequestBuilder`
"""
method, params, headers, json = pre_delete(
count=count,
Expand All @@ -471,4 +471,4 @@ def delete(
headers=headers,
json=json,
)
return AsyncFilterRequestBuilder(request)
return AsyncSelectRequestBuilder(request)
24 changes: 12 additions & 12 deletions src/postgrest/src/postgrest/_sync/request_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ def insert(
returning: ReturnMethod = ReturnMethod.representation,
upsert: bool = False,
default_to_null: bool = True,
) -> SyncQueryRequestBuilder:
) -> SyncSelectRequestBuilder:
"""Run an INSERT query.

Args:
Expand All @@ -344,7 +344,7 @@ def insert(
Otherwise, use the default value for the column.
Only applies for bulk inserts.
Returns:
:class:`SyncQueryRequestBuilder`
:class:`SyncSelectRequestBuilder`
"""
method, params, headers, json = pre_insert(
json,
Expand All @@ -363,7 +363,7 @@ def insert(
headers=headers,
json=json,
)
return SyncQueryRequestBuilder(request)
return SyncSelectRequestBuilder(request)

def upsert(
self,
Expand All @@ -374,7 +374,7 @@ def upsert(
ignore_duplicates: bool = False,
on_conflict: str = "",
default_to_null: bool = True,
) -> SyncQueryRequestBuilder:
) -> SyncSelectRequestBuilder:
"""Run an upsert (INSERT ... ON CONFLICT DO UPDATE) query.

Args:
Expand All @@ -388,7 +388,7 @@ def upsert(
not when merging with existing rows under `ignoreDuplicates: false`.
This also only applies when doing bulk upserts.
Returns:
:class:`SyncQueryRequestBuilder`
:class:`SyncSelectRequestBuilder`
"""
method, params, headers, json = pre_upsert(
json,
Expand All @@ -408,23 +408,23 @@ def upsert(
headers=headers,
json=json,
)
return SyncQueryRequestBuilder(request)
return SyncSelectRequestBuilder(request)

def update(
self,
json: JSON,
*,
count: Optional[CountMethod] = None,
returning: ReturnMethod = ReturnMethod.representation,
) -> SyncFilterRequestBuilder:
) -> SyncSelectRequestBuilder:
"""Run an UPDATE query.

Args:
json: The updated fields.
count: The method to use to get the count of rows returned.
returning: Either 'minimal' or 'representation'
Returns:
:class:`SyncFilterRequestBuilder`
:class:`SyncSelectRequestBuilder`
"""
method, params, headers, json = pre_update(
json,
Expand All @@ -441,21 +441,21 @@ def update(
headers=headers,
json=json,
)
return SyncFilterRequestBuilder(request)
return SyncSelectRequestBuilder(request)

def delete(
self,
*,
count: Optional[CountMethod] = None,
returning: ReturnMethod = ReturnMethod.representation,
) -> SyncFilterRequestBuilder:
) -> SyncSelectRequestBuilder:
"""Run a DELETE query.

Args:
count: The method to use to get the count of rows returned.
returning: Either 'minimal' or 'representation'
Returns:
:class:`SyncFilterRequestBuilder`
:class:`SyncSelectRequestBuilder`
"""
method, params, headers, json = pre_delete(
count=count,
Expand All @@ -471,4 +471,4 @@ def delete(
headers=headers,
json=json,
)
return SyncFilterRequestBuilder(request)
return SyncSelectRequestBuilder(request)
57 changes: 56 additions & 1 deletion src/postgrest/tests/_async/test_request_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
from httpx import AsyncClient, Headers, QueryParams, Request, Response
from yarl import URL

from postgrest import AsyncRequestBuilder, AsyncSingleRequestBuilder
from postgrest import (
AsyncMaybeSingleRequestBuilder,
AsyncRequestBuilder,
AsyncSingleRequestBuilder,
)
from postgrest._async.request_builder import RequestConfig
from postgrest.base_request_builder import APIResponse, SingleAPIResponse
from postgrest.types import JSON, CountMethod, ReturnMethod
Expand Down Expand Up @@ -140,6 +144,34 @@ def test_insert_with_select_forces_representation(
"return=representation",
]

def test_insert_with_select_single(self, request_builder: AsyncRequestBuilder):
builder = request_builder.insert({"key1": "val1"}).select("id").single()

assert isinstance(builder, AsyncSingleRequestBuilder)
assert builder.request.params["select"] == "id"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.headers.get_list("prefer", True) == [
"return=representation"
]
assert builder.request.http_method == "POST"

def test_insert_with_select_maybe_single(
self, request_builder: AsyncRequestBuilder
):
builder = request_builder.insert({"key1": "val1"}).select("id").maybe_single()

assert isinstance(builder, AsyncMaybeSingleRequestBuilder)
assert builder.request.params["select"] == "id"
assert builder.request.http_method == "POST"

def test_upsert_with_select_single(self, request_builder: AsyncRequestBuilder):
builder = request_builder.upsert({"key1": "val1"}).select("id").single()

assert isinstance(builder, AsyncSingleRequestBuilder)
assert builder.request.params["select"] == "id"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.http_method == "POST"

def test_bulk_upsert_with_default(self, request_builder: AsyncRequestBuilder):
builder = request_builder.upsert(
[{"key1": "val1", "key2": "val2"}, {"key3": "val3"}], default_to_null=False
Expand Down Expand Up @@ -194,6 +226,21 @@ def test_update_with_select(self, request_builder: AsyncRequestBuilder):
assert builder.request.params["id"] == "eq.1"
assert builder.request.params["select"] == "id"

def test_update_with_select_single(self, request_builder: AsyncRequestBuilder):
builder = request_builder.update({"key1": "val1"}).eq("id", 1).select().single()

assert isinstance(builder, AsyncSingleRequestBuilder)
assert builder.request.params["id"] == "eq.1"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.http_method == "PATCH"

def test_update_with_order_and_limit(self, request_builder: AsyncRequestBuilder):
builder = request_builder.update({"key1": "val1"}).order("id").limit(1)

assert builder.request.params["order"] == "id.asc"
assert builder.request.params["limit"] == "1"
assert builder.request.http_method == "PATCH"


class TestDelete:
def test_delete(self, request_builder: AsyncRequestBuilder):
Expand Down Expand Up @@ -230,6 +277,14 @@ def test_delete_with_select(self, request_builder: AsyncRequestBuilder):
assert builder.request.params["id"] == "eq.1"
assert builder.request.params["select"] == "id"

def test_delete_with_select_single(self, request_builder: AsyncRequestBuilder):
builder = request_builder.delete().eq("id", 1).select("id").single()

assert isinstance(builder, AsyncSingleRequestBuilder)
assert builder.request.params["id"] == "eq.1"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.http_method == "DELETE"


class TestTextSearch:
def test_text_search(self, request_builder: AsyncRequestBuilder):
Expand Down
55 changes: 54 additions & 1 deletion src/postgrest/tests/_sync/test_request_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
from httpx import Client, Headers, QueryParams, Request, Response
from yarl import URL

from postgrest import SyncRequestBuilder, SyncSingleRequestBuilder
from postgrest import (
SyncMaybeSingleRequestBuilder,
SyncRequestBuilder,
SyncSingleRequestBuilder,
)
from postgrest._async.request_builder import RequestConfig
from postgrest.base_request_builder import APIResponse, SingleAPIResponse
from postgrest.types import JSON, CountMethod, ReturnMethod
Expand Down Expand Up @@ -140,6 +144,32 @@ def test_insert_with_select_forces_representation(
"return=representation",
]

def test_insert_with_select_single(self, request_builder: SyncRequestBuilder):
builder = request_builder.insert({"key1": "val1"}).select("id").single()

assert isinstance(builder, SyncSingleRequestBuilder)
assert builder.request.params["select"] == "id"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.headers.get_list("prefer", True) == [
"return=representation"
]
assert builder.request.http_method == "POST"

def test_insert_with_select_maybe_single(self, request_builder: SyncRequestBuilder):
builder = request_builder.insert({"key1": "val1"}).select("id").maybe_single()

assert isinstance(builder, SyncMaybeSingleRequestBuilder)
assert builder.request.params["select"] == "id"
assert builder.request.http_method == "POST"

def test_upsert_with_select_single(self, request_builder: SyncRequestBuilder):
builder = request_builder.upsert({"key1": "val1"}).select("id").single()

assert isinstance(builder, SyncSingleRequestBuilder)
assert builder.request.params["select"] == "id"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.http_method == "POST"

def test_bulk_upsert_with_default(self, request_builder: SyncRequestBuilder):
builder = request_builder.upsert(
[{"key1": "val1", "key2": "val2"}, {"key3": "val3"}], default_to_null=False
Expand Down Expand Up @@ -194,6 +224,21 @@ def test_update_with_select(self, request_builder: SyncRequestBuilder):
assert builder.request.params["id"] == "eq.1"
assert builder.request.params["select"] == "id"

def test_update_with_select_single(self, request_builder: SyncRequestBuilder):
builder = request_builder.update({"key1": "val1"}).eq("id", 1).select().single()

assert isinstance(builder, SyncSingleRequestBuilder)
assert builder.request.params["id"] == "eq.1"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.http_method == "PATCH"

def test_update_with_order_and_limit(self, request_builder: SyncRequestBuilder):
builder = request_builder.update({"key1": "val1"}).order("id").limit(1)

assert builder.request.params["order"] == "id.asc"
assert builder.request.params["limit"] == "1"
assert builder.request.http_method == "PATCH"


class TestDelete:
def test_delete(self, request_builder: SyncRequestBuilder):
Expand Down Expand Up @@ -230,6 +275,14 @@ def test_delete_with_select(self, request_builder: SyncRequestBuilder):
assert builder.request.params["id"] == "eq.1"
assert builder.request.params["select"] == "id"

def test_delete_with_select_single(self, request_builder: SyncRequestBuilder):
builder = request_builder.delete().eq("id", 1).select("id").single()

assert isinstance(builder, SyncSingleRequestBuilder)
assert builder.request.params["id"] == "eq.1"
assert builder.request.headers["accept"] == "application/vnd.pgrst.object+json"
assert builder.request.http_method == "DELETE"


class TestTextSearch:
def test_text_search(self, request_builder: SyncRequestBuilder):
Expand Down