From: Daniele Varrazzo Date: Thu, 16 Jun 2022 23:42:05 +0000 (+0200) Subject: test: fix version check using proper PostgreSQL version schema X-Git-Tag: 3.1~49^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1674aa453b824adf375e1b41ad945ca3acfbf13b;p=thirdparty%2Fpsycopg.git test: fix version check using proper PostgreSQL version schema Previously to specify "libpq 14.2" it was needed to use 14.0.2. --- diff --git a/tests/utils.py b/tests/utils.py index 496b241cc..d3c1ba76d 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -18,7 +18,7 @@ def check_libpq_version(got, want): and skips the test if the requested version doesn't match what's loaded. """ - return check_version(got, want, "libpq") + return check_version(got, want, "libpq", postgres_rule=True) def check_postgres_version(got, want): @@ -31,11 +31,11 @@ def check_postgres_version(got, want): and skips the test if the server version doesn't match what expected. """ - return check_version(got, want, "PostgreSQL") + return check_version(got, want, "PostgreSQL", postgres_rule=True) -def check_version(got, want, whose_version): - pred = VersionCheck.parse(want) +def check_version(got, want, whose_version, postgres_rule=True): + pred = VersionCheck.parse(want, postgres_rule=postgres_rule) pred.whose = whose_version return pred.get_skip_message(got) @@ -52,14 +52,17 @@ class VersionCheck: op: Optional[str] = None, version_tuple: Tuple[int, ...] = (), whose: str = "(wanted)", + postgres_rule: bool = False, ): self.skip = skip self.op = op or "==" self.version_tuple = version_tuple self.whose = whose + # Treat 10.1 as 10.0.1 + self.postgres_rule = postgres_rule @classmethod - def parse(cls, spec: str) -> "VersionCheck": + def parse(cls, spec: str, *, postgres_rule: bool = False) -> "VersionCheck": # Parse a spec like "> 9.6", "skip < 21.2.0" m = re.match( r"""(?ix) @@ -76,7 +79,10 @@ class VersionCheck: skip = (m.group(1) or "only").lower() == "skip" op = m.group(2) version_tuple = tuple(int(n) for n in m.groups()[2:] if n) - return cls(skip=skip, op=op, version_tuple=version_tuple) + + return cls( + skip=skip, op=op, version_tuple=version_tuple, postgres_rule=postgres_rule + ) def get_skip_message(self, version: Optional[int]) -> Optional[str]: got_tuple = self._parse_int_version(version) @@ -110,9 +116,15 @@ class VersionCheck: def _match_version(self, got_tuple: Tuple[int, ...]) -> bool: if not self.version_tuple: return True + + version_tuple = self.version_tuple + if self.postgres_rule and version_tuple and version_tuple[0] >= 10: + assert len(version_tuple) <= 2 + version_tuple = version_tuple[:1] + (0,) + version_tuple[1:] + op: Callable[[Tuple[int, ...], Tuple[int, ...]], bool] op = getattr(operator, self._OP_NAMES[self.op]) - return op(got_tuple, self.version_tuple) + return op(got_tuple, version_tuple) def _parse_int_version(self, version: Optional[int]) -> Tuple[int, ...]: if version is None: