Source code for nettoolkit.j2config.read_conditions


# ---------------------------------------------------------------------------------------
import pandas as pd
from dataclasses import dataclass, field
from nettoolkit.nettoolkit_common import LST, STR
from nettoolkit.nettoolkit_db import read_xl_all_sheet

# ---------------------------------------------------------------------------------------

[docs] def get_conditions(jinja_file): """get all conditional statements from jinja file Args: jinja_file (str): jinja template file Returns: dict: dictionary with list of jinja variables, conditions, and loops. """ d = {'conditions':set(), 'loops':set(), 'variables': set() } with open(jinja_file, 'r') as f: lns = f.readlines() for ln in lns: if ln.strip().startswith("{% for "): d['loops'].add(ln) elif ln.strip().startswith("{% if") or ln.strip().startswith("{% elif"): d['conditions'].add(ln) elif ln.strip().startswith("{% set "): d['variables'].add(ln) return d
[docs] def get_variables(jinja_file): """get all jinja variables defined in jinja file Args: jinja_file (str): jinja template file Returns: set: set of jinja variables """ conds = set() with open(jinja_file, 'r') as f: lns = f.readlines() for ln in lns: starts, ends = [], [] for i in range(20): if i == 0: s,e = 0,0 start = STR.find_multi(ln, '{{', start=s, count=None, index=True, beginwith=False) end = STR.find_multi(ln, '}}', start=e, count=None, index=True, beginwith=False) if start == -1: break starts.append(start) ends.append(end) s = start+2 e = end+2 if starts == []: continue for s, e in zip(starts, ends): cond = ln[s:e+2] conds.add(cond) return conds
# --------------------------------------------------------------------------------------- # Jinja variables check class # ---------------------------------------------------------------------------------------
[docs] @dataclass class JinjaVarCheck(): jinja_file: str clean_file: str global_file: str = '' def __post_init__(self): self.variables = get_variables(self.jinja_file) self.var_df = pd.read_excel(self.clean_file, sheet_name='var').fillna("") if self.global_file: self.global_df = pd.read_excel(self.global_file).fillna("") else: self.global_df = pd.DataFrame() self.dfd = read_xl_all_sheet(self.clean_file) def __call__(self): self.jinja_var_only_variables = set(self._get_var_only_variables()) self.device_xl_var_only_variables = set(self.var_df['var']) if not self.global_df.empty: self.global_xl_var_only_variables = set(self.global_df['var']) # self.xl_table_variables = self._get_xl_table_variables() # self.jinja_table_variables = set(self._get_otherthan_vars_variables()) self._merge_global_device_vars() self._check() def _merge_global_device_vars(self): if not self.global_df.empty: self.xl_var_only_variables = self.device_xl_var_only_variables | self.global_xl_var_only_variables else: self.xl_var_only_variables = self.device_xl_var_only_variables def _get_xl_table_variables(self): del(self.dfd['var']) table_vars = set() for df in self.dfd.values(): table_vars = table_vars | set(df.keys()) return table_vars def _get_var_only_variables(self): nvs = [] for v in self.variables: v = v.split("{{")[-1].split("}}")[0].strip() v = v.split("|")[0].strip() if v.startswith("var."): nvs.append(v[4:]) return nvs def _get_otherthan_vars_variables(self): nvs = [] for v in self.variables: v = v.split("{{")[-1].split("}}")[0].strip() v = v.split("|")[0].strip() if not v.startswith("var."): spl = v.split(".") if len(spl) > 1: if spl[1].startswith("index"): continue s = ".".join(spl[1:]) nvs.append(s) return nvs def _check(self): self.xl_var_missing = self.jinja_var_only_variables - self.xl_var_only_variables
# self.jinja_var_missing = self.xl_var_only_variables - self.jinja_var_only_variables # self.xl_table_missing = self.jinja_table_variables - self.xl_table_variables # self.jinja_table_missing = self.xl_table_variables - self.jinja_table_variables