139 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from .base import Base
 | 
						|
 | 
						|
 | 
						|
class KeyOption(Base):
 | 
						|
    """ A KeyOption represents a directive with no value.
 | 
						|
 | 
						|
    For example: http://nginx.org/en/docs/http/ngx_http_core_module.html#internal
 | 
						|
 | 
						|
    """
 | 
						|
    def __init__(self, name):
 | 
						|
        self.name = self.value = name
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return self._render(
 | 
						|
            '{name};'.format(
 | 
						|
                name=self.name,
 | 
						|
            )
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class KeyValueOption(Base):
 | 
						|
    """ A key/value directive. This covers most directives available for Nginx """
 | 
						|
    def __init__(self, name, value=''):
 | 
						|
        self.name = name
 | 
						|
        if isinstance(value, bool):
 | 
						|
            self.value = 'off' if value is False else 'on'
 | 
						|
        elif isinstance(value, int):
 | 
						|
            self.value = str(value)
 | 
						|
        elif isinstance(value, list):
 | 
						|
            self.value = [str(e) for e in value]
 | 
						|
        else:
 | 
						|
            self.value = value
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return self._render(
 | 
						|
            '{name} {value};'.format(
 | 
						|
                name=self.name,
 | 
						|
                value=self.value
 | 
						|
            )
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class KeyMultiValueOption(KeyValueOption):
 | 
						|
    """ A key with multiple space delimited options.
 | 
						|
 | 
						|
    For example: http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
 | 
						|
 | 
						|
    Example::
 | 
						|
 | 
						|
        >>> from nginx.config.api.options import KeyMultiValueOption
 | 
						|
        >>> a_log = KeyMultiValueOption('access_log', ['/path/to/log.gz', 'combined', 'gzip', 'flush=5m'])
 | 
						|
        >>> print(a_log)
 | 
						|
 | 
						|
        access_log /path/to/log.gz combined gzip flush=5m;
 | 
						|
 | 
						|
    """
 | 
						|
    def __repr__(self):
 | 
						|
        return self._render(
 | 
						|
            '{name} {value};'.format(
 | 
						|
                name=self.name,
 | 
						|
                value=' '.join(self.value)
 | 
						|
            )
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class KeyValuesMultiLines(Base):
 | 
						|
    def __init__(self, name, values=[]):
 | 
						|
        self.name = name
 | 
						|
        self.lines = []
 | 
						|
        for value in values:
 | 
						|
            if isinstance(value, list):
 | 
						|
                self.lines.append(' '.join([str(v) for v in value]))
 | 
						|
            else:
 | 
						|
                self.lines.append(str(value))
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return ''.join(
 | 
						|
            [self._render('{name} {value};'.format(name=self.name, value=line)) for line in self.lines]
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class Comment(Base):
 | 
						|
    """ A simple comment object. """
 | 
						|
 | 
						|
    _offset = ''
 | 
						|
    _comment = ''
 | 
						|
 | 
						|
    def __init__(self, offset='', comment='', **kwargs):
 | 
						|
        self._offset = offset
 | 
						|
        self._comment = comment
 | 
						|
        super(Comment, self).__init__(**kwargs)
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return self._render(
 | 
						|
            '{offset}# {comment}'.format(
 | 
						|
                offset=self._offset,
 | 
						|
                comment=self._comment,
 | 
						|
            )
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class AttrDict(dict):
 | 
						|
    """ A dictionary that exposes it's values as attributes. """
 | 
						|
    def __init__(self, owner):
 | 
						|
        self.__dict__ = self
 | 
						|
        self._owner = owner
 | 
						|
 | 
						|
    def __setitem__(self, key, val):
 | 
						|
        if hasattr(val, '_parent'):
 | 
						|
            val._parent = self._owner
 | 
						|
        return super(AttrDict, self).__setitem__(key, val)
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        owner = self.pop('_owner')
 | 
						|
        ret = super(AttrDict, self).__repr__()
 | 
						|
        self._owner = owner
 | 
						|
        return ret
 | 
						|
 | 
						|
 | 
						|
class AttrList(AttrDict):
 | 
						|
    """ A dictionary/list hybrid that exposes values as attributes. """
 | 
						|
    def __iter__(self):
 | 
						|
        return iter(self.values())
 | 
						|
 | 
						|
    def append(self, item):
 | 
						|
        if hasattr(item, '_parent'):
 | 
						|
            item._parent = self._owner
 | 
						|
        if hasattr(item, 'name'):
 | 
						|
            self[item.name] = item
 | 
						|
        else:
 | 
						|
            self[hash(item)] = item
 | 
						|
 | 
						|
    def add(self, *items):
 | 
						|
        for item in items:
 | 
						|
            self.append(item)
 | 
						|
 | 
						|
 | 
						|
# alias for backwards compatibility
 | 
						|
KeyValuesMultilines = KeyValuesMultiLines
 |