loader.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. import json
  4. import logging
  5. import os
  6. import sys
  7. import traceback
  8. class SettingsLoader(dict):
  9. def __init__(self, *args, **kwargs):
  10. super(SettingsLoader, self).__init__(*args, **kwargs)
  11. self.loadfile()
  12. def clear(self):
  13. for key in list(self.keys()):
  14. self.pop(key)
  15. def set_store_path(self):
  16. p = self.get("settings_path", "").strip()
  17. if not os.path.isdir(p):
  18. p = os.path.dirname(__file__)
  19. if sys.path[0] != p:
  20. sys.path.insert(0, p)
  21. return p
  22. def loadfile(self):
  23. try:
  24. import webserver.settings
  25. self.update(webserver.settings.settings)
  26. except:
  27. logging.error(traceback.format_exc())
  28. pass
  29. self.set_store_path()
  30. try:
  31. import auto
  32. self.update(auto.settings)
  33. except:
  34. logging.error(traceback.format_exc())
  35. pass
  36. try:
  37. import manual
  38. self.update(manual.settings)
  39. except:
  40. pass
  41. def dumpfile(self, filename="auto.py"):
  42. s = "\n".join("%-30s: %s," % ("'" + k + "'", repr(v)) for k, v in sorted(self.items()))
  43. code = (
  44. u"""#!/usr/bin/env python3
  45. #-*- coding: UTF-8 -*-
  46. import os
  47. settings = {
  48. """
  49. + s
  50. + """
  51. }
  52. """
  53. )
  54. d = self.set_store_path()
  55. py = os.path.join(d, filename)
  56. pyc = os.path.join(d, filename + "c")
  57. logging.error("saving settings file: %s" % py)
  58. with open(py, "w") as f:
  59. f.write(code)
  60. try:
  61. os.remove(pyc)
  62. except:
  63. pass
  64. def loads(self, text):
  65. self.update(json.loads(text))
  66. def dumps(self):
  67. return json.dumps(self)
  68. _settings = SettingsLoader()
  69. def get_settings():
  70. return _settings