From 0d31d172047b2a03e4570ec3177cb75167ab48d2 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 13 Apr 2026 15:17:23 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-compile):=20PY=20register=20list=20gen?= =?UTF-8?q?erators=20=E2=80=94=20array=20format=20for=20columns/elements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed IR List and AccumReg List PY generators: - columns: OrderedDict → list of OrderedDict (matching PS1 array format) - table element: use 'table' key (not 'element'), 'tableAutofill' (not 'autoCommandBar'), 'None' (not 'none') - elements: list (not OrderedDict wrapper) PY tests: 10/12 (2 remaining CoA failures — PY CoA Item generator needs deeper rewrite from dict to list format) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../form-compile/scripts/form-compile.py | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 65500862..d5b29cf1 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -909,42 +909,38 @@ def generate_information_register_list_dsl(meta, p): is_periodic = meta.get('Periodicity') and meta['Periodicity'] != 'Nonperiodical' is_recorder_subordinate = meta.get('WriteMode') == 'RecorderSubordinate' - columns = OrderedDict() + columns_list = [] # Period if is_periodic: - columns['\u041f\u0435\u0440\u0438\u043e\u0434'] = {'element': 'labelField', 'path': '\u0421\u043f\u0438\u0441\u043e\u043a.Period'} + columns_list.append(OrderedDict([('labelField', '\u041f\u0435\u0440\u0438\u043e\u0434'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a.Period')])) # Recorder/LineNumber for subordinate registers if is_recorder_subordinate: - columns['\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'] = {'element': 'labelField', 'path': '\u0421\u043f\u0438\u0441\u043e\u043a.Recorder'} - columns['\u041d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438'] = {'element': 'labelField', 'path': '\u0421\u043f\u0438\u0441\u043e\u043a.LineNumber'} + columns_list.append(OrderedDict([('labelField', '\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a.Recorder')])) + columns_list.append(OrderedDict([('labelField', '\u041d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a.LineNumber')])) # Dimensions for dim in meta.get('Dimensions', []): if not is_displayable_type(dim['Type']): continue - columns[dim['Name']] = {'element': 'labelField', 'path': f"\u0421\u043f\u0438\u0441\u043e\u043a.{dim['Name']}"} + columns_list.append(OrderedDict([('labelField', dim['Name']), ('path', f"\u0421\u043f\u0438\u0441\u043e\u043a.{dim['Name']}")])) # Resources for res in meta.get('Resources', []): if not is_displayable_type(res['Type']): continue - el = 'labelField' - if re.match(r'^xs:boolean$|^Boolean$', res['Type']): - el = 'checkBox' - columns[res['Name']] = {'element': el, 'path': f"\u0421\u043f\u0438\u0441\u043e\u043a.{res['Name']}"} + el_key = 'check' if re.match(r'^xs:boolean$|^Boolean$', res['Type']) else 'labelField' + columns_list.append(OrderedDict([(el_key, res['Name']), ('path', f"\u0421\u043f\u0438\u0441\u043e\u043a.{res['Name']}")])) # Attributes for attr in meta['Attributes']: if not is_displayable_type(attr['Type']): continue - el = 'labelField' - if re.match(r'^xs:boolean$|^Boolean$', attr['Type']): - el = 'checkBox' - columns[attr['Name']] = {'element': el, 'path': f"\u0421\u043f\u0438\u0441\u043e\u043a.{attr['Name']}"} + el_key = 'check' if re.match(r'^xs:boolean$|^Boolean$', attr['Type']) else 'labelField' + columns_list.append(OrderedDict([(el_key, attr['Name']), ('path', f"\u0421\u043f\u0438\u0441\u043e\u043a.{attr['Name']}")])) table_el = OrderedDict([ - ('element', 'table'), + ('table', '\u0421\u043f\u0438\u0441\u043e\u043a'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a'), - ('commandBarLocation', 'none'), - ('autoCommandBar', {'autofill': False}), - ('columns', columns), + ('commandBarLocation', 'None'), + ('tableAutofill', False), + ('columns', columns_list), ]) props = OrderedDict() @@ -955,7 +951,7 @@ def generate_information_register_list_dsl(meta, p): return OrderedDict([ ('title', meta['Synonym']), ('properties', props), - ('elements', OrderedDict([('\u0421\u043f\u0438\u0441\u043e\u043a', table_el)])), + ('elements', [table_el]), ('attributes', [ {'name': '\u0421\u043f\u0438\u0441\u043e\u043a', 'type': 'DynamicList', 'main': True, 'settings': {'mainTable': f"InformationRegister.{meta['Name']}", 'dynamicDataRead': True}} ]), @@ -974,39 +970,35 @@ def generate_accumulation_register_dsl(meta, preset_data, purpose): def generate_accumulation_register_list_dsl(meta, p): - columns = OrderedDict() + columns_list = [] # AccumulationRegisters always have Period, Recorder, LineNumber - columns['\u041f\u0435\u0440\u0438\u043e\u0434'] = {'element': 'labelField', 'path': '\u0421\u043f\u0438\u0441\u043e\u043a.Period'} - columns['\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'] = {'element': 'labelField', 'path': '\u0421\u043f\u0438\u0441\u043e\u043a.Recorder'} - columns['\u041d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438'] = {'element': 'labelField', 'path': '\u0421\u043f\u0438\u0441\u043e\u043a.LineNumber'} + columns_list.append(OrderedDict([('labelField', '\u041f\u0435\u0440\u0438\u043e\u0434'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a.Period')])) + columns_list.append(OrderedDict([('labelField', '\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a.Recorder')])) + columns_list.append(OrderedDict([('labelField', '\u041d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a.LineNumber')])) # Dimensions for dim in meta.get('Dimensions', []): if not is_displayable_type(dim['Type']): continue - columns[dim['Name']] = {'element': 'labelField', 'path': f"\u0421\u043f\u0438\u0441\u043e\u043a.{dim['Name']}"} + columns_list.append(OrderedDict([('labelField', dim['Name']), ('path', f"\u0421\u043f\u0438\u0441\u043e\u043a.{dim['Name']}")])) # Resources for res in meta.get('Resources', []): if not is_displayable_type(res['Type']): continue - el = 'labelField' - if re.match(r'^xs:boolean$|^Boolean$', res['Type']): - el = 'checkBox' - columns[res['Name']] = {'element': el, 'path': f"\u0421\u043f\u0438\u0441\u043e\u043a.{res['Name']}"} + el_key = 'check' if re.match(r'^xs:boolean$|^Boolean$', res['Type']) else 'labelField' + columns_list.append(OrderedDict([(el_key, res['Name']), ('path', f"\u0421\u043f\u0438\u0441\u043e\u043a.{res['Name']}")])) # Attributes for attr in meta['Attributes']: if not is_displayable_type(attr['Type']): continue - el = 'labelField' - if re.match(r'^xs:boolean$|^Boolean$', attr['Type']): - el = 'checkBox' - columns[attr['Name']] = {'element': el, 'path': f"\u0421\u043f\u0438\u0441\u043e\u043a.{attr['Name']}"} + el_key = 'check' if re.match(r'^xs:boolean$|^Boolean$', attr['Type']) else 'labelField' + columns_list.append(OrderedDict([(el_key, attr['Name']), ('path', f"\u0421\u043f\u0438\u0441\u043e\u043a.{attr['Name']}")])) table_el = OrderedDict([ - ('element', 'table'), + ('table', '\u0421\u043f\u0438\u0441\u043e\u043a'), ('path', '\u0421\u043f\u0438\u0441\u043e\u043a'), - ('commandBarLocation', 'none'), - ('autoCommandBar', {'autofill': False}), - ('columns', columns), + ('commandBarLocation', 'None'), + ('tableAutofill', False), + ('columns', columns_list), ]) props = OrderedDict() @@ -1017,7 +1009,7 @@ def generate_accumulation_register_list_dsl(meta, p): return OrderedDict([ ('title', meta['Synonym']), ('properties', props), - ('elements', OrderedDict([('\u0421\u043f\u0438\u0441\u043e\u043a', table_el)])), + ('elements', [table_el]), ('attributes', [ {'name': '\u0421\u043f\u0438\u0441\u043e\u043a', 'type': 'DynamicList', 'main': True, 'settings': {'mainTable': f"AccumulationRegister.{meta['Name']}", 'dynamicDataRead': True}} ]),