Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: mojo/public/tools/bindings/generators/mojom_python_generator.py

Issue 517353002: mojo: Starting generator for python bindings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 """Generates Python source files from a mojom.Module."""
6
7 import re
8
9 import mojom.generate.generator as generator
10 import mojom.generate.module as mojom
11 from mojom.generate.template_expander import UseJinja
12
13
14 def NameToComponent(name):
pkl (ping after 24h if needed) 2014/09/01 12:52:02 style: Function names should be name_to_component(
qsr 2014/09/01 14:19:38 The style of all the python files in mojo/public/t
pkl (ping after 24h if needed) 2014/09/01 14:35:10 Ack. Chromium has it's own style guide http://www.
15 # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar ->
16 # HTTP_Entry2_FooBar)
17 name = re.sub('([^_])([A-Z][^A-Z_]+)', r'\1_\2', name)
18 # insert '_' between non upper and start of upper blocks (e.g.,
19 # HTTP_Entry2_FooBar -> HTTP_Entry2_Foo_Bar)
20 name = re.sub('([^A-Z_])([A-Z])', r'\1_\2', name)
21 return [x.lower() for x in name.split('_')]
22
23 def CapitalizeFirst(string):
24 return string[0].upper() + string[1:]
25
26 def UpperCamelCase(name):
27 return ''.join([CapitalizeFirst(x) for x in NameToComponent(name)])
pkl (ping after 24h if needed) 2014/09/01 12:52:02 why not just use x.capitalize() ? No need to defin
qsr 2014/09/01 14:19:38 Done.
28
29 def CamelCase(name):
30 uccc = UpperCamelCase(name)
31 return uccc[0].lower() + uccc[1:]
32
33 def ConstantStyle(name):
34 components = NameToComponent(name)
35 if components[0] == 'k':
36 components = components[1:]
37 return '_'.join([x.upper() for x in components])
38
39 def GetNameForElement(element):
40 if isinstance(element, (mojom.NamedValue,
41 mojom.Constant)):
42 return ConstantStyle(element.name)
43 raise Exception("Unexpected element: " % element)
pkl (ping after 24h if needed) 2014/09/01 12:52:02 style: Please use " and ' for string constants con
qsr 2014/09/01 14:19:38 Done.
44
45 def TranslateConstants(token):
46 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
47 # Both variable and enum constants are constructed like:
48 # NamespaceUid.Struct[.Enum].CONSTANT_NAME
49 name = []
50 if token.imported_from:
51 name.append(token.imported_from["python_module"])
52 if token.parent_kind:
53 name.append(GetNameForElement(token.parent_kind))
54 if isinstance(token, mojom.EnumValue):
55 name.append(GetNameForElement(token))
56 else:
57 name.append(token.name)
58 return ".".join(name)
59
60 if isinstance(token, mojom.BuiltinValue):
61 if token.value == "double.INFINITY" or token.value == "float.INFINITY":
62 return "float('inf')";
63 if token.value == "double.NEGATIVE_INFINITY" or \
pkl (ping after 24h if needed) 2014/09/01 12:52:02 style: do not use backslash for continuation. Use:
qsr 2014/09/01 14:19:38 Done.
64 token.value == "float.NEGATIVE_INFINITY":
65 return "float('-inf')"
66 if token.value == "double.NAN" or token.value == "float.NAN":
67 return "float('nan')";
68
69 return token
70
71
72 def ExpressionToText(value):
73 return TranslateConstants(value)
74
75
76 class Generator(generator.Generator):
77
78 python_filters = {
79 "expression_to_text": ExpressionToText,
80 "name": GetNameForElement,
81 }
82
83 @UseJinja("python_templates/module.py.tmpl", filters=python_filters)
84 def GeneratePythonModule(self):
85 return {
86 "imports": self.GetImports(),
87 "module": self.module,
88 }
89
90 def GenerateFiles(self, args):
91 self.Write(self.GeneratePythonModule(), "%s.py" % self.module.name.replace(' .mojom', '_mojom'))
pkl (ping after 24h if needed) 2014/09/01 12:52:02 line length > 80
qsr 2014/09/01 14:19:38 Done.
92
93 def GetImports(self):
94 for each in self.module.imports:
95 each["python_module"] = each['module_name'].replace('.mojom', '_mojom')
96 return self.module.imports
97
98 def GetJinjaParameters(self):
99 return {
100 'lstrip_blocks': True,
101 'trim_blocks': True,
102 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698