M gf/go.py +15 -6
@@ 166,7 166,10 @@ def __call__(writer):
@variadic_method(Writer, basestring)
def __call__(writer, text, *arguments):
"""Write text % arguments on the file-like object."""
- writer.file.write(text % arguments)
+ if arguments: # FIXME: Restore backward compatibility
+ writer.file.write(text % arguments)
+ else:
+ writer.file.write(text)
@method(Writer)
def push(writer):
@@ 209,18 212,24 @@ def __call__(writer):
@variadic_method(IndentingWriter, basestring)
def __call__(writer, text, *arguments):
- writer.only_newline = False
if arguments:
text = text % arguments
text_list = text.split("\n")
base_call = __call__.super(Writer, basestring)
+ sub_text = text_list[0]
if writer.only_newline:
base_call(writer, writer.indent)
- base_call(writer, text_list[0])
+ if sub_text:
+ base_call(writer, sub_text)
+ writer.only_newline = False
+ else:
+ writer.only_newline = True
for sub_text in text_list[1:]:
- __call__.super(Writer)(writer)
- base_call(writer, writer.indent)
- base_call(writer, sub_text)
+ writer()
+ if sub_text:
+ base_call(writer, writer.indent)
+ base_call(writer, sub_text)
+ writer.only_newline = False
@method(IndentingWriter, int)
def push(writer, steps):
A => tests/textest.py +54 -0
@@ 0,0 1,54 @@
+"""Test scanner and parser of macro talk."""
+
+from unittest import TestCase as BaseTestCase
+from doctest import (DocFileSuite, set_unittest_reportflags,
+ REPORT_NDIFF, REPORT_ONLY_FIRST_FAILURE)
+from glob import glob
+
+import os, sys
+sys.path.insert(0,
+ os.path.abspath(
+ os.path.normpath(
+ os.path.join(
+ os.path.basename(__file__), os.pardir))))
+
+from gf import IndentingWriter, push, pop
+from gf.go import get_text
+
+test_directory = os.path.abspath(
+ os.path.normpath(os.path.dirname(__file__ )))
+
+
+iw = IndentingWriter()
+
+def show_text():
+ global iw
+ print get_text(iw)
+ iw = IndentingWriter()
+
+
+test_functions = dict(
+ w=lambda *arguments: iw(*arguments),
+ push=lambda *arguments: push(iw, *arguments),
+ pop=lambda *arguments: pop(iw, *arguments),
+ st=show_text)
+
+suite = DocFileSuite(*glob(os.path.join(test_directory, "*.tst")),
+ **dict(module_relative = False, globs=test_functions))
+
+
+if __name__ == "__main__":
+ from unittest import TextTestRunner
+ argv = []
+ for arg in sys.argv[1:]:
+ if arg == "-d":
+ set_unittest_reportflags(REPORT_NDIFF)
+ elif arg == "-f":
+ set_unittest_reportflags(REPORT_ONLY_FIRST_FAILURE)
+ else:
+ argv.append(arg)
+ if argv:
+ suite = DocFileSuite(*argv,
+ **dict(module_relative=False,
+ globs=test_functions))
+ TextTestRunner().run(suite)
A => tests/writer_simple.tst +95 -0
@@ 0,0 1,95 @@
+>>> w("sepp")
+>>> st()
+sepp
+
+>>> w()
+>>> st()
+<BLANKLINE>
+<BLANKLINE>
+
+>>> w("1")
+>>> st()
+1
+
+>>> w("%r %03d", "sepp", 10)
+>>> st()
+'sepp' 010
+
+>>> w("1")
+>>> w("2")
+>>> w("3")
+>>> st()
+123
+
+>>> w("1")
+>>> push()
+>>> w()
+>>> w("2")
+>>> w()
+>>> pop()
+>>> w("3")
+>>> st()
+1
+ 2
+3
+
+>>> w("f(%s)", "arg")
+>>> w(); w("{")
+>>> push()
+>>> w()
+>>> w(r'printf("%%i\n", %d);', 42)
+>>> w()
+>>> w("return 0;")
+>>> pop()
+>>> w()
+>>> w("}")
+>>> st()
+f(arg)
+{
+ printf("%i\n", 42);
+ return 0;
+}
+
+>>> w("0"); push(); w(); w("1"); push(); w(); w("2")
+>>> pop(); pop()
+>>> w(); w("3")
+>>> st()
+0
+ 1
+ 2
+3
+
+>>> w("0"); push(); w(); w("1"); push(); w(); w("2")
+>>> pop(2)
+>>> w(); w("3")
+>>> st()
+0
+ 1
+ 2
+3
+
+>>> w("0"); push(2); w(); w("1"); push(2); w(); w("2")
+>>> pop(2)
+>>> w(); w("3")
+>>> st()
+0
+ 1
+ 2
+3
+
+>>> w("0"); push(); w(); w("1\n"); pop(); w("2")
+>>> st()
+0
+ 1
+2
+
+>>> push(); w("0\n"); pop(); w("1")
+>>> st()
+0
+1
+
+>>> push(); w(); w("0\n"); pop(); w("1")
+>>> st()
+<BLANKLINE>
+ 0
+1