Skip to content

Commit

Permalink
Show reserved field warning at intuitive level
Browse files Browse the repository at this point in the history
  • Loading branch information
avylove committed Jul 25, 2020
1 parent 27cdf89 commit 76f5998
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 21 deletions.
11 changes: 4 additions & 7 deletions enlighten/_counter.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@
import re
import sys
import time
import warnings

from enlighten._basecounter import BaseCounter, PrintableCounter
from enlighten._util import EnlightenWarning, format_time
from enlighten._util import EnlightenWarning, format_time, warn_best_level

COUNTER_FMT = u'{desc}{desc_pad}{count:d} {unit}{unit_pad}' + \
u'[{elapsed}, {rate:.2f}{unit_pad}{unit}/s]{fill}'
Expand Down Expand Up @@ -515,11 +514,9 @@ def format(self, width=None, elapsed=None):
match.group() for match in (RE_SUBCOUNTER_FIELDS.match(key) for key in fields) if match
)
if reserved_fields:
warnings.warn(
'Ignoring reserved fields specified as user-defined fields: %s' %
', '.join(reserved_fields),
EnlightenWarning, stacklevel=2
)
warn_best_level('Ignoring reserved fields specified as user-defined fields: %s' %
', '.join(reserved_fields),
EnlightenWarning)

fields.update({'bar': u'{0}',
'count': self.count,
Expand Down
11 changes: 4 additions & 7 deletions enlighten/_statusbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@
"""

import time
import warnings

from enlighten._basecounter import PrintableCounter
from enlighten._util import EnlightenWarning, format_time, Justify
from enlighten._util import EnlightenWarning, format_time, Justify, warn_best_level


STATUS_FIELDS = {'elapsed', 'fill'}
Expand Down Expand Up @@ -194,11 +193,9 @@ def format(self, width=None, elapsed=None):
# Warn on reserved fields
reserved_fields = (set(fields) & STATUS_FIELDS)
if reserved_fields:
warnings.warn(
'Ignoring reserved fields specified as user-defined fields: %s' %
', '.join(reserved_fields),
EnlightenWarning, stacklevel=2
)
warn_best_level('Ignoring reserved fields specified as user-defined fields: %s' %
', '.join(reserved_fields),
EnlightenWarning)

elapsed = elapsed if elapsed is not None else self.elapsed
fields['elapsed'] = format_time(elapsed)
Expand Down
19 changes: 19 additions & 0 deletions enlighten/_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,37 @@
Provides utility functions and objects
"""

import inspect
import os
import warnings

try:
BASESTRING = basestring
except NameError:
BASESTRING = str

BASE_DIR = os.path.basename(os.path.dirname(__file__))


class EnlightenWarning(Warning):
"""
Generic warning class for Enlighten
"""


def warn_best_level(message, category):
"""
Helper function to warn at first frame stack outside of library
"""

level = 5 # Unused default
for level, frame in enumerate(inspect.stack(), 1): # pragma: no cover
if os.path.basename(os.path.dirname(frame[1])) != BASE_DIR:
break

warnings.warn(message, category=category, stacklevel=level)


def format_time(seconds):
"""
Args:
Expand Down
14 changes: 9 additions & 5 deletions tests/test_counter.py
Original file line number Diff line number Diff line change
Expand Up @@ -764,23 +764,27 @@ def test_fill(self):
self.assertEqual(ctr.format(), u'-' * 39 + 'HI' + u'-' * 39)

@unittest.skipIf(PY2, 'Skip warnings tests in Python 2')
def test_reserve_fields(self):
def test_reserved_fields(self):
"""
When reserved fields are used, a warning is raised
"""

ctr = Counter(stream=self.tty.stdout, total=10, count=1, fields={'elapsed': 'reserved'})
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields'):
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn:
ctr.format()
self.assertRegex(__file__, warn.filename)

ctr = Counter(stream=self.tty.stdout, total=10, fields={'elapsed': 'reserved'})
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields'):
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn:
ctr.format()
self.assertRegex(__file__, warn.filename)

ctr = Counter(stream=self.tty.stdout, total=10, count=1, elapsed='reserved')
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields'):
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn:
ctr.format()
self.assertRegex(__file__, warn.filename)

ctr = Counter(stream=self.tty.stdout, total=10, elapsed='reserved')
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields'):
with self.assertWarns(EnlightenWarning) as warn:
ctr.format()
self.assertRegex(__file__, warn.filename)
6 changes: 4 additions & 2 deletions tests/test_statusbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,12 @@ def test_reserve_fields(self):
When reserved fields are used, a warning is raised
"""

with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields'):
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn:
self.manager.status_bar(status_format=u'Stage: {stage}, Fill: {fill}', stage=1,
fields={'fill': 'Reserved field'})
self.assertRegex(__file__, warn.filename)

with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields'):
with self.assertWarnsRegex(EnlightenWarning, 'Ignoring reserved fields') as warn:
self.manager.status_bar(status_format=u'Stage: {stage}, elapsed: {elapsed}', stage=1,
elapsed='Reserved field')
self.assertRegex(__file__, warn.filename)

0 comments on commit 76f5998

Please sign in to comment.