options.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # Copyright 2013 Google, Inc. All Rights Reserved.
  2. #
  3. # Google Author(s): Behdad Esfahbod, Roozbeh Pournader
  4. class Options(object):
  5. class UnknownOptionError(Exception):
  6. pass
  7. def __init__(self, **kwargs):
  8. self.verbose = False
  9. self.timing = False
  10. self.drop_tables = []
  11. self.input_file = None
  12. self.output_file = "merged.ttf"
  13. self.import_file = None
  14. self.set(**kwargs)
  15. def set(self, **kwargs):
  16. for k, v in kwargs.items():
  17. if not hasattr(self, k):
  18. raise self.UnknownOptionError("Unknown option '%s'" % k)
  19. setattr(self, k, v)
  20. def parse_opts(self, argv, ignore_unknown=[]):
  21. ret = []
  22. opts = {}
  23. for a in argv:
  24. orig_a = a
  25. if not a.startswith("--"):
  26. ret.append(a)
  27. continue
  28. a = a[2:]
  29. i = a.find("=")
  30. op = "="
  31. if i == -1:
  32. if a.startswith("no-"):
  33. k = a[3:]
  34. v = False
  35. else:
  36. k = a
  37. v = True
  38. else:
  39. k = a[:i]
  40. if k[-1] in "-+":
  41. op = k[-1] + "=" # Ops is '-=' or '+=' now.
  42. k = k[:-1]
  43. v = a[i + 1 :]
  44. ok = k
  45. k = k.replace("-", "_")
  46. if not hasattr(self, k):
  47. if ignore_unknown is True or ok in ignore_unknown:
  48. ret.append(orig_a)
  49. continue
  50. else:
  51. raise self.UnknownOptionError("Unknown option '%s'" % a)
  52. ov = getattr(self, k)
  53. if isinstance(ov, bool):
  54. v = bool(v)
  55. elif isinstance(ov, int):
  56. v = int(v)
  57. elif isinstance(ov, list):
  58. vv = v.split(",")
  59. if vv == [""]:
  60. vv = []
  61. vv = [int(x, 0) if len(x) and x[0] in "0123456789" else x for x in vv]
  62. if op == "=":
  63. v = vv
  64. elif op == "+=":
  65. v = ov
  66. v.extend(vv)
  67. elif op == "-=":
  68. v = ov
  69. for x in vv:
  70. if x in v:
  71. v.remove(x)
  72. else:
  73. assert 0
  74. opts[k] = v
  75. self.set(**opts)
  76. return ret