kif-parser (empty) → 0.0.3
raw patch · 7 files changed
+253/−0 lines, 7 filesdep +basedep +bytestringdep +cmdargssetup-changed
Dependencies added: base, bytestring, cmdargs, hostname, old-time, parsec, twine
Files
- LICENSE +31/−0
- Main.hs +135/−0
- Setup.hs +3/−0
- kif-parser.cabal +33/−0
- templates/json.tmpl +33/−0
- templates/junit.tmpl +7/−0
- templates/markdown.tmpl +11/−0
+ LICENSE view
@@ -0,0 +1,31 @@+Copyright (c) 2012, Monoid - Development and Consulting - Jan Christiansen++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++* Redistributions of source code must retain the above copyright+notice, this list of conditions and the following disclaimer.++* Redistributions in binary form must reproduce the above+copyright notice, this list of conditions and the following+disclaimer in the documentation and/or other materials provided+with the distribution.++* Neither the name of Monoid - Development and Consulting - +Jan Christiansen nor the names of other+contributors may be used to endorse or promote products derived+from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Main.hs view
@@ -0,0 +1,135 @@+{-# LANGUAGE DeriveDataTypeable #-}++module Main where++import System.Environment (getArgs, withArgs)+import System.Time+import Data.Version (showVersion)+import Network.HostName+import Text.Twine+import qualified Data.ByteString as BS+import System.Console.CmdArgs+import Paths_kif_parser++import Text.KIF+import Text.KIF.Parser++data Params = Params {+ output :: OutputType,+ configuration :: String,+ file :: FilePath+}+ deriving (Show, Data, Typeable)++data OutputType = JUnit+ | Markdown+ | JSON+ deriving (Show, Data, Typeable)++params :: Params+params = Params {+ configuration = "" &= help "An optional text that is displayed as the test description",+ output = JUnit &= argPos 0,+ file = def &= typ "FILE" &= argPos 1+}++getParams :: IO Params+getParams =+ cmdArgs $ params+ &= program "kif-parser"+ &= versionArg [explicit, name "version", name "v", summary summaryText]+ &= summary summaryText+ &= details ["Process Keep It Functional log files"]++summaryText :: String+summaryText = "kif-parser " ++ showVersion version ++ ", Jan Christiansen"++main :: IO ()+main = do+ args <- getArgs+ params <- (if null args then withArgs ["--help"] else id) getParams+ case output params of+ JUnit -> readKIF (file params) >>= kifToJUnit (configuration params) >>= BS.putStr+ Markdown -> readKIF (file params) >>= kifToMarkdown (configuration params) >>= BS.putStr+ JSON -> readKIF (file params) >>= kifToJSON (configuration params) >>= BS.putStr++kifToJUnit :: String -> KIFTest -> IO BS.ByteString+kifToJUnit config kifTest = do+ timeStamp <- getClockTime+ hostName <- getHostName+ context <- makeContext $ do+ "configuration" =: config+ "timeStamp" =: show timeStamp+ "hostName" =: hostName+ "test" =: mapStrings escapeXML kifTest+ filePath <- getDataFileName "templates/junit.tmpl"+ evalTemplate filePath context++escapeXML :: String -> String+escapeXML = concatMap esc+ where+ esc c = case c of+ '"' -> """+ '\'' -> "'"+ '<' -> "<"+ '>' -> ">"+ '&' -> "&"+ _ -> [c]++kifToMarkdown :: String -> KIFTest -> IO BS.ByteString+kifToMarkdown config kifTest = do+ context <- makeContext $ do+ "configuration" =: config+ "test" =: kifTest+ filePath <- getDataFileName "templates/markdown.tmpl"+ evalTemplate filePath context++kifToJSON :: String -> KIFTest -> IO BS.ByteString+kifToJSON config kifTest = do+ context <- makeContext $ do+ "configuration" =: escapeJSON config+ "test" =: mapStrings escapeJSON kifTest+ filePath <- getDataFileName "templates/json.tmpl"+ evalTemplate filePath context++escapeJSON :: String -> String+escapeJSON str = "\"" ++ concatMap esc str ++ "\""+ where+ esc c = case c of+ '"' -> "\\\""+ '\\' -> "\\\\"+ '/' -> "\\/"+ '\NUL' -> "\\u0000"+ '\SOH' -> "\\u0001"+ '\STX' -> "\\u0002"+ '\ETX' -> "\\u0003"+ '\EOT' -> "\\u0004"+ '\ENQ' -> "\\u0005"+ '\ACK' -> "\\u0006"+ '\a' -> "\\u0007"+ '\b' -> "\\b"+ '\t' -> "\\t"+ '\n' -> "\\n"+ '\v' -> "\\u000b"+ '\f' -> "\\f"+ '\r' -> "\\r"+ '\SO' -> "\\u000e"+ '\SI' -> "\\u000f"+ '\DLE' -> "\\u0010"+ '\DC1' -> "\\u0011"+ '\DC2' -> "\\u0012"+ '\DC3' -> "\\u0013"+ '\DC4' -> "\\u0014"+ '\NAK' -> "\\u0015"+ '\SYN' -> "\\u0016"+ '\ETB' -> "\\u0017"+ '\CAN' -> "\\u0018"+ '\EM' -> "\\u0019"+ '\SUB' -> "\\u001a"+ '\ESC' -> "\\u001b"+ '\FS' -> "\\u001c"+ '\GS' -> "\\u001d"+ '\RS' -> "\\u001e"+ '\US' -> "\\u001f"+ '\DEL' -> "\\u007f"+ _ -> [c]
+ Setup.hs view
@@ -0,0 +1,3 @@+import Distribution.Simple++main = defaultMain
+ kif-parser.cabal view
@@ -0,0 +1,33 @@+name: kif-parser+version: 0.0.3+cabal-version: >= 1.6+stability: alpha+description: Converts KIF (Keep It Functional) iOS integration test logs into other formats, i.e., JUnit XML format +synopsis: Process KIF iOS test logs+license: BSD3+license-file: LICENSE+author: Jan Christiansen+maintainer: Jan Christiansen <j.christiansen@monoid-it.de>+category: Distribution+build-type: Simple+bug-reports: https://github.com/plancalculus/kif-parser/issues+data-files:+ templates/junit.tmpl,+ templates/markdown.tmpl,+ templates/json.tmpl++source-repository head+ type: git+ location: https://github.com/plancalculus/kif-parser.git++executable kif-parser+ main-is: Main.hs+ ghc-options: -Wall -fno-warn-unused-do-bind+ build-depends:+ base >= 4 && < 5,+ parsec,+ twine,+ bytestring,+ old-time,+ hostname,+ cmdargs
+ templates/json.tmpl view
@@ -0,0 +1,33 @@++{+ "test": {+ "no-of-scenarios": {{test.noOfScenarios}},+ "no-of-failures": {{test.noOfFailures}},+ "duration": {{test.duration}},+ "scenarios": [+ {@|scenario <- test.scenarios|+ "scenario" : {+ "number": {{scenario.number}},+ "description": {{scenario.description}},+ "no-of-steps": {{scenario.noOfSteps}},+ "duration": {{scenario.duration}},+ "passed": {?|scenario.passed|true?}{?|scenario.failed|false?},+ "steps": [+ {@|step <- scenario.steps|+ {?|step.passed|"pass": {+ "description": {{step.description}},+ "duration": {{step.duration}}+ }+ ?}+ {?|step.failed|"fail": {+ "description": {{step.description}},+ "reason": {{step.reason}},+ "duration": {{step.duration}}+ }+ ?}+ @}+ }+ @}+ ]+ }+}
+ templates/junit.tmpl view
@@ -0,0 +1,7 @@+<?xml version='1.0' ?>++<testsuite name="{{configuration}}" errors="0" failures="{{test.noOfFailures}}" tests="{{test.noOfScenarios}}" time="{{test.duration}}" timestamp="{{timeStamp}}" hostname="{{hostName}}">+{@|scenario <- test.scenarios|+<testcase name="{{scenario.description}}" classname="KIFTestScenario" time="{{scenario.duration}}" />+@}+</testsuite>
+ templates/markdown.tmpl view
@@ -0,0 +1,11 @@+# Test Report {{configuration}}++{@|scenario <- test.scenarios|+## Test Case {{scenario.number}}: {{scenario.description}} {?|scenario.passed|(**Passed**)?}{?|scenario.failed|(**Failed**)?}+Performs {{scenario.noOfSteps}} steps in {{scenario.duration}}++{@|step <- scenario.steps|+ * {{step.description}} {?|step.passed|(**Passed**)?}{?|step.failed|(**Failed**)?}+@}++@}