Refactor exposing of global configuration

We do this to make it easier to control this value during testing. We
should not import these values at package setup time. Nor should we
import them at package load time.

This change introduces a new API for the Moulinette package. The
moulinette.env accessor. This is a breaking change. However, I've
searched around and can't seem to find any usage that relies directly on
these properties being available.

I've tried to maintain API backwards compatibility in all cases
otherwise.
This commit is contained in:
Luke Murphy 2019-07-20 12:27:32 +02:00
parent 69b0d496dd
commit e027a188a9
No known key found for this signature in database
GPG key ID: 5E2EF5A63E3718CC
6 changed files with 41 additions and 14 deletions

View file

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from moulinette.core import init_interface, MoulinetteError, MoulinetteSignals, Moulinette18n from moulinette.core import init_interface, MoulinetteError, MoulinetteSignals, Moulinette18n
from moulinette.globals import DATA_DIR, LIB_DIR, LOCALES_DIR, CACHE_DIR from moulinette.globals import init_moulinette_env
__title__ = 'moulinette' __title__ = 'moulinette'
__version__ = '0.1' __version__ = '0.1'
@ -28,9 +28,8 @@ __credits__ = """
along with this program; if not, see http://www.gnu.org/licenses along with this program; if not, see http://www.gnu.org/licenses
""" """
__all__ = [ __all__ = [
'init', 'api', 'cli', 'm18n', 'init', 'api', 'cli', 'm18n', 'env',
'init_interface', 'MoulinetteError', 'init_interface', 'MoulinetteError',
'DATA_DIR', 'LIB_DIR', 'LOCALES_DIR', 'CACHE_DIR',
] ]
@ -62,7 +61,7 @@ def init(logging_config=None, **kwargs):
configure_logging(logging_config) configure_logging(logging_config)
# Add library directory to python path # Add library directory to python path
sys.path.insert(0, LIB_DIR) sys.path.insert(0, init_moulinette_env()['LIB_DIR'])
# Easy access to interfaces # Easy access to interfaces
@ -139,3 +138,8 @@ def cli(namespaces, args, use_cache=True, output_as=None,
logging.getLogger(namespaces[0]).error(e.strerror) logging.getLogger(namespaces[0]).error(e.strerror)
return 1 return 1
return 0 return 0
def env():
"""Initialise moulinette specific configuration."""
return init_moulinette_env()

View file

@ -10,7 +10,7 @@ from collections import OrderedDict
from moulinette import m18n, msignals from moulinette import m18n, msignals
from moulinette.cache import open_cachefile from moulinette.cache import open_cachefile
from moulinette.globals import CACHE_DIR, DATA_DIR from moulinette.globals import init_moulinette_env
from moulinette.core import (MoulinetteError, MoulinetteLock) from moulinette.core import (MoulinetteError, MoulinetteLock)
from moulinette.interfaces import ( from moulinette.interfaces import (
BaseActionsMapParser, GLOBAL_SECTION, TO_RETURN_PROP BaseActionsMapParser, GLOBAL_SECTION, TO_RETURN_PROP
@ -393,6 +393,10 @@ class ActionsMap(object):
self.parser_class = parser_class self.parser_class = parser_class
self.use_cache = use_cache self.use_cache = use_cache
moulinette_env = init_moulinette_env()
DATA_DIR = moulinette_env['DATA_DIR']
CACHE_DIR = moulinette_env['CACHE_DIR']
if len(namespaces) == 0: if len(namespaces) == 0:
namespaces = self.get_namespaces() namespaces = self.get_namespaces()
actionsmaps = OrderedDict() actionsmaps = OrderedDict()
@ -537,6 +541,9 @@ class ActionsMap(object):
""" """
namespaces = [] namespaces = []
moulinette_env = init_moulinette_env()
DATA_DIR = moulinette_env['DATA_DIR']
for f in os.listdir('%s/actionsmap' % DATA_DIR): for f in os.listdir('%s/actionsmap' % DATA_DIR):
if f.endswith('.yml'): if f.endswith('.yml'):
namespaces.append(f[:-4]) namespaces.append(f[:-4])
@ -554,6 +561,10 @@ class ActionsMap(object):
A dict of actions map for each namespaces A dict of actions map for each namespaces
""" """
moulinette_env = init_moulinette_env()
CACHE_DIR = moulinette_env['CACHE_DIR']
DATA_DIR = moulinette_env['DATA_DIR']
actionsmaps = {} actionsmaps = {}
if not namespaces: if not namespaces:
namespaces = klass.get_namespaces() namespaces = klass.get_namespaces()

View file

@ -2,7 +2,7 @@
import os import os
from moulinette.globals import CACHE_DIR from moulinette.globals import init_moulinette_env
def get_cachedir(subdir='', make_dir=True): def get_cachedir(subdir='', make_dir=True):
@ -16,6 +16,8 @@ def get_cachedir(subdir='', make_dir=True):
- make_dir -- False to not make directory if it not exists - make_dir -- False to not make directory if it not exists
""" """
CACHE_DIR = init_moulinette_env()['CACHE_DIR']
path = os.path.join(CACHE_DIR, subdir) path = os.path.join(CACHE_DIR, subdir)
if make_dir and not os.path.isdir(path): if make_dir and not os.path.isdir(path):

View file

@ -8,7 +8,7 @@ import logging
from importlib import import_module from importlib import import_module
import moulinette import moulinette
from moulinette.globals import LOCALES_DIR, LIB_DIR from moulinette.globals import init_moulinette_env
from moulinette.cache import get_cachedir from moulinette.cache import get_cachedir
@ -179,8 +179,12 @@ class Moulinette18n(object):
self.default_locale = default_locale self.default_locale = default_locale
self.locale = default_locale self.locale = default_locale
moulinette_env = init_moulinette_env()
self.locales_dir = moulinette_env['LOCALES_DIR']
self.lib_dir = moulinette_env['LIB_DIR']
# Init global translator # Init global translator
self._global = Translator(LOCALES_DIR, default_locale) self._global = Translator(self.locales_dir, default_locale)
# Define namespace related variables # Define namespace related variables
self._namespaces = {} self._namespaces = {}
@ -198,7 +202,7 @@ class Moulinette18n(object):
""" """
if namespace not in self._namespaces: if namespace not in self._namespaces:
# Create new Translator object # Create new Translator object
translator = Translator('%s/%s/locales' % (LIB_DIR, namespace), translator = Translator('%s/%s/locales' % (self.lib_dir, namespace),
self.default_locale) self.default_locale)
translator.set_locale(self.locale) translator.set_locale(self.locale)
self._namespaces[namespace] = translator self._namespaces[namespace] = translator

View file

@ -2,7 +2,11 @@
from os import environ from os import environ
DATA_DIR = environ.get('MOULINETTE_DATA_DIR', '/usr/share/moulinette')
LIB_DIR = environ.get('MOULINETTE_LIB_DIR', '/usr/lib/moulinette') def init_moulinette_env():
LOCALES_DIR = environ.get('MOULINETTE_LOCALES_DIR', '/usr/share/moulinette/locale') return {
CACHE_DIR = environ.get('MOULINETTE_CACHE_DIR', '/var/cache/moulinette') 'DATA_DIR': environ.get('MOULINETTE_DATA_DIR', '/usr/share/moulinette'),
'LIB_DIR': environ.get('MOULINETTE_LIB_DIR', '/usr/lib/moulinette'),
'LOCALES_DIR': environ.get('MOULINETTE_LOCALES_DIR', '/usr/share/moulinette/locale'),
'CACHE_DIR': environ.get('MOULINETTE_CACHE_DIR', '/var/cache/moulinette'),
}

View file

@ -3,8 +3,10 @@
import os import os
import sys import sys
from setuptools import setup, find_packages from setuptools import setup, find_packages
from moulinette.globals import init_moulinette_env
from moulinette.globals import LOCALES_DIR
LOCALES_DIR = init_moulinette_env()['LOCALES_DIR']
# Extend installation # Extend installation
locale_files = [] locale_files = []