2 Usable base class for all hosting commands. 12 DEFAULT_STACK_ENV =
'ODYSSEY_DEFAULT_STACK' 14 localtz = dateutil.tz.tzlocal()
17 def parse_ts(ts, **kwargs):
18 dt = dateutil.parser.parse(ts)
19 return localize_dt(dt, **kwargs)
22 def localize_dt(dt, tz=localtz):
23 return dt.astimezone(tz)
26 def localnow(tz=localtz):
27 return datetime.datetime.now(tz=tz)
30 def formatdate(dt, format='%b %d, %Y'):
31 return dt.strftime(format)
34 def formattime(dt, format='%I:%M %p %Z
'): 35 return dt.strftime(format)
38 def formatdatetime(dt, timeformat=None, dateformat=None):
39 d = formatdate(dt, format=dateformat)
if dateformat
else formatdate(dt)
40 t = formattime(dt, format=timeformat)
if timeformat
else formattime(dt)
41 return '%s, %s' % (d, t)
45 return humanize.naturaldelta(td)
52 allowed_states = set()
56 def add_stack_argument(self, *args, env=DEFAULT_STACK_ENV,
57 help=None, metavar='STACK_NAME', **kwargs):
59 help =
"Stack name to apply command to." 62 return self.add_argument(*args, env=env, help=help, metavar=metavar,
66 """ Used to assert a stack is compatible and in a viable state. """ 67 ver = stack.stack_version
69 raise SystemExit(
"Incompatible version: %s" % ver)
71 raise SystemExit(
"Improper stack state: %s" % stack.state)
def check_requirements(self, stack)