Bug 1653367 [wpt PR 24632] - Update interfaces/streams.idl, a=testonly
[gecko.git] / tools / tryselect / preset.py
blob3071a36d1dac4fba601476b49b9930764fb041cb
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 from __future__ import absolute_import, print_function, unicode_literals
7 import os
8 import shlex
9 import subprocess
11 import yaml
14 class PresetHandler(object):
16 def __init__(self, path):
17 self.path = path
18 self._presets = {}
20 @property
21 def presets(self):
22 if not self._presets and os.path.isfile(self.path):
23 with open(self.path, 'r') as fh:
24 self._presets = yaml.safe_load(fh) or {}
26 return self._presets
28 def __contains__(self, name):
29 return name in self.presets
31 def __getitem__(self, name):
32 return self.presets[name]
34 def __len__(self):
35 return len(self.presets)
37 def __str__(self):
38 if not self.presets:
39 return ''
40 return yaml.safe_dump(self.presets, default_flow_style=False)
42 def list(self):
43 if not self.presets:
44 print("no presets found")
45 else:
46 print(self)
48 def edit(self):
49 if 'EDITOR' not in os.environ:
50 print("error: must set the $EDITOR environment variable to use --edit-presets")
51 return
53 subprocess.call(shlex.split(os.environ['EDITOR']) + [self.path])
55 def save(self, name, **data):
56 self.presets[name] = data
58 with open(self.path, "w") as fh:
59 fh.write(str(self))
62 class MergedHandler(object):
63 def __init__(self, *paths):
64 """Helper class for dealing with multiple preset files."""
65 self.handlers = [PresetHandler(p) for p in paths]
67 def __contains__(self, name):
68 return any(name in handler for handler in self.handlers)
70 def __getitem__(self, name):
71 for handler in self.handlers:
72 if name in handler:
73 return handler[name]
74 raise KeyError(name)
76 def __len__(self):
77 return sum(len(h) for h in self.handlers)
79 def __str__(self):
80 all_presets = {
81 k: v
82 for handler in self.handlers
83 for k, v in handler.presets.items()
85 return yaml.safe_dump(all_presets, default_flow_style=False)
87 def list(self):
88 if len(self) == 0:
89 print("no presets found")
90 return
92 for handler in self.handlers:
93 val = str(handler)
94 if val:
95 val = '\n '.join([''] + val.splitlines() + ['']) # indent all lines by 2 spaces
96 print("Presets from {}:".format(handler.path))
97 print(val)