packages/miew/tools/atom_types.py

Summary

Maintainability
F
5 days
Test Coverage
#!python3
import re

keys = []
entries = []
csv_matcher = re.compile('(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*,?|(?<=,)(),?)+?')
with open('atom_types.csv') as f:
  first = True
  for line in f:
    mline = csv_matcher.findall(line.strip())
    values = [x[0] if len(x[0]) > 0 else x[1] for x in mline]
    if first:
      keys = values
      first = False
    else:
      entry = dict(zip(keys, values))
      assert len(entry.keys()) == len(keys)
      entry['id'] = entry['name'].upper()
      entries.append(entry)

max_number = max(int(entry['number']) for entry in entries)
by_number = [None] * (max_number + 1)

isotopes = []
for entry in entries:
  number = int(entry['number'])
  if not by_number[number]:
    by_number[number] = entry
  else:
    isotopes.append(entry)

def format_entry(entry):
  if not entry:
    return "null,"
  else:
    return "new Element({number}, '{id}', '{fullName}', {weight}, {radiusVDW}, {radiusBonds}, {HValency}),".format(**entry)

print('''\
// DO NOT EDIT MANUALLY! Autogenerated from atom_types.csv by atom_types.py.
Element.ByAtomicNumber = [
  /* eslint-disable no-magic-numbers */
%s
  /* eslint-enable no-magic-numbers */
];
''' % '\n'.join('  ' + format_entry(entry) for entry in by_number))

isotopes_string = '' if not isotopes else '''
  // Duplicate atomic numbers (isotopes)
  /* eslint-disable no-magic-numbers */
%s
  /* eslint-enable no-magic-numbers */
''' % '\n'.join(('  \'%s\': ' % entry['id']) + format_entry(entry) for entry in isotopes)

print('''\
// DO NOT EDIT MANUALLY! Autogenerated from atom_types.csv by atom_types.py.
Element.ByName = {%s
  // All regular elements will be added later, automatically
};
''' % isotopes_string)

def format_color_entry(entry, key):
  return "{id:<2}: {value}".format(id=entry['id'], value=entry[key])

for key in filter(lambda x: x.startswith('color'), keys):
  print('''\
// DO NOT EDIT MANUALLY! Autogenerated from atom_types.csv by atom_types.py.
/* %s */.colors = {
  /* eslint-disable no-magic-numbers */
%s
  /* eslint-enable no-magic-numbers */
};
''' % (key, ',\n'.join('  ' + format_color_entry(entry, key) for entry in entries if entry[key])))