Source code for lookmlgen.base_generator
"""
File name: base_generator.py
Author: joeschmid
Date created: 4/8/17
"""
import abc
import six
DEFAULT_WARNING_HEADER_COMMENT = \
"""# STOP! This file was generated by an automated process.
# Any edits you make will be lost the next time it is
# re-generated.\n"""
[docs]class GeneratorFormatOptions(object):
"""Specify formatting options to be used during LookML generation
:param indent_spaces: Number of spaces to indent
:param newline_between_items: Add a newline between items
:param omit_default_field_type: Leave out 'type: string'
:param warning_header_comment: Text to use as a comment as the top
of the file warning the user that the
file will get overwritten
:param omit_time_frames_if_not_set: If no time frame is specified for
a dimension_group field, omit the
time_frames parameter. If timeframes
is not included every timeframe
option will be added to the dimension group.
:type indent_spaces: int
:type newline_between_items: bool
:type omit_default_field_type: bool
:type warning_header_comment: string
:type omit_time_frames_if_not_set: bool
"""
def __init__(self, indent_spaces=2, newline_between_items=True,
omit_default_field_type=True, view_fields_alphabetical=True,
warning_header_comment=DEFAULT_WARNING_HEADER_COMMENT,
omit_time_frames_if_not_set=False):
self.indent_spaces = indent_spaces
self.newline_between_items = newline_between_items
self.omit_default_field_type = omit_default_field_type
self.warning_header_comment = warning_header_comment
self.view_fields_alphabetical = view_fields_alphabetical
self.omit_time_frames_if_not_set = omit_time_frames_if_not_set
[docs]@six.add_metaclass(abc.ABCMeta)
class BaseGenerator:
""" Abstract base class for any subclass that generates LookML
:param file: File handle of a file open for writing or a
StringIO object
:param format_options: Formatting options to use during generation
:type file: File handle or StringIO object
:type format_options:
:class:`~lookmlgen.base_generator.GeneratorFormatOptions`
"""
def __init__(self, file=None, format_options=GeneratorFormatOptions()):
self.file = file
self.format_options = format_options
[docs] @abc.abstractmethod
def generate_lookml(self, file=None, format_options=None):
""" Implement this method in subclasses to generate LookML
:param file: File handle of a file open for writing or a
StringIO object
:param format_options: Formatting options to use during generation
:type file: File handle or StringIO object
:type format_options:
:class:`~lookmlgen.base_generator.GeneratorFormatOptions`
"""
raise NotImplementedError(
'You must implement the generate_lookml() method')
@classmethod
def __subclasshook__(cls, C):
if cls is BaseGenerator:
if any("generate_lookml" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented