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

Unified Diff: chrome/browser/resources/protobufs/binary_proto_generator.py

Issue 2567483002: Add proto for TLS error assistant, refactor proto generator code. (Closed)
Patch Set: Add OWNERS for c/b/r/protobufs and c/b/r/ssl Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/protobufs/binary_proto_generator.py
diff --git a/chrome/browser/resources/protobufs/binary_proto_generator.py b/chrome/browser/resources/protobufs/binary_proto_generator.py
new file mode 100755
index 0000000000000000000000000000000000000000..ae5396704e34e9cf9ec001e044325b155a1fd7d2
--- /dev/null
+++ b/chrome/browser/resources/protobufs/binary_proto_generator.py
@@ -0,0 +1,144 @@
+#!/usr/bin/python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+ Converts a given ASCII proto into a binary resource.
+
+"""
+
+import abc
+import optparse
+import os
+import re
+import subprocess
+import sys
+import traceback
+
+class BinaryProtoGenerator:
+
+ # If the script is run in a virtualenv
+ # (https://virtualenv.pypa.io/en/stable/), then no google.protobuf library
+ # should be brought in from site-packages. Passing -S into the interpreter in
+ # a virtualenv actually destroys the ability to import standard library
+ # functions like optparse, so this script should not be wrapped if we're in a
+ # virtualenv.
+ def _IsInVirtualEnv(self):
+ # This is the way used by pip and other software to detect virtualenv.
+ return hasattr(sys, 'real_prefix')
+
+ def _ImportProtoModules(self, paths):
+ """Import the protobuf modules we need. |paths| is list of import paths"""
+ for path in paths:
+ # Put the path to our proto libraries in front, so that we don't use
+ # system protobuf.
+ sys.path.insert(1, path)
+
+ import google.protobuf.text_format as text_format
+ globals()['text_format'] = text_format
+ self.ImportProtoModule()
+
+ def _GenerateBinaryProtos(self, opts):
+ """ Read the ASCII proto and generate one or more binary protos. """
+ # Read the ASCII
+ with open(opts.infile, 'r') as ifile:
+ ascii_pb_str = ifile.read()
+
+ # Parse it into a structured PB
+ full_pb = self.EmptyProtoInstance()
+ text_format.Merge(ascii_pb_str, full_pb)
+
+ self.ValidatePb(opts, full_pb);
+ self.ProcessPb(opts, full_pb)
+
+ @abc.abstractmethod
+ def ImportProtoModule(self):
+ """ Import the proto module to be used by the generator. """
+ pass
+
+ @abc.abstractmethod
+ def EmptyProtoInstance(self):
+ """ Returns an empty proto instance to be filled by the generator."""
+ pass
+
+ @abc.abstractmethod
+ def ValidatePb(self, opts, pb):
+ """ Validate the basic values of the protobuf. The
+ file_type_policies_unittest.cc will also validate it by platform,
+ but this will catch errors earlier.
+ """
+ pass
+
+ @abc.abstractmethod
+ def ProcessPb(self, opts, pb):
+ """ Process the parsed prototobuf. """
+ pass
+
+ def AddCommandLineOptions(self, parser):
+ """ Allows subclasses to add any options the command line parser. """
+ pass
+
+ def AddExtraCommandLineArgsForVirtualEnvRun(self, opts, command):
+ """ Allows subclasses to add any extra command line arguments when running
+ this under a virtualenv."""
+ pass
+
+ def VerifyArgs(self, opts):
+ """ Allows subclasses to check command line parameters before running. """
+ return True
+
+ def Run(self):
+ parser = optparse.OptionParser()
+ # TODO(crbug.com/614082): Remove this once the bug is fixed.
+ parser.add_option('-w', '--wrap', action="store_true", default=False,
+ help='Wrap this script in another python '
+ 'execution to disable site-packages. This is a '
+ 'fix for http://crbug.com/605592')
+
+ parser.add_option('-i', '--infile',
+ help='The ASCII proto file to read.')
+ parser.add_option('-d', '--outdir',
+ help='Directory underwhich binary file(s) will be ' +
+ 'written')
+ parser.add_option('-o', '--outbasename',
+ help='Basename of the binary file to write to.')
+ parser.add_option('-p', '--path', action="append",
+ help='Repeat this as needed. Directory(s) containing ' +
+ 'the your_proto_definition_pb2.py and ' +
+ 'google.protobuf.text_format modules')
+ self.AddCommandLineOptions(parser)
+
+ (opts, args) = parser.parse_args()
+ if opts.infile is None or opts.outdir is None or opts.outbasename is None:
+ parser.print_help()
+ return 1
+
+ if opts.wrap and not self._IsInVirtualEnv():
+ # Run this script again with different args to the interpreter to suppress
+ # the inclusion of libraries, like google.protobuf, from site-packages,
+ # which is checked before sys.path when resolving imports. We want to
+ # specifically import the libraries injected into the sys.path in
+ # ImportProtoModules().
+ command = [sys.executable, '-S', '-s', sys.argv[0]]
+ command += ['-i', opts.infile]
+ command += ['-d', opts.outdir]
+ command += ['-o', opts.outbasename]
+ for path in opts.path:
+ command += ['-p', path]
+
+ self.AddExtraCommandLineArgsForVirtualEnvRun(opts, command);
+ sys.exit(subprocess.call(command))
+
+ self._ImportProtoModules(opts.path)
+
+ if not self.VerifyArgs(opts):
+ print "Wrong arguments"
+ return 1
+
+ try:
+ self._GenerateBinaryProtos(opts)
+ except Exception as e:
+ print "ERROR: Failed to render binary version of %s:\n %s\n%s" % (
+ opts.infile, str(e), traceback.format_exc())
+ return 1
« no previous file with comments | « chrome/browser/resources/protobufs/OWNERS ('k') | chrome/browser/resources/safe_browsing/gen_file_type_proto.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698