Add helpers.split_easybake_string for prelim parsing.
Helps to remove some distractions from the main easybake method.
This commit is contained in:
parent
f06b0915ab
commit
38bac41eb9
2 changed files with 57 additions and 40 deletions
|
@ -400,6 +400,50 @@ def seconds_to_hms(seconds):
|
||||||
hms = ':'.join('%02d' % part for part in parts)
|
hms = ':'.join('%02d' % part for part in parts)
|
||||||
return hms
|
return hms
|
||||||
|
|
||||||
|
def split_easybake_string(ebstring):
|
||||||
|
'''
|
||||||
|
Given an easybake string, return (tagname, synonym, rename_to), where
|
||||||
|
tagname may be a full qualified name, and at least one of
|
||||||
|
synonym or rename_to will be None since both are not posible at once.
|
||||||
|
|
||||||
|
'languages.python' -> ('languages.python', None, None)
|
||||||
|
'languages.python+py' -> ('languages.python', 'py', None)
|
||||||
|
'languages.python=bestlang' -> ('languages.python', None, 'bestlang')
|
||||||
|
'''
|
||||||
|
ebstring = ebstring.strip()
|
||||||
|
ebstring = ebstring.strip('.+=')
|
||||||
|
|
||||||
|
if ebstring == '':
|
||||||
|
raise exceptions.EasyBakeError('No tag supplied')
|
||||||
|
|
||||||
|
if '=' in ebstring and '+' in ebstring:
|
||||||
|
raise exceptions.EasyBakeError('Cannot rename and assign snynonym at once')
|
||||||
|
|
||||||
|
rename_parts = ebstring.split('=')
|
||||||
|
if len(rename_parts) > 2:
|
||||||
|
raise exceptions.EasyBakeError('Too many equals signs')
|
||||||
|
|
||||||
|
if len(rename_parts) == 2:
|
||||||
|
(ebstring, rename_to) = rename_parts
|
||||||
|
|
||||||
|
elif len(rename_parts) == 1:
|
||||||
|
(ebstring, rename_to) = (rename_parts[0], None)
|
||||||
|
|
||||||
|
synonym_parts = ebstring.split('+')
|
||||||
|
if len(synonym_parts) > 2:
|
||||||
|
raise exceptions.EasyBakeError('Too many plus signs')
|
||||||
|
|
||||||
|
if len(synonym_parts) == 2:
|
||||||
|
(tagname, synonym) = synonym_parts
|
||||||
|
|
||||||
|
elif len(synonym_parts) == 1:
|
||||||
|
(tagname, synonym) = (synonym_parts[0], None)
|
||||||
|
|
||||||
|
if not tagname:
|
||||||
|
raise exceptions.EasyBakeError('No tag supplied')
|
||||||
|
|
||||||
|
return (tagname, synonym, rename_to)
|
||||||
|
|
||||||
def sql_listify(items):
|
def sql_listify(items):
|
||||||
'''
|
'''
|
||||||
Given a list of strings, return a string in the form of an SQL list.
|
Given a list of strings, return a string in the form of an SQL list.
|
||||||
|
|
|
@ -1160,7 +1160,7 @@ class PDBUtilMixin:
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def easybake(self, ebstring, author=None):
|
def easybake(self, ebstring, author=None, *, commit=True):
|
||||||
'''
|
'''
|
||||||
Easily create tags, groups, and synonyms with a string like
|
Easily create tags, groups, and synonyms with a string like
|
||||||
"group1.group2.tag+synonym"
|
"group1.group2.tag+synonym"
|
||||||
|
@ -1170,70 +1170,43 @@ class PDBUtilMixin:
|
||||||
output_notes = []
|
output_notes = []
|
||||||
|
|
||||||
def create_or_get(name):
|
def create_or_get(name):
|
||||||
#print('cog', name)
|
|
||||||
try:
|
try:
|
||||||
item = self.get_tag(name=name)
|
item = self.get_tag(name=name)
|
||||||
note = ('existing_tag', item.qualified_name())
|
note = ('existing_tag', item.name)
|
||||||
except exceptions.NoSuchTag:
|
except exceptions.NoSuchTag:
|
||||||
item = self.new_tag(name, author=author, commit=False)
|
item = self.new_tag(name, author=author, commit=False)
|
||||||
note = ('new_tag', item.qualified_name())
|
note = ('new_tag', item.name)
|
||||||
output_notes.append(note)
|
output_notes.append(note)
|
||||||
return item
|
return item
|
||||||
|
|
||||||
ebstring = ebstring.strip()
|
(tagname, synonym, rename_to) = helpers.split_easybake_string(ebstring)
|
||||||
ebstring = ebstring.strip('.+=')
|
|
||||||
if ebstring == '':
|
|
||||||
raise exceptions.EasyBakeError('No tag supplied')
|
|
||||||
|
|
||||||
if '=' in ebstring and '+' in ebstring:
|
|
||||||
raise exceptions.EasyBakeError('Cannot rename and assign snynonym at once')
|
|
||||||
|
|
||||||
rename_parts = ebstring.split('=')
|
|
||||||
if len(rename_parts) == 2:
|
|
||||||
(ebstring, rename_to) = rename_parts
|
|
||||||
elif len(rename_parts) == 1:
|
|
||||||
ebstring = rename_parts[0]
|
|
||||||
rename_to = None
|
|
||||||
else:
|
|
||||||
raise exceptions.EasyBakeError('Too many equals signs')
|
|
||||||
|
|
||||||
create_parts = ebstring.split('+')
|
|
||||||
if len(create_parts) == 2:
|
|
||||||
(tag, synonym) = create_parts
|
|
||||||
elif len(create_parts) == 1:
|
|
||||||
tag = create_parts[0]
|
|
||||||
synonym = None
|
|
||||||
else:
|
|
||||||
raise exceptions.EasyBakeError('Too many plus signs')
|
|
||||||
|
|
||||||
if not tag:
|
|
||||||
raise exceptions.EasyBakeError('No tag supplied')
|
|
||||||
|
|
||||||
if rename_to:
|
if rename_to:
|
||||||
tag = self.get_tag(name=tag)
|
tag = self.get_tag(name=tagname)
|
||||||
old_name = tag.name
|
old_name = tag.name
|
||||||
tag.rename(rename_to)
|
tag.rename(rename_to)
|
||||||
note = ('rename', '%s=%s' % (old_name, tag.name))
|
note = ('rename', f'{old_name}={tag.name}')
|
||||||
output_notes.append(note)
|
output_notes.append(note)
|
||||||
else:
|
else:
|
||||||
tag_parts = tag.split('.')
|
tag_parts = tagname.split('.')
|
||||||
tags = [create_or_get(t) for t in tag_parts]
|
tags = [create_or_get(t) for t in tag_parts]
|
||||||
for (higher, lower) in zip(tags, tags[1:]):
|
for (higher, lower) in zip(tags, tags[1:]):
|
||||||
try:
|
try:
|
||||||
lower.join_group(higher, commit=False)
|
lower.join_group(higher, commit=False)
|
||||||
note = ('join_group', '%s.%s' % (higher.name, lower.name))
|
note = ('join_group', f'{higher.name}.{lower.name}')
|
||||||
output_notes.append(note)
|
output_notes.append(note)
|
||||||
except exceptions.GroupExists:
|
except exceptions.GroupExists:
|
||||||
pass
|
pass
|
||||||
tag = tags[-1]
|
tag = tags[-1]
|
||||||
|
|
||||||
self.log.debug('Committing - easybake')
|
|
||||||
self.commit()
|
|
||||||
|
|
||||||
if synonym:
|
if synonym:
|
||||||
synonym = tag.add_synonym(synonym)
|
synonym = tag.add_synonym(synonym)
|
||||||
note = ('new_synonym', '%s+%s' % (tag.name, synonym))
|
note = ('new_synonym', f'{tag.name}+{synonym}')
|
||||||
output_notes.append(note)
|
output_notes.append(note)
|
||||||
|
|
||||||
|
if commit:
|
||||||
|
self.log.debug('Committing - easybake')
|
||||||
|
self.commit()
|
||||||
return output_notes
|
return output_notes
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue