From cc46f14f10d771ea3f3e41b919d64565bed7fcef Mon Sep 17 00:00:00 2001 From: Kassym Dorsel Date: Thu, 23 Apr 2020 21:25:02 -0400 Subject: [PATCH 1/7] Add issubset, issuperset and size to Range type --- asyncpg/types.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/asyncpg/types.py b/asyncpg/types.py index 5124718f..44833df1 100644 --- a/asyncpg/types.py +++ b/asyncpg/types.py @@ -85,6 +85,52 @@ def upper_inf(self): def isempty(self): return self._empty + def issubset(self, other): + if self._empty: + return True + if other._empty: + return False + + if other._lower is None: + lowerOk = True + else: + if self._lower is None: + return False + if other._lower_inc or not self._lower_inc: + lowerOk = self._lower >= other._lower + else: + lowerOk = self._lower > other._lower + + if not lowerOk: + return False + + if other._upper is None: + upperOk = True + else: + if self._upper is None: + return False + if other._upper_inc or not self._upper_inc: + upperOk = self._upper <= other._upper + else: + upperOk = self._upper < other._upper + + return lowerOk and upperOk + + def issuperset(self, other): + return other.issubset(self) + + def size(self, step=None): + if self._upper is None or self._lower is None: + return None + if step is None or self._upper_inc != self._lower_inc: + step = 0 + else: + step = abs(step) + if not self._upper_inc: + step *= -1 + + return step + self._upper - self._lower + def __bool__(self): return not self._empty From 7096db1e0e588bba8cd7521173f772c9689f2efe Mon Sep 17 00:00:00 2001 From: Kassym Dorsel Date: Fri, 24 Apr 2020 10:17:29 -0400 Subject: [PATCH 2/7] Separate out lower and upper subset checks --- asyncpg/types.py | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/asyncpg/types.py b/asyncpg/types.py index 44833df1..ebf3bb88 100644 --- a/asyncpg/types.py +++ b/asyncpg/types.py @@ -85,41 +85,40 @@ def upper_inf(self): def isempty(self): return self._empty - def issubset(self, other): - if self._empty: + def _issubset_lower(self, other): + if other._lower is None: return True - if other._empty: + if self._lower is None: return False - if other._lower is None: - lowerOk = True - else: - if self._lower is None: - return False - if other._lower_inc or not self._lower_inc: - lowerOk = self._lower >= other._lower - else: - lowerOk = self._lower > other._lower + return self._lower > other._lower or ( + self._lower == other._lower and (other._lower_inc or not self._lower_inc) + ) - if not lowerOk: + def _issubset_upper(self, other): + if other._upper is None: + return True + if self._upper is None: return False - if other._upper is None: - upperOk = True - else: - if self._upper is None: - return False - if other._upper_inc or not self._upper_inc: - upperOk = self._upper <= other._upper - else: - upperOk = self._upper < other._upper + return self._upper < other._upper or ( + self._upper == other._upper and (other._upper_inc or not self._upper_inc) + ) + + def issubset(self, other): + if self._empty: + return True + if other._empty: + return False - return lowerOk and upperOk + return self._issubset_lower(other) and self._issubset_upper(other) def issuperset(self, other): return other.issubset(self) def size(self, step=None): + if self._empty: + return 0 if self._upper is None or self._lower is None: return None if step is None or self._upper_inc != self._lower_inc: From 534dce44b0e5386401f28519f79a576506c9841c Mon Sep 17 00:00:00 2001 From: Kassym Dorsel Date: Sat, 25 Apr 2020 16:36:45 -0400 Subject: [PATCH 3/7] Remove size method Hard to generalize. Based on specific usage --- asyncpg/types.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/asyncpg/types.py b/asyncpg/types.py index ebf3bb88..1c2effdc 100644 --- a/asyncpg/types.py +++ b/asyncpg/types.py @@ -116,20 +116,6 @@ def issubset(self, other): def issuperset(self, other): return other.issubset(self) - def size(self, step=None): - if self._empty: - return 0 - if self._upper is None or self._lower is None: - return None - if step is None or self._upper_inc != self._lower_inc: - step = 0 - else: - step = abs(step) - if not self._upper_inc: - step *= -1 - - return step + self._upper - self._lower - def __bool__(self): return not self._empty From 44960d3db4919c9597fa37f52d10ee02e8b219fc Mon Sep 17 00:00:00 2001 From: Kassym Dorsel Date: Sat, 25 Apr 2020 23:22:35 -0400 Subject: [PATCH 4/7] Add Range type tests --- tests/test_types.py | 51 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 tests/test_types.py diff --git a/tests/test_types.py b/tests/test_types.py new file mode 100644 index 00000000..995ecd73 --- /dev/null +++ b/tests/test_types.py @@ -0,0 +1,51 @@ +# Copyright (C) 2016-present the ayncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from itertools import product + +from asyncpg.types import Range +from asyncpg import _testbase as tb + +class TestTypes(tb.TestCase): + + def test_range_issubset(self): + subs = [ + Range(empty=True), + Range(lower=1, upper=5, lower_inc=True, upper_inc=False), + Range(lower=1, upper=5, lower_inc=True, upper_inc=True), + Range(lower=1, upper=5, lower_inc=False, upper_inc=True), + Range(lower=1, upper=5, lower_inc=False, upper_inc=False), + Range(lower=-5, upper=10), + Range(lower=2, upper=3), + Range(lower=1, upper=None), + Range(lower=None, upper=None) + ] + + sups = [ + Range(empty=True), + Range(lower=1, upper=5, lower_inc=True, upper_inc=False), + Range(lower=1, upper=5, lower_inc=True, upper_inc=True), + Range(lower=1, upper=5, lower_inc=False, upper_inc=True), + Range(lower=1, upper=5, lower_inc=False, upper_inc=False), + Range(lower=None, upper=None) + ] + + # Each row is 1 subs with all sups + results = [ + True, True, True, True, True, True, + False, True, True, False, False, True, + False, False, True, False, False, True, + False, False, True, True, False, True, + False, True, True, True, True, True, + False, False, False, False, False, True, + False, True, True, True, True, True, + False, False, False, False, False, True, + False, False, False, False, False, True + ] + + for (sub, sup), res in zip(product(subs, sups), results): + self.assertIs(sub.issubset(sup), res, f'Sub:{sub}, Sup:{sup}') + self.assertIs(sup.issuperset(sub), res, f'Sub:{sub}, Sup:{sup}') From 9cb36ac6f4b07f0451d8ab96b0e273bcc07a2d5a Mon Sep 17 00:00:00 2001 From: Kassym Dorsel Date: Sun, 26 Apr 2020 12:05:03 -0400 Subject: [PATCH 5/7] Replace f-strings for python 3.5 support --- tests/test_types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_types.py b/tests/test_types.py index 995ecd73..91feae48 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -47,5 +47,5 @@ def test_range_issubset(self): ] for (sub, sup), res in zip(product(subs, sups), results): - self.assertIs(sub.issubset(sup), res, f'Sub:{sub}, Sup:{sup}') - self.assertIs(sup.issuperset(sub), res, f'Sub:{sub}, Sup:{sup}') + self.assertIs(sub.issubset(sup), res, "Sub:{}, Sup:{}".format(sub, sup)) + self.assertIs(sup.issuperset(sub), res, "Sub:{}, Sup:{}".format(sub, sup)) From ae69caa78927ffaee3b46b7bc7cc729dcd7b3646 Mon Sep 17 00:00:00 2001 From: Kassym Dorsel Date: Sat, 2 May 2020 21:27:22 -0400 Subject: [PATCH 6/7] flake8 fixes --- asyncpg/types.py | 6 ++++-- tests/test_types.py | 8 ++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/asyncpg/types.py b/asyncpg/types.py index 1c2effdc..bd5813fc 100644 --- a/asyncpg/types.py +++ b/asyncpg/types.py @@ -92,7 +92,8 @@ def _issubset_lower(self, other): return False return self._lower > other._lower or ( - self._lower == other._lower and (other._lower_inc or not self._lower_inc) + self._lower == other._lower + and (other._lower_inc or not self._lower_inc) ) def _issubset_upper(self, other): @@ -102,7 +103,8 @@ def _issubset_upper(self, other): return False return self._upper < other._upper or ( - self._upper == other._upper and (other._upper_inc or not self._upper_inc) + self._upper == other._upper + and (other._upper_inc or not self._upper_inc) ) def issubset(self, other): diff --git a/tests/test_types.py b/tests/test_types.py index 91feae48..0ca668b1 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -47,5 +47,9 @@ def test_range_issubset(self): ] for (sub, sup), res in zip(product(subs, sups), results): - self.assertIs(sub.issubset(sup), res, "Sub:{}, Sup:{}".format(sub, sup)) - self.assertIs(sup.issuperset(sub), res, "Sub:{}, Sup:{}".format(sub, sup)) + self.assertIs( + sub.issubset(sup), res, "Sub:{}, Sup:{}".format(sub, sup) + ) + self.assertIs( + sup.issuperset(sub), res, "Sub:{}, Sup:{}".format(sub, sup) + ) From 07480c4badcaef9cc1b2c11db408edeaea11fc70 Mon Sep 17 00:00:00 2001 From: Elvis Pranskevichus Date: Mon, 2 Aug 2021 14:56:57 -0700 Subject: [PATCH 7/7] Update tests/test_types.py --- tests/test_types.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_types.py b/tests/test_types.py index 0ca668b1..04241953 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -9,6 +9,7 @@ from asyncpg.types import Range from asyncpg import _testbase as tb + class TestTypes(tb.TestCase): def test_range_issubset(self):