bigquery_etl/query_scheduling/formatters.py (45 lines of code) (raw):
"""This file contains custom filters for formatting data types in Jinja templates."""
from datetime import datetime, timedelta
from bigquery_etl import query_scheduling
from bigquery_etl.query_scheduling.utils import TIMEDELTA_RE
def format_schedule_interval(interval):
"""Format the input value to a Airflow schedule_interval value."""
presets = ["once", "hourly", "daily", "weekly", "monthly", "yearly"]
if interval in presets:
return "'@" + interval + "'"
return repr(interval)
def format_attr(d, attribute, formatter_name):
"""Apply a formatter to a dict attribute."""
for name in dir(query_scheduling.formatters):
if name != formatter_name:
continue
formatter_func = getattr(query_scheduling.formatters, name)
if callable(formatter_func) is None:
continue
if attribute in d:
d[attribute] = formatter_func(d[attribute])
return d
def format_date(date_string):
"""Format a date string to a datetime object."""
if date_string is None:
return None
return datetime.strptime(date_string, "%Y-%m-%d")
# based on https://stackoverflow.com/questions/4628122/how-to-construct-a
# -timedelta-object-from-a-simple-string
def format_timedelta(timedelta_string):
"""Format a timedelta object."""
parts = TIMEDELTA_RE.match(timedelta_string)
if not parts:
return timedelta_string
parts = parts.groupdict()
is_negative = timedelta_string.startswith("-")
time_params = {}
for name, param in parts.items():
if param:
time_params[name] = int(param) * (-1 if is_negative else 1)
return timedelta(**time_params)
def format_timedelta_macro(timedelta_string):
"""Format an Airflow timedelta macro."""
timedelta = repr(format_timedelta(timedelta_string))
return timedelta.replace("datetime", "macros")
def format_optional_string(val):
"""Format a value that is either None or a string."""
if val is None:
return "None"
else:
return "'" + val + "'"
def format_repr(val):
"""Return representation of a object."""
return repr(val)
def format_as_tuple(val):
"""Return tuple representation of the provided value."""
return tuple(val)