Skip to content

Commit d254b8c

Browse files
committed
Merge branch 'master' into develop
2 parents a2b1244 + 4c171d9 commit d254b8c

10 files changed

+106
-3
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ build
1111
dist
1212
*.egg-info
1313
venv/
14+
venv_*/
1415

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
empty\_if
2+
=========
3+
4+
.. currentmodule:: privex.helpers.common
5+
6+
.. autofunction:: empty_if

docs/source/helpers/privex.helpers.common.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ privex.helpers.common
1414
chunked
1515
dec_round
1616
empty
17+
empty_if
1718
env_bool
1819
env_csv
1920
env_cast
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
test\_emptyif\_only\_empty
2+
==========================
3+
4+
.. currentmodule:: tests.test_bool
5+
6+
.. automethod:: TestBoolHelpers.test_emptyif_only_empty
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
test\_emptyif\_only\_value
2+
==========================
3+
4+
.. currentmodule:: tests.test_bool
5+
6+
.. automethod:: TestBoolHelpers.test_emptyif_only_value
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
test\_emptyif\_with\_is\_not\_empty
2+
===================================
3+
4+
.. currentmodule:: tests.test_bool
5+
6+
.. automethod:: TestBoolHelpers.test_emptyif_with_is_not_empty

docs/source/helpers/tests/test_bool/tests.test_bool.TestBoolHelpers.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ TestBoolHelpers
44
.. currentmodule:: tests.test_bool
55

66
.. autoclass:: TestBoolHelpers
7-
:noindex:
7+
88

99
.. automethod:: __init__
1010
:noindex:
@@ -22,6 +22,9 @@ Methods
2222
~TestBoolHelpers.test_empty_lst
2323
~TestBoolHelpers.test_empty_vals
2424
~TestBoolHelpers.test_empty_zero
25+
~TestBoolHelpers.test_emptyif_only_empty
26+
~TestBoolHelpers.test_emptyif_only_value
27+
~TestBoolHelpers.test_emptyif_with_is_not_empty
2528
~TestBoolHelpers.test_isfalse_falsey
2629
~TestBoolHelpers.test_isfalse_truthy
2730
~TestBoolHelpers.test_istrue_falsey

privex/helpers/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def _setup_logging(level=logging.WARNING):
128128
log = _setup_logging()
129129
name = 'helpers'
130130

131-
VERSION = '2.4.0'
131+
VERSION = '2.4.1'
132132

133133

134134

privex/helpers/common.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
from collections import namedtuple
4848
from decimal import Decimal, getcontext
4949
from os import getenv as env
50-
from typing import Sequence, List, Union, Tuple, Type, Dict
50+
from typing import Sequence, List, Union, Tuple, Type, Dict, TypeVar, Any
5151

5252
log = logging.getLogger(__name__)
5353

@@ -123,6 +123,53 @@ def empty(v, zero: bool = False, itr: bool = False) -> bool:
123123
return False
124124

125125

126+
T = TypeVar('T')
127+
K = TypeVar('K')
128+
V = TypeVar('V')
129+
130+
USE_ORIG_VAR = type('UseOrigVar', (), {})
131+
132+
133+
def empty_if(v: V, is_empty: K = None, not_empty: T = USE_ORIG_VAR, **kwargs) -> Union[T, K, V]:
134+
"""
135+
Syntactic sugar for ``x if empty(y) else z``. If ``not_empty`` isn't specified, then the original value ``v``
136+
will be returned if it's not empty.
137+
138+
**Example 1**::
139+
140+
>>> def some_func(name=None):
141+
... name = empty_if(name, 'John Doe')
142+
... return name
143+
>>> some_func("")
144+
John Doe
145+
>>> some_func("Dave")
146+
Dave
147+
148+
**Example 2**::
149+
150+
>>> empty_if(None, 'is empty', 'is not empty')
151+
is empty
152+
>>> empty_if(12345, 'is empty', 'is not empty')
153+
is not empty
154+
155+
156+
:param Any v: The value to test for emptiness
157+
:param is_empty: The value to return if ``v`` is empty (defaults to ``None``)
158+
:param not_empty: The value to return if ``v`` is not empty (defaults to the original value ``v``)
159+
:param kwargs: Any additional kwargs to pass to :func:`.empty`
160+
161+
:key zero: if ``zero=True``, then v is empty if it's int ``0`` or str ``'0'``
162+
:key itr: if ``itr=True``, then v is empty if it's ``[]``, ``{}``, or is an iterable and has 0 length
163+
164+
:return V orig_var: The original value ``v`` is returned if ``not_empty`` isn't specified.
165+
:return K is_empty: The value specified as ``is_empty`` is returned if ``v`` is empty
166+
:return T not_empty: The value specified as ``not_empty`` is returned if ``v`` is not empty
167+
(and not_empty was specified)
168+
"""
169+
not_empty = v if not_empty == USE_ORIG_VAR else not_empty
170+
return is_empty if empty(v, **kwargs) else not_empty
171+
172+
126173
def is_true(v) -> bool:
127174
"""
128175
Check if a given bool/str/int value is some form of ``True``:

tests/test_bool.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,30 @@ def test_notempty(self):
9595
self.assertFalse(helpers.empty(['world'], itr=True))
9696
self.assertFalse(helpers.empty(('world',), itr=True))
9797
self.assertFalse(helpers.empty({'hello': 'world'}, itr=True))
98+
99+
def test_emptyif_with_is_not_empty(self):
100+
self.assertEqual(helpers.empty_if("", "empty", "not empty"), "empty")
101+
self.assertEqual(helpers.empty_if(None, "empty", "not empty"), "empty")
102+
self.assertEqual(helpers.empty_if(0, "empty", "not empty", zero=True), "empty")
103+
104+
self.assertEqual(helpers.empty_if("hello", "empty", "not empty"), "not empty")
105+
self.assertEqual(helpers.empty_if(1234, "empty", "not empty"), "not empty")
106+
self.assertEqual(helpers.empty_if([1, 2, 3], "empty", "not empty"), "not empty")
107+
108+
def test_emptyif_only_empty(self):
109+
self.assertEqual(helpers.empty_if("", "empty"), "empty")
110+
self.assertEqual(helpers.empty_if(None, "empty"), "empty")
111+
self.assertEqual(helpers.empty_if(0, "empty", zero=True), "empty")
112+
113+
self.assertEqual(helpers.empty_if("hello", "empty"), "hello")
114+
self.assertEqual(helpers.empty_if(1234, "empty"), 1234)
115+
self.assertListEqual(helpers.empty_if([1, 2, 3], "empty"), [1, 2, 3])
116+
117+
def test_emptyif_only_value(self):
118+
self.assertIsNone(helpers.empty_if(""))
119+
self.assertIsNone(helpers.empty_if(None))
120+
self.assertIsNone(helpers.empty_if(0, zero=True))
121+
122+
self.assertEqual(helpers.empty_if("hello"), "hello")
123+
self.assertEqual(helpers.empty_if(1234), 1234)
124+
self.assertListEqual(helpers.empty_if([1, 2, 3]), [1, 2, 3])

0 commit comments

Comments
 (0)