text: #    Copyright 2013 - 2017 Mirantis, 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.
  
  import sys
  import yaml
  
  from cookiecutter.exceptions import UndefinedVariableInTemplate
  from cookiecutter import generate
  
  from reclass_tools import helpers
  
  
  def render_dir(template_dir, output_dir, contexts, env_name=None):
      """Coockiecutter echancement to use several source JSON files
  
      :param template_dir: directory with templates to render
      :param output_dir: directory that should be created from templates
      :param context_files: list of strings, paths to YAML or JSON files
                            that provide the context variables for rendering.
                            Merge of the files usind update() into a single
                            dict is in the same order as files in the list.
      :param env_name: name for new environment that will be created
      """
      def toyaml(value, width=0, indentfirst=False):
          string = yaml.dump(value, default_flow_style=False, width=255)
          if string.splitlines():
              return (
                  ' ' * width * indentfirst +
                  ('\n' + ' ' * width).join(string.splitlines()) + '\n')
          else:
              return ''
  
      overwrite_if_exists = True
  
      merged_context = {}
  
      for fcon in contexts:
          if fcon.endswith('.yaml'):
              context = helpers.yaml_read(fcon)
          elif fcon.endswith('.json'):
              context = helpers.json_read(fcon)
          else:
              sys.exit("Error: Please use YAML or JSON files for contexts")
  
          merged_context = helpers.merge_nested_objects(merged_context, context)
  
      merged_context['toyaml'] = toyaml
      if env_name:
          if 'cookiecutter' not in merged_context:
              merged_context['cookiecutter'] = {}
          merged_context['cookiecutter']['_env_name'] = env_name
  
      try:
          generate.generate_files(
              repo_dir=template_dir,
              context=merged_context,
              overwrite_if_exists=overwrite_if_exists,
              output_dir=output_dir
          )
  
      except UndefinedVariableInTemplate as undefined_err:
          context_str = yaml.dump(
              undefined_err.context,
              default_flow_style=False,
              width=255
          )
          print('=' * 15 + ' Context: ' + '=' * 15 +
                '\n{}'.format(context_str) + '='*40)
          print('>>> {}'.format(undefined_err.message))
          sys.exit('>>> Error message: {}'.format(undefined_err.error.message))
  