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
|