Skip to content

Commit 83ca3cd

Browse files
authored
chore: add alias for range methods (#350)
1 parent 496d95a commit 83ca3cd

File tree

6 files changed

+227
-5
lines changed

6 files changed

+227
-5
lines changed

Makefile

+6-1
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,10 @@ clean_infra:
2424

2525
run_tests: tests
2626

27-
build_sync:
27+
run_unasync:
2828
poetry run unasync postgrest tests
29+
30+
build_sync: run_unasync remove_pytest_asyncio_from_sync
31+
32+
remove_pytest_asyncio_from_sync:
33+
sed -i 's/@pytest.mark.asyncio//g' tests/_sync/test_client.py

postgrest/base_request_builder.py

+18
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,24 @@ def nxr(self: Self, column: str, range: Tuple[int, int]) -> Self:
399399
def adj(self: Self, column: str, range: Tuple[int, int]) -> Self:
400400
return self.filter(column, Filters.ADJ, f"({range[0]},{range[1]})")
401401

402+
def range_gt(self: Self, column: str, range: Tuple[int, int]) -> Self:
403+
return self.sr(column, range)
404+
405+
def range_gte(self: Self, column: str, range: Tuple[int, int]) -> Self:
406+
return self.nxl(column, range)
407+
408+
def range_lt(self: Self, column: str, range: Tuple[int, int]) -> Self:
409+
return self.sl(column, range)
410+
411+
def range_lte(self: Self, column: str, range: Tuple[int, int]) -> Self:
412+
return self.nxr(column, range)
413+
414+
def range_adjacent(self: Self, column: str, range: Tuple[int, int]) -> Self:
415+
return self.adj(column, range)
416+
417+
def overlaps(self: Self, column: str, values: Iterable[Any]) -> Self:
418+
return self.ov(column, values)
419+
402420
def match(self: Self, query: Dict[str, Any]) -> Self:
403421
updated_query = self
404422

pyproject.toml

+3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ upload_to_vcs_release = true
5353
branch = "master"
5454
changelog_components = "semantic_release.changelog.changelog_headers,semantic_release.changelog.compare_url"
5555

56+
[tool.pytest.ini_options]
57+
asyncio_mode = "auto"
58+
5659
[build-system]
5760
requires = ["poetry-core>=1.0.0"]
5861
build-backend = "poetry.core.masonry.api"

tests/_async/test_filter_request_builder.py

+100
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,24 @@ def test_equals(filter_request_builder):
6868
assert str(builder.params) == "x=eq.a"
6969

7070

71+
def test_not_equal(filter_request_builder):
72+
builder = filter_request_builder.neq("x", "a")
73+
74+
assert str(builder.params) == "x=neq.a"
75+
76+
77+
def test_greater_than(filter_request_builder):
78+
builder = filter_request_builder.gt("x", "a")
79+
80+
assert str(builder.params) == "x=gt.a"
81+
82+
83+
def test_greater_than_or_equals_to(filter_request_builder):
84+
builder = filter_request_builder.gte("x", "a")
85+
86+
assert str(builder.params) == "x=gte.a"
87+
88+
7189
def test_contains(filter_request_builder):
7290
builder = filter_request_builder.contains("x", "a")
7391

@@ -100,3 +118,85 @@ def test_contained_by_mixed_items(filter_request_builder):
100118

101119
# {a,["b",%20"c"]}
102120
assert str(builder.params) == "x=cd.%7Ba%2C%5B%22b%22%2C%20%22c%22%5D%7D"
121+
122+
123+
def test_range_greater_than(filter_request_builder):
124+
builder = filter_request_builder.range_gt(
125+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
126+
)
127+
128+
# {a,["b",%20"c"]}
129+
assert str(builder.params) == "x=sr.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
130+
131+
132+
def test_range_greater_than_or_equal_to(filter_request_builder):
133+
builder = filter_request_builder.range_gte(
134+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
135+
)
136+
137+
# {a,["b",%20"c"]}
138+
assert (
139+
str(builder.params) == "x=nxl.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
140+
)
141+
142+
143+
def test_range_less_than(filter_request_builder):
144+
builder = filter_request_builder.range_lt(
145+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
146+
)
147+
148+
# {a,["b",%20"c"]}
149+
assert str(builder.params) == "x=sl.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
150+
151+
152+
def test_range_less_than_or_equal_to(filter_request_builder):
153+
builder = filter_request_builder.range_lte(
154+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
155+
)
156+
157+
# {a,["b",%20"c"]}
158+
assert (
159+
str(builder.params) == "x=nxr.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
160+
)
161+
162+
163+
def test_range_adjacent(filter_request_builder):
164+
builder = filter_request_builder.range_adjacent(
165+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
166+
)
167+
168+
# {a,["b",%20"c"]}
169+
assert (
170+
str(builder.params) == "x=adj.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
171+
)
172+
173+
174+
def test_overlaps(filter_request_builder):
175+
builder = filter_request_builder.overlaps("x", ["is:closed", "severity:high"])
176+
177+
# {a,["b",%20"c"]}
178+
assert str(builder.params) == "x=ov.%7Bis%3Aclosed%2Cseverity%3Ahigh%7D"
179+
180+
181+
def test_like(filter_request_builder):
182+
builder = filter_request_builder.like("x", "%a%")
183+
184+
assert str(builder.params) == "x=like.%25a%25"
185+
186+
187+
def test_ilike(filter_request_builder):
188+
builder = filter_request_builder.ilike("x", "%a%")
189+
190+
assert str(builder.params) == "x=ilike.%25a%25"
191+
192+
193+
def test_is_(filter_request_builder):
194+
builder = filter_request_builder.is_("x", "a")
195+
196+
assert str(builder.params) == "x=is.a"
197+
198+
199+
def test_in_(filter_request_builder):
200+
builder = filter_request_builder.in_("x", ["a", "b"])
201+
202+
assert str(builder.params) == "x=in.%28a%2Cb%29"

tests/_sync/test_client.py

-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ def test_simple(self, postgrest_client: SyncPostgrestClient):
2828
)
2929
assert session.headers.items() >= headers.items()
3030

31-
@pytest.mark.asyncio
3231
def test_custom_headers(self):
3332
with SyncPostgrestClient(
3433
"https://example.com", schema="pub", headers={"Custom-Header": "value"}
@@ -72,15 +71,13 @@ def test_schema(postgrest_client: SyncPostgrestClient):
7271
assert subheaders.items() < dict(session.headers).items()
7372

7473

75-
@pytest.mark.asyncio
7674
def test_params_purged_after_execute(postgrest_client: SyncPostgrestClient):
7775
assert len(postgrest_client.session.params) == 0
7876
with pytest.raises(APIError):
7977
postgrest_client.from_("test").select("a", "b").eq("c", "d").execute()
8078
assert len(postgrest_client.session.params) == 0
8179

8280

83-
@pytest.mark.asyncio
8481
def test_response_status_code_outside_ok(postgrest_client: SyncPostgrestClient):
8582
with pytest.raises(APIError) as exc_info:
8683
postgrest_client.from_("test").select("a", "b").eq(
@@ -96,7 +93,6 @@ def test_response_status_code_outside_ok(postgrest_client: SyncPostgrestClient):
9693
assert exc_response["errors"][0].get("code") == 400
9794

9895

99-
@pytest.mark.asyncio
10096
def test_response_maybe_single(postgrest_client: SyncPostgrestClient):
10197
with patch(
10298
"postgrest._async.request_builder.AsyncSingleRequestBuilder.execute",

tests/_sync/test_filter_request_builder.py

+100
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,24 @@ def test_equals(filter_request_builder):
6868
assert str(builder.params) == "x=eq.a"
6969

7070

71+
def test_not_equal(filter_request_builder):
72+
builder = filter_request_builder.neq("x", "a")
73+
74+
assert str(builder.params) == "x=neq.a"
75+
76+
77+
def test_greater_than(filter_request_builder):
78+
builder = filter_request_builder.gt("x", "a")
79+
80+
assert str(builder.params) == "x=gt.a"
81+
82+
83+
def test_greater_than_or_equals_to(filter_request_builder):
84+
builder = filter_request_builder.gte("x", "a")
85+
86+
assert str(builder.params) == "x=gte.a"
87+
88+
7189
def test_contains(filter_request_builder):
7290
builder = filter_request_builder.contains("x", "a")
7391

@@ -100,3 +118,85 @@ def test_contained_by_mixed_items(filter_request_builder):
100118

101119
# {a,["b",%20"c"]}
102120
assert str(builder.params) == "x=cd.%7Ba%2C%5B%22b%22%2C%20%22c%22%5D%7D"
121+
122+
123+
def test_range_greater_than(filter_request_builder):
124+
builder = filter_request_builder.range_gt(
125+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
126+
)
127+
128+
# {a,["b",%20"c"]}
129+
assert str(builder.params) == "x=sr.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
130+
131+
132+
def test_range_greater_than_or_equal_to(filter_request_builder):
133+
builder = filter_request_builder.range_gte(
134+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
135+
)
136+
137+
# {a,["b",%20"c"]}
138+
assert (
139+
str(builder.params) == "x=nxl.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
140+
)
141+
142+
143+
def test_range_less_than(filter_request_builder):
144+
builder = filter_request_builder.range_lt(
145+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
146+
)
147+
148+
# {a,["b",%20"c"]}
149+
assert str(builder.params) == "x=sl.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
150+
151+
152+
def test_range_less_than_or_equal_to(filter_request_builder):
153+
builder = filter_request_builder.range_lte(
154+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
155+
)
156+
157+
# {a,["b",%20"c"]}
158+
assert (
159+
str(builder.params) == "x=nxr.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
160+
)
161+
162+
163+
def test_range_adjacent(filter_request_builder):
164+
builder = filter_request_builder.range_adjacent(
165+
"x", ["2000-01-02 08:30", "2000-01-02 09:30"]
166+
)
167+
168+
# {a,["b",%20"c"]}
169+
assert (
170+
str(builder.params) == "x=adj.%282000-01-02%2008%3A30%2C2000-01-02%2009%3A30%29"
171+
)
172+
173+
174+
def test_overlaps(filter_request_builder):
175+
builder = filter_request_builder.overlaps("x", ["is:closed", "severity:high"])
176+
177+
# {a,["b",%20"c"]}
178+
assert str(builder.params) == "x=ov.%7Bis%3Aclosed%2Cseverity%3Ahigh%7D"
179+
180+
181+
def test_like(filter_request_builder):
182+
builder = filter_request_builder.like("x", "%a%")
183+
184+
assert str(builder.params) == "x=like.%25a%25"
185+
186+
187+
def test_ilike(filter_request_builder):
188+
builder = filter_request_builder.ilike("x", "%a%")
189+
190+
assert str(builder.params) == "x=ilike.%25a%25"
191+
192+
193+
def test_is_(filter_request_builder):
194+
builder = filter_request_builder.is_("x", "a")
195+
196+
assert str(builder.params) == "x=is.a"
197+
198+
199+
def test_in_(filter_request_builder):
200+
builder = filter_request_builder.in_("x", ["a", "b"])
201+
202+
assert str(builder.params) == "x=in.%28a%2Cb%29"

0 commit comments

Comments
 (0)