Skip to content

Commit

Permalink
Remove obsolete dict_from_config_file function
Browse files Browse the repository at this point in the history
utils.compile_yaml has this responsibility now.
  • Loading branch information
JakobGM committed May 5, 2018
1 parent 76a6e55 commit 7e10a3e
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 187 deletions.
9 changes: 4 additions & 5 deletions astrality/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@
make_logging_undefined,
)

from astrality.utils import generate_expanded_env_dict
from astrality import utils
from astrality.context import Context
from astrality.utils import run_shell

ApplicationConfig = Dict[str, Dict[str, Any]]

Expand Down Expand Up @@ -47,11 +46,11 @@ def jinja_environment(
)

# Add env context containing all environment variables
env.globals['env'] = generate_expanded_env_dict()
env.globals['env'] = utils.generate_expanded_env_dict()

# Add run shell command filter
run_shell_from_working_directory = partial(
run_shell,
utils.run_shell,
working_directory=shell_command_working_directory,
)
env.filters['shell'] = run_shell_from_working_directory
Expand Down Expand Up @@ -123,7 +122,7 @@ def compile_template(
shutil.copymode(template, target)

if permissions:
result = run_shell(
result = utils.run_shell(
command=f'chmod {permissions} {target}',
timeout=0,
fallback=False,
Expand Down
59 changes: 9 additions & 50 deletions astrality/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import re
from abc import ABC, abstractmethod
from distutils.dir_util import copy_tree
from io import StringIO
from pathlib import Path
from typing import (
Any,
Expand All @@ -25,7 +24,6 @@

from mypy_extensions import TypedDict

from astrality import compiler
from astrality.exceptions import (
MisconfiguredConfigurationFile,
NonExistentEnabledModule,
Expand All @@ -38,21 +36,7 @@
from astrality.module import ModuleConfigDict # noqa

logger = logging.getLogger('astrality')

from yaml import load # noqa
try:
from yaml import CLoader as Loader # type: ignore
logger.info('Using LibYAML bindings for faster .yml parsing.')
except ImportError: # pragma: no cover
from yaml import Loader
logger.warning(
'LibYAML not installed.'
'Using somewhat slower pure python implementation.',
)


ApplicationConfig = Dict[str, Dict[str, Any]]

ASTRALITY_DEFAULT_GLOBAL_SETTINGS = {'astrality': {
'hot_reload_config': False,
'startup_delay': 0,
Expand Down Expand Up @@ -111,31 +95,6 @@ def infer_config_location(
return config_directory, config_file


def dict_from_config_file(
config_file: Path,
context: Context,
) -> ApplicationConfig:
"""
Return a dictionary that reflects the contents of `config_file`.
`config` file is compiled as a Jinja template with `context`.
:param config_file: YAML file path.
:param context: Jinja2 context.
"""
if not config_file.is_file(): # pragma: no cover
error_msg = f'Could not load config file "{config_file}".'
logger.critical(error_msg)
raise FileNotFoundError(error_msg)

config_string = compiler.compile_template_to_string(
template=config_file,
context=context,
shell_command_working_directory=config_file.parent,
)
return load(StringIO(config_string), Loader=Loader)


def user_configuration(
config_directory: Optional[Path] = None,
) -> Tuple[ApplicationConfig, Dict, Context, Path]:
Expand All @@ -150,16 +109,16 @@ def user_configuration(
# First get global context, which we can use when compiling other files
context_file = config_directory / 'context.yml'
if context_file.exists():
global_context = Context(dict_from_config_file(
config_file=context_file,
global_context = Context(utils.compile_yaml(
path=context_file,
context=Context(),
))
else:
global_context = Context()

# Global configuration options
config = dict_from_config_file(
config_file=config_file,
config = utils.compile_yaml(
path=config_file,
context=global_context,
)

Expand All @@ -172,8 +131,8 @@ def user_configuration(
# Globally defined modules
modules_file = config_directory / 'modules.yml'
if modules_file.exists():
modules_config = dict_from_config_file(
config_file=modules_file,
modules_config = utils.compile_yaml(
path=modules_file,
context=global_context,
)

Expand Down Expand Up @@ -767,8 +726,8 @@ def filter_config_file(
assert config_file.name == 'modules.yml'

try:
modules_dict = dict_from_config_file(
config_file=config_file,
modules_dict = utils.compile_yaml(
path=config_file,
context=context,
)
except FileNotFoundError:
Expand Down Expand Up @@ -813,4 +772,4 @@ def filter_config_file(
module_section = modules_dict.pop(module_name)
modules_dict[non_conflicting_module_name] = module_section

return modules_dict # type: ignore
return modules_dict
48 changes: 3 additions & 45 deletions astrality/tests/config/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,19 @@

import pytest

from astrality import compiler
from astrality.config import (
create_config_directory,
dict_from_config_file,
user_configuration,
resolve_config_directory,
)
from astrality.context import Context
from astrality.utils import generate_expanded_env_dict
from astrality.utils import generate_expanded_env_dict, compile_yaml


@pytest.fixture
def dummy_config():
test_conf = Path(__file__).parents[1] / 'test_config' / 'test.yml'
return dict_from_config_file(
config_file=test_conf,
return compile_yaml(
path=test_conf,
context=Context(),
)

Expand Down Expand Up @@ -119,42 +116,3 @@ def test_creation_of_config_directory_with_example_content(self):
assert 'astrality.yml' in dir_contents
assert 'modules' in dir_contents
rmtree(created_config_dir)


@pytest.yield_fixture
def dir_with_compilable_files(tmpdir):
config_dir = Path(tmpdir)
config_file = config_dir / 'astrality.yml'
config_file.write_text(
'key1: {{ env.EXAMPLE_ENV_VARIABLE }}\n'
'key2: {{ "echo test" | shell }}'
)

module_file = config_dir / 'modules.yml'
module_file.write_text(
'key1: {{ env.EXAMPLE_ENV_VARIABLE }}\n'
'key2: {{ "echo test" | shell }}'
)

yield config_dir

os.remove(config_file)
os.remove(module_file)
config_dir.rmdir()


class TestUsingConfigFilesWithPlaceholders:
def test_dict_from_config_file(self, dir_with_compilable_files):
config = dict_from_config_file(
config_file=dir_with_compilable_files / 'astrality.yml',
context={},
)
assert config == {
'key1': 'test_value',
'key2': 'test',
}

def test_get_user_configuration(self, dir_with_compilable_files):
user_conf, *_ = user_configuration(dir_with_compilable_files)
assert user_conf['key1'] == 'test_value'
assert user_conf['key2'] == 'test'
7 changes: 4 additions & 3 deletions astrality/tests/module/test_module_filewatching.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
"""Tests for module manager behaviour related to file system modifications."""
import os
import shutil
from sys import platform
from pathlib import Path
from sys import platform

import pytest

from astrality.config import dict_from_config_file
from astrality import utils
from astrality.context import Context
from astrality.module import ModuleManager
from astrality.tests.utils import Retry


MACOS = platform == 'darwin'


Expand Down Expand Up @@ -179,7 +180,7 @@ def test_hot_reloading(
# Copy the first configuration into place
shutil.copy(str(config1), str(target_config))

modules1 = dict_from_config_file(
modules1 = utils.compile_yaml(
config1,
context={},
)
Expand Down
2 changes: 1 addition & 1 deletion astrality/tests/test_filewatcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def test_filesystem_watcher(watch_dir):
test_file1.write_text('test_content')

assert retry(lambda: event_saver.argument == test_file1)
assert event_saver.called == 1
assert event_saver.called >= 1

# Create a directory in the watched directory
recursive_dir.mkdir(parents=True)
Expand Down
50 changes: 50 additions & 0 deletions astrality/tests/utils/test_compile_yaml.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""Tests for compiling YAML jinja2 templates."""

import os
from pathlib import Path
import pytest

from astrality.config import user_configuration
from astrality.utils import compile_yaml


@pytest.yield_fixture
def dir_with_compilable_files(tmpdir):
"""Create some temporary YAML files which can be compiled."""
config_dir = Path(tmpdir)
config_file = config_dir / 'astrality.yml'
config_file.write_text(
'key1: {{ env.EXAMPLE_ENV_VARIABLE }}\n'
'key2: {{ "echo test" | shell }}'
)

module_file = config_dir / 'modules.yml'
module_file.write_text(
'key1: {{ env.EXAMPLE_ENV_VARIABLE }}\n'
'key2: {{ "echo test" | shell }}'
)

yield config_dir

os.remove(config_file)
os.remove(module_file)
config_dir.rmdir()


class TestUsingConfigFilesWithPlaceholders:
def test_dict_from_config_file(self, dir_with_compilable_files):
"""Placeholders should be properly substituted."""
config = compile_yaml(
path=dir_with_compilable_files / 'astrality.yml',
context={},
)
assert config == {
'key1': 'test_value',
'key2': 'test',
}

def test_get_user_configuration(self, dir_with_compilable_files):
"""user_configuration should use compile_yaml properly."""
user_conf, *_ = user_configuration(dir_with_compilable_files)
assert user_conf['key1'] == 'test_value'
assert user_conf['key2'] == 'test'
83 changes: 0 additions & 83 deletions docs/TODO.rst

This file was deleted.

0 comments on commit 7e10a3e

Please sign in to comment.