Skip to content

Commit ecda4bd

Browse files
author
Jordi Bagot
committed
Add re type
1 parent c262002 commit ecda4bd

File tree

5 files changed

+32
-3
lines changed

5 files changed

+32
-3
lines changed

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ The format is *inspired* by `Keep a Changelog <http://keepachangelog.com/en/1.0.
66
and this project adheres to `Semantic Versioning <http://semver.org/spec/v2.0.0.html>`_.
77

88

9+
`unreleased`_
10+
--------------------------
11+
Added
12+
+++++
13+
- New type: re
14+
15+
916
`v0.4.5`_ - 25-June-2018
1017
--------------------------
1118
Added

README.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ Supported types
119119
- dict (BAR=key=val,foo=bar) #environ.Env(BAR=(dict, {}))
120120
- dict (BAR=key=val;foo=1.1;baz=True) #environ.Env(BAR=(dict(value=unicode, cast=dict(foo=float,baz=bool)), {}))
121121
- url
122+
- re
122123
- path (environ.Path)
123124
- db_url
124125
- PostgreSQL: postgres://, pgsql://, psql:// or postgresql://
@@ -207,7 +208,7 @@ Some settings such as Django's ``ADMINS`` make use of nested lists. You can use
207208
.. code-block:: python
208209
209210
# DJANGO_ADMINS=John:[email protected],Jane:[email protected]
210-
ADMINS = [x.split(':') for x in env.list('DJANGO_ADMINS')]
211+
ADMINS = [x.split(':') for x in env.list('DJANGO_ADMINS')]
211212
212213
# or use more specific function
213214

environ/environ.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,20 @@ def path(self, var, default=NOTSET, **kwargs):
233233
"""
234234
return Path(self.get_value(var, default=default), **kwargs)
235235

236+
def re(self, var, regex, default=NOTSET):
237+
"""Returns the string that satisfies the given regex.
238+
If it's not satisfied returns the var as string
239+
240+
:param var: Name of variable.
241+
:param regex: Regular expression to apply to var.
242+
:param default: If var not present in environ, return this instead.
243+
244+
:returns: str
245+
"""
246+
str_var = self.str(var, default)
247+
re_obj = re.search(regex, str_var)
248+
return re_obj.group(0) if re_obj else str_var
249+
236250
def get_value(self, var, cast=None, default=NOTSET, parse_default=False):
237251
"""Return value for given environment variable.
238252
@@ -768,7 +782,7 @@ def __unicode__(self):
768782

769783
def __getitem__(self, *args, **kwargs):
770784
return self.__str__().__getitem__(*args, **kwargs)
771-
785+
772786
def __fspath__(self):
773787
return self.__str__()
774788

environ/test.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class BaseTests(unittest.TestCase):
3434
def generateData(cls):
3535
return dict(STR_VAR='bar',
3636
MULTILINE_STR_VAR='foo\\nbar',
37+
STR_RE_VAR='bar-1.0.0',
3738
INT_VAR='42',
3839
FLOAT_VAR='33.3',
3940
FLOAT_COMMA_VAR='33,3',
@@ -97,6 +98,11 @@ def test_str(self):
9798
self.assertTypeAndValue(str, 'foo\\nbar', self.env.str('MULTILINE_STR_VAR'))
9899
self.assertTypeAndValue(str, 'foo\nbar', self.env.str('MULTILINE_STR_VAR', multiline=True))
99100

101+
def test_re(self):
102+
self.assertTypeAndValue(str, '1.0.0', self.env.re('STR_RE_VAR', r'\d+.\d+.\d+'))
103+
self.assertTypeAndValue(str, 'foo', self.env.re('MULTILINE_STR_VAR', r'\w+'))
104+
self.assertTypeAndValue(str, 'bar', self.env.re('STR_VAR', r'\d+'))
105+
100106
def test_bytes(self):
101107
self.assertTypeAndValue(bytes, b'bar', self.env.bytes('STR_VAR'))
102108

@@ -395,7 +401,7 @@ def test_memory_sqlite_url(self):
395401

396402
self.assertEqual(url['ENGINE'], 'django.db.backends.sqlite3')
397403
self.assertEqual(url['NAME'], ':memory:')
398-
404+
399405
def test_memory_sqlite_url_warns_about_netloc(self):
400406
url = 'sqlite://missing-slash-path'
401407
with warnings.catch_warnings(record=True) as w:

environ/test_env.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ INT_VAR=42
2323
STR_LIST_WITH_SPACES= foo, bar
2424
STR_VAR=bar
2525
MULTILINE_STR_VAR=foo\nbar
26+
STR_RE_VAR=bar-1.0.0
2627
INT_LIST=42,33
2728
CYRILLIC_VAR=фуубар
2829
INT_TUPLE=(42,33)

0 commit comments

Comments
 (0)