OnJava8-Examples/tools/AttachResults.py

251 lines
8.4 KiB
Python
Raw Normal View History

2015-06-05 10:39:12 -07:00
#! py -3
"""
Append output and error files to Java files
"""
TODO = """
2015-06-06 15:07:33 -07:00
- Display all files with less than 100% match (rather than putting percentage and "Sample" in)
Rely on visual inspection of non-matching file?
Have a list of files to exclude normally, and inspect ocasionally
2015-06-05 14:18:52 -07:00
- Test to make sure that None files indeed have no output
- Ambitious: Allow edits of "AttachedResults.txt" which are
then pulled back into the source files.
} /* Same output as RoShamBo2.java *///:~
} /* Output: (Same as RoShamBo2.java) *///:~
2015-06-05 10:39:12 -07:00
"""
from pathlib import Path
import pprint
import textwrap
import os, sys, re
from itertools import chain
from betools import CmdLine, visitDir, ruler, head
2015-06-05 14:18:52 -07:00
maxlinewidth = 59
2015-06-05 10:39:12 -07:00
examplePath = Path(r"C:\Users\Bruce\Dropbox\__TIJ4-ebook\ExtractedExamples")
2015-06-06 15:07:33 -07:00
class JavaMain:
2015-06-06 18:27:39 -07:00
max_output_length = 32 # lines beyond which we flag this
2015-06-06 15:07:33 -07:00
maindef = re.compile("public\s+static\s+void\s+main")
ellipses = ["[...]".center(maxlinewidth, '_')]
class JFile:
"""Could just manipulate this, then write it at the end"""
@staticmethod
def with_main(javaFilePath):
with javaFilePath.open() as doc:
code = doc.read()
2015-06-06 18:27:39 -07:00
if JavaMain.maindef.search(code) or "{Exec:" in code:
2015-06-06 15:07:33 -07:00
return JavaMain.JFile(javaFilePath, code)
return None
def __init__(self, javaFilePath, code):
self.javaFilePath = javaFilePath
self.code = code
self.lines = self.code.splitlines()
self.output_line = None
for line in self.lines:
if "} /* Output:" in line:
self.output_line = line
self.newcode = ""
2015-06-05 14:18:52 -07:00
@staticmethod
2015-06-06 15:07:33 -07:00
def create(javaFilePath):
j_file = JavaMain.JFile.with_main(javaFilePath)
if j_file is None:
return None
if "{ValidateByHand}" in j_file.code:
return None
if "/* Output: (None) */" in j_file.code:
return None
2015-06-06 18:27:39 -07:00
if "/* Output: (Execute to see)" in j_file.code:
return None
2015-06-06 15:07:33 -07:00
outfile = javaFilePath.with_name(javaFilePath.stem + "-output.txt")
errfile = javaFilePath.with_name(javaFilePath.stem + "-erroroutput.txt")
if outfile.exists() or errfile.exists():
return JavaMain(javaFilePath, j_file, outfile, errfile)
2015-06-05 14:18:52 -07:00
return None
2015-06-06 15:07:33 -07:00
def __init__(self, javaFilePath, j_file, outfile, errfile):
self.javaFilePath = javaFilePath
self.j_file = j_file
self.outfile = outfile
self.errfile = errfile
self.first_and_last = None
self.first_lines = None
2015-06-06 18:27:39 -07:00
self.long_output = False
2015-06-06 15:07:33 -07:00
ol = self.j_file.output_line
if ol:
if "(First and last" in ol:
self.first_and_last = int(ol.partition("(First and last")[2].split()[0])
elif "(First" in ol:
self.first_lines = int(ol.partition("(First")[2].split()[0])
result =""
if outfile.exists():
with outfile.open() as f:
out = f.read().strip()
if out:
if self.first_and_last:
lines = out.splitlines()
out = "\n".join(lines[:self.first_and_last] + JavaMain.ellipses + lines[-self.first_and_last:])
elif self.first_lines:
lines = out.splitlines()
out = "\n".join(lines[:self.first_lines] + JavaMain.ellipses)
result += out + "\n"
if errfile.exists(): # Always include all of errfile
with errfile.open() as f:
err = f.read().strip()
if err:
result += "___[ Error Output ]___\n"
result += err
self.result = JavaMain.wrapOutput(result) + "\n"
2015-06-06 18:27:39 -07:00
if len(self.result.splitlines()) > JavaMain.max_output_length:
self.long_output = True
2015-06-06 15:07:33 -07:00
for line in self.j_file.lines:
if line.startswith("} ///:~"):
self.j_file.newcode += "} /* Output:\n"
self.j_file.newcode += self.result + "*///:~\n"
break
if line.startswith("} /* Output:"):
line = line.partition("*///:~")[0]
self.j_file.newcode += line + "\n"
self.j_file.newcode += self.result + "*///:~\n"
break
else:
self.j_file.newcode += line + "\n"
def new_code(self):
return self.j_file.newcode
@staticmethod
def wrapOutput(output):
lines = output.splitlines()
result = []
for line in lines:
result += textwrap.wrap(line.rstrip(), width=maxlinewidth)
return "\n".join(result)
2015-06-06 18:27:39 -07:00
def write_modified_file(self):
with self.j_file.javaFilePath.open('w') as modified:
modified.write(self.j_file.newcode)
2015-06-06 15:07:33 -07:00
2015-06-05 10:39:12 -07:00
2015-06-05 14:18:52 -07:00
@CmdLine('o')
def allOutputTagLines():
"""Shows all lines starting with } /*"""
allvariations = set()
os.chdir(str(examplePath))
for jfp in Path(".").rglob("*.java"):
with jfp.open() as code:
for line in code.readlines():
if line.startswith("} /*"):
allvariations.add(line)
pprint.pprint(allvariations)
2015-06-05 10:39:12 -07:00
@CmdLine('t')
def outputTagTypes():
"""Show different output tag variations"""
types = set()
os.chdir(str(examplePath))
for jfp in Path(".").rglob("*.java"):
2015-06-06 15:07:33 -07:00
jf = JavaMain.JFile.with_main(jfp)
2015-06-05 14:18:52 -07:00
if jf is None:
continue
2015-06-06 15:07:33 -07:00
if jf.output_line:
types.add(jf.output_line)
2015-06-05 10:39:12 -07:00
pprint.pprint(types)
2015-06-06 15:07:33 -07:00
2015-06-05 14:18:52 -07:00
@CmdLine('e')
def extractResults():
"""Test extraction of all results"""
os.chdir(str(examplePath))
with Path("AttachedResults.txt").open('w') as results:
for jfp in Path(".").rglob("*.java"):
2015-06-06 15:07:33 -07:00
j_main = JavaMain.create(jfp)
if j_main:
2015-06-05 14:18:52 -07:00
results.write(ruler(jfp))
2015-06-06 15:07:33 -07:00
outline = j_main.j_file.output_line
2015-06-05 14:18:52 -07:00
if outline:
results.write(outline + "\n")
2015-06-06 15:07:33 -07:00
results.write(j_main.result)
os.system("subl AttachedResults.txt")
2015-06-05 14:18:52 -07:00
@CmdLine('n')
def noOutputFixup():
2015-06-06 15:07:33 -07:00
"""Attach "Output: (None)" lines to empty output files"""
2015-06-05 14:18:52 -07:00
os.chdir(str(examplePath))
2015-06-06 15:07:33 -07:00
# test = open("test.txt", 'w')
2015-06-05 14:18:52 -07:00
for jfp in Path(".").rglob("*.java"):
2015-06-06 15:07:33 -07:00
if "gui" in jfp.parts or "swt" in jfp.parts:
continue
jf = JavaMain.JFile.with_main(jfp)
2015-06-05 14:18:52 -07:00
if jf is None:
continue
2015-06-06 15:07:33 -07:00
if "{ValidateByHand}" in jf.code:
continue
if not jf.output_line:
if JavaMain.create(jfp):
continue
2015-06-05 14:18:52 -07:00
newcode = ""
for line in jf.lines:
if line.startswith("} ///:~"):
newcode += "} /* Output: (None) *///:~\n"
else:
newcode += line + "\n"
2015-06-06 15:07:33 -07:00
with jfp.open('w') as f:
f.write(newcode)
os.system("subl {}".format(jfp))
# test.write(ruler(jfp))
# test.write(newcode)
2015-06-05 14:18:52 -07:00
2015-06-06 18:27:39 -07:00
@CmdLine('v')
def viewAttachedFiles():
"""View all files containing output in this directory and below"""
for java in Path(".").rglob("*.java"):
with java.open() as codefile:
code = codefile.read()
if "/* Output:" in code:
if "/* Output: (None)" in code:
continue
if "/* Output: (Execute to see)" in code:
continue
for n, line in enumerate(code.splitlines()):
if "/* Output:" in line:
os.system("subl {}:{}".format(java, n))
continue
2015-06-05 14:18:52 -07:00
2015-06-05 10:39:12 -07:00
@CmdLine('a')
def attachFiles():
"""Attach standard and error output to all files"""
os.chdir(str(examplePath))
2015-06-06 18:27:39 -07:00
test = open("AllFilesWithOutput.txt", 'w')
longOutput = open("LongOutput.txt", 'w')
2015-06-05 10:39:12 -07:00
for jfp in Path(".").rglob("*.java"):
2015-06-06 15:07:33 -07:00
if "gui" in jfp.parts or "swt" in jfp.parts:
2015-06-05 14:18:52 -07:00
continue
2015-06-06 15:07:33 -07:00
j_main = JavaMain.create(jfp)
if j_main is None:
continue
2015-06-06 18:27:39 -07:00
j_main.write_modified_file()
2015-06-06 15:07:33 -07:00
test.write(ruler())
test.write(j_main.new_code())
2015-06-06 18:27:39 -07:00
if j_main.long_output:
longOutput.write(ruler())
longOutput.write(j_main.new_code())
os.system("subl AllFilesWithOutput.txt")
os.system("subl LongOutput.txt")
2015-06-05 10:39:12 -07:00
if __name__ == '__main__': CmdLine.run()
2015-06-06 15:07:33 -07:00