From c1991cd38010422a5c1cddf250bc01069a6032e9 Mon Sep 17 00:00:00 2001 From: RussellBallestrini Date: Thu, 23 May 2013 09:42:39 -0400 Subject: [PATCH] Reverted back to using a counter 'count' to keep track of precision. Using our own counter, opposed to enumerates, allows us to skip increment:: if d[ unit ] == 0: continue # skip 0's The continue moves us back to the top of the loop, and which bypasses count += 1. This allows us to have a datetime/timedelta that has a 0 value for a unit, and it will not effect precision fufillment. For example, review this test:: ONE_YEAR_FOUR_HOURS_DELTA = timedelta( 365, 14400, 0 ) def test_zero_day_is_skipped_display_hour(): _result = human( ONE_YEAR_FOUR_HOURS_DELTA, precision = 2 ) assert 'year' in _result # day is 0 so it is skipped, so we should show hours ... assert 'hour' in _result This test will fail using enumerate or using a slice on the units[:precision] tuple. --- ago.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ago.py b/ago.py index de4dbb1..7efe64c 100644 --- a/ago.py +++ b/ago.py @@ -25,11 +25,14 @@ def human(dt, precision=2, past_tense='{} ago', future_tense='in {}'): d = delta2dict( delta ) hlist = [] + count = 0 units = ( 'year', 'day', 'hour', 'minute', 'second', 'microsecond' ) - for unit in units[:precision]: # strip units to precision + for unit in units: + if count >= precision: break # met precision if d[ unit ] == 0: continue # skip 0's s = '' if d[ unit ] == 1 else 's' # handle plurals hlist.append( '%s %s%s' % ( d[unit], unit, s ) ) + count += 1 human_delta = ', '.join( hlist ) return the_tense.format(human_delta)