From 833f0bdf4cc24df54f9a0c1e6c8b3ffed69e1aab Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Fri, 17 May 2024 21:04:50 +0200 Subject: [PATCH 1/2] enum method working --- coursebuilder/__main__.py | 2 +- coursebuilder/query.py | 6 ++--- coursebuilder/schema.py | 46 +++++++++++++-------------------------- test/Makefile | 2 +- test/schema.yaml | 3 ++- 5 files changed, 22 insertions(+), 37 deletions(-) diff --git a/coursebuilder/__main__.py b/coursebuilder/__main__.py index beedcb5..6a80bb3 100644 --- a/coursebuilder/__main__.py +++ b/coursebuilder/__main__.py @@ -58,7 +58,7 @@ 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_dataframe(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) diff --git a/coursebuilder/query.py b/coursebuilder/query.py index fab883b..17591fa 100644 --- a/coursebuilder/query.py +++ b/coursebuilder/query.py @@ -6,8 +6,8 @@ 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: + print(item) + # print(eval(self.__query,locals())) pass diff --git a/coursebuilder/schema.py b/coursebuilder/schema.py index ee4f058..80de9b8 100644 --- a/coursebuilder/schema.py +++ b/coursebuilder/schema.py @@ -122,43 +122,27 @@ class Schema: 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] - - + enum_val = meta[field]['value'] + return self.__schema[field]['values'][ enum_val ][lang] 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 'int' | 'num' : return meta[field]['value'] case 'multinum' : return meta[field]['value'] - - 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_dataframe(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 } for field in fields] - - - # maybe return tableitems as np.Dataframe? - return items \ 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..4ceebf5 100644 --- a/test/schema.yaml +++ b/test/schema.yaml @@ -181,7 +181,8 @@ 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" From 1381c37500af3e429f0f1e658f88b227e77cd616 Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Sat, 18 May 2024 22:26:50 +0200 Subject: [PATCH 2/2] MVP of reworked tuple generation --- coursebuilder/__main__.py | 14 +++++++++++- coursebuilder/query.py | 7 ++++-- coursebuilder/schema.py | 46 +++++++++++++++++++++++---------------- test/schema.yaml | 16 +++++++------- 4 files changed, 53 insertions(+), 30 deletions(-) diff --git a/coursebuilder/__main__.py b/coursebuilder/__main__.py index 6a80bb3..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.to_dataframe(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 17591fa..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 item in table_items: - print(item) + # 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 80de9b8..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,28 +113,15 @@ 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): - enum_val = meta[field]['value'] - return self.__schema[field]['values'][ enum_val ][lang] - 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 meta[field]['value'] - 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 to_dataframe(self,meta,fields,lang): + def to_list_of_dict(self,meta,fields,lang): # list comprehension for rows return [{'field' : field, # field name 'lang' : lang, # language shortcode @@ -143,6 +130,27 @@ class Schema: '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 + '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'])) ) + + return list \ No newline at end of file diff --git a/test/schema.yaml b/test/schema.yaml index 4ceebf5..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 @@ -188,8 +188,8 @@ credits: 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 " # @@ -217,8 +217,8 @@ form-of-exam: } spec: true template: - de: "${value} (${spec})" - en: "${value} (${spec})" + de: "{value} ({spec})" + en: "{value} ({spec})" # @@ -263,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