diff --git a/coursebuilder/__main__.py b/coursebuilder/__main__.py index beedcb5..65b2393 100644 --- a/coursebuilder/__main__.py +++ b/coursebuilder/__main__.py @@ -58,12 +58,24 @@ class CourseBuilder: meta = yaml.load(fm,Loader=yaml.Loader) - table_items = schema.process(meta=meta,fields=actual_fields,lang=args.lang) if query == None else schema.process_raw(meta=meta,fields=actual_fields,lang=args.lang) + table_items = schema.process(meta=meta,fields=actual_fields,lang=args.lang) if query == None else schema.to_list_of_dict(meta=meta,fields=actual_fields,lang=args.lang) if args.legacy: MarkdownGenerator.generate_table_legacy(table_items=table_items,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol) elif query: + query.run(table_items) + + # for i in table_items: + # print(i) + + q = schema.to_list_of_tuple(meta=meta,fields=actual_fields,lang=args.lang) + + for i in q: + print(i) + + # MarkdownGenerator.generate_table(table_items=q,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol) + else: MarkdownGenerator.generate_table(table_items=table_items,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol) diff --git a/coursebuilder/query.py b/coursebuilder/query.py index fab883b..835fe36 100644 --- a/coursebuilder/query.py +++ b/coursebuilder/query.py @@ -1,4 +1,6 @@ +import pandas as pd + class Query: def __init__(self,query) -> None: @@ -6,8 +8,9 @@ class Query: def run(self,table_items): # print(table_items) - for row in table_items: - print(row) - # print(eval(self.__query,{row:row})) + # for item in table_items: + # pass + # print(item) + # print(eval(self.__query,locals())) pass diff --git a/coursebuilder/schema.py b/coursebuilder/schema.py index ee4f058..ee730c0 100644 --- a/coursebuilder/schema.py +++ b/coursebuilder/schema.py @@ -92,7 +92,7 @@ class Schema: return [k,', '.join(parts)] - def process(self,meta,fields = [],lang = 'de'): + def process(self,meta,fields,lang): table_items = [] @@ -113,52 +113,44 @@ class Schema: # maybe return tableitems as np.Dataframe? return table_items - def get_str(self,meta,field,lang='de'): - if self.is_translatable(field): - return meta[field][lang] - else: - if not 'value' in meta[field]: - raise AssertionError(field,'incomplete') - return meta[field]['value'] - - def get_enum(self,meta,field,lang): - vv = meta[field]['value'] - return self.__schema[field]['values'][vv][lang] - - def get_num(self,meta,field,lang): - return meta[field]['value'] - - # if self.needs_spec(field): - - # t = string.Template(self.get_template(field=field,lang=lang)) - - # spec = meta[field]['spec'][lang] - - # return [self.process_label(field,lang),t.substitute({'value': enum_val,'spec': spec})] - # else: - # return [self.process_label(field,lang),enum_val] - - - def get_value(self,meta,field,lang): + """treats receiving the value like a variant, + return values are language specific""" match self.__schema[field]['type']: - case 'str': return self.get_str(meta,field,lang) - case 'enum': return self.get_enum(meta,field,lang) - case 'int' | 'num' : return self.get_num(meta,field,lang) - case 'multinum' : return meta[field]['value'] + case 'str': return meta[field][lang] if self.is_translatable(field) else meta[field]['value'] + case 'enum' | 'int' | 'num' | 'multikey' : return meta[field]['value'] + case 'multinum': return meta[field]['value'] if hasattr(meta[field]['value'],'__iter__') else (meta[field]['value'],) # force list! - - def process_raw(self,meta,fields,lang): - - items = [{'field' : field, - 'lang' : lang, - 'type' : self.__schema[field]['type'], - 'label' : self.process_label(field,lang), - 'value' : self.get_value(meta,field,lang) - + def to_list_of_dict(self,meta,fields,lang): + # list comprehension for rows + return [{'field' : field, # field name + 'lang' : lang, # language shortcode + 'type' : self.__schema[field]['type'], # datatype + 'label' : self.process_label(field,lang), # label + 'value' : self.get_value(meta,field,lang), # actual value + 'template' : self.__schema[field]['template'][lang] if 'template' in self.__schema[field] else None, + # getting crazy with nested dict comprehension + 'enum_values' : { k:v[lang] for (k,v) in self.__schema[field]['values'].items()} if 'enum' in self.__schema[field]['type'] else None, + 'key_values' : { k:v[lang] for (k,v) in self.__schema[field]['keys'].items()} if 'multikey' in self.__schema[field]['type'] else None, + 'spec' : meta[field]['spec'][lang] if 'spec' in meta[field] else None } for field in fields] + + def to_list_of_tuple(self,meta,fields,lang): + # generate a list of tuples with key and value (text) + list = [] + for r in self.to_list_of_dict(meta,fields,lang): + match r['type']: + case 'str' : + list.append( (r['label'],r['value']) ) + case 'int' | 'num' : + list.append( ( r['label'], r['template'].format(value=r['value'],spec=r['spec']) if r['template'] else r['value']) ) + case 'enum' : + list.append( ( r['label'], r['template'].format(value=r['enum_values'][r['value']],spec=r['spec']) + if r['template'] else r['enum_values'][r['value']] ) ) + case 'multikey' : + list.append( ( r['label'], ', '.join( [r['template'].format(key=r['key_values'][k],value=v) for k,v in r['value'].items()] ) ) ) + case 'multinum' : + list.append( (r['label'], ', '.join( r['template'].format(value=v) for v in r['value'])) ) - - # maybe return tableitems as np.Dataframe? - return items \ No newline at end of file + return list \ No newline at end of file diff --git a/test/Makefile b/test/Makefile index c806cc2..f662980 100644 --- a/test/Makefile +++ b/test/Makefile @@ -33,6 +33,6 @@ debug: # | pandoc ${target_flags} -V lang:de -o ${target_de} debug-query: - python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -q "kind == compulsory" + python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -q "item['field'] == 'kind' and item['value'] == 'elective'" .PHONY: clean \ No newline at end of file diff --git a/test/schema.yaml b/test/schema.yaml index fde6931..94c7820 100644 --- a/test/schema.yaml +++ b/test/schema.yaml @@ -114,8 +114,8 @@ form-of-instruction: } } template: - de: "${key} (${value}SWS)" - en: "${key} (${value}SWS)" + de: "{key} ({value}SWS)" + en: "{key} ({value}SWS)" # # Voraussetzungen für die Teilnahme @@ -181,14 +181,15 @@ workload: # credits/ECTS # credits: - type: num + type: num + unit: ECTS label: { en: "credits and weight of mark", de: "Kreditpunkte und Gewichtung der Note in der Gesamtnote" } template: - de: "${value}CP, Gewichtung: ${value}CP von 120CP " - en: "${value}CP, weight: ${value} / 120 " + de: "{value}CP, Gewichtung: {value}CP von 120CP " + en: "{value}CP, weight: {value} / 120 " # @@ -216,8 +217,8 @@ form-of-exam: } spec: true template: - de: "${value} (${spec})" - en: "${value} (${spec})" + de: "{value} ({spec})" + en: "{value} ({spec})" # @@ -262,8 +263,8 @@ duration: de: Dauer en: duration template: - de: "$value Semester" - en: "$value term(s)" + de: "{value} Semester" + en: "{value} term(s)" # # Art der Veranstaltung