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) | ||||
|     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): | ||||
|     ''' | ||||
|     Given a list of strings, return a string in the form of an SQL list. | ||||
|  |  | |||
|  | @ -1160,7 +1160,7 @@ class PDBUtilMixin: | |||
|         else: | ||||
|             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 | ||||
|         "group1.group2.tag+synonym" | ||||
|  | @ -1170,70 +1170,43 @@ class PDBUtilMixin: | |||
|         output_notes = [] | ||||
| 
 | ||||
|         def create_or_get(name): | ||||
|             #print('cog', name) | ||||
|             try: | ||||
|                 item = self.get_tag(name=name) | ||||
|                 note = ('existing_tag', item.qualified_name()) | ||||
|                 note = ('existing_tag', item.name) | ||||
|             except exceptions.NoSuchTag: | ||||
|                 item = self.new_tag(name, author=author, commit=False) | ||||
|                 note = ('new_tag', item.qualified_name()) | ||||
|                 note = ('new_tag', item.name) | ||||
|             output_notes.append(note) | ||||
|             return item | ||||
| 
 | ||||
|         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: | ||||
|             (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') | ||||
|         (tagname, synonym, rename_to) = helpers.split_easybake_string(ebstring) | ||||
| 
 | ||||
|         if rename_to: | ||||
|             tag = self.get_tag(name=tag) | ||||
|             tag = self.get_tag(name=tagname) | ||||
|             old_name = tag.name | ||||
|             tag.rename(rename_to) | ||||
|             note = ('rename', '%s=%s' % (old_name, tag.name)) | ||||
|             note = ('rename', f'{old_name}={tag.name}') | ||||
|             output_notes.append(note) | ||||
|         else: | ||||
|             tag_parts = tag.split('.') | ||||
|             tag_parts = tagname.split('.') | ||||
|             tags = [create_or_get(t) for t in tag_parts] | ||||
|             for (higher, lower) in zip(tags, tags[1:]): | ||||
|                 try: | ||||
|                     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) | ||||
|                 except exceptions.GroupExists: | ||||
|                     pass | ||||
|             tag = tags[-1] | ||||
| 
 | ||||
|         self.log.debug('Committing - easybake') | ||||
|         self.commit() | ||||
| 
 | ||||
|         if 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) | ||||
| 
 | ||||
|         if commit: | ||||
|             self.log.debug('Committing - easybake') | ||||
|             self.commit() | ||||
|         return output_notes | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue