Source code for fixtrate.config

from distutils.util import strtobool
import os

from .utils.validators import validate_ip_address, validate_port
from .constants import FixVersion


default_config = {
    'VERSION': FixVersion.FIX42,
    'HEARTBEAT_INTERVAL': 30,
}


[docs]class Config(dict): """ Wraps `dict` and adds some helpful methods for fetching config values from different sources and for validating. """ OPTIONS = { ('VERSION', str, True), ('SENDER_COMP_ID', str, True), ('TARGET_COMP_ID', str, True), ('HOST', str, False), ('PORT', int, False), ('HEARTBEAT_INTERVAL', int, False), ('SESSION_QUALIFIER', int, False), } def __init__(self, defaults=None): dict.__init__(self, defaults or {})
[docs] def validate(self): """ Validate config values :return: :raises: `ValueError` if incorrect value, `TypeError` if incorrect type. """ missing = [] for name, _type, required in self.OPTIONS: if name not in self: if required: missing.append(name) continue if not isinstance(self[name], _type): raise TypeError( 'Expected {} to be {}, but instead was {}' ''.format(name, _type, type(self[name])) ) if missing: raise ValueError( 'Missing required config variables: {}' ''.format(', '.join(missing))) try: self['VERSION'] = FixVersion(self['VERSION']) except ValueError: raise ValueError( '{} is not a valid FIX version' ''.format(self['VERSION'])) if 'HOST' in self: try: validate_ip_address(self['HOST']) except ValueError: raise ValueError( '{} is not a valid IP address' ''.format(self['HOST'])) if 'PORT' in self: try: validate_port(self['PORT']) except ValueError: raise ValueError( '{} is not a valid port number' ''.format(self['PORT']))
[docs] def from_env(self, namespace='FIX_'): """Update the config object from ENV variables. Will only fetch variables prepended with a given namespace string. :param namespace: (optional) The namespace used to look for appropriate ENV vars. Defaults to `'FIX_'`. :type namespace: str :return: None """ for name, _type, _ in self.OPTIONS: val = os.environ.get(namespace + name) if val is None: continue if _type == bool: val = bool(strtobool(val)) else: val = _type(val) self[name] = val