|  | @@ -17,6 +17,7 @@ import re
 | 
	
		
			
				|  |  |  from datetime import datetime, timedelta
 | 
	
		
			
				|  |  |  from dateutil.relativedelta import relativedelta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +from . import current_app
 | 
	
		
			
				|  |  |  from .utils import is_iterable
 | 
	
		
			
				|  |  |  from .utils.timeutils import (timedelta_seconds, weekday, maybe_timedelta,
 | 
	
		
			
				|  |  |                                remaining, humanize_seconds)
 | 
	
	
		
			
				|  | @@ -29,13 +30,15 @@ class ParseException(Exception):
 | 
	
		
			
				|  |  |  class schedule(object):
 | 
	
		
			
				|  |  |      relative = False
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def __init__(self, run_every=None, relative=False):
 | 
	
		
			
				|  |  | +    def __init__(self, run_every=None, relative=False, nowfun=None):
 | 
	
		
			
				|  |  |          self.run_every = maybe_timedelta(run_every)
 | 
	
		
			
				|  |  |          self.relative = relative
 | 
	
		
			
				|  |  | +        self.nowfun = nowfun or current_app.now
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def remaining_estimate(self, last_run_at):
 | 
	
		
			
				|  |  |          """Returns when the periodic task should run next as a timedelta."""
 | 
	
		
			
				|  |  | -        return remaining(last_run_at, self.run_every, relative=self.relative)
 | 
	
		
			
				|  |  | +        return remaining(last_run_at, self.run_every, relative=self.relative,
 | 
	
		
			
				|  |  | +                         now=self.nowfun())
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def is_due(self, last_run_at):
 | 
	
		
			
				|  |  |          """Returns tuple of two items `(is_due, next_time_to_run)`,
 | 
	
	
		
			
				|  | @@ -257,15 +260,14 @@ class crontab(schedule):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return result
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def __init__(self, minute='*', hour='*', day_of_week='*',
 | 
	
		
			
				|  |  | -            nowfun=datetime.utcnow):
 | 
	
		
			
				|  |  | +    def __init__(self, minute='*', hour='*', day_of_week='*', nowfun=None):
 | 
	
		
			
				|  |  |          self._orig_minute = minute
 | 
	
		
			
				|  |  |          self._orig_hour = hour
 | 
	
		
			
				|  |  |          self._orig_day_of_week = day_of_week
 | 
	
		
			
				|  |  |          self.hour = self._expand_cronspec(hour, 24)
 | 
	
		
			
				|  |  |          self.minute = self._expand_cronspec(minute, 60)
 | 
	
		
			
				|  |  |          self.day_of_week = self._expand_cronspec(day_of_week, 7)
 | 
	
		
			
				|  |  | -        self.nowfun = nowfun
 | 
	
		
			
				|  |  | +        self.nowfun = nowfun or current_app.now
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def __repr__(self):
 | 
	
		
			
				|  |  |          return "<crontab: %s %s %s (m/h/d)>" % (self._orig_minute or "*",
 |