Initial commit
This commit is contained in:
commit
b7d90b9afe
16245 files changed
+3396666
No files matched your search
+195
@@ -0,0 +1,195 @@
|
||||
#! /usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import csv
|
||||
|
||||
def _vlog(text):
|
||||
if verbose:
|
||||
print(text)
|
||||
|
||||
def _add_translation(key):
|
||||
value = input('translate "' + key + '" to: ')
|
||||
|
||||
if len(value) == 0:
|
||||
print(' --> skipped')
|
||||
return key
|
||||
|
||||
translation_dictionay.update({ key : value })
|
||||
|
||||
with open(translation_file, 'w') as tf:
|
||||
json.dump(translation_dictionay, tf, sort_keys=True, indent=4)
|
||||
|
||||
return value
|
||||
|
||||
def _translated(t):
|
||||
if t in translation_dictionay:
|
||||
return translation_dictionay[t]
|
||||
elif translation_input == True:
|
||||
return _add_translation(t)
|
||||
else:
|
||||
return t
|
||||
|
||||
def _read_translation_file(translation_file):
|
||||
if os.path.exists(translation_file):
|
||||
with open(translation_file, 'r') as tf:
|
||||
return json.load(tf)
|
||||
else:
|
||||
return {}
|
||||
|
||||
def _get_setting_value(project_name, setting_name, project_settings):
|
||||
single_project_settings = project_settings[project_name]
|
||||
|
||||
for family_name, settings in single_project_settings.items():
|
||||
for setting, value in settings.items():
|
||||
if setting == setting_name:
|
||||
if type(value) is type(''):
|
||||
return value;
|
||||
else:
|
||||
if value == True:
|
||||
return 'x'
|
||||
else:
|
||||
return ''
|
||||
|
||||
return ''
|
||||
|
||||
def _get_project_name(settings_file):
|
||||
l = settings_file.split('/')
|
||||
return l[len(l) - 3]
|
||||
|
||||
def _write_settings_to_csv(project_settings):
|
||||
setting_list = []
|
||||
field_names = []
|
||||
|
||||
for project_name, settings_family in project_settings.items():
|
||||
field_names.append(project_name)
|
||||
for family_name, settings in settings_family.items():
|
||||
for setting, value in settings.items():
|
||||
if not setting in setting_list:
|
||||
setting_list.append(setting)
|
||||
|
||||
field_names.sort()
|
||||
field_names.insert(0, 'Setting')
|
||||
|
||||
_vlog(str(len(setting_list)) + ' different settings in total')
|
||||
|
||||
with open(output_file, mode='w') as csv_file:
|
||||
writer = csv.DictWriter(csv_file, fieldnames=field_names, delimiter=';')
|
||||
|
||||
writer.writeheader()
|
||||
rows = []
|
||||
for setting in setting_list:
|
||||
row = {}
|
||||
for field_name in field_names:
|
||||
if field_name == field_names[0]:
|
||||
row.update({field_name : _translated(setting)})
|
||||
else:
|
||||
row.update({field_name : _get_setting_value(field_name, setting, project_settings)})
|
||||
rows.append(row)
|
||||
|
||||
rows.sort(key = lambda row : row['Setting'].upper())
|
||||
|
||||
for row in rows:
|
||||
writer.writerow(row)
|
||||
|
||||
def _parse_settings_file(settings_file):
|
||||
project_name = _get_project_name(settings_file)
|
||||
_vlog('#####################################################')
|
||||
_vlog('# Parsing settings file for project ' + project_name)
|
||||
_vlog('#####################################################')
|
||||
sf = open(settings_file, 'r')
|
||||
project_settings = json.load(sf)['ProjectSettings']
|
||||
sf.close()
|
||||
|
||||
ignore_list = [
|
||||
'nagios',
|
||||
'sps',
|
||||
'recording',
|
||||
'EquipmentLanguages',
|
||||
'egcuUsesOnlyOneRelay',
|
||||
'useExactPositioning'
|
||||
]
|
||||
|
||||
settings = {} # [setting_family][setting][value]
|
||||
|
||||
for setting_family in project_settings:
|
||||
_vlog('Found setting family "' + setting_family + '"')
|
||||
if setting_family == 'Functionalities':
|
||||
settings[setting_family] = {}
|
||||
for setting in project_settings[setting_family]['IdentifierList']['Default']:
|
||||
settings[setting_family][setting] = True
|
||||
elif setting_family == 'SituationMap':
|
||||
continue
|
||||
elif setting_family == 'Office':
|
||||
settings[setting_family] = {'Office' : project_settings[setting_family]['Type']['Default']}
|
||||
else:
|
||||
if not setting_family in settings:
|
||||
settings[setting_family] = {}
|
||||
|
||||
for setting in project_settings[setting_family]:
|
||||
_vlog(' - setting ' + setting)
|
||||
if setting in ignore_list:
|
||||
_vlog(' --> ignored')
|
||||
continue
|
||||
|
||||
if setting.startswith('enable') or setting == 'SystemLanguages':
|
||||
value = project_settings[setting_family][setting]['Default']
|
||||
settings[setting_family][setting] = value
|
||||
_vlog(' --> stored with value "' + str(value) + '"')
|
||||
else:
|
||||
print(_get_project_name(settings_file) + ' > ' + setting_family + ' > ' + setting + ' is not treated!!!')
|
||||
|
||||
return { project_name : settings }
|
||||
|
||||
def _find_settings(directory):
|
||||
setting_files = []
|
||||
entries = os.walk(directory)
|
||||
|
||||
for root, dirs, files in os.walk(directory, topdown=True):
|
||||
for name in files:
|
||||
if name == 'project_settings.json':
|
||||
settings_file = os.path.join(root, name)
|
||||
setting_files.append(settings_file)
|
||||
_vlog('Found file: "' + settings_file + '"')
|
||||
|
||||
return setting_files
|
||||
|
||||
def _parse_args():
|
||||
parser = argparse.ArgumentParser(description='Starts searching recursivle for "project_settings.json" files in a given directory and converts them to CSV format.')
|
||||
parser.add_argument('-d', '--directory', default='.', help='starts searching in the given directory (default: ".", best value is "...<source-dir>/Lts/Projects/")', type=str)
|
||||
parser.add_argument('-v', '--verbose', help='verbose logging', action='store_true', dest='verbose')
|
||||
parser.add_argument('-t', '--translation_file', default='./project_settings_translation.json', help='file for translation of setting names (default: "./project_settings_translation.json")', type=str)
|
||||
parser.add_argument('-i', '--translation_input', help='ask for terms which are not translated', action='store_true', dest='translation_input')
|
||||
parser.add_argument('-o', '--output_file', default='./project_settings_overview.csv', help='output file (default: "./project_settings_overview.csv")', type=str)
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
def _main():
|
||||
args = _parse_args()
|
||||
global verbose
|
||||
global translation_dictionay
|
||||
global translation_input
|
||||
global translation_file
|
||||
global output_file
|
||||
verbose = args.verbose
|
||||
translation_input = args.translation_input
|
||||
translation_file = args.translation_file
|
||||
translation_dictionay = _read_translation_file(translation_file)
|
||||
output_file = args.output_file
|
||||
if not output_file.endswith('.csv'):
|
||||
output_file = output_file + '.csv'
|
||||
|
||||
if not os.path.isdir(args.directory):
|
||||
print('ERROR: "' + args.directory + '" is not a valid directory. Aborting.')
|
||||
exit()
|
||||
|
||||
project_settings = {}
|
||||
for settings_file in _find_settings(args.directory):
|
||||
project_settings.update(_parse_settings_file(settings_file))
|
||||
|
||||
_write_settings_to_csv(project_settings)
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(_main())
|
||||
Reference in new issue
Block a user