ClustalParser 1.2.2 → 1.2.3
raw patch · 4 files changed
+87/−17 lines, 4 filesdep +hspec-discoverdep ~hspecPVP ok
version bump matches the API change (PVP)
Dependencies added: hspec-discover
Dependency ranges changed: hspec
API changes (from Hackage documentation)
Files
- ClustalParser.cabal +12/−15
- changelog +2/−0
- src/Bio/ClustalParser.hs +3/−2
- test-suite/ClustalParserSpec.hs +70/−0
ClustalParser.cabal view
@@ -1,15 +1,9 @@ name: ClustalParser--- The package version. See the Haskell package versioning policy (PVP) --- for standards guiding when and how versions should be incremented.--- http://www.haskell.org/haskellwiki/Package_versioning_policy--- PVP summary: +-+------- breaking API changes--- | | +----- non-breaking API additions--- | | | +--- code changes with no API change-version: 1.2.2+version: 1.2.3 synopsis: Libary for parsing Clustal tools output description: Currently contains parsers and datatypes for: clustalw2, clustalo, mlocarna, cmalign .- Clustal tools are multiple sequence alignment tools for biological sequence like DNA, RNA and Protein.+ Clustal tools are multiple sequence alignment tools for biological sequence like DNA, RNA and Protein. For more information on clustal Tools refer to <http://www.clustal.org/>. . Mlocarna is a multiple sequence alignment tool for RNA sequences with secondary structure output. @@ -22,10 +16,11 @@ license-file: LICENSE author: Florian Eggenhofer maintainer: egg@informatik.uni-freiburg.de--- copyright: +-- copyright: category: Bioinformatics build-type: Simple cabal-version: >=1.8+Tested-With: GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2 extra-source-files: README.md changelog@@ -36,9 +31,10 @@ source-repository this type: git- location: https://github.com/eggzilla/ClustalParser/tree/1.2.2- tag: 1.2.2+ location: https://github.com/eggzilla/ClustalParser/tree/1.2.3+ tag: 1.2.3 + library -- Modules exported by the library. exposed-modules: Bio.ClustalParser@@ -47,7 +43,7 @@ -- Other library packages from which modules are imported. build-depends: base >=4.5 && <5, parsec>=3.1.9, vector, text -- compiler options- ghc-options: -Wall -O2 -fno-warn-unused-do-bind+ ghc-options: -Wall -fno-warn-unused-do-bind -- Directories containing source files. hs-source-dirs: src @@ -55,10 +51,11 @@ main-is: ClustalParserTest.hs build-depends: base >= 4 && <= 5, cmdargs, ClustalParser, either-unwrap -- compiler options - ghc-options: -Wall -O2+ ghc-options: -Wall test-suite hspec- build-depends: base, parsec, ClustalParser, hspec >= 1.8, text+ build-depends: base, parsec, ClustalParser, hspec >= 2.0, text, hspec-discover hs-source-dirs: test-suite main-is: Spec.hs- type: exitcode-stdio-1.0 + type: exitcode-stdio-1.0+ other-modules: ClustalParserSpec
changelog view
@@ -1,4 +1,6 @@ -*-change-log-*-+1.2.3 Florian Eggenhofer <egg@cs.uni-freiburg.de> 12. March 2018+ * Fixed parsing of additional newline in Biopythons AlignIO output without conservation track 1.2.2 Florian Eggenhofer <egg@cs.uni-freiburg.de> 07. March 2018 * Clustal parser can now parse alignments with missing consensus annotation
src/Bio/ClustalParser.hs view
@@ -118,6 +118,7 @@ many1 (noneOf "\n") many1 (try newline) alignmentSlices <- many1 (try genParserClustalAlignmentSlice)+ optional newline eof return (mergealignmentSlices alignmentSlices) @@ -140,11 +141,11 @@ entrySlices' <- many1 genParserClustalEntrySlice --extract length of identifier and spacer to determine offset of conservation track let offsetLenght = length (entrySequenceSliceIdentifier (head entrySlices')) + spacerLength (head entrySlices')- conservationTrackSlice <- choice [(lookAhead (string "\n")), (try (genParserConservationTrackSlice offsetLenght))]+ conservationTrackSliceChoice <- choice [(lookAhead (string "\n")), (try (genParserConservationTrackSlice offsetLenght))] --spacerAndConservationTrackSlice <- many1 (noneOf "\n") --let conservationTrackSlice' = drop offsetLenght spacerAndConservationTrackSlice --newline- let conservationTrackSlice' = if (conservationTrackSlice == "\n") then "" else conservationTrackSlice+ let conservationTrackSlice' = if (conservationTrackSliceChoice == "\n") then "" else conservationTrackSliceChoice optional newline return $ ClustalAlignmentSlice entrySlices' conservationTrackSlice'
+ test-suite/ClustalParserSpec.hs view
@@ -0,0 +1,70 @@+module ClustalParserSpec (spec) where++import Bio.ClustalParser +import Test.Hspec+import Test.Hspec.QuickCheck+import Text.Parsec.Error+import Text.Parsec.Pos+import Text.ParserCombinators.Parsec.Error+import qualified Data.Text as T++spec :: Spec+spec = do+ describe "Clustal W Parser" $ do+ context "Parsing RNAalifold input" $ do+ it "Returns ClustalAlignment type" $ do+ (parseClustalAlignment clustalExample) `shouldBe` (Right clustalResult)+ context "Parsing invalid input" $ do+ it "Returns ParseError" $ do+ (parseClustalAlignment "invalid input") `shouldBe` Left clustalParseError+ describe "Structural Clustal Parser" $ do+ context "Parsing Structural Clustal input" $ do+ it "Returns StructuralClustalAlignment type" $ do+ (parseStructuralClustalAlignment structuralClustalExample) `shouldBe` Right structuralClustalResult+ context "Parsing invalid input" $ do+ it "Returns ParseError" $ do+ (parseStructuralClustalAlignment "invalid input") `shouldBe` Left structuralClustalParseError+ describe "Structural Clustal Parser 2" $ do+ context "Parsing Structural Clustal input 2" $ do+ it "Returns StructuralClustalAlignment type" $ do+ (parseStructuralClustalAlignment structuralClustalExample2) `shouldBe` Right structuralClustalResult2+ context "Parsing invalid input" $ do+ it "Returns ParseError" $ do+ (parseStructuralClustalAlignment "invalid input") `shouldBe` Left structuralClustalParseError+ + +clustalParseError :: ParseError+clustalParseError = (addErrorMessage (Expect "\"CLUSTAL\"") (newErrorMessage clustalErrorMessage clustalErrorSourcePosition))++clustalErrorMessage :: Message+clustalErrorMessage = SysUnExpect "\"i\""++clustalErrorSourcePosition :: SourcePos+clustalErrorSourcePosition = newPos "genParserClustalAlignment" 1 1++clustalExample :: String+clustalExample = "CLUSTAL 2.1 multiple sequence alignment\n\n\nNC_0123:123-540 AATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTT\nNC_0223:123-540 AATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTT\nNC_0323:123-540 AATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTT\n ************************************************************\nNC_0123:123-540 TTTTTTTTTTTTTT----------------------------------------------\nNC_0223:123-540 TTTTTTTTTTTTTTAATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAA\nNC_0323:123-540 TTTTTTTTTTTTTTAATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAA\n ************** \n\nNC_0123:123-540 ----------------------------\nNC_0223:123-540 AAAAAAATTTTTTTTTTTTTTTTTTTTT\nNC_0323:123-540 AAAAAAATTTTTTTTTTTTTTTTTTTTT\n * \n"++clustalResult :: ClustalAlignment+clustalResult = ClustalAlignment [ClustalAlignmentEntry (T.pack "NC_0123:123-540") (T.pack "AATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTT--------------------------------------------------------------------------"),ClustalAlignmentEntry (T.pack "NC_0223:123-540") (T.pack "AATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTAATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTT"),ClustalAlignmentEntry (T.pack "NC_0323:123-540") (T.pack "AATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTAATATATATTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTT")] (T.pack "************************************************************************** * ")++structuralClustalParseError :: ParseError+structuralClustalParseError = addErrorMessage (Expect "\"mLocARNA\"") (newErrorMessage structuralClustalErrorMessage structuralClustalErrorSourcePosition)++structuralClustalErrorMessage :: Message+structuralClustalErrorMessage = SysUnExpect "\"i\""++structuralClustalErrorSourcePosition :: SourcePos+structuralClustalErrorSourcePosition = newPos "genParserStructuralClustalAlignment" 1 1++structuralClustalExample :: String+structuralClustalExample = "mLocARNA --- multiple Local (and global) Alignment of RNA --- LocARNA 1.8.0\nCopyright Sebastian Will\n\nCompute pair probs ...\nPerform progressive alignment ...\n\n\n\nAB001721.1/2735-2851 CCCGGUGACUAUAGAGAGAGGGCCACACCCGUUCCCAUCCCGAACACGGAAGUUAAGCCUCUCAUCGCUGAUGGUACUAUGUGGUUCGCUGCAUGGGAGAGUAGGACGUUGCCGGGU\ngi|451991584:1-117 CCCGGUGACUAUAGAGAGAGGGCCACACCCGUUCCCAUCCCGAACACGGAAGUUAAGCCUCUCAUCGCUGAUGGUACUAUGUGGUUCGCUGCAUGGGAGAGUAGGACGUUGCCGGGU\nalifold (((((((((....(.(((.(((.....))).))).)...(((....)))..(((..(((((((((.((.(.(((.(((....))))))).))))))))).))..)))))))))))). (-38.30 = -38.30 + 0.00)\n"+ +structuralClustalResult :: StructuralClustalAlignment+structuralClustalResult = StructuralClustalAlignment [ClustalAlignmentEntry (T.pack "AB001721.1/2735-2851") (T.pack "CCCGGUGACUAUAGAGAGAGGGCCACACCCGUUCCCAUCCCGAACACGGAAGUUAAGCCUCUCAUCGCUGAUGGUACUAUGUGGUUCGCUGCAUGGGAGAGUAGGACGUUGCCGGGU"),ClustalAlignmentEntry (T.pack "gi|451991584:1-117") (T.pack "CCCGGUGACUAUAGAGAGAGGGCCACACCCGUUCCCAUCCCGAACACGGAAGUUAAGCCUCUCAUCGCUGAUGGUACUAUGUGGUUCGCUGCAUGGGAGAGUAGGACGUUGCCGGGU")] (T.pack "(((((((((....(.(((.(((.....))).))).)...(((....)))..(((..(((((((((.((.(.(((.(((....))))))).))))))))).))..)))))))))))).") (-38.30)++structuralClustalExample2 :: String+structuralClustalExample2 = "mLocARNA --- multiple Local (and global) Alignment of RNA --- LocARNA 1.9.0\nCopyright Sebastian Will\n\nCompute pair probs ...\nCompute pairwise alignments ... \nPerform progressive alignment ...\n\n\n\nAARQ02000011.1/391-585 -AAUUGAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUGCUUG-AAGGUGAAAUCCCUGAAAAGUA-UCGAUCAGUUGACGAGGAGGAGAUUAAUCGAAGUUUCGGCGGGAGUCUCCCG\nCP006940.1:755039-755234 CAAUUGAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUGCUUG-AAGGUGAAAUCCCUGAAAAGUA-UCGAUCAGUUGACGAGGAGGAGAUUAAUCGAAGUUUCGGCGGGAGUCUCCCG\nAM263198.1:720654-720850 CAAUUAAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUACUUG-AAGGUGAAAUUCCUGAAAAGUA-ACGGUCAGUUGACGAGGAGGAGAUUAAUCGAAAGUUCGGCGGGAGUCUCCCG\nAL596166.1:50733-50929 CAACUGAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUGCUUA-AAGGUGAAAUUCCUGGAAAGUAAACAAUCAGUUGACGAGGAGGAGAUUAAUCGAAAUUUCGGCGGGAGUCUCCCG\nFR687253.1:714343-714539 CAACUGAAUAGAAGCGCCAGAACUGAUCGGAUCGAAAUUACUUUCUAGGUGAAAUUCCU-AAAAGUAACGGGUCAGUUGACGAGGAGGAGAUUAAUCGAAGUUUCGGCGGGAGUCUCCCG\n\nAARQ02000011.1/391-585 GCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAACAUGCUU\nCP006940.1:755039-755234 GCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAAUAUGCUU\nAM263198.1:720654-720850 GCUGUAGCAUGCAGUCGUUAAGUCUUACUUACAAAACAUUUGGGUGACCAAAUGGACAGAGUAGUAAUGAAAUAUGUGU\nAL596166.1:50733-50929 GCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAACAUGUGC\nFR687253.1:714343-714539 GCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAACAUGCGC\n\nalifold .............(((((..((((((((((........(((((...(((.......)))...))))).))))))))))......(.(((((((..((((....))))....)))))))))\n )).)).(((((...((((((....((((((.....((((((((....))))))))...))))))))))))..))))).. (-68.86 = -47.45 + -21.41)\n"++structuralClustalResult2 :: StructuralClustalAlignment+structuralClustalResult2 = StructuralClustalAlignment [ClustalAlignmentEntry (T.pack "AARQ02000011.1/391-585") (T.pack "-AAUUGAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUGCUUG-AAGGUGAAAUCCCUGAAAAGUA-UCGAUCAGUUGACGAGGAGGAGAUUAAUCGAAGUUUCGGCGGGAGUCUCCCGGCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAACAUGCUU"),ClustalAlignmentEntry (T.pack "CP006940.1:755039-755234") (T.pack "CAAUUGAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUGCUUG-AAGGUGAAAUCCCUGAAAAGUA-UCGAUCAGUUGACGAGGAGGAGAUUAAUCGAAGUUUCGGCGGGAGUCUCCCGGCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAAUAUGCUU"),ClustalAlignmentEntry (T.pack "AM263198.1:720654-720850") (T.pack "CAAUUAAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUACUUG-AAGGUGAAAUUCCUGAAAAGUA-ACGGUCAGUUGACGAGGAGGAGAUUAAUCGAAAGUUCGGCGGGAGUCUCCCGGCUGUAGCAUGCAGUCGUUAAGUCUUACUUACAAAACAUUUGGGUGACCAAAUGGACAGAGUAGUAAUGAAAUAUGUGU"),ClustalAlignmentEntry (T.pack "AL596166.1:50733-50929") (T.pack "CAACUGAAUAGAAGCGCCAGAACUGAUUGGGACGAAAAUGCUUA-AAGGUGAAAUUCCUGGAAAGUAAACAAUCAGUUGACGAGGAGGAGAUUAAUCGAAAUUUCGGCGGGAGUCUCCCGGCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAACAUGUGC"),ClustalAlignmentEntry (T.pack "FR687253.1:714343-714539") (T.pack "CAACUGAAUAGAAGCGCCAGAACUGAUCGGAUCGAAAUUACUUUCUAGGUGAAAUUCCU-AAAAGUAACGGGUCAGUUGACGAGGAGGAGAUUAAUCGAAGUUUCGGCGGGAGUCUCCCGGCUGU-GCAUGCAGUCGUUAAGUCUUACUUACAAAUCAUUUGGGUGACCAAGUGGACAGAGUAGUAAUGAAACAUGCGC")] (T.pack ".............(((((..((((((((((........(((((...(((.......)))...))))).))))))))))......(.(((((((..((((....))))....))))))))))).)).(((((...((((((....((((((.....((((((((....))))))))...))))))))))))..)))))..") (-68.86)