Index: third_party/gsutil/third_party/protorpc/protorpc/generate.py |
diff --git a/third_party/gsutil/third_party/protorpc/protorpc/generate.py b/third_party/gsutil/third_party/protorpc/protorpc/generate.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..9a2630b32381f1568ec14fede089188daa86fee6 |
--- /dev/null |
+++ b/third_party/gsutil/third_party/protorpc/protorpc/generate.py |
@@ -0,0 +1,128 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright 2010 Google Inc. |
+# |
+# Licensed under the Apache License, Version 2.0 (the "License"); |
+# you may not use this file except in compliance with the License. |
+# You may obtain a copy of the License at |
+# |
+# http://www.apache.org/licenses/LICENSE-2.0 |
+# |
+# Unless required by applicable law or agreed to in writing, software |
+# distributed under the License is distributed on an "AS IS" BASIS, |
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+# See the License for the specific language governing permissions and |
+# limitations under the License. |
+# |
+ |
+__author__ = 'rafek@google.com (Rafe Kaplan)' |
+ |
+import contextlib |
+ |
+from . import messages |
+from . import util |
+ |
+__all__ = ['IndentationError', |
+ 'IndentWriter', |
+ ] |
+ |
+ |
+class IndentationError(messages.Error): |
+ """Raised when end_indent is called too many times.""" |
+ |
+ |
+class IndentWriter(object): |
+ """Utility class to make it easy to write formatted indented text. |
+ |
+ IndentWriter delegates to a file-like object and is able to keep track of the |
+ level of indentation. Each call to write_line will write a line terminated |
+ by a new line proceeded by a number of spaces indicated by the current level |
+ of indentation. |
+ |
+ IndexWriter overloads the << operator to make line writing operations clearer. |
+ |
+ The indent method returns a context manager that can be used by the Python |
+ with statement that makes generating python code easier to use. For example: |
+ |
+ index_writer << 'def factorial(n):' |
+ with index_writer.indent(): |
+ index_writer << 'if n <= 1:' |
+ with index_writer.indent(): |
+ index_writer << 'return 1' |
+ index_writer << 'else:' |
+ with index_writer.indent(): |
+ index_writer << 'return factorial(n - 1)' |
+ |
+ This would generate: |
+ |
+ def factorial(n): |
+ if n <= 1: |
+ return 1 |
+ else: |
+ return factorial(n - 1) |
+ """ |
+ |
+ @util.positional(2) |
+ def __init__(self, output, indent_space=2): |
+ """Constructor. |
+ |
+ Args: |
+ output: File-like object to wrap. |
+ indent_space: Number of spaces each level of indentation will be. |
+ """ |
+ # Private attributes: |
+ # |
+ # __output: The wrapped file-like object. |
+ # __indent_space: String to append for each level of indentation. |
+ # __indentation: The current full indentation string. |
+ self.__output = output |
+ self.__indent_space = indent_space * ' ' |
+ self.__indentation = 0 |
+ |
+ @property |
+ def indent_level(self): |
+ """Current level of indentation for IndentWriter.""" |
+ return self.__indentation |
+ |
+ def write_line(self, line): |
+ """Write line to wrapped file-like object using correct indentation. |
+ |
+ The line is written with the current level of indentation printed before it |
+ and terminated by a new line. |
+ |
+ Args: |
+ line: Line to write to wrapped file-like object. |
+ """ |
+ if line != '': |
+ self.__output.write(self.__indentation * self.__indent_space) |
+ self.__output.write(line) |
+ self.__output.write('\n') |
+ |
+ def begin_indent(self): |
+ """Begin a level of indentation.""" |
+ self.__indentation += 1 |
+ |
+ def end_indent(self): |
+ """Undo the most recent level of indentation. |
+ |
+ Raises: |
+ IndentationError when called with no indentation levels. |
+ """ |
+ if not self.__indentation: |
+ raise IndentationError('Unable to un-indent further') |
+ self.__indentation -= 1 |
+ |
+ @contextlib.contextmanager |
+ def indent(self): |
+ """Create indentation level compatible with the Python 'with' keyword.""" |
+ self.begin_indent() |
+ yield |
+ self.end_indent() |
+ |
+ def __lshift__(self, line): |
+ """Syntactic sugar for write_line method. |
+ |
+ Args: |
+ line: Line to write to wrapped file-like object. |
+ """ |
+ self.write_line(line) |