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
 |