]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
test: fix version check using proper PostgreSQL version schema
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 16 Jun 2022 23:42:05 +0000 (01:42 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 12 Jul 2022 11:58:34 +0000 (12:58 +0100)
Previously to specify "libpq 14.2" it was needed to use 14.0.2.

tests/utils.py

index 496b241cc17d7f4d54d927e9b5f4bfc29eb74d77..d3c1ba76d3232cd8f7a29b245194e9b5c94e582a 100644 (file)
@@ -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: