|
|
|
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)
|