125 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| 
								 | 
							
								# Copyright 2015 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require 'active_support/inflector'
							 | 
						||
| 
								 | 
							
								require 'erb'
							 | 
						||
| 
								 | 
							
								require 'ostruct'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module Google
							 | 
						||
| 
								 | 
							
								  module Apis
							 | 
						||
| 
								 | 
							
								    # @private
							 | 
						||
| 
								 | 
							
								    class Generator
							 | 
						||
| 
								 | 
							
								      # Directory containing ERB templates
							 | 
						||
| 
								 | 
							
								      TEMPLATE_DIR = File.expand_path('../templates', __FILE__)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      # Helpers used in ERB templates
							 | 
						||
| 
								 | 
							
								      module TemplateHelpers
							 | 
						||
| 
								 | 
							
								        # Get the include path for a ruby module/class
							 | 
						||
| 
								 | 
							
								        #
							 | 
						||
| 
								 | 
							
								        # @param [String] module_name
							 | 
						||
| 
								 | 
							
								        #  Fully qualified module/class name
							 | 
						||
| 
								 | 
							
								        # @return [String]
							 | 
						||
| 
								 | 
							
								        #  Path to file
							 | 
						||
| 
								 | 
							
								        def to_path(module_name)
							 | 
						||
| 
								 | 
							
								          ActiveSupport::Inflector.underscore(module_name)
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Render a block comment
							 | 
						||
| 
								 | 
							
								        #
							 | 
						||
| 
								 | 
							
								        # @param [String] str
							 | 
						||
| 
								 | 
							
								        #  Comment string
							 | 
						||
| 
								 | 
							
								        # @param [Fixnum] spaces_before
							 | 
						||
| 
								 | 
							
								        #  Number of spaces to indent the comment hash
							 | 
						||
| 
								 | 
							
								        # @param [Fixnum] spaces_after
							 | 
						||
| 
								 | 
							
								        #  Number of spaces to indent after the comment hash for subsequent lines
							 | 
						||
| 
								 | 
							
								        # @return [String] formatted comment
							 | 
						||
| 
								 | 
							
								        def block_comment(str, spaces_before = 0, spaces_after = 0)
							 | 
						||
| 
								 | 
							
								          return '' if str.nil?
							 | 
						||
| 
								 | 
							
								          pre = ' ' * spaces_before
							 | 
						||
| 
								 | 
							
								          post = ' ' * spaces_after
							 | 
						||
| 
								 | 
							
								          lines = str.gsub(/([{}])/, '`').scan(/.{1,78}(?:\W|$)/).map(&:strip)
							 | 
						||
| 
								 | 
							
								          lines.join("\n" + pre + '#' + post)
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Indent a block of text
							 | 
						||
| 
								 | 
							
								        #
							 | 
						||
| 
								 | 
							
								        # @param [String] str
							 | 
						||
| 
								 | 
							
								        #  Content to indent
							 | 
						||
| 
								 | 
							
								        # @param [Fixnum] spaces
							 | 
						||
| 
								 | 
							
								        #  Number of spaces to indent
							 | 
						||
| 
								 | 
							
								        # @return [String] formatted content
							 | 
						||
| 
								 | 
							
								        def indent(str, spaces)
							 | 
						||
| 
								 | 
							
								          pre = ' ' * spaces
							 | 
						||
| 
								 | 
							
								          str = pre + str.split(/\n/).join("\n" + pre) + "\n"
							 | 
						||
| 
								 | 
							
								          return str unless str.strip.empty?
							 | 
						||
| 
								 | 
							
								          nil
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Include a partial inside a template.
							 | 
						||
| 
								 | 
							
								        #
							 | 
						||
| 
								 | 
							
								        # @private
							 | 
						||
| 
								 | 
							
								        # @param [String] partial
							 | 
						||
| 
								 | 
							
								        #  Name of the template
							 | 
						||
| 
								 | 
							
								        # @param [Hash] context
							 | 
						||
| 
								 | 
							
								        #  Context used to render
							 | 
						||
| 
								 | 
							
								        # @return [String] rendered content
							 | 
						||
| 
								 | 
							
								        def include(partial, context)
							 | 
						||
| 
								 | 
							
								          template = Template.new(sprintf('_%s.tmpl', partial))
							 | 
						||
| 
								 | 
							
								          template.render(context)
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								      end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      # Holds local vars/helpers for template rendering
							 | 
						||
| 
								 | 
							
								      class Context < OpenStruct
							 | 
						||
| 
								 | 
							
								        include TemplateHelpers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Get the context for ERB evaluation
							 | 
						||
| 
								 | 
							
								        # @return [Binding]
							 | 
						||
| 
								 | 
							
								        def to_binding
							 | 
						||
| 
								 | 
							
								          binding
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								      end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      # ERB template for the code generator
							 | 
						||
| 
								 | 
							
								      class Template
							 | 
						||
| 
								 | 
							
								        # Loads a template from the template dir. Automatically
							 | 
						||
| 
								 | 
							
								        # appends the .tmpl suffix
							 | 
						||
| 
								 | 
							
								        #
							 | 
						||
| 
								 | 
							
								        # @param [String] template_name
							 | 
						||
| 
								 | 
							
								        #  Name of the template file
							 | 
						||
| 
								 | 
							
								        def self.load(template_name)
							 | 
						||
| 
								 | 
							
								          Template.new(sprintf('%s.tmpl', template_name))
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # @param [String] template_name
							 | 
						||
| 
								 | 
							
								        #  Name of the template file
							 | 
						||
| 
								 | 
							
								        def initialize(template_name)
							 | 
						||
| 
								 | 
							
								          file = File.join(TEMPLATE_DIR, template_name)
							 | 
						||
| 
								 | 
							
								          @erb = ERB.new(File.read(file), nil, '-')
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Render the template
							 | 
						||
| 
								 | 
							
								        #
							 | 
						||
| 
								 | 
							
								        # @param [Hash] context
							 | 
						||
| 
								 | 
							
								        #  Variables to set when rendering the template
							 | 
						||
| 
								 | 
							
								        # @return [String] rendered template
							 | 
						||
| 
								 | 
							
								        def render(context)
							 | 
						||
| 
								 | 
							
								          ctx = Context.new(context)
							 | 
						||
| 
								 | 
							
								          @erb.result(ctx.to_binding)
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								      end
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end
							 |