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):
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)
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)
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)
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: