mirror of https://github.com/interlegis/sapl.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							112 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							112 lines
						
					
					
						
							2.9 KiB
						
					
					
				| import os | |
| import re | |
| import subprocess | |
| 
 | |
| from redbaron import RedBaron | |
| from redbaron.nodes import EndlNode, ReturnNode, StringNode | |
| 
 | |
| git_project_root = subprocess.Popen( | |
|     ["git", "rev-parse", "--show-toplevel"], | |
|      stdout=subprocess.PIPE | |
|      ).communicate()[0].decode('utf-8').replace('\n', '') | |
| 
 | |
| 
 | |
| def ignorado(path, name): | |
|     for pattern in [ | |
|         'legacy.*', | |
|         'relatorios/templates.*', | |
|         '.*/migrations', | |
|     ]: | |
|         if re.match(os.path.join(git_project_root, pattern), path): | |
|             return True | |
|     return name.startswith('ipython_log.py') or name == 'manage.py' | |
| 
 | |
| 
 | |
| filenames = [os.path.join(path, name) | |
|              for path, subdirs, files in os.walk(git_project_root) | |
|              for name in files | |
|              if name.endswith('.py') and not ignorado(path, name)] | |
| 
 | |
| 
 | |
| def build_red(filename): | |
|     with open(filename, "r") as source_code: | |
|         red = RedBaron(source_code.read()) | |
|         if red.data: | |
|             red.__filename__ = filename | |
|             return red | |
| 
 | |
| # reds = [build_red(f) for f in filenames] | |
| # reds_without_tests = [r for r in reds | |
| #                       if not re.match('.*/test_.*\.py', r.__filename__)] | |
| 
 | |
| 
 | |
| def write(node): | |
|     red = node.git_project_root | |
|     with open(red.__filename__, "w") as source_code: | |
|         source_code.write(red.dumps()) | |
| 
 | |
| 
 | |
| ############################################################################## | |
| # verificacoes ad-hoc | |
| 
 | |
| def flat(ll): | |
|     return [i for l in ll for i in l] | |
| 
 | |
| 
 | |
| def inter(n): | |
|     'Se a string n esta dentro de uma chamada de traducao' | |
|     try: | |
|         assert not n.next or n.next.type == 'string' | |
|         assert n.parent_find('call').parent.value[0].value == '_' | |
|         return True | |
|     except: | |
|         return False | |
| 
 | |
| 
 | |
| def frase(n): | |
|     return ' ' in n.value | |
| 
 | |
| 
 | |
| def mark(n): | |
|     mark.ok |= {n.value} | |
| 
 | |
| 
 | |
| mark.ok = set() | |
| 
 | |
| 
 | |
| def get(r): | |
|     return [s for s in r('string') | |
|             if not inter(s) and s.value not in mark.ok] | |
|     # and frase(s) | |
| 
 | |
| 
 | |
| def fix(n): | |
|     n.value = '_(%s)' % n.value | |
|     write(n) | |
| 
 | |
| 
 | |
| def local(node): | |
|     res = '%s:%s' % (node.git_project_root.__filename__, | |
|                      node.absolute_bounding_box.top_left.line) | |
|     os.system("echo '%s' | xclip -selection c" % res) | |
|     return res | |
| 
 | |
| 
 | |
| def acha_props_constantes(red): | |
|     "Enumera nós property que apenas retornam uma constante" | |
|     for fun in red('def'): | |
|         if fun.decorators.dumps().strip() == '@property': | |
|             nos = [n for n in fun.value if not isinstance(n, EndlNode)] | |
|             if len(nos) == 1: | |
|                 [ret] = nos | |
|                 if (isinstance(ret, ReturnNode) | |
|                         and isinstance(ret.value, StringNode)): | |
|                     yield fun | |
| 
 | |
| 
 | |
| def corrige_props_constantes(reds): | |
|     "Troca nós property que apenas retornam uma constante por um assign" | |
|     pp = [p for red in reds for p in acha_props_constantes(red)] | |
|     for p in pp: | |
|         p.parent.value[p.index_on_parent] = '{} = {}'.format(p.name, p('return')('string').dumps()) | |
|         write(p)
 | |
| 
 |