def test_include_overrides_the_previous_included_configs(self):
        yaml = substitute_yaml("""
            {_default_}: Fruits
            {_include_}:
              - alpha.yml
              - beta.yml
            """)

        included_files = {
            'alpha.yml':
            substitute_yaml("""
                Fruits:
                    apple: 1
                    banana: 2
                """),
            'beta.yml':
            substitute_yaml("""
                Fruits:
                    banana: 13
                    kiwi: 14
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'apple': 1,
            'banana': 13,
            'kiwi': 14,
        } == config.get_dict()
    def test_config_overrides_the_included_config(self):
        yaml = substitute_yaml("""
            {_default_}: Fruits
            {_include_}: alpha.yml

            Fruits:
                orange: 1
                apple: 2
            """)

        included_files = {
            'alpha.yml':
            substitute_yaml("""
                Fruits:
                    apple: 13
                    kiwi: 14
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'orange': 1,
            'apple': 2,
            'kiwi': 14,
        } == config.get_dict()
    def test_include_overrides_the_previous_included_configs(self):
        yaml = substitute_yaml("""
            {_default_}: Fruits
            {_include_}:
              - alpha.yml
              - beta.yml
            """)

        included_files = {
            'alpha.yml': substitute_yaml("""
                Fruits:
                    apple: 1
                    banana: 2
                """),
            'beta.yml': substitute_yaml("""
                Fruits:
                    banana: 13
                    kiwi: 14
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'apple': 1,
            'banana': 13,
            'kiwi': 14,
        } == config.get_dict()
    def test_select_config_from_multi_level_included_file(self):
        yaml = substitute_yaml("""
            {_default_}: Vegetables
            {_include_}: alpha.yml

            Fruits:
                orange: 1
            """)

        included_files = {
            'alpha.yml':
            substitute_yaml('{_include_}: beta.yml'),
            'beta.yml':
            substitute_yaml('{_include_}: gamma.yml'),
            'gamma.yml':
            substitute_yaml("""
                Vegetables:
                    carrot: 2
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'carrot': 2,
        } == config.get_dict()
    def assert_load(self, main_includes, included_files, include_cwd=None):
        """
        :type main_includes: list
        :type included_files: dict
        :type include_cwd: str or None
        """
        __tracebackhide__ = True  # pylint: disable=unused-variable

        indented_includes = '\n'.join(
            ['  - {}'.format(include) for include in main_includes])

        yaml = substitute_yaml(textwrap.dedent("""
            {_default_}: Fruits
            {_include_}:
            {main_includes}

            Fruits:
              orange: 1
            """),
                               main_includes=indented_includes)

        with patch_open_read(included_files):
            config = octoconf.loads(yaml, include_cwd=include_cwd)

        assert {'orange': 1} == config.get_dict()
    def test_config_overrides_the_included_config_on_multiple_level(self):
        yaml = substitute_yaml("""
            {_default_}: Fruits
            {_include_}: alpha.yml

            Fruits:
                apple: 1
                banana: 2
            """)

        included_files = {
            'alpha.yml': substitute_yaml("""
                {_include_}: beta.yml

                Fruits:
                    banana: 13
                    kiwi: 14
                """),
            'beta.yml': substitute_yaml("""
                Fruits:
                    kiwi: 25
                    orange: 26
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'apple': 1,
            'banana': 2,
            'kiwi': 14,
            'orange': 26,
        } == config.get_dict()
    def test_config_overrides_the_included_config(self):
        yaml = substitute_yaml("""
            {_default_}: Fruits
            {_include_}: alpha.yml

            Fruits:
                orange: 1
                apple: 2
            """)

        included_files = {
            'alpha.yml': substitute_yaml("""
                Fruits:
                    apple: 13
                    kiwi: 14
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'orange': 1,
            'apple': 2,
            'kiwi': 14,
        } == config.get_dict()
    def test_select_config_in_included_file(self):
        yaml = substitute_yaml("""
            {_include_}: alpha.yml

            Fruits:
                orange: 1
            """)

        included_files = {
            'alpha.yml': substitute_yaml("""
                {_default_}: Fruits
                Vegetables:
                    carrot: 2
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'orange': 1,
        } == config.get_dict()
    def test_select_config_in_included_file(self):
        yaml = substitute_yaml("""
            {_include_}: alpha.yml

            Fruits:
                orange: 1
            """)

        included_files = {
            'alpha.yml':
            substitute_yaml("""
                {_default_}: Fruits
                Vegetables:
                    carrot: 2
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'orange': 1,
        } == config.get_dict()
    def test_config_overrides_the_included_config_on_multiple_level(self):
        yaml = substitute_yaml("""
            {_default_}: Fruits
            {_include_}: alpha.yml

            Fruits:
                apple: 1
                banana: 2
            """)

        included_files = {
            'alpha.yml':
            substitute_yaml("""
                {_include_}: beta.yml

                Fruits:
                    banana: 13
                    kiwi: 14
                """),
            'beta.yml':
            substitute_yaml("""
                Fruits:
                    kiwi: 25
                    orange: 26
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'apple': 1,
            'banana': 2,
            'kiwi': 14,
            'orange': 26,
        } == config.get_dict()
    def test_select_config_from_multi_level_included_file(self):
        yaml = substitute_yaml("""
            {_default_}: Vegetables
            {_include_}: alpha.yml

            Fruits:
                orange: 1
            """)

        included_files = {
            'alpha.yml': substitute_yaml('{_include_}: beta.yml'),
            'beta.yml': substitute_yaml('{_include_}: gamma.yml'),
            'gamma.yml': substitute_yaml("""
                Vegetables:
                    carrot: 2
                """),
        }

        with patch_open_read(included_files):
            config = octoconf.loads(yaml)

        assert {
            'carrot': 2,
        } == config.get_dict()
    def assert_load(self, main_includes, included_files, include_cwd=None):
        """
        :type main_includes: list
        :type included_files: dict
        :type include_cwd: str or None
        """
        __tracebackhide__ = True  # pylint: disable=unused-variable

        indented_includes = '\n'.join(['  - {}'.format(include)
                                       for include in main_includes])

        yaml = substitute_yaml(textwrap.dedent("""
            {_default_}: Fruits
            {_include_}:
            {main_includes}

            Fruits:
              orange: 1
            """), main_includes=indented_includes)

        with patch_open_read(included_files):
            config = octoconf.loads(yaml, include_cwd=include_cwd)

        assert {'orange': 1} == config.get_dict()