Try to factor out the filter code.
authorJonathan Lange <jml@mumak.net>
Tue, 27 Mar 2012 10:19:19 +0000 (11:19 +0100)
committerJonathan Lange <jml@mumak.net>
Tue, 27 Mar 2012 10:19:19 +0000 (11:19 +0100)
filters/subunit2csv
python/subunit/filters.py [new file with mode: 0644]

index 842884a9cb396afb75ba5e91d9f802e4391619c6..58b458369460c04eea99e350dfc27d5c8389bc25 100755 (executable)
 
 """Turn a subunit stream into a CSV"""
 
-from optparse import OptionParser
-import sys
+from subunit.filters import main
 
-from subunit import DiscardStream, ProtocolTestCase
-from subunit.test_results import CsvResult
 
-parser = OptionParser(description=__doc__)
-parser.add_option("--no-passthrough", action="store_true",
-    help="Hide all non subunit input.", default=False, dest="no_passthrough")
-parser.add_option("-o", "--output-to",
-    help="Output the XML to this path rather than stdout.")
-parser.add_option("-f", "--forward", action="store_true", default=False,
-    help="Forward subunit stream on stdout.")
-
-(options, args) = parser.parse_args()
-if options.output_to is None:
-    output_to = sys.stdout
-else:
-    output_to = file(options.output_to, 'wb')
-
-try:
-    result = CsvResult(output_to)
-    if options.no_passthrough:
-        passthrough_stream = DiscardStream()
-    else:
-        passthrough_stream = None
-    if options.forward:
-        forward_stream = sys.stdout
-    else:
-        forward_stream = None
-    test = ProtocolTestCase(sys.stdin, passthrough=passthrough_stream,
-       forward=forward_stream)
-    result.startTestRun()
-    test.run(result)
-    result.stopTestRun()
-finally:
-    if options.output_to is not None:
-        output_to.close()
-if result.wasSuccessful():
-    exit_code = 0
-else:
-    exit_code = 1
-sys.exit(exit_code)
+main()
diff --git a/python/subunit/filters.py b/python/subunit/filters.py
new file mode 100644 (file)
index 0000000..9880508
--- /dev/null
@@ -0,0 +1,83 @@
+#  subunit: extensions to python unittest to get test results from subprocesses.
+#  Copyright (C) 2009  Robert Collins <robertc@robertcollins.net>
+#
+#  Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
+#  license at the users choice. A copy of both licenses are available in the
+#  project source as Apache-2.0 and BSD. You may not use this file except in
+#  compliance with one of these two licences.
+#  
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under these licenses is distributed on an "AS IS" BASIS, WITHOUT
+#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+#  license you chose for the specific language governing permissions and
+#  limitations under that license.
+#
+
+
+from optparse import OptionParser
+import sys
+
+from subunit import DiscardStream, ProtocolTestCase
+from subunit.test_results import CsvResult
+
+
+def make_options():
+    parser = OptionParser(description=__doc__)
+    parser.add_option(
+        "--no-passthrough", action="store_true",
+        help="Hide all non subunit input.", default=False, dest="no_passthrough")
+    parser.add_option(
+        "-o", "--output-to",
+        help="Output the XML to this path rather than stdout.")
+    parser.add_option(
+        "-f", "--forward", action="store_true", default=False,
+        help="Forward subunit stream on stdout.")
+    return parser
+
+
+def get_output_stream(output_to):
+    if output_to is None:
+        return sys.stdout
+    else:
+        return file(output_to, 'wb')
+
+
+def filter_with_result(result, no_passthrough, forward):
+    if no_passthrough:
+        passthrough_stream = DiscardStream()
+    else:
+        passthrough_stream = None
+    if forward:
+        forward_stream = sys.stdout
+    else:
+        forward_stream = None
+
+    test = ProtocolTestCase(
+        sys.stdin, passthrough=passthrough_stream,
+        forward=forward_stream)
+    result.startTestRun()
+    test.run(result)
+    result.stopTestRun()
+
+    return result.wasSuccessful()
+
+
+def something(result_factory, output_path, no_passthrough, forward):
+    output_to = get_output_stream(output_path)
+    result = result_factory(output_to)
+    try:
+        successful = filter_with_result(result, no_passthrough, forward)
+    finally:
+        if output_path:
+            output_to.close()
+    if successful:
+        return 0
+    else:
+        return 1
+
+
+def main():
+    parser = make_options()
+    (options, args) = parser.parse_args()
+    sys.exit(
+        something(CsvResult, options.output_to, options.no_passthrough, options.forward))