From 022aa7043d154049f1eed31a57743457ca12af07 Mon Sep 17 00:00:00 2001 From: Oliver Maus Date: Fri, 15 Nov 2024 16:15:47 +0100 Subject: [PATCH 1/4] Add PRIDE package v1.0.3 --- validation_packages/pride/pride@1.0.3.fsx | 368 ++++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 validation_packages/pride/pride@1.0.3.fsx diff --git a/validation_packages/pride/pride@1.0.3.fsx b/validation_packages/pride/pride@1.0.3.fsx new file mode 100644 index 0000000..926fb5e --- /dev/null +++ b/validation_packages/pride/pride@1.0.3.fsx @@ -0,0 +1,368 @@ +let []PACKAGE_METADATA = """(* +--- +Name: pride +Summary: Validates if the ARC contains the necessary metadata to be publishable via PRIDE. +Description: | + Validates if the ARC contains the necessary metadata to be publishable via PRIDE. + The following metadata is required: + - Investigation has title and description + - Investigation has Keywords comment in correct format + - All persons in Investigation Contacts must have a first name, last name, affiliation and valid email + - Study has protocol, tissue & species in correct format + - Assay has protocol, technology type, instrument model, and fixed and/or variable modification in correct format +MajorVersion: 1 +MinorVersion: 0 +PatchVersion: 3 +Publish: true +Authors: + - FullName: Oliver Maus + Affiliation: DataPLANT + - FullName: Christopher Lux + Email: lux@csbiology.de + Affiliation: RPTU Kaiserslautern + AffiliationLink: http://rptu.de/startseite +Tags: + - Name: validation + - Name: pride + - Name: proteomics +ReleaseNotes: | + - First release +--- +*)""" + + +#r "nuget: ARCExpect, 4.0.1" + + +open ControlledVocabulary +open Expecto +open ARCExpect +open ARCTokenization +open ARCTokenization.StructuralOntology +open System.IO + + +// Input: +let arcDir = Directory.GetCurrentDirectory() + + +// Values: +let absoluteDirectoryPaths = FileSystem.parseARCFileSystem arcDir + +let investigationMetadata = + absoluteDirectoryPaths + |> Investigation.parseMetadataSheetsFromTokens() arcDir + |> List.concat + +let studyMetadata = + absoluteDirectoryPaths + |> Study.parseMetadataSheetsFromTokens() arcDir + |> List.concat + +let assayMetadata = + absoluteDirectoryPaths + |> Assay.parseMetadataSheetsFromTokens() arcDir + |> List.concat + +let studyProcessGraphTokens = + try + absoluteDirectoryPaths + |> Study.parseProcessGraphColumnsFromTokens arcDir + |> Seq.collect Map.values + |> List.concat + with + | _ -> List.empty + +let assayProcessGraphTokens = + try + absoluteDirectoryPaths + |> Assay.parseProcessGraphColumnsFromTokens arcDir + |> Seq.collect Map.values + |> List.concat + with + | _ -> List.empty + +let organismTokens = + studyProcessGraphTokens + |> List.tryFind (fun cvpList -> cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("OBI:0100026","organism","OBI"))) + |> Option.defaultValue [] + +let tissueTokens = + studyProcessGraphTokens + |> List.tryFind (fun cvpList -> cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("NCIT:C12801","Tissue","NCIT"))) + |> Option.defaultValue [] + +let instrumentTokens = + assayProcessGraphTokens + |> List.tryFind (fun cvpList -> cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("MS:1000031","instrument model","MS"))) + |> Option.defaultValue [] + +let modTokens = + assayProcessGraphTokens + |> List.filter ( + fun cvpList -> + cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("MS:1003021","Fixed modification","MS")) || + cvpList.Head |> Param.getValueAsTerm = (CvTerm.create("MS:1003022","Variable modification","MS")) + ) + |> List.concat + +let techTypeName = CvTerm.create("ASSMSO:00000011", "Assay Technology Type", "ASSMSO") +let techTypeTAN = CvTerm.create("ASSMSO:00000013", "Assay Technology Type Term Accession Number", "ASSMSO") +let techTypeTSR = CvTerm.create("ASSMSO:00000015", "Assay Technology Type Term Source REF", "ASSMSO") + + +// Helper functions (to deposit in ARCExpect later): + +open System.Text + + +let characterLimit (lowerLimit : int option) (upperLimit : int option) = + match lowerLimit, upperLimit with + | None, None -> System.Text.RegularExpressions.Regex(@"^.{0,}$") + | Some ll, None -> System.Text.RegularExpressions.Regex($"^.{{{ll},}}$") + | None, Some ul -> System.Text.RegularExpressions.Regex($"^.{{0,{ul}}}$") + | Some ll, Some ul -> System.Text.RegularExpressions.Regex($"^.{{{ll},{ul}}}$") + + +type ErrorMessage with + + static member ofIParamCollection error iParamCollection = + + let iParam = Seq.head iParamCollection + + let str = new StringBuilder() + str.AppendFormat("['{0}', ..] {1}\n", Param.getCvName iParam, error) |> ignore + + match Param.tryGetValueOfCvParamAttr "FilePath" iParam with + | Some path -> + str.AppendFormat(" > filePath '{0}'\n", path) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Worksheet" iParam with + | Some sheet -> + str.AppendFormat(" > sheet '{0}'", sheet) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Row" iParam with + | Some row -> + str.AppendFormat(" > row '{0}'", row) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Column" iParam with + | Some column -> + str.AppendFormat(" > column '{0}'", column) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Line" iParam with + | Some line -> + str.AppendFormat(" > line '{0}'", line) |> ignore + | None -> () + + match Param.tryGetValueOfCvParamAttr "Position" iParam with + | Some position -> + str.AppendFormat(" > position '{0}'", position) |> ignore + | None -> () + str.ToString() + + +type Validate.ParamCollection with + + static member AllTermsSatisfyPredicate (projection : #IParam -> bool) (paramCollection : #seq<#IParam>) = + match Seq.forall projection paramCollection with + | true -> () + | false -> + ErrorMessage.ofIParamCollection $"does not satisfy the requirements" paramCollection + |> Expecto.Tests.failtestNoStackf "%s" + + +// Validation Cases: +let investigationCases = + testList INVMSO.``Investigation Metadata``.INVESTIGATION.key.Name [ + // Investigation has title + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Title`` + } + + // Investigation has description + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description``.Name) { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm + INVMSO.``Investigation Metadata``.INVESTIGATION.``Investigation Description`` + } + + // Investigation has contacts with name, last name, affiliation and email + // Investigation Person First Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person First Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + + // Investigation Person Last Name + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name``) + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + + // Investigation Person Affiliation + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation`` + } + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``.Name} is not empty") { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Affiliation``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter Validate.Param.ValueIsNotEmpty + } + + // Investigation Person Email + ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name} exists") { + investigationMetadata + |> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email`` + } + ARCExpect.validationCase (TestID.Name INVMSO.``Investigation Metadata``. ``INVESTIGATION CONTACTS``.``Investigation Person Email``.Name) { + investigationMetadata + |> Seq.filter (Param.getTerm >> (=) INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Email``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter (Validate.Param.ValueMatchesRegex StringValidationPattern.email) + } + + // Investigation hast Keywords comment + //ARCExpect.validationCase (TestID.Name $"{INVMSO.``Investigation Metadata``.INVESTIGATION.key}.Keywords exists") { + // investigationMetadata + // //|> Validate.ParamCollection.ContainsNonKeyParamWithTerm INVMSO.``Investigation Metadata``.``INVESTIGATION CONTACTS``.``Investigation Person Last Name`` + // |> Validate.ParamCollection.ContainsParamWithTerm (CvTerm.create "Keywords") + //} + ] + +let studyCases = + testList STDMSO.``Study Metadata``.STUDY.key.Name [ + // Study has protocol in correct format + ARCExpect.validationCase (TestID.Name STDMSO.``Study Metadata``.``STUDY PROTOCOLS``.key.Name) { + studyMetadata + |> Validate.ParamCollection.ContainsParamWithTerm STDMSO.``Study Metadata``.``STUDY PROTOCOLS``.key + } + + // Study protocol is in correct format + ARCExpect.validationCase (TestID.Name "STUDY PROTOCOLS description") { + studyMetadata|> Seq.filter (fun iparam -> Param.getTerm iparam = STDMSO.``Study Metadata``.``STUDY PROTOCOLS``.``Study Protocol Description``) + |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + |> Seq.iter (Validate.Param.ValueMatchesRegex (characterLimit (Some 50) (Some 500))) + } + + // Study has tissue header in process graph + ARCExpect.validationCase (TestID.Name "Tissue") { + tissueTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists (fun iparam -> iparam.Value = ParamValue.CvValue (CvTerm.create("NCIT:C12801","Tissue","NCIT"))) + ) + } + + // Study has tissue values as terms (CvValues) + ARCExpect.validationCase (TestID.Name "Tissue terms") { + tissueTokens + |> Validate.ParamCollection.AllTermsSatisfyPredicate (fun ip -> match ip.Value with CvValue _ -> true | _ -> false) + } + + // Study has species in correct format + ARCExpect.validationCase (TestID.Name "Organism") { + organismTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists (fun iparam -> iparam.Value = ParamValue.CvValue (CvTerm.create("OBI:0100026","organism","OBI"))) + ) + } + + // Study has species values as terms (CvValues) + ARCExpect.validationCase (TestID.Name "Organism terms") { + tissueTokens + |> Validate.ParamCollection.AllTermsSatisfyPredicate (fun ip -> match ip.Value with CvValue _ -> true | _ -> false) + } + ] + +let assayCases = + testList ASSMSO.``Assay Metadata``.ASSAY.key.Name [ + // Assay has protocol + //ARCExpect.validationCase (TestID.Name techTypeTAN.Name) { + // assayMetadata + // |> Validate.ParamCollection.ContainsParamWithTerm techTypeTAN + //} + + // Assay has protocol in correct format + //ARCExpect.validationCase (TestID.Name "ASSAY PROTOCOLS description") { + // assayMetadata + // |> Seq.filter (fun iparam -> Param.getTerm iparam = techTypeTAN) + // |> Seq.filter (Param.getValueAsString >> (<>) "Metadata Section Key") + // |> Seq.iter (Validate.Param.ValueMatchesRegex (characterLimit (Some 50) (Some 500))) + //} + + // Assay has technology type in correct format + ARCExpect.validationCase (TestID.Name techTypeTAN.Name) { + assayMetadata + |> Validate.ParamCollection.ContainsParamWithTerm techTypeTAN + } + ARCExpect.validationCase (TestID.Name techTypeName.Name) { + assayMetadata + |> Validate.ParamCollection.ContainsParamWithTerm techTypeName + } + ARCExpect.validationCase (TestID.Name techTypeTSR.Name) { + assayMetadata + |> Validate.ParamCollection.ContainsParamWithTerm techTypeTSR + } + + // Assay has instrument model + ARCExpect.validationCase (TestID.Name "instrument model") { + instrumentTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists (fun iparam -> iparam.Value = ParamValue.CvValue (CvTerm.create("MS:1000031","instrument model","MS"))) + ) + } + + // Assay has instrument model in correct format + ARCExpect.validationCase (TestID.Name "instrument model terms") { + instrumentTokens + |> Validate.ParamCollection.AllTermsSatisfyPredicate (fun ip -> match ip.Value with CvValue _ -> true | _ -> false) + } + + // Assay has fixed or variable modification in correct format + ARCExpect.validationCase (TestID.Name "modification") { + modTokens + |> Validate.ParamCollection.SatisfiesPredicate ( + fun iparams -> + iparams + |> List.exists ( + fun iparam -> + iparam.Value = ParamValue.CvValue (CvTerm.create("MS:1003021","Fixed modification","MS")) || + iparam.Value = ParamValue.CvValue (CvTerm.create("MS:1003022","Variable modification","MS")) + ) + ) + } + ] + + +// Execution: + +Setup.ValidationPackage( + metadata = Setup.Metadata(PACKAGE_METADATA), + CriticalValidationCases = [investigationCases; studyCases; assayCases] +) +|> Execute.ValidationPipeline( + basePath = arcDir +) \ No newline at end of file From 2a4d733418d7556f1281de019d2d0f97d61d5114 Mon Sep 17 00:00:00 2001 From: Oliver Maus Date: Fri, 15 Nov 2024 16:25:29 +0100 Subject: [PATCH 2/4] Add integration test for PRIDE package v1.0.3 --- tests/ReferenceObjects.fs | 11 +++++ tests/ValidationPackages.Tests.fsproj | 3 +- tests/pride@1.0.3.fs | 61 +++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 tests/pride@1.0.3.fs diff --git a/tests/ReferenceObjects.fs b/tests/ReferenceObjects.fs index c73bf35..aa09eda 100644 --- a/tests/ReferenceObjects.fs +++ b/tests/ReferenceObjects.fs @@ -62,5 +62,16 @@ module invenio = let validationResultCritical = ValidationResult.create(10,9,1,0) + let validationResultNonCritical = + ValidationResult.create(0,0,0,0) + + +module pride = + + module testARC_proteomicsCorrect = + + let validationResultCritical = + ValidationResult.create(22,22,0,0) + let validationResultNonCritical = ValidationResult.create(0,0,0,0) \ No newline at end of file diff --git a/tests/ValidationPackages.Tests.fsproj b/tests/ValidationPackages.Tests.fsproj index 3ac28c7..783fa50 100644 --- a/tests/ValidationPackages.Tests.fsproj +++ b/tests/ValidationPackages.Tests.fsproj @@ -16,11 +16,10 @@ + - - diff --git a/tests/pride@1.0.3.fs b/tests/pride@1.0.3.fs new file mode 100644 index 0000000..f888140 --- /dev/null +++ b/tests/pride@1.0.3.fs @@ -0,0 +1,61 @@ +module pride + + +open ValidationPackages.Tests +open TestUtils + +open Xunit +open ARCExpect + +open System.IO +open System + + +type BaseTool_Fixture(scriptName : string, version : string, arcfolder : string) = + + let result = runTool "dotnet" [|"fsi"; $"../../validation_packages/{scriptName}/{scriptName}@{version}.fsx"|] $"fixtures/{arcfolder}" + + let arcExpectValidationResult = ARCExpect.ValidationSummary.fromJson (File.ReadAllText $"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/validation_summary.json") + + let jUnitResult = JUnitResults.fromJUnitFile $"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/validation_report.xml" + + let jUnitExpected = JUnitResults.fromJUnitFile $"fixtures/validationReport/{scriptName}/{version}/{arcfolder}/validation_report.xml" + + interface IDisposable with + override this.Dispose() = + Directory.Delete($"fixtures/{arcfolder}/.arc-validate-results/{scriptName}@{version}/", true) + + member this.Result = result + + member this.ArcExpectValidationResult = arcExpectValidationResult + + member this.JUnitResult = jUnitResult + + member this.JUnitExpected = jUnitExpected + + +type ArcPrototype_Fixture() = + + inherit BaseTool_Fixture("pride", "1.0.3", "testARC_proteomicsCorrect") + + +type ArcPrototype() = + + let tool_fixture = new ArcPrototype_Fixture() + + interface IClassFixture + + member this.Fixture with get() = tool_fixture + + [] + member this.``result Exitcode is 0`` () = + Assert.Equal(0, this.Fixture.Result.ExitCode) + + [] + member this.``validation_summary JSON is equal`` () = + Assert.Equal(ReferenceObjects.pride.testARC_proteomicsCorrect.validationResultCritical, this.Fixture.ArcExpectValidationResult.Critical) + Assert.Equal(ReferenceObjects.pride.testARC_proteomicsCorrect.validationResultNonCritical, this.Fixture.ArcExpectValidationResult.NonCritical) + + [] + member this.``validation_report XML is equal`` () = + Assert.Equal(this.Fixture.JUnitExpected, this.Fixture.JUnitResult) \ No newline at end of file From afa4f12e736cf4254d18c2e962e81e3db83f40f3 Mon Sep 17 00:00:00 2001 From: Oliver Maus Date: Fri, 15 Nov 2024 16:57:38 +0100 Subject: [PATCH 3/4] Add testARC_proteomicsCorrect and respective validation report XML --- .../testARC_proteomicsCorrect/assays/.gitkeep | 0 .../assays/testAssayOther/README.md | 0 .../assays/testAssayOther/dataset/.gitkeep | 0 .../assays/testAssayOther/isa.assay.xlsx | Bin 0 -> 6894 bytes .../assays/testAssayOther/protocols/.gitkeep | 0 .../assays/testAssayPRIDE/README.md | 0 .../assays/testAssayPRIDE/dataset/.gitkeep | 0 .../assays/testAssayPRIDE/isa.assay.xlsx | Bin 0 -> 9133 bytes .../assays/testAssayPRIDE/protocols/.gitkeep | 0 .../isa.investigation.xlsx | Bin 0 -> 7169 bytes .../testARC_proteomicsCorrect/runs/.gitkeep | 0 .../studies/.gitkeep | 0 .../studies/testStudyOther/README.md | 0 .../studies/testStudyOther/isa.study.xlsx | Bin 0 -> 7516 bytes .../studies/testStudyOther/protocols/.gitkeep | 0 .../studies/testStudyOther/resources/.gitkeep | 0 .../studies/testStudyPRIDE/README.md | 0 .../studies/testStudyPRIDE/isa.study.xlsx | Bin 0 -> 9702 bytes .../studies/testStudyPRIDE/protocols/.gitkeep | 0 .../studies/testStudyPRIDE/resources/.gitkeep | 0 .../workflows/.gitkeep | 0 .../validation_report.xml | 27 ++++++++++++++++++ 22 files changed, 27 insertions(+) create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/README.md create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/dataset/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/isa.assay.xlsx create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/README.md create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/dataset/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/isa.assay.xlsx create mode 100644 tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/isa.investigation.xlsx create mode 100644 tests/fixtures/testARC_proteomicsCorrect/runs/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/README.md create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/isa.study.xlsx create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/resources/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/README.md create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/isa.study.xlsx create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/protocols/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/resources/.gitkeep create mode 100644 tests/fixtures/testARC_proteomicsCorrect/workflows/.gitkeep create mode 100644 tests/fixtures/validationReport/pride/1.0.3/testARC_proteomicsCorrect/validation_report.xml diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/assays/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/README.md b/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/README.md new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/dataset/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/dataset/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/isa.assay.xlsx b/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/isa.assay.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2ba813c89d5790848127457d5bce59b370d7fad7 GIT binary patch literal 6894 zcmai3by(D0(_VV%T4Cu%x};P}a#>2cOIT96Q$)H;6lo*`328}@P`Vox>FzH57I{!# zectaqf9$o_?%Ze2b0sWyuc%2sd;uNmcE+0RC88E7g7E`V8~sZjeKhN`MW7M z0;U2M>H;G|)+B)~ue4SYrK(8TQ846ga=0=-2z_#p*@n30IOSb#G;JnOg?& z{H(3ev`2P8GW$YS)PSh0EG!cH{-Tghu^I<2-U&ZjcCaHlX2Ma+%oDcMNDC8EU0mge zJgxVgt@E(1=%agxqy!y%2IFOp2w%wb#pi4FbPs~#D1jtyuA~K(c?g&RLb4XDO9;V@ zZfWxU81W<)wNrR-7wCgHrF}tWHObf2z~4^ zypj!pr z)|XGhHPKcrTzHaO7Z{~SI<7iU=2$1@$9lR)NC6d9@(*P#1Z*yj)X5;^z)ZCC*23|m zkC3&VBf$_Q`C+t@3>GNfvcj8&Es!_w)R{S6>!hwQax?}b{rIrkngBWP5{07=eXN2I zvwioD6qE-?MnNiMc~60C@YU_E;f_~525wB6uoL>BPe`knN~Pr(gS{HmFPLW^)k{nr zq8dKA9kF}@4WLg8>gFU(y<>_Zqi;$TGd8Cw_rd8)o6~8!5YB5|EZlI7ug>CUz09K9 z^`R%nMBQ_7T!u6o9W=Wn^Sq~0Js!G?}0PJq==kt8%4mGOtbQ;X0VG5K+1+zUu6t zPEc;XIAa7iR**~t=d3YhFL|jr5=WdY|J1*UjV5-vroi+aYkObt+3Opj5ip-Nosn?= zdZ2`DC+?u)ln#cx+pB_G0AH^QI9 zy_#F=t23~yve_w5H|{-7+VB@RR&*?iDA>Sqctq%P)}x)$24UHQ&JvSr3J+#+w6hm( zF~z*?{@ioK(P4L|K(gns=%P4H1ii+ZZBrRaTUlMS-bU7#LBluqX~ ztIaQIgjRQqQrsw->ki$WQv`5ldW63m2y$Z21!h&9DR;7O~QM7c+m)*x1m z`*2xYv^a@Vv;3;Sp0)+>>ciV1H@qE! zt}@rj!q^dJs_N`$X>0EEBWvT8tOL04+O{r0G)FHsD51=&v{ISL-v6iQ@KQE+_vTOjiuD>5^s%WT!)M8&aJH9fBh=XX@z^*(kYU2JverBdQ$ZGX zXM?uZKy}b^XW;#i5)F=WYi4+Snfw>=#n~9_z%5$ZtqvkVS0a#w42}=xnDRV8BR0DL z5S-ajth#0N%tCHx0s|6jHdKJ57Rf)Da!R86J%gc`F$YtAA+F9?c*uy6K88Y*Zra;| z&dG06d{ZAO5qDhy1qJ{nVn!fb(lfbk43JvGModFG~Q(-TJ ztY?s)31a4oggGX*lTlrGD0vH=Z278;jdHrC-KGo#eLC6ba}12-dNdTMMewTBmPMia z`^hopbvXWO@piU=*}#6*_^YVJ_43_}fcMN+>Z>6J-UP19etiBYH5=MWc2oSI?=1eC z#iqKu=^3`hU9Lm?mi`|$`swI~h)kfo5SCD75O{Kk0}0i+g#*cT${4I+grc!thD(^y zHtG{1Ec=aaQZ2d4a=_RDkeuziwe#_alFG34^_Y@`6}brqFkHv%B+Q0XaCag`axT%s zuAh@nUIGHb#)skCCf#D|UK=aUVkh~EM@CH%%0A44#GI#_$lwi@p2bL>1*S!Uabp8G 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/protocols/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayOther/protocols/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/README.md b/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/README.md new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/dataset/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/dataset/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/isa.assay.xlsx b/tests/fixtures/testARC_proteomicsCorrect/assays/testAssayPRIDE/isa.assay.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9a3c67bfae84278c105eb5eabbc392dd07a2afc1 GIT binary patch literal 9133 zcmai4Wmpy1(?_}+>F&7Fh|=BNDRn^_=?0OO?hYyG?gr`ZZVBm-kkI!ctM2OV|2-do zhdXi3%(5RmX-U|_IdvaZ$|NW;ba;+ruM*Nh-*<8##ban?oI36bOw*eM&#p#nglZ#T%-wp7 zI;O~DxBzvZb-U$#8FV`C+ayQH4Kvu!dvS|`O{%w80 zRJjl=Zdl9zt^s-D=Yj_P^}-ftVaND`=D~fZ=@RpwK%Ys0gMlIZq=tvki)RpWFsbT8Q)2hOXl}AhihPo_d>fyUS&Ac z@W>?4hhg^14VVhjj!b?EbZiUzTu^dkf8FQ3<(pqK%s<~i`TmZ1oZZ4o%lcE~f&M!Z z6V2Ox8Y5}Kpw}*wM=AblTbXq7quV;FGmW=Ad1>OKnHe=HFVU3pW!DEZTO9}%bl|o} zLZk$1zts~Y`T3ALX}}rYvW!zd9d!r$VUa(r1_82&v&B!7{Ye1#K=5yt{n`>4bprZW z6eI-i?_^Haw&n)b*5>zDlmq@z7pi*od(Bx~cf>yXkTvRhv46E!wPU6HkaH zS~vC88JM+;HD6Dm4YBroZabse+MrC>W7l8ySd13=NZxz2gTPMsc4+aIRr(7Axm=6a zIoy969Qnae_a?G?2?W~z4%gaXg$7>`R69V1$N7WyI}7u@U1Q@Etdp5gy;m;jBUbP^ zpHh&57dR?ZOC+;dre5shU=)Fi) zX=5Ob+^H`xYNhWT3Aic53JL*wbZJh#^=X0?vg$|q5H5Q0i3dJUuVihDLkbQM zUwL78+ze@?bcxfQNv>lPsPT-yd(sOiI--fF8(bQ?e9~wAyg+#9qWG>PjTf%ooZ(PG zlB~M6c)tt#6)Hd$i^7HHLZRAf5ZF+n%h6$@UFwtlX%h?ISR>K=9CNK7;_$RB>;~2x z$K^@l7-sZVkDK)gGyw|^aX&>k3XsU|mUOoxi|v%?RcEAoJTihFi0x9@k0i zr__C!$>90dHsqi4!yC*Cp`H9xs#K;64hh(2Yy5ac-wPDS@W7k|-3ZOzq0$1F1)Q#F zdNZn~q&3}fdc5dUUOs*E!C0u$rAB=mvEF&IA}U-OhXAvOk6OE2a~|egO10)y>YQKv zh1VcS3qfl?-w%{O1lrHcm2&nV|LBsQVFh~|LGm4iik4)4 zmBiGv=}gH6YM}(d9CW|u9da&H%DeZAn<+gm8{BbW6UmpkqUI%45tjaUkpXDdi44Mx zgU3hlU#2k0EnjMlYSwUfYL%SGd<86tpXbsKBl&o%n$)r6O2Lj5ts_m5&z(FLr&SR` ziZPS0&*KE_OUcN9k0eL<2R}Z-KtGQ~)QIyrNi-_-uQeuq=PZL{@j~t0L_n3l2W3g- zuH}>t^PD~E37wgK4F_hHKc(D&D&4har*-QM8Zf{@%RSf{Qb}=OJcQ)XFf0ArGb-lS z+1vog+xFq-icN#Z#pw)W(x;OpsS7;3^vcIkC1z(zR*$tA=pn?|y2VSR0h(V^OI?s? zI@1;!zjs^Cqm@iQ4WTPt>sqsek4-%s*o6zoj};*Mtw{ zAW8~Q9Z3Ek9N%N}cZ7e>d7&fa@SvIydUYuewl=v6nQXl3Ev!xsZ(E}Fgh8?|MX-k( z#B&->&gHw?l~*cf3Dk~xsA49RF->5is?T^d$=4PMXSnp3Gp9J8NufUu9-S=Q6~@S2 z4C>q=9|#OZ_m8>N4SWxs#B96Wx0UUr-yPGV=PTwQB4nV1sfEUi^uASk+6*ppin7e= zKC(z68p%>}2p+8fz`^%6UBa?oq&alENrlmiKE33%VhFO!tKk zPA|aybrY0n%=Iu+9=+)~2_SuEBFxSSAGU0Ql458J31F(i#W~$Cp6Hk;%2Rti(% z%>t8(a4)LzaB-xd_CPm#db0ykt1=iB7j@YhtS5 z*~h4@aNDnRFW)DTeR~s}(+JHGPn(SUDMx-5K4qMyK=s3^c-BgZ#3ZZNQF?ZMR(Flz zgZ;C;6z>M9dZ*miZM)f8OPx;6EiB)=|r*Kt59F6IbT;tcx7_HYu*e{%!ZWXhjOyQoOsIiPp-zGXcCc z(qh-bBigCVxZ@n;B`S*{=k{r3%vmQ<*>B1ltv?X==dHYdeSykSdwl~7;O`aEjo)$* z0|=RczmWMC-S=PLtE1Ey8M}EVRR5zpEWFftAp?Aj4yFWY$$^+eiUUa3{?8=)?9`m73&`F&2tH0*}~3Pt_VjZgKQy6 zmK@4@KrE9AaI<$pT8#>7J^b6uGTcfzRG{zhUF(ZIIqAIikaE5M(oCNw@AK04u$X}^vmL5bDYvusIr zo3im@dSm@!TMnbeXE1N5oO}=ZIpfW;S4DW|aN?6vEua@~?TSsST1iO;<6yZLHU2*K zHvX%vY4BXSna}~tVM3?HLg=&bQpDOhB!4fpO~ z{Wl8#di&VF1X==rK9L^6W7IG^bqEN6A4ndW0{3A3PWJuhcMKkA$XPFNV1A?XIV>^K zI!({8(jRb~;4t;+J{Tn@pLlF2$tF%0q=1PtKk)V5?ZMn>1P zM<9>HSMqt~dJ<8 zhqFY)35N-$2(jPC|7bapw4l?W z%&g;vfW;5lnVeU#jtG)FP8gzz&==k&o_SthyD?>jaKzN{`dB&I)yXfsQM*bSKWs~vMY0j0X1xiVrhu@eITu`@ zfNUMKhisn;wsbtgClqzqZM;$!>8RmX&O=w~3VABepzt0TBA6t0NP@c~PBd6oilZ%l z{252d__Mz{Z0aCUI<396kpEbtNBpoLRv%^JP6StAId{bXm9BS3ejIC%5BEiG0)HTx zVY&nWF844Z8^x1fA+zxagJH!|Yvm1MHcG@ti9rV~a8?Jt;T>50)KdqA7S{79f0kXTz#>30JS!nak*}^CV;pQN?jiKBf zP0WK#{NJITkPSIene~2NjhVBuQI>SBFg>TZ5Dpy9ap2>ZRHyXF44=UbUv>z8 zJvippyXqA8`h%y{0wQYHwKpya4U_$+$HE59;uWci zH()aQNw&{B)dy9={g{E^lGK&*PMWS=Yftcvvo=rHbEsfR>hS``&6$z?k_JW1&!-j| zbFQnNK6U}OD)@X$VH=%KQGkbjzWYTy=HRWt*kswun3WG5{Vq_*)DV=`ojTNpkZaJS zJkqx@eT+?RYiUndavS!8ja_86JGhG@di|0m$*}z&5fJTlV(;%6D;@0y$B8zdFuPk? zZb9Sa^K3v~Xiq`0^Cr~{qTNnF4%xt83rFRn5{dyP;_ZZ5<%|<;NgKr>aTz>fiuowe z?cPM88t@!J;}zG%(mULoQO;EH@eOF~$#!R#sA3lK(FDChHtVP&5)K##+;AAjJ? zW^R4kCU4c8f@34@tF37#?);=qO;uY;?X38{c1=+Y&ASP(A-NcLmXTFcHwo(6u$WKR z1q`WhC_Q&?IUQD>RK>9&AV;|BKfZAea1T>a8R?(eYB28fJfl5XgAokV6p|}0$Wyg< z)YcP-NG?&;tCh@r%6H7B9mrNXU3kZXvEkfn|XWj_%c$1N?Z(k zZc`bLnHq4Gc~C=Gy6#HZxOO2aJ5?@)RI3B1)~VGztOqtOhAKWqp2>vVyIHrgwe{kaeeio1oOorJ|x3gnd+yfg+sE%lSMT*lz9uLF-f|` zO1slduC*)Yi=vg^dfCF1$|g!&Ws7HMrux&=Y|R`6TgMotQYCW^CKp1}COp|{*^Asy z8kwy7_vU|AS`Wz!ipyKq5mZ4zfD#zeL#1VB?*gi{?u+`I7#&b!>96Ox5(E-Mkhhs> zuyTGf9ecFnp0`BNH3aTNq|D6`7c@G$!+h>Ve@|(6`q?#W{ikex#z8jiLQEJnUQubR zhL2|P>!rzy$%d2a1(I}C2DH3o&?`p7QQbt4Zu6|hXsF83>&?~YQ4zVbtP;ueI;>FS zu^dsFJ4uA5W}PqR>Le5+MlTJ?Xw{ra7=R~ys1ieVT5f)E?A7iAP_+SRevu4ums~kW zOYk=HP^_96PXc9}i$6aj*~4p01uV1Dj5f;CbfL4rl?}*^6}u`$CA0G7LX9Y&vgrZwKGEvamYAUCWAIKEY)!ZZ6(9BX9u1O*#*XzBFJ@cq=x z0Fsbls?SK1OJ+(PDk&EmG{7LeSU))bql=R21}dvj&Dk9W+Gk6qB7Q`JqoGk5zlj7iYK4P^e_?E&^wh}6$HhUI|Y<}Ql=YYoTf8PCav9$O749LmC%^!r0cr?!=uIN%yx5mr0;UEma! z;SkglQkdqn|{8hN5nn#DGsFX3$WPjK%!^9bDQIMa3)8--RUsQ6i^(+_4!UZ31dVAxq$E$GOlR|FuC4F2 zXDHd~Dr>xayTz`-yQ|pe^1cR|pro?Qstt|qOPu^AZ08_{9){`ES%Fw5DVCAfc0NGl z1OXO?D|Uxebu}J=UDxRiI&-IYEEZ1_C`gHT{>(9QC9WCA)EwPioG&> z>JXgToORoQik4d9>f6OK^hxNuyq8gnZ7*t9FV)kZ9U*kKbEoq9wX|r&5D(ZkMcc{t z)!xi_{Tx9&M4;MD7hheF=Qco52<`8lGqkn^es`VX&xzW~8|D~z5mIr>u6*%Wc(bWw zbH>%E*|=u5k4Jmluo(JhXG91+!s7u#h>mDNs$C^RA=zazV5&a0 zl9V$l<#nAx7^onK*$~CMHu-G$<#aj(k6x!#60A>=7Jbb->(!j*Q8lfDB%>{RIJ{kN zl0CM6FL6tYfL`*UKp>^_T1=NsUR;x;uibtoU1&6KncDjnOtD!!wdzS+s0h380h_~6 z@Gt7AZg)~SOI8cG{G$5Q5{>N`XS|-Sx&Uzwys$&VZUYXDa*2-IzL(b;m+mTF91IO& zUk{vFcD5R?R%b;Jul-hutQ4Mki%0oK%`vfO6O2&GF8% zO~uX8r9CsB9yoZWz;@HqBQD2XRh1kSMnuHp!5d@-RqCTjGz=~H>Jq9PRUAZij(xMc z?Jt+-Z&XuA*;Z-vibr}~tD7{N@l$`T!b27qnxP5NJ2*xqW%lSw;z;XZ| z2A8?UV{lQD5Vxtb)(-7KIym8kGg&jeN}f1u*o!SL2%|B1wk%3yy6g_KO-k6{Y}qR& zU{PH8g`26229H;x%dx}y%8GQMQo}7(mk!kluLpjvmWuh^; zqM#}&3U`8Pjy$0<`=;^DbI-SCI5RS>c^w(OEVmHGoG9reQd=+QB&CFV7yJ9FtgMy= zh`m3-&QkP?FQLud~b99FJa zn*Q9~{e$~q-7}m%F#P)le;+>nU<3oh1*rw;d0_iHkpJKP-p}S9*1dW`$nSFgF{%5p z^}nLnZ?n1|++bi!Rll*N5zk1BSr2J{d`+n`ixJWI!Dhdg=D!4tKmIP@SE2rk^-l!+bIW$Pf2)mtu{~(~y@>jyG3oDYf0b0fbN`;m ve{n10|4r$SwEjE$@2Te(`x?RbX?Rz31w!{oZ*HTgzYtAU|#>+c|8FCh3BAMEM+c@QP zk1n5qBL4+0<2#-mx0Dt_xyn$$gl82ij`P6vCp`fvixmP&|*%$%zHB>hZ^edwud{NIA0wIf#bgNa7|I6BOCyENFvhdw#R(5mX74| zwTTyoVxL7!cG(>N9uCIo53TE@rphNr=021g-I)USCeAlLzI?*yy8*A^C|I~aEdPI= zfcfbODEYqzBJ`V%t%126>)o7NZ|$c_POd|LlY)bRLHjj_z_^z1r{teFR#Pe0RG5?6#~ws?Qv35*az4>dswv)NiT>fY?-58Vh=I3_`7Dj)(P zbocr9eeS+CvB6?ML-eOcVz{ zh|qr>UJr2m9Cnyrykmdf>9yjMSJ@{tSxfu=ifxd~+)~48J#t$&gTe@M*+r)>O&a*x zWq2paPjw}oLB4-gOJ%I?QXn@4)SsSKnPiNkm?yi?4QX^BnbJa8{Td=AQuU*TB*FI$ zwUauE-X;6sL!N$jm^()P$r=F4h_m@G%KkY4<#xiqG3!I~QRRl&8Yr_we@=6$=;{@PSUMX!ZY0P7Bb)rlRB0)|^N^L0| zf7cG$>^mKfW->dCJr)qFUGc*m@K$H7ehC0}%LXkkf@Ty*P z>KIYSn=fST4D3Ub;@87Ul>As9K|)KPJYsB7RjSSITdUo9DnDj{20B)-%ACE(MIXK3 zZhhd{DPGTF)FU0r?M}*l!X?ggvEKGPLYKY84f6j^H0CWqH`Le}8yMLC9j4X^rg9fh zB0pllz!3an?oSBY4WF^`T2_gVfPOnCj1fD;yOcW5D3$BpPiDy^RLa&l21*vfiC0Ef zUK~B4l(LU{QSs?L@Zz%_dc7Rm!PHo7kmI0Qc4E?=a5L2e&^0^3q0dwB>9n-EezLJj z#$agAL}K}tLsdkQh6>oibl%!{^rJ;6u;6=E zZ4jkon+>zl7fhdbXUL-Q*$hhx_)`$>?=Wno_b}tFc=9VGAX@J5s%QuG7FMWQRRPWl zv9?yEF=7sE7qyn7COEos-8mbi)(1r!Y*919-b$Z@dihhzbyf3H(eJ? zh{y5OEtXxxlsU8QV0y0Moqc)6s2*go?70!os!+s(nK}?4=DNu+(qU!$kdbMbi7)k{ zu)wldW8M6yGN$tLMQqu?+VD&IB(m- zBs+MW{NI>YY+k<#c)Um9gXGhG;bMZ!O3S~tiXrMO+AMY9l8OB-VAt=e-Uiu9+Bwtn zo6qi?0Q95np|)yWZiVEl5))7f{k#mT>i}eQmJw||b|8rszqj-xagU}W%BS*RDZxKb zqIWUH_<-W%^qqT({Q<=l?@_oLT%R}kl9KTEPF}322t~BBac}hf2t}NlcFdcbK@neY(Toi?d39sfRAnSLD*m{K`BLFX8(}(0O31-0 zF1&n$0&6RjiATh86rwDi>U_$FKqlF)t2nqFwY=%f>r55PA&Zu}d6TL}9bxzLNysJO z?r`1abv9~3@E)`Zw?Y#?@b6 z{N^m+BJv0#Jg-7YK3B+glc%Zm1qMn;{AL2Xt7f*}rzPKJGRP4`ZS3uKz9hLo|^`GLoM|J;k0L5H&! zT*EZl(oX7Gd-lA>y-j3`s7JA2ekY>Bu1#m%_a;Y;`%A+q!pg#`QCZ7Vo;os$d^|Oz zm3u_Kj{M#q>Q%^}$R3wwIGUh`t|VypRw}AxxQbC3IM*kbKP(lWB7?(F;AS?}kH7CG zX?xK-+fv*Xj**$6VIMtQ>aCSERGN(yU7c1OTXe?hSS9LbZ(Mm$IDM%mqtHp~ZL%l3 z^vc2T>#O$;KYwQ3 zZFM=TDQ@5ohBx1f^)>cW(=2tn9f!D0-n4D^Q&SJ&>47;x41v#q1d~H707UyQEC9zT zT>_OC2r65pSh#7eqaFbQlGoIeN{N*w1G+XaiCLaId+jG=05IeGilM47|uwfwJbew>Op*MS<%(ny-r2jeh z^0S;#k5tz9d{)wBz`I>Ko-iDXcaOeCB%|-Z4TdeM@6Lz zd_ZhGRixa|Y8oGblQ{)(9&$K8>LU3hqF%GswM4BBG^2d{vL4H8xCRu}5m81@MoDf> zma!CptLGmAK(40`dh4ZI_wr<$!TsSY*-5ZKQ01d8Nh8ru;{@PSg636y28|Wwe$y2S zR-JlYx68||y&WUDlq7*`ho>hw)7(LAE;VC<9tU5sbckO4I9}Y$o!!`@3V(Ifty*$@ zdLXlrEwWi>RFWd-c6K%P>grMnU}b0j)*lNL;A?}FO5mi9j5aLog>_aZi4OM+hysLB z0Bm&%!G3#3ng7M%gK6^x3A-<*Gxbx2YBG5KxMzTRQXf?7c(zGh&AOziPR+CBmH{EK-K{b#v@XdguEQr}b!5J;#Ib#ibwsZk$$VYe37wX8~ih~y;0 z&h!o#r2*K|9f?fQz&G~T!#9ltSvc+xlZrcR)Saq{HCGBL<=#_l4dIbzdj8%ZL?l7t zI|bnyh^(i&gg_Itdq|*Yc<85woZLf}N^fr^>Nim55#J|rzmxXeTEvrpkNl0tN=FLwGo zGtMwt5tIo4zafIVqmfylkzWS(9#yZ?1JjPfxtO7xL4ggq7$vZCsmT$|@w0%wYzILh zuo|sLdiWS&_&0~}*F6Jn9dk}`uUkAVr_ixm&%FpK=pNax<2`%X04hyZ_^8InqrkJ> zg)s_gz>QifYW)hCSoBONUCq4DkFT=<%#JyN%SApRXELj$3p-{@qKQ}THBdfyRcIP? zyl=p4r{1kO%AQ&nryk3ya?LE4Ps`-K%s~}H)pTmwVdnDwLiPh>iW(yS zK{GZ?--I413^Un@?e3&#B!CGIWtyZRRhE=bQwc1y>c<` z>|f_h+$0}Xg~hC&=QAavV6|Tb^E%A3l*e(RVMe&>;$1lVyN4+&f9)DssWtrKc|gB6 zk0cTX5tS>-&sDK^)O;Zvkyxzqq6(bOBe=_{77k%lRn2J#)v$1MhL4=}HRZ}t&}VIz zO}{+GJBd_(0FuC;SXLrpd&qo{zFkRLvfxTvH-8M49r-AQQKiLPp;ZO>USm)$gl)2b>f_U$q!(`5JS9?i#>cKfj&3cv) zYY(Sp0T4;`skrq0+9lKYg_6YSM7?3Pd@w`#OZulD5NGwtquR*e-6lBzsE>Q3J@M~0%5E%}#^AH*=!z0Svxx9j=;?&FXQ<&#!)H(+ zd7RGEj3{h79;AKAhAb>7F`(DXeBa%y8n;tE-HK?=mQuD@gdbTQj@a_ub3Xfi0xL|e zx6iG)5T#R3!ncys{V78F9vor}&zLGUD<>T<(isH4i1kJB+c_?-sC{7B4;f!$qUW12 z5%U!#GYWxyf%c#!x~^n4AI(vfa->Uh@`An9dT(YUoRWa(3oM5{$&V!N53`|SS`M9p z=@%mShtWaPk~ycrZp1G|(k!}tmp8EdUaLDsk9iK)w%e*B5YQGFGj6SLzFnZd?g4-6 z+KoBt&?zS^%QH0$DlEea-PRZ;N?AyCDhLlg(js%Ud&PBPIL5S(H(|KEVdlRN_r6+G|W&QX4S0Na`IRM(uvp^LIY-k++nx<=Q{j-%Qgny&{Kj@O6;a=NKJBbBcM3?{#phvcPOMsJQ|UOE7Z+xA<|cnM?|*PX9j zT`D>nSI(Sqa#Nyq;){R4-8uI*`&2Ev_-I4Dwg}BYIDdLg&&t-|)@|K4LTLR7Bh{=o zTMVigCCH*R4-|`PI+AF{Iu|t_*TA{7v&oN~X1ifwWaL?z@)DlBQ#@8dS9q!GQCl?fJ$6?#@$geWYLfB``K zD+FHkG!X&AE}aRef@cYq(=U1II)c_+N)oduPIPW`sCTwM8bZXVRRV_TRG_~%@0DpY z0okdbcL1~6a)qPXbtKs1`*o0i`Xu}!@w;#Ut@C_Lt95Q%J=n)?E1e-U`soMN_n&|g z<3y?z!-NPCcH!OD-$UWf)RNto!{25}RGeb;My$*ulT zvN@;I_+0(OUHKI^Q?11Hwln+MO5J(<#9#NAAorDm7f@%oL!E(jTMGVE;zFaOtePL8 zd+l7@fBwB6kHGvs^I*Bm0=vzNI$27GJTYys0@)8wOZA5`n$?^#ny;?6>}wvIwT8_B zAd0)@Nw$dMlc>F)=2E9l25^liQ58`PFo2hEuS>f8mpjkD^i2XX-EmRBwXE&app?Qg zH;+Gl1k5WMqZ%CDiJs#RVBmy#UZ5Y9bMOp}^Ag-~C4jCmMmImwrQ#i^8h}JgHQ|q_ zMPLm1<~`I*4&jMXc_OkUuUmg8-&fu<=BC#$PQP)UB!H>!+8}He^9@m>oh{vy*6O@> zkfytsIli0dzPna#pN}26h?6qV2<&sJqU)1Cr=&Q6d--Iy$j#*Wz=}(Ptc$|+OiNoC zs_8&}HEqFbS*ORT+3IbCu_1FjWZ@#(Yt`M`+s!*&=c~0FFMAHf30im(sOjfEk=y>@ zcosy$MiJ`gW1EHESZql8h%i8bPEvek5EozlvHGD7`ln?qc_~;pAk2S%CV+b6kMS>$ z2EP~hXXd<7w{OQyatwlc`A(7jPosaU-FGM$nBrfUpOWnV&)AJ9d^>K8eTIh9Pl@=> z(m!{1BNE?^8^HW6;NLg+w`hC^gg&l7%|h+m!u|~0|GD2AZS{8Cn5Tz6%Rtxp52f{P z>$h3!Z>{wX4FjY65A1K{^*3X;tNblM{a(cn>9!C1TaNm@!vCT$56UR?f4EaC{&V|( z>lMEZ_x}m|tzP`L`|myD?*&4k1VZip?jV0d|JRmTpig1HiuP~Vt;N5q`)`ZNf5QH+ z*8h$EyUP4Vquu|*=v~eE8~%4*{0)DL_bXKH-Yev#5PqIDY-ktK28~GC8!;Z{{{hM( B?DhZv literal 0 HcmV?d00001 diff --git a/tests/fixtures/testARC_proteomicsCorrect/runs/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/runs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/studies/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/studies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/README.md b/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/README.md new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/isa.study.xlsx b/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyOther/isa.study.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2b122fa8e8f56c82bbc2baabc0b60b5ef773de40 GIT binary patch literal 7516 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 K;;JIP1^+(>3Nr}+ literal 0 HcmV?d00001 diff --git a/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/protocols/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/protocols/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/resources/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/studies/testStudyPRIDE/resources/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/testARC_proteomicsCorrect/workflows/.gitkeep b/tests/fixtures/testARC_proteomicsCorrect/workflows/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/validationReport/pride/1.0.3/testARC_proteomicsCorrect/validation_report.xml b/tests/fixtures/validationReport/pride/1.0.3/testARC_proteomicsCorrect/validation_report.xml new file mode 100644 index 0000000..bbe287f --- /dev/null +++ b/tests/fixtures/validationReport/pride/1.0.3/testARC_proteomicsCorrect/validation_report.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 38aa6f791554e81e2c92f6f188529919b1c2f61f Mon Sep 17 00:00:00 2001 From: Oliver Maus Date: Fri, 15 Nov 2024 16:57:52 +0100 Subject: [PATCH 4/4] Add integration test for PRIDE package v1.0.3 --- tests/pride@1.0.3.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/pride@1.0.3.fs b/tests/pride@1.0.3.fs index f888140..70f8148 100644 --- a/tests/pride@1.0.3.fs +++ b/tests/pride@1.0.3.fs @@ -34,16 +34,16 @@ type BaseTool_Fixture(scriptName : string, version : string, arcfolder : string) member this.JUnitExpected = jUnitExpected -type ArcPrototype_Fixture() = +type testARC_proteomicsCorrect_Fixture() = inherit BaseTool_Fixture("pride", "1.0.3", "testARC_proteomicsCorrect") -type ArcPrototype() = +type testARC_proteomicsCorrect() = - let tool_fixture = new ArcPrototype_Fixture() + let tool_fixture = new testARC_proteomicsCorrect_Fixture() - interface IClassFixture + interface IClassFixture member this.Fixture with get() = tool_fixture