blob: 1454f09f1b98a97bd424c63bb8b9490462c8b41e [file] [log] [blame]
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +01001#!/usr/bin/env python
2# Copyright (C) 2013 Google Inc. All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met:
7#
8# * Redistributions of source code must retain the above copyright
9# notice, this list of conditions and the following disclaimer.
10# * Redistributions in binary form must reproduce the above
11# copyright notice, this list of conditions and the following disclaimer
12# in the documentation and/or other materials provided with the
13# distribution.
14# * Neither the name of Google Inc. nor the names of its
15# contributors may be used to endorse or promote products derived from
16# this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30import os.path
31import sys
32
33from in_file import InFile
34import in_generator
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010035import template_expander
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010036
37
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010038class RuntimeFeatureWriter(in_generator.Writer):
Torne (Richard Coles)81a51572013-05-13 16:52:28 +010039 class_name = 'RuntimeEnabledFeatures'
40
41 # FIXME: valid_values and defaults should probably roll into one object.
42 valid_values = {
43 'status': ['stable', 'experimental', 'test'],
44 }
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010045 defaults = {
46 'condition' : None,
47 'depends_on' : [],
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010048 'custom': False,
Torne (Richard Coles)81a51572013-05-13 16:52:28 +010049 'status': None,
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010050 }
51
Torne (Richard Coles)93ac45c2013-05-29 14:40:20 +010052 def __init__(self, in_file_path, enabled_conditions):
53 super(RuntimeFeatureWriter, self).__init__(in_file_path, enabled_conditions)
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010054 self._outputs = {(self.class_name + ".h"): self.generate_header,
55 (self.class_name + ".cpp"): self.generate_implementation,
56 }
57
Torne (Richard Coles)e5249552013-05-15 11:35:13 +010058 self._features = self.in_file.name_dictionaries
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010059 # Make sure the resulting dictionaries have all the keys we expect.
Torne (Richard Coles)e5249552013-05-15 11:35:13 +010060 for feature in self._features:
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010061 feature['first_lowered_name'] = self._lower_first(feature['name'])
62 # Most features just check their isFooEnabled bool
63 # but some depend on more than one bool.
64 enabled_condition = "is%sEnabled" % feature['name']
65 for dependant_name in feature['depends_on']:
66 enabled_condition += " && is%sEnabled" % dependant_name
67 feature['enabled_condition'] = enabled_condition
Torne (Richard Coles)e5249552013-05-15 11:35:13 +010068 self._non_custom_features = filter(lambda feature: not feature['custom'], self._features)
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010069
70 def _lower_first(self, string):
71 lowered = string[0].lower() + string[1:]
72 lowered = lowered.replace("cSS", "css")
73 lowered = lowered.replace("iME", "ime")
Torne (Richard Coles)93ac45c2013-05-29 14:40:20 +010074 lowered = lowered.replace("hTML", "html")
Torne (Richard Coles)521d96e2013-06-19 11:58:24 +010075 lowered = lowered.replace("wOFF", "woff")
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010076 return lowered
77
Torne (Richard Coles)81a51572013-05-13 16:52:28 +010078 def _feature_sets(self):
79 # Another way to think of the status levels is as "sets of features"
80 # which is how we're referring to them in this generator.
81 return self.valid_values['status']
82
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010083 @template_expander.use_jinja(class_name + ".h.tmpl")
Torne (Richard Coles)e5249552013-05-15 11:35:13 +010084 def generate_header(self):
85 return {
86 'features': self._features,
87 'feature_sets': self._feature_sets(),
Torne (Richard Coles)81a51572013-05-13 16:52:28 +010088 }
89
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010090 @template_expander.use_jinja(class_name + ".cpp.tmpl")
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010091 def generate_implementation(self):
Torne (Richard Coles)e5249552013-05-15 11:35:13 +010092 return {
93 'features': self._features,
94 'feature_sets': self._feature_sets(),
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010095 }
96
97
98if __name__ == "__main__":
99 in_generator.Maker(RuntimeFeatureWriter).main(sys.argv)