# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# or in the "license" file accompanying this file. This file 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 os
import shutil

from configobj import ConfigObj

from awsshell.utils import build_config_file_path


class Config(object):
    """Reads and writes the config template and user config file."""

    def load(self, config_template, config_file=None):
        """Reads the config file if it exists, else reads the default config.

        Creates the user config file if it doesn't exist using the template.

        :type config_template: str
        :param config_template: The config template file name.

        :type config_file: str
        :param config_file: (Optional) The config file name.
            If None, the config_file name will be set to the config_template.

        :rtype: :class:`configobj.ConfigObj`
        :return: The config information for reading and writing.
        """
        if config_file is None:
            config_file = config_template
        config_path = build_config_file_path(config_file)
        template_path = os.path.join(os.path.dirname(__file__), config_template)
        self._copy_template_to_config(template_path, config_path)
        return self._load_template_or_config(template_path, config_path)

    def _load_template_or_config(self, template_path, config_path):
        """Loads the config file if it exists, else reads the default config.

        :type template_path: str
        :param template_path: The template config file path.

        :type config_path: str
        :param config_path: The user's config file path.

        :rtype: :class:`configobj.ConfigObj`
        :return: The config information for reading and writing.
        """
        expanded_config_path = os.path.expanduser(config_path)
        cfg = ConfigObj()
        cfg.filename = expanded_config_path
        cfg.merge(ConfigObj(template_path, interpolation=False))
        cfg.merge(ConfigObj(expanded_config_path, interpolation=False))
        return cfg

    def _copy_template_to_config(self, template_path,
                                 config_path, overwrite=False):
        """Writes the default config from a template.

        :type template_path: str
        :param template_path: The template config file path.

        :type config_path: str
        :param config_path: The user's config file path.

        :type overwrite: bool
        :param overwrite: (Optional) Determines whether to overwrite the
            existing config file, if it exists.
        """
        expanded_config_path = os.path.expanduser(config_path)
        if not overwrite and os.path.isfile(config_path):
            return
        else:
            shutil.copyfile(template_path, config_path)

@@ -2977,16 +2977,72 @@
  exists.
+%0A%0A        :raises: :class:%60OSError %3Cexceptions.OSError%3E%60
 %0A       
@@ -3200,16 +3200,265 @@
   else:%0A
+            try:%0A                config_path_dir_name = os.path.dirname(config_path)%0A                os.makedirs(config_path_dir_name)%0A            except OSError:%0A                if not os.path.isdir(config_path_dir_name):%0A                    raise%0A
         

Fix tests if ~/.aws/shell/ doesn't exist.