from psycopg3 import pq
for m in request.node.iter_markers(name="libpq"):
- if not libpq_version_matches(pq.version(), m.args):
- pytest.skip(f"skipping test as libpq {pq.version()}")
+ check_libpq_version(pq.version(), m.args)
return pq
-def libpq_version_matches(got, want):
+def check_libpq_version(got, want):
# convert 90603 to (9, 6, 3), 120003 to (12, 0, 3)
got, got_fix = divmod(got, 100)
got_maj, got_min = divmod(got, 100)
- got = (got_maj, got_min, got_fix)
+ if got_maj >= 10:
+ got = (got_maj, got_fix)
+ else:
+ got = (got_maj, got_min, got_fix)
# Parse a spec like "> 9.6"
if len(want) != 1:
want_min = int(m.group(3) or "0")
want_fix = int(m.group(4) or "0")
if want_maj >= 10:
- if not want_fix:
- want_min, want_fix = 0, want_min
- else:
+ if want_fix:
pytest.fail(f"bad libpq version in {want}")
-
- want = (want_maj, want_min, want_fix)
+ want = (want_maj, want_min)
+ else:
+ want = (want_maj, want_min, want_fix)
op = getattr(
operator, {">=": "ge", "<=": "le", ">": "gt", "<": "lt"}[m.group(1)]
)
- return op(got, want)
+
+ if not op(got, want):
+ revops = {">=": "<", "<=": ">", ">": "<=", "<": ">="}
+ pytest.skip(
+ f"skipping test: libpq loaded is {'.'.join(map(str, got))}"
+ f" {revops[m.group(1)]} {'.'.join(map(str, want))}"
+ )
@pytest.fixture