From f141395ce73acc3d1461ff21a29813c1e9e15baf Mon Sep 17 00:00:00 2001 From: Sameera Date: Tue, 7 May 2019 11:50:40 -0400 Subject: [PATCH 1/7] for issue 334 --- src/future/builtins/__init__.py | 4 +-- src/future/builtins/misc.py | 9 ++++++- src/future/builtins/new_min_max.py | 43 ++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 src/future/builtins/new_min_max.py diff --git a/src/future/builtins/__init__.py b/src/future/builtins/__init__.py index 216465a1..8bc1649d 100644 --- a/src/future/builtins/__init__.py +++ b/src/future/builtins/__init__.py @@ -11,7 +11,7 @@ # The isinstance import is no longer needed. We provide it only for # backward-compatibility with future v0.8.2. It will be removed in future v1.0. from future.builtins.misc import (ascii, chr, hex, input, isinstance, next, - oct, open, pow, round, super) + oct, open, pow, round, super, max, min) from future.utils import PY3 if PY3: @@ -43,7 +43,7 @@ __all__ = ['filter', 'map', 'zip', 'ascii', 'chr', 'hex', 'input', 'next', 'oct', 'open', 'pow', 'round', 'super', - 'bytes', 'dict', 'int', 'list', 'object', 'range', 'str', + 'bytes', 'dict', 'int', 'list', 'object', 'range', 'str', 'max', 'min' ] else: diff --git a/src/future/builtins/misc.py b/src/future/builtins/misc.py index 90dc384a..b0b67066 100644 --- a/src/future/builtins/misc.py +++ b/src/future/builtins/misc.py @@ -13,6 +13,8 @@ - ``open`` (equivalent to io.open on Py2) - ``super`` (backport of Py3's magic zero-argument super() function - ``round`` (new "Banker's Rounding" behaviour from Py3) +- ``max`` (new max behaviour from Py3) +- ``min`` (new min behaviour from Py3) ``isinstance`` is also currently exported for backwards compatibility with v0.8.2, although this has been deprecated since v0.9. @@ -59,6 +61,8 @@ from future.builtins.newnext import newnext as next from future.builtins.newround import newround as round from future.builtins.newsuper import newsuper as super + from future.builtins.new_min_max import newmax as max + from future.builtins.new_min_max import newmin as min from future.types.newint import newint _SENTINEL = object() @@ -89,11 +93,12 @@ def pow(x, y, z=_SENTINEL): else: return _builtin_pow(x+0j, y, z) + # ``future`` doesn't support Py3.0/3.1. If we ever did, we'd add this: # callable = __builtin__.callable __all__ = ['ascii', 'chr', 'hex', 'input', 'isinstance', 'next', 'oct', - 'open', 'pow', 'round', 'super'] + 'open', 'pow', 'round', 'super', 'max', 'min'] else: import builtins @@ -109,6 +114,8 @@ def pow(x, y, z=_SENTINEL): pow = builtins.pow round = builtins.round super = builtins.super + max = builtins.max + min = builtins.min __all__ = [] diff --git a/src/future/builtins/new_min_max.py b/src/future/builtins/new_min_max.py new file mode 100644 index 00000000..128a7f16 --- /dev/null +++ b/src/future/builtins/new_min_max.py @@ -0,0 +1,43 @@ +from __builtin__ import max as _builtin_max, min as _builtin_min + + +def newmin(*args, **kwargs): + return new_min_max(_builtin_min, *args, **kwargs) + + +def newmax(*args, **kwargs): + return new_min_max(_builtin_max, *args, **kwargs) + + +def new_min_max(_builtin_func, *args, **kwargs): + """ + To support the argument "default" introduced in python 3.4 for min and max + :param _builtin_func: builtin min or builtin max + :param args: + :param kwargs: + :return: returns the min or max based on the arguments passed + """ + + for key, _ in kwargs.items(): + if key not in set(['key', 'default']): + raise TypeError('Illegal argument %s', key) + + if len(args) != 1 and kwargs.get('default') is not None: + raise TypeError + + if len(args) == 1: + if len(args[0]) == 0: + if kwargs.get('default') is not None: + return kwargs.get('default') + else: + raise ValueError('iterable is an empty sequence') + if kwargs.get('key') is not None: + return _builtin_func(args[0], key=kwargs.get('key')) + else: + return _builtin_func(args[0]) + + if len(args) > 1: + if kwargs.get('key') is not None: + return _builtin_func(args, key=kwargs.get('key')) + else: + return _builtin_func(args) From 98e8ae154e90434be0a32205c5f78b22c201afb3 Mon Sep 17 00:00:00 2001 From: Sameera Date: Tue, 7 May 2019 13:56:35 -0400 Subject: [PATCH 2/7] adding tests and fixing functions --- src/future/builtins/new_min_max.py | 9 +++++++-- tests/test_future/test_builtins.py | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/future/builtins/new_min_max.py b/src/future/builtins/new_min_max.py index 128a7f16..1adbd491 100644 --- a/src/future/builtins/new_min_max.py +++ b/src/future/builtins/new_min_max.py @@ -19,14 +19,19 @@ def new_min_max(_builtin_func, *args, **kwargs): """ for key, _ in kwargs.items(): - if key not in set(['key', 'default']): + if key not in {'key', 'default'}: raise TypeError('Illegal argument %s', key) + if len(args) == 0: + raise TypeError + if len(args) != 1 and kwargs.get('default') is not None: raise TypeError if len(args) == 1: - if len(args[0]) == 0: + try: + next(iter(args[0])) + except StopIteration: if kwargs.get('default') is not None: return kwargs.get('default') else: diff --git a/tests/test_future/test_builtins.py b/tests/test_future/test_builtins.py index 05d597a5..a514d697 100644 --- a/tests/test_future/test_builtins.py +++ b/tests/test_future/test_builtins.py @@ -6,7 +6,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals from future.builtins import (bytes, dict, int, range, round, str, super, ascii, chr, hex, input, next, oct, open, pow, - filter, map, zip) + filter, map, zip, min, max) from future.utils import PY3, exec_, native_str, implements_iterator from future.tests.base import (unittest, skip26, expectedFailurePY2, @@ -138,6 +138,7 @@ def test_round(self): self.assertEqual(round(0.125000001, 2), 0.13) self.assertEqual(round(123.5, 0), 124.0) self.assertEqual(round(123.5), 124) + self.assertEqual(round(123.5), 124) self.assertEqual(round(12.35, 2), 12.35) self.assertEqual(round(12.35, 1), 12.3) self.assertEqual(round(12.35, 0), 12.0) @@ -1099,6 +1100,13 @@ def test_max(self): self.assertEqual(max(data, key=f), sorted(reversed(data), key=f)[-1]) + self.assertEqual(max([], default=5), 5) + with self.assertRaises(TypeError): + max(None, default=5) + with self.assertRaises(TypeError): + max(1, 2, default=0) + self.assertEqual(max([], default=0), 0) + def test_min(self): self.assertEqual(min('123123'), '1') self.assertEqual(min(1, 2, 3), 1) @@ -1140,6 +1148,12 @@ def __getitem__(self, index): f = keys.__getitem__ self.assertEqual(min(data, key=f), sorted(data, key=f)[0]) + self.assertEqual(min([], default=5), 5) + self.assertEqual(min([], default=0), 0) + with self.assertRaises(TypeError): + max(None, default=5) + with self.assertRaises(TypeError): + max(1, 2, default=0) def test_next(self): it = iter(range(2)) From 5c3f9949614b92bf75132c0f122d099363b957d7 Mon Sep 17 00:00:00 2001 From: Sameera Date: Tue, 7 May 2019 14:17:03 -0400 Subject: [PATCH 3/7] minor changes --- src/future/builtins/misc.py | 4 ++-- tests/test_future/test_builtins.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/future/builtins/misc.py b/src/future/builtins/misc.py index b0b67066..52d19926 100644 --- a/src/future/builtins/misc.py +++ b/src/future/builtins/misc.py @@ -13,8 +13,8 @@ - ``open`` (equivalent to io.open on Py2) - ``super`` (backport of Py3's magic zero-argument super() function - ``round`` (new "Banker's Rounding" behaviour from Py3) -- ``max`` (new max behaviour from Py3) -- ``min`` (new min behaviour from Py3) +- ``max`` (new default option from Py3) +- ``min`` (new default option from Py3) ``isinstance`` is also currently exported for backwards compatibility with v0.8.2, although this has been deprecated since v0.9. diff --git a/tests/test_future/test_builtins.py b/tests/test_future/test_builtins.py index a514d697..d983f9d6 100644 --- a/tests/test_future/test_builtins.py +++ b/tests/test_future/test_builtins.py @@ -138,7 +138,6 @@ def test_round(self): self.assertEqual(round(0.125000001, 2), 0.13) self.assertEqual(round(123.5, 0), 124.0) self.assertEqual(round(123.5), 124) - self.assertEqual(round(123.5), 124) self.assertEqual(round(12.35, 2), 12.35) self.assertEqual(round(12.35, 1), 12.3) self.assertEqual(round(12.35, 0), 12.0) From fbea2790e6ab207681cd7049cea2b79e52548af9 Mon Sep 17 00:00:00 2001 From: Sameera Date: Tue, 7 May 2019 15:04:04 -0400 Subject: [PATCH 4/7] set represenation for python 2.6 --- src/future/builtins/new_min_max.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/future/builtins/new_min_max.py b/src/future/builtins/new_min_max.py index 1adbd491..2858e541 100644 --- a/src/future/builtins/new_min_max.py +++ b/src/future/builtins/new_min_max.py @@ -19,7 +19,7 @@ def new_min_max(_builtin_func, *args, **kwargs): """ for key, _ in kwargs.items(): - if key not in {'key', 'default'}: + if key not in set(['key', 'default']): raise TypeError('Illegal argument %s', key) if len(args) == 0: From ee0d6dc217be6ee051c1fe058d426a21d73100c3 Mon Sep 17 00:00:00 2001 From: Sameera Date: Tue, 7 May 2019 15:31:17 -0400 Subject: [PATCH 5/7] fix for python 3.3 and below --- src/future/builtins/misc.py | 9 +++++++-- src/future/utils/__init__.py | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/future/builtins/misc.py b/src/future/builtins/misc.py index 52d19926..0691dc3a 100644 --- a/src/future/builtins/misc.py +++ b/src/future/builtins/misc.py @@ -13,8 +13,8 @@ - ``open`` (equivalent to io.open on Py2) - ``super`` (backport of Py3's magic zero-argument super() function - ``round`` (new "Banker's Rounding" behaviour from Py3) -- ``max`` (new default option from Py3) -- ``min`` (new default option from Py3) +- ``max`` (new default option from Py3.4) +- ``min`` (new default option from Py3.4) ``isinstance`` is also currently exported for backwards compatibility with v0.8.2, although this has been deprecated since v0.9. @@ -100,6 +100,11 @@ def pow(x, y, z=_SENTINEL): __all__ = ['ascii', 'chr', 'hex', 'input', 'isinstance', 'next', 'oct', 'open', 'pow', 'round', 'super', 'max', 'min'] +elif not utils.PY34_PLUS: + from future.builtins.new_min_max import newmax as max + from future.builtins.new_min_max import newmin as min + __all__ = ['min', 'max'] + else: import builtins ascii = builtins.ascii diff --git a/src/future/utils/__init__.py b/src/future/utils/__init__.py index 090a2bbe..9ce2ec08 100644 --- a/src/future/utils/__init__.py +++ b/src/future/utils/__init__.py @@ -56,6 +56,7 @@ PY3 = sys.version_info[0] >= 3 +PY34_PLUS = sys.version_info[0:2] >= (3, 4) PY35_PLUS = sys.version_info[0:2] >= (3, 5) PY36_PLUS = sys.version_info[0:2] >= (3, 6) PY2 = sys.version_info[0] == 2 From 4102c9a14d5208914902858da2912806c1ae5e1e Mon Sep 17 00:00:00 2001 From: Sameera Date: Tue, 7 May 2019 16:00:27 -0400 Subject: [PATCH 6/7] correction for python 3.3 and below --- src/future/builtins/misc.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/future/builtins/misc.py b/src/future/builtins/misc.py index 0691dc3a..f86ce5f3 100644 --- a/src/future/builtins/misc.py +++ b/src/future/builtins/misc.py @@ -100,11 +100,6 @@ def pow(x, y, z=_SENTINEL): __all__ = ['ascii', 'chr', 'hex', 'input', 'isinstance', 'next', 'oct', 'open', 'pow', 'round', 'super', 'max', 'min'] -elif not utils.PY34_PLUS: - from future.builtins.new_min_max import newmax as max - from future.builtins.new_min_max import newmin as min - __all__ = ['min', 'max'] - else: import builtins ascii = builtins.ascii @@ -119,10 +114,14 @@ def pow(x, y, z=_SENTINEL): pow = builtins.pow round = builtins.round super = builtins.super - max = builtins.max - min = builtins.min - - __all__ = [] + if utils.PY34_PLUS: + max = builtins.max + min = builtins.min + __all__ = [] + else: + from future.builtins.new_min_max import newmax as max + from future.builtins.new_min_max import newmin as min + __all__ = ['min', 'max'] # The callable() function was removed from Py3.0 and 3.1 and # reintroduced into Py3.2+. ``future`` doesn't support Py3.0/3.1. If we ever From 61c9aec4aa4113aee3e37edbca97658a00632819 Mon Sep 17 00:00:00 2001 From: Sameera Date: Tue, 7 May 2019 16:13:01 -0400 Subject: [PATCH 7/7] fixing builtin library for python 3.3 and below in min, max --- src/future/builtins/new_min_max.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/future/builtins/new_min_max.py b/src/future/builtins/new_min_max.py index 2858e541..8fd63fdf 100644 --- a/src/future/builtins/new_min_max.py +++ b/src/future/builtins/new_min_max.py @@ -1,4 +1,8 @@ -from __builtin__ import max as _builtin_max, min as _builtin_min +from future import utils +if utils.PY2: + from __builtin__ import max as _builtin_max, min as _builtin_min +else: + from builtins import max as _builtin_max, min as _builtin_min def newmin(*args, **kwargs):