cobot-io 0.1.3.8 → 0.1.3.9
raw patch · 5 files changed
+89/−20 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Bio.MMTF.Decode.MessagePack: type MonadFail m = Monad m
Files
- ChangeLog.md +4/−0
- cobot-io.cabal +2/−2
- src/Bio/FASTA/Parser.hs +3/−4
- test/FASTASpec.hs +12/−10
- test/FastaParserSpec.hs +68/−4
ChangeLog.md view
@@ -2,6 +2,10 @@ ## [Unreleased] +## [0.1.3.9] - 2020-10-27+### Fixed+- FASTA parser can now parse empty lines with spaces. + ## [0.1.3.8] - 2020-10-22 ### Fixed - A couple of issues, that caused parametrization failures, fixed in bond restoring for PDB format.
cobot-io.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: c8e4ad988d6a9a2190936e54867ea81535c6b883ad6448fd8fbd16eab88715ca+-- hash: 2fa509bfbb994978869ae5dc69747b5693ec1c98d823c08ae3b850221ef52a80 name: cobot-io-version: 0.1.3.8+version: 0.1.3.9 synopsis: Biological data file formats and IO description: Please see the README on GitHub at <https://github.com/biocad/cobot-io#readme> category: Bio
src/Bio/FASTA/Parser.hs view
@@ -6,8 +6,8 @@ import Bio.FASTA.Type (Fasta, FastaItem (..)) import Bio.Sequence (BareSequence, bareSequence) import Data.Attoparsec.Text (Parser, char, choice, endOfInput, endOfLine, many', many1', satisfy,- takeWhile)-import Data.Char (isLetter)+ skipWhile, takeWhile)+import Data.Char (isLetter, isSpace) import Data.Text (Text, strip) import Prelude hiding (takeWhile) @@ -20,7 +20,7 @@ fastaPGeneric = many' . item item :: (Char -> Bool) -> Parser (FastaItem Char)-item predicate = FastaItem <$> seqName <*> fastaSeq predicate+item predicate = (FastaItem <$> seqName <*> fastaSeq predicate) <* skipWhile isSpace seqName :: Parser Text seqName = strip <$> (char '>' *> tabs *> takeWhile (`notElem` ['\n', '\r']) <* tabs <* eol)@@ -39,4 +39,3 @@ tabs :: Parser () tabs = () <$ many' (char '\t')-
test/FASTASpec.hs view
@@ -2,12 +2,12 @@ module FASTASpec where -import Bio.FASTA (fromFile, toFile)-import Bio.FASTA.Type (Fasta, FastaItem (..))-import Bio.Sequence (bareSequence)-import Prelude hiding (readFile, writeFile)-import System.Directory (removeFile)-import Test.Hspec+import Bio.FASTA (fromFile, toFile)+import Bio.FASTA.Type (Fasta, FastaItem (..))+import Bio.Sequence (bareSequence)+import Prelude hiding (readFile, writeFile)+import System.Directory (removeFile)+import Test.Hspec correctFasta :: Fasta Char correctFasta = [ FastaItem "3HMX:A|PDBID|CHAIN|SEQUENCE" (bareSequence "IWELKKDVYVVELDWYPDAPGEMVVLTCDTPEEDGITWTLDQSSEVLGSGKTLTIQVKEFGDAGQYTCHKGGEVLSHSLL")@@ -22,10 +22,11 @@ writeFile "test/FASTA/test.fasta" parseFile :: FilePath -> Spec-parseFile path = describe "fromFile" $ do- it "correctly parses fasta from file" $ do- fasta <- fromFile path- fasta `shouldBe` correctFasta+parseFile path = do+ describe "fromFile" $ do+ it "correctly parses fasta from file" $ do+ fasta <- fromFile path+ fasta `shouldBe` correctFasta writeFile :: FilePath -> Spec writeFile path = describe "writeFile" $ do@@ -34,3 +35,4 @@ fasta <- fromFile path removeFile path fasta `shouldBe` correctFasta+
test/FastaParserSpec.hs view
@@ -2,10 +2,12 @@ module FastaParserSpec where -import Bio.FASTA.Parser (fastaP)-import Bio.FASTA.Type (FastaItem(..))-import Bio.Sequence (bareSequence)-import Data.Attoparsec.Text (parseOnly)+import Bio.FASTA.Parser (fastaP)+import Bio.FASTA.Type (Fasta, FastaItem (..))+import Bio.Sequence (bareSequence)+import Data.Attoparsec.Text (endOfInput, parseOnly)+import Data.Text (Text)+import qualified Data.Text as T import Test.Hspec fastaParserSpec :: Spec@@ -21,6 +23,7 @@ sequenceWithSeveralEndOfLineInSequence sequenceWithTabsInName sequenceWithTabsInSequence+ toughParserTests emptyFasta :: Spec emptyFasta = describe "emptyFasta" $ do@@ -87,3 +90,64 @@ it "correctly parses sequence with tabs between sequence parts" $ do let res = parseOnly fastaP ">this is my sequence\nIWELKKDVYVVELDWYPDAPGEMVVLTCDTPEEGITWTLDQSSE\t\t\nYYYYYYYYYYYYYYYYYYYYYYYY\t\n" res `shouldBe` Right [FastaItem "this is my sequence" (bareSequence "IWELKKDVYVVELDWYPDAPGEMVVLTCDTPEEGITWTLDQSSEYYYYYYYYYYYYYYYYYYYYYYYY")]++toughParserTests :: Spec+toughParserTests = describe "various parser tests" $ do+ it "correctly parses empty lines" $ checkParser correctTest1 (Right correctAnswer)+ it "correctly parses empty lines with spaces" $ checkParser correctTest2 (Right correctAnswer)+ it "correctly parses empty lines with tabs" $ checkParser correctTest3 (Right correctAnswer)+ it "correctly fails to parse a name without >" $ checkParser incorrectTest1 (Left "endOfInput")+ it "correctly fails to parse a new sequence at the same line" $ checkParser incorrectTest2 (Left "endOfInput")++correctTest1 :: Text+correctTest1 = T.unlines+ [ ">test1"+ , "ABCDEF"+ , "GHIJKL"+ , ""+ , ">test2"+ , "ABCDEF"+ ]++correctTest2 :: Text+correctTest2 = T.unlines+ [ ">test1"+ , "ABCDEF"+ , "GHIJKL"+ , " "+ , ">test2"+ , "ABCDEF"+ ]++correctTest3 :: Text+correctTest3 = T.unlines+ [ ">test1"+ , "ABCDEF"+ , "GHIJKL"+ , "\t"+ , ">test2"+ , "ABCDEF"+ ]++incorrectTest1 :: Text+incorrectTest1 = T.unlines+ [ "test1"+ , "ABCDEF"+ , "GHIJKL"+ , ">test2"+ , "ABCDEF"+ ]++incorrectTest2 :: Text+incorrectTest2 = T.unlines+ [ ">test1"+ , "ABCDEF"+ , "GHIJKL >test2"+ , "ABCDEF"+ ]++correctAnswer :: Fasta Char+correctAnswer = [FastaItem "test1" (bareSequence "ABCDEFGHIJKL"), FastaItem "test2" (bareSequence "ABCDEF")]++checkParser :: Text -> Either String (Fasta Char) -> Expectation+checkParser source expectation = parseOnly (fastaP <* endOfInput) source `shouldBe` expectation