1
0

__init__.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import os
  2. import sys
  3. import locale
  4. import datetime
  5. import threading
  6. import contextlib
  7. class UnsupportedLocaleSettingError(locale.Error):
  8. pass
  9. locale_lock = threading.Lock()
  10. @contextlib.contextmanager
  11. def setlocale(temporary_locale):
  12. with locale_lock:
  13. primary_locale = locale.setlocale(locale.LC_ALL)
  14. try:
  15. try:
  16. yield locale.setlocale(locale.LC_ALL, temporary_locale)
  17. except locale.Error, ex:
  18. if ex.message == 'unsupported locale setting':
  19. raise UnsupportedLocaleSettingError(temporary_locale)
  20. else:
  21. raise ex
  22. finally:
  23. locale.setlocale(locale.LC_ALL, primary_locale)
  24. def raw_input_with_default(prompt, default):
  25. import readline
  26. def pre_input_hook():
  27. readline.insert_text(default)
  28. readline.redisplay()
  29. readline.set_pre_input_hook(pre_input_hook)
  30. try:
  31. return raw_input(prompt)
  32. finally:
  33. readline.set_pre_input_hook(None)
  34. def int_input_with_default(prompt, default):
  35. if default:
  36. default = str(default)
  37. else:
  38. default = ''
  39. s = raw_input_with_default(prompt, default).strip()
  40. if s:
  41. return int(s)
  42. else:
  43. return None
  44. class DatePeriod(object):
  45. def __init__(self, start = None, end = None):
  46. self.start = start
  47. self.end = end
  48. @property
  49. def start(self):
  50. return self._start
  51. @start.setter
  52. def start(self, start):
  53. if not (start is None or type(start) is datetime.datetime):
  54. raise TypeError()
  55. self._start = start
  56. @property
  57. def end(self):
  58. return self._end
  59. @end.setter
  60. def end(self, end):
  61. if not (end is None or type(end) is datetime.datetime):
  62. raise TypeError()
  63. self._end = end
  64. @property
  65. def isoformat(self):
  66. if self.start is None or self.end is None:
  67. raise ValueError('both start and end must be set')
  68. return '%s/%s' % (
  69. self.start.isoformat().replace('+00:00', 'Z'),
  70. self.end.isoformat().replace('+00:00', 'Z'),
  71. )