PageRenderTime 16ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/tortoisehg/util/settings.py

https://bitbucket.org/tortoisehg/hgtk/
Python | 124 lines | 95 code | 20 blank | 9 comment | 24 complexity | d23edd45fc19683abdbb6e4f78e7de82 MD5 | raw file
Possible License(s): GPL-2.0
  1. # settings.py - TortoiseHg dialog settings library
  2. #
  3. # Copyright 2007 TK Soh <teekaysoh@gmail.com>
  4. # Copyright 2009 Steve Borho <steve@borho.org>
  5. #
  6. # This software may be used and distributed according to the terms of the
  7. # GNU General Public License version 2, incorporated herein by reference.
  8. import os
  9. import cPickle
  10. from mercurial import util
  11. class SimpleMRUList(object):
  12. def __init__(self, size=10, reflist=[], compact=True):
  13. self._size = size
  14. self._list = reflist
  15. if compact:
  16. self.compact()
  17. def __iter__(self):
  18. for elem in self._list:
  19. yield elem
  20. def add(self, val):
  21. if val in self._list:
  22. self._list.remove(val)
  23. self._list.insert(0, val)
  24. self.flush()
  25. def get_size(self):
  26. return self._size
  27. def set_size(self, size):
  28. self._size = size
  29. self.flush()
  30. def flush(self):
  31. while len(self._list) > self._size:
  32. del self._list[-1]
  33. def compact(self):
  34. ''' remove duplicate in list '''
  35. newlist = []
  36. for v in self._list:
  37. if v not in newlist:
  38. newlist.append(v)
  39. self._list[:] = newlist
  40. class Settings(object):
  41. def __init__(self, appname, path=None):
  42. self._appname = appname
  43. self._data = {}
  44. self._path = path and path or self._get_path(appname)
  45. self._audit()
  46. self.read()
  47. def get_value(self, key, default=None, create=False):
  48. if key in self._data:
  49. return self._data[key]
  50. elif create:
  51. self._data[key] = default
  52. return default
  53. def set_value(self, key, value):
  54. self._data[key] = value
  55. def mrul(self, key, size=10):
  56. ''' wrapper method to create a most-recently-used (MRU) list '''
  57. ls = self.get_value(key, [], True)
  58. ml = SimpleMRUList(size=size, reflist=ls)
  59. return ml
  60. def get_keys(self):
  61. return self._data.keys()
  62. def get_appname(self):
  63. return self._appname
  64. def read(self):
  65. self._data.clear()
  66. if os.path.exists(self._path):
  67. try:
  68. f = file(self._path, 'rb')
  69. self._data = cPickle.loads(f.read())
  70. f.close()
  71. except Exception:
  72. pass
  73. def write(self):
  74. self._write(self._path, self._data)
  75. def _write(self, appname, data):
  76. s = cPickle.dumps(data)
  77. f = util.atomictempfile(appname, 'wb', None)
  78. f.write(s)
  79. try:
  80. f.rename()
  81. except OSError:
  82. pass # silently ignore these errors
  83. def _get_path(self, appname):
  84. if os.name == 'nt':
  85. try:
  86. import pywintypes
  87. try:
  88. from win32com.shell import shell, shellcon
  89. appdir = shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_APPDATA)
  90. except pywintypes.com_error:
  91. appdir = os.environ['APPDATA']
  92. except ImportError:
  93. appdir = os.environ['APPDATA']
  94. return os.path.join(appdir, 'TortoiseHg', appname)
  95. else:
  96. home = os.path.expanduser('~')
  97. return os.path.join(home, '.tortoisehg', appname)
  98. def _audit(self):
  99. if os.path.exists(os.path.dirname(self._path)):
  100. return
  101. try:
  102. os.makedirs(os.path.dirname(self._path))
  103. except OSError:
  104. pass # silently ignore these errors