diff options
author | Jim Rollenhagen <jim@jimrollenhagen.com> | 2019-09-26 09:43:27 -0400 |
---|---|---|
committer | Jim Rollenhagen <jim@jimrollenhagen.com> | 2019-09-26 09:43:27 -0400 |
commit | e9c6edfe510f4ed407f8d2d84b4b931a382b48b3 (patch) | |
tree | 94bbd6a34bcf09e99f7ae1be88b19960192d6adb /toxgen.py | |
parent | 1d73d6e50411ebc45fb96a6ed3c63ca91a500323 (diff) | |
download | wsme-master.tar.gz |
Diffstat (limited to 'toxgen.py')
-rw-r--r-- | toxgen.py | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/toxgen.py b/toxgen.py deleted file mode 100644 index 862c80f..0000000 --- a/toxgen.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -Produce a tox.ini file from a template config file. - -The template config file is a standard tox.ini file with additional sections. -Theses sections will be combined to create new testenv: sections if they do -not exists yet. - -See REAME.rst for more detail. -""" - -import itertools -import collections -import optparse - -try: - from configparser import ConfigParser -except: - from ConfigParser import ConfigParser # noqa - - -parser = optparse.OptionParser(epilog=__doc__) -parser.add_option('-i', '--input', dest='input', - default='tox-tmpl.ini', metavar='FILE') -parser.add_option('-o', '--output', dest='output', - default='tox.ini', metavar='FILE') - - -class AxisItem(object): - def __init__(self, axis, name, config): - self.axis = axis - self.isdefault = name[-1] == '*' - self.name = name[:-1] if self.isdefault else name - self.load(config) - - def load(self, config): - sectionname = 'axis:%s:%s' % (self.axis.name, self.name) - if config.has_section(sectionname): - self.options = collections.OrderedDict(config.items(sectionname)) - else: - self.options = collections.OrderedDict() - - for name, value in self.axis.defaults.items(): - if name not in self.options: - self.options[name] = value - - -class Axis(object): - def __init__(self, name, config): - self.name = name - self.load(config) - - def load(self, config): - self.items = collections.OrderedDict() - values = config.get('axes', self.name).split(',') - if config.has_section('axis:%s' % self.name): - self.defaults = collections.OrderedDict( - config.items('axis:%s' % self.name) - ) - else: - self.defaults = {} - for value in values: - self.items[value.strip('*')] = AxisItem(self, value, config) - - -def render(incfg): - axes = collections.OrderedDict() - - if incfg.has_section('axes'): - for axis in incfg.options('axes'): - axes[axis] = Axis(axis, incfg) - - out = ConfigParser() - for section in incfg.sections(): - if section == 'axes' or section.startswith('axis:'): - continue - out.add_section(section) - for name, value in incfg.items(section): - out.set(section, name, value) - - for combination in itertools.product( - *[axis.items.keys() for axis in axes.values()]): - options = collections.OrderedDict() - - section_name = ( - 'testenv:' + '-'.join([item for item in combination if item]) - ) - section_alt_name = ( - 'testenv:' + '-'.join([ - itemname - for axis, itemname in zip(axes.values(), combination) - if itemname and not axis.items[itemname].isdefault - ]) - ) - if section_alt_name == section_name: - section_alt_name = None - - axes_items = [ - '%s:%s' % (axis, itemname) - for axis, itemname in zip(axes, combination) - ] - - for axis, itemname in zip(axes.values(), combination): - axis_options = axis.items[itemname].options - if 'constraints' in axis_options: - constraints = axis_options['constraints'].split('\n') - for c in constraints: - if c.startswith('!') and c[1:] in axes_items: - continue - for name, value in axis_options.items(): - if name in options: - options[name] += value - else: - options[name] = value - - constraints = options.pop('constraints', '').split('\n') - neg_constraints = [c[1:] for c in constraints if c and c[0] == '!'] - if not set(neg_constraints).isdisjoint(axes_items): - continue - - if not out.has_section(section_name): - out.add_section(section_name) - - if (section_alt_name and not out.has_section(section_alt_name)): - out.add_section(section_alt_name) - - for name, value in reversed(options.items()): - if not out.has_option(section_name, name): - out.set(section_name, name, value) - if section_alt_name and not out.has_option(section_alt_name, name): - out.set(section_alt_name, name, value) - - return out - - -def main(): - options, args = parser.parse_args() - tmpl = ConfigParser() - tmpl.read(options.input) - with open(options.output, 'wb') as outfile: - render(tmpl).write(outfile) - - -if __name__ == '__main__': - main() |