Skip to content

Commit

Permalink
ENH Add load_sample_from_yaml function
Browse files Browse the repository at this point in the history
To load a single sample from an YAML file
  • Loading branch information
luispedro committed Jul 19, 2022
1 parent c89a4c8 commit 86ae91f
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 13 deletions.
53 changes: 41 additions & 12 deletions NGLess/BuiltinModules/Samples.hs
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
{-# LANGUAGE CPP #-}
{- Copyright 2022 NGLess Authors
- License: MIT
-}

module BuiltinModules.Samples
( loadModule
#ifdef IS_BUILDING_TEST
, executeLoadSample
, executeLoadSampleList
#endif
) where

import qualified Data.ByteString as B
import qualified Data.Text as T
import Data.List (find)
import Data.Default (def)
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
Expand Down Expand Up @@ -104,23 +110,46 @@ executeLoadSampleList (NGOString fname) _ = do
Left err -> throwSystemError ("Could not sample information file "++ (T.unpack fname) ++ ". Error was `" ++ show err ++ "`")
executeLoadSampleList arg _ = throwShouldNotOccur ("load_sample_list called with argument: " ++ show arg)


load_sample_list_Function = Function
{ funcName = FuncName "load_sample_list"
, funcArgType = Just NGLString
, funcArgChecks = []
, funcRetType = NGList NGLReadSet
, funcKwArgs = []
, funcAllowsAutoComprehension = True
, funcChecks = [FunctionCheckMinNGLessVersion (1,5)
,FunctionCheckReturnAssigned]
}
executeLoadSample :: NGLessObject -> KwArgsValues -> NGLessIO NGLessObject
executeLoadSample fname kwargs = do
sample <- lookupStringOrScriptError "load_sample_from_yaml arguments" "sample" kwargs
samples <- executeLoadSampleList fname []
case samples of
NGOList l -> case find (\(NGOReadSet n _) -> n == sample) l of
Just s -> return s
_ -> throwDataError ("load_sample_from_yaml: sample " ++ show sample ++ " not found in file " ++ show fname)
_ -> throwShouldNotOccur "load_sample_from_yaml: sample list is not a list"


yamlFunctions =
[ Function
{ funcName = FuncName "load_sample_list"
, funcArgType = Just NGLString
, funcArgChecks = []
, funcRetType = NGList NGLReadSet
, funcKwArgs = [ArgInformation "sample" True (NGList NGLString) []]
, funcAllowsAutoComprehension = True
, funcChecks = [FunctionCheckMinNGLessVersion (1,5)
,FunctionCheckReturnAssigned]
}
, Function
{ funcName = FuncName "load_sample_from_yaml"
, funcArgType = Just NGLString
, funcArgChecks = []
, funcRetType = NGList NGLReadSet
, funcKwArgs = []
, funcAllowsAutoComprehension = True
, funcChecks = [FunctionCheckMinNGLessVersion (1,5)
,FunctionCheckReturnAssigned]
}
]

loadModule :: T.Text -> NGLessIO Module
loadModule _ = return def
{ modInfo = ModInfo "builtin.samples" "1.5"
, modFunctions = [load_sample_list_Function]
, modFunctions = yamlFunctions
, runFunction = \case
"load_sample_list" -> executeLoadSampleList
"load_sample_from_yaml" -> executeLoadSample
_ -> error "NOT POSSIBLE"
}
2 changes: 2 additions & 0 deletions Tests-Src/Tests.hs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import Tests.Language (tgroup_Language)
import Tests.LoadFQDirectory (tgroup_LoadFQDirectory)
import Tests.NGLessAPI (tgroup_NGLessAPI)
import Tests.Parse (tgroup_Parse)
import Tests.Samples (tgroup_Samples)
import Tests.Select (tgroup_Select)
import Tests.Types (tgroup_Types)
import Tests.Validation (tgroup_Validation)
Expand All @@ -63,6 +64,7 @@ test_Types = [tgroup_Types]
test_NGLessAPI = [tgroup_NGLessAPI]
test_Vector = [tgroup_Vector]
test_IntGroups = [tgroup_IntGroups]
test_Samples = [tgroup_Samples]
test_Select = [tgroup_Select]
test_Language = [tgroup_Language]
test_LoadFqDir = [tgroup_LoadFQDirectory]
Expand Down
2 changes: 1 addition & 1 deletion Tests-Src/Tests/FastQ.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import qualified Data.Conduit.List as CL

import Interpretation.FastQ
import Interpretation.Substrim
import Tests.Utils
import Tests.Utils (asTempFile)
import Data.FastQ
import Utils.Here
import Utils.Conduit
Expand Down
49 changes: 49 additions & 0 deletions Tests-Src/Tests/Samples.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}

{- Copyright 2022 NGLess Authors
- License: MIT
-}
module Tests.Samples
( tgroup_Samples
) where

import Test.Tasty.TH
import Test.Tasty.HUnit
import qualified Data.ByteString as B
import qualified Data.Text as T
import Control.Monad.IO.Class (liftIO)

import BuiltinModules.Samples
import Language
import Utils.Here
import Tests.Utils (asTempFile, testNGLessIO)

simpleYaml :: B.ByteString
simpleYaml = [here|
samples:
sample1:
- paired:
- sample/sample1a.1.fq.gz
- sample/sample1a.2.fq.gz
sample2:
- paired:
- sample/sample2a.1.fq.gz
- sample/sample2a.2.fq.gz
|]

tgroup_Samples = $(testGroupGenerator)

getSampleName (NGOReadSet name _) = name

case_load_samples :: Assertion
case_load_samples = testNGLessIO $ do
simpleYamlF <- asTempFile simpleYaml "yaml"
NGOList samples <- executeLoadSampleList (NGOString $ T.pack simpleYamlF) []
liftIO $ length samples @?= 2
liftIO $ (getSampleName $ head samples) @?= "sample1"
liftIO $ (getSampleName $ last samples) @?= "sample2"
NGOReadSet n _ <- executeLoadSample (NGOString $ T.pack simpleYamlF) [("sample", NGOString "sample1")]
liftIO $ n @?= "sample1"



11 changes: 11 additions & 0 deletions docs/sources/yaml-list.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,14 @@ It can also be used with the [parallel module](stdlib.html) module's `run_for_al
if len(read) < 45:
discard
...

## Loading a single sample from an YAML file

The function `load_sample_from_yaml` (which takes a YAML file and a mandatory
`sample` argument) will return a single sample (identified by the `sample`
argument).

ngless "1.5"
input = load_sample_from_yaml('list.yaml', sample='sample-id')
...

0 comments on commit 86ae91f

Please sign in to comment.