Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CWL Model, Encoding & Decoding #421

Open
wants to merge 46 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
a814349
Add cwl model
caroott Jul 19, 2024
b0ff7aa
Add cwl decode functions
caroott Jul 19, 2024
093b71d
Add testing project
caroott Jul 19, 2024
d4d44a0
fix references in decode
caroott Jul 19, 2024
cd0078f
fix cwl type naming
caroott Jul 19, 2024
ee84815
change naming of CWL to CWLProcessingUnits
caroott Jul 19, 2024
a7aecf0
fix test fsproj
caroott Jul 19, 2024
fe79944
add test strings
caroott Jul 19, 2024
62ef339
Add cwl test
caroott Sep 15, 2024
9bf5b30
fix optional fields
caroott Sep 16, 2024
ef9c09e
rewrite tests to be more clear
caroott Sep 16, 2024
8af4fa6
reorganize tests
caroott Sep 16, 2024
6e3b032
dix dockerFile requirement
caroott Sep 16, 2024
58b6fe9
fix EnvVarRequirement
caroott Sep 17, 2024
79052ec
fix SchemaDefRequirement
caroott Sep 17, 2024
f77652c
fix SoftwareRequirements
caroott Sep 17, 2024
015abb2
fix workdirReq and resourceReq
caroott Sep 17, 2024
80224f3
start separating processunits for better modularity / edge case handling
caroott Sep 22, 2024
2fd65c1
reorder and specify wf specific types
caroott Sep 22, 2024
5ca6bf0
change in-/outputs to dynamicObj for more flexibility
caroott Sep 22, 2024
d493ecb
update yamlicious dependency to 0.0.2
caroott Sep 26, 2024
e5c2a00
add workflow steps
caroott Oct 6, 2024
42fcb79
add workflow description type
caroott Oct 6, 2024
01a3046
add steps decoding
caroott Oct 6, 2024
233e4c5
fix direct map decode
caroott Oct 6, 2024
7ed70ad
add WorkflowSteps tests
caroott Oct 6, 2024
ac9aa23
support direct type mappings for inputs and outputs
caroott Oct 6, 2024
796fc96
remove try with for dirent initial workdir
caroott Oct 6, 2024
42b2105
add overflow decoder
caroott Oct 6, 2024
86b87d6
add cmd tool metadata and tests
caroott Oct 8, 2024
05e89b7
fix for new dynamic obj version
caroott Oct 8, 2024
62a2831
update fsproj
caroott Oct 8, 2024
af6443e
Update YAMLicious to version 0.0.2
caroott Oct 8, 2024
8c35e1b
rename Type to Type_ for fable
caroott Oct 8, 2024
43a9be6
add failcase to requirements
caroott Oct 8, 2024
a05301e
add wf requirements to decoder
caroott Oct 8, 2024
6fb2871
add metadata and dynobj testing (fix test runs)
caroott Oct 11, 2024
78e09de
trim strings for python
caroott Oct 11, 2024
1fd8fb8
update yamlicious version
caroott Oct 15, 2024
b80f6aa
add workflow decoding
caroott Oct 15, 2024
1b301c3
Merge branch 'main' into CWL
caroott Oct 15, 2024
39a13b0
add cwl to all test list
caroott Oct 15, 2024
ee737c0
rename types and tests
caroott Oct 17, 2024
95f2763
add attachmembers attribute
caroott Oct 18, 2024
741d07e
switch to resizearray and add some comments
caroott Oct 18, 2024
7c60965
add optional field to inputs
caroott Oct 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions ARCtrl.sln
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "ARCtrl.Yaml.Tests", "tests\
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "ARCtrl.Contract.Tests", "tests\Contract\ARCtrl.Contract.Tests.fsproj", "{D10D12C7-B877-423B-867D-161D99E673C9}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "ARCtrl.CWL.Tests", "tests\CWL\ARCtrl.CWL.Tests.fsproj", "{0F2188D3-144C-41BF-89F6-AA85883AE0D3}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "ARCtrl.ROCrate", "src\ROCrate\ARCtrl.ROCrate.fsproj", "{658BF141-B4B5-4B90-891D-AC36A3FD7574}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "ARCtrl.ROCrate.Tests", "tests\ROCrate\ARCtrl.ROCrate.Tests.fsproj", "{212A1C64-02FC-465A-B0FA-F69735F37ACC}"
Expand Down Expand Up @@ -181,6 +183,10 @@ Global
{D10D12C7-B877-423B-867D-161D99E673C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D10D12C7-B877-423B-867D-161D99E673C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D10D12C7-B877-423B-867D-161D99E673C9}.Release|Any CPU.Build.0 = Release|Any CPU
{0F2188D3-144C-41BF-89F6-AA85883AE0D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0F2188D3-144C-41BF-89F6-AA85883AE0D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0F2188D3-144C-41BF-89F6-AA85883AE0D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0F2188D3-144C-41BF-89F6-AA85883AE0D3}.Release|Any CPU.Build.0 = Release|Any CPU
{658BF141-B4B5-4B90-891D-AC36A3FD7574}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{658BF141-B4B5-4B90-891D-AC36A3FD7574}.Debug|Any CPU.Build.0 = Debug|Any CPU
{658BF141-B4B5-4B90-891D-AC36A3FD7574}.Release|Any CPU.ActiveCfg = Release|Any CPU
Expand Down Expand Up @@ -219,6 +225,7 @@ Global
{1CA11165-4B70-41D2-A846-50374E85385E} = {64B34A6E-318D-4E6E-9262-CE52C9B85A38}
{5810EF87-4F85-4B4C-98E3-833AE914C628} = {64B34A6E-318D-4E6E-9262-CE52C9B85A38}
{D10D12C7-B877-423B-867D-161D99E673C9} = {64B34A6E-318D-4E6E-9262-CE52C9B85A38}
{0F2188D3-144C-41BF-89F6-AA85883AE0D3} = {64B34A6E-318D-4E6E-9262-CE52C9B85A38}
{658BF141-B4B5-4B90-891D-AC36A3FD7574} = {6DA2330B-D407-4FB1-AF05-B0184034EC44}
{212A1C64-02FC-465A-B0FA-F69735F37ACC} = {64B34A6E-318D-4E6E-9262-CE52C9B85A38}
{243ACD5F-10AD-4BE6-9932-829667BE2053} = {64B34A6E-318D-4E6E-9262-CE52C9B85A38}
Expand Down
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<PackageVersion Include="Thoth.Json.Python" Version="0.4.0" />
<PackageVersion Include="Thoth.Json.Newtonsoft" Version="0.2.0" />
<PackageVersion Include="FsSpreadsheet" Version="6.3.0-alpha.4" />
<PackageVersion Include="YAMLicious" Version="0.0.1" />
<PackageVersion Include="YAMLicious" Version="0.0.3" />
<PackageVersion Include="DynamicObj" Version="4.0.0" />
<PackageVersion Include="Fable.SimpleHttp" Version="3.5.0" />
<PackageVersion Include="Fable.Fetch" Version="2.6.0" />
Expand Down
4 changes: 2 additions & 2 deletions src/ARCtrl/ARC.fs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ module ARCAux =
|> FileSystem.create
fs.Union(tree)

let updateFSByCWL (cwl : CWL.CWL option) (fs : FileSystem) =
let updateFSByCWL (cwl : unit option) (fs : FileSystem) =
let workflows = FileSystemTree.createWorkflowsFolder [||]
let runs = FileSystemTree.createRunsFolder [||]
let tree =
Expand All @@ -65,7 +65,7 @@ module ARCAux =


[<AttachMembers>]
type ARC(?isa : ArcInvestigation, ?cwl : CWL.CWL, ?fs : FileSystem.FileSystem) =
type ARC(?isa : ArcInvestigation, ?cwl : unit, ?fs : FileSystem.FileSystem) =

let mutable _isa = isa
let mutable _cwl = cwl
Expand Down
123 changes: 93 additions & 30 deletions src/ARCtrl/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@
"resolved": "1.1.0",
"contentHash": "YEMSyiB/HCpBgDSZUr0LHaTa9vYH+xj8Fvd/AvzUAVbLQ3Bc2l9xHOI9g4+Bh1wGsLFrhMwFW+U39D7m5a6oOw=="
},
"Fable.SimpleHttp": {
"type": "Direct",
"requested": "[3.5.0, )",
"resolved": "3.5.0",
"contentHash": "SWYshvAI90JcdGLsUmTWBG9eaazY6ihdIk/uehrEz/VqMx9qX+e7+PzYaw31DMwGYSva9/mpq9s69T/z8Ubl5Q==",
"dependencies": {
"FSharp.Core": "4.6.2",
"Fable.Browser.Dom": "1.0.0",
"Fable.Browser.XMLHttpRequest": "1.1.0",
"Fable.Core": "3.0.0"
}
},
"NETStandard.Library": {
"type": "Direct",
"requested": "[2.0.3, )",
Expand All @@ -17,51 +29,102 @@
"Microsoft.NETCore.Platforms": "1.1.0"
}
},
"Thoth.Json.Python": {
"Thoth.Json.Newtonsoft": {
"type": "Direct",
"requested": "[0.4.0, )",
"resolved": "0.4.0",
"contentHash": "O86Oisv/91NpbHENz11poZh9zrTRJdAjDXHVC1JqvDDsscelI7HxOmWgks8ZFvYxbBzNJCG+FKQHC10KzyMf8g==",
"requested": "[0.2.0, )",
"resolved": "0.2.0",
"contentHash": "dMQOT6TJftO97c8gHWFegfSw/0/E+VdhGaSkf3e1Ba+DjrAESLA9HMlYyE30x7nhn7w5SfH1WO9YyzSRTV4Ysg==",
"dependencies": {
"FSharp.Core": "5.0.0",
"Fable.Core": "4.1.0",
"Fable.Package.SDK": "1.0.0",
"Fable.Python": "4.3.0",
"Thoth.Json.Core": "0.4.0"
"Fable.Package.SDK": "0.1.0",
"Newtonsoft.Json": "13.0.1",
"Thoth.Json.Core": "0.3.0"
}
},
"Fable.Python": {
"Fable.Browser.Blob": {
"type": "Transitive",
"resolved": "4.3.0",
"contentHash": "KT5PI4NyMtVLDcmDkf5SeqwtFjVO17u27xr45qXfYWG12UePHxGjQJoI16OafIzlEQ6cHfAuRljhZGKIlvOJNQ==",
"resolved": "1.1.0",
"contentHash": "xMX7hPFwBUGuj75xLlH6VsVThZjRlGW4zOqXb1X+byRPLSBE91vtn9EueNUB+YpGhE9LfrtakIPNGy+dkoMkjg==",
"dependencies": {
"FSharp.Core": "4.6.2",
"Fable.Core": "3.0.0"
}
},
"Fable.Browser.Dom": {
"type": "Transitive",
"resolved": "1.0.0",
"contentHash": "ZodpIKYuKnUnqN71Fi103mh0joFYrRPGwpYOrpbZ149PkVAW7DNKXgxad5lsi9df7vAe5+sBhhO71TPREZaWlw==",
"dependencies": {
"FSharp.Core": "4.7.2",
"Fable.Core": "[4.1.0, 5.0.0)"
"FSharp.Core": "4.5.2",
"Fable.Browser.Blob": "1.0.0",
"Fable.Browser.Event": "1.0.0",
"Fable.Browser.WebStorage": "1.0.0",
"Fable.Core": "3.0.0"
}
},
"Fable.Browser.Event": {
"type": "Transitive",
"resolved": "1.0.0",
"contentHash": "T1bGrlRJ4A2fxOfAVPzJpxanR6lkzPgJroPdSN1IU5CLdKtvRakWmYq6QKqu4dz6ZV9Z3fIPTWLZkoGKEOEo3w==",
"dependencies": {
"FSharp.Core": "4.5.2",
"Fable.Core": "3.0.0"
}
},
"Fable.Browser.WebStorage": {
"type": "Transitive",
"resolved": "1.0.0",
"contentHash": "ZqnZKYkhPO+wmJPxQqtiwSc3zCC/mB37SPlVi4ZLiHoPFnra7SQ3qaRn4/ENYTeaVtVq92eVaYbTyAOnFn+GPA==",
"dependencies": {
"FSharp.Core": "4.5.2",
"Fable.Browser.Event": "1.0.0",
"Fable.Core": "3.0.0"
}
},
"Fable.Browser.XMLHttpRequest": {
"type": "Transitive",
"resolved": "1.1.0",
"contentHash": "27p/F8781NrnV9vQ23RhX10ww9MDkX+Yi3yTiV9s8U8Bufi/VCCjS4swX0LXvgKQANN3k87CwaNeiO75r2U7gw==",
"dependencies": {
"FSharp.Core": "4.6.2",
"Fable.Browser.Blob": "1.1.0",
"Fable.Browser.Event": "1.0.0",
"Fable.Core": "3.0.0"
}
},
"Microsoft.NETCore.Platforms": {
"type": "Transitive",
"resolved": "1.1.0",
"contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
},
"Newtonsoft.Json": {
"type": "Transitive",
"resolved": "13.0.1",
"contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
},
"arctrl.contract": {
"type": "Project",
"dependencies": {
"ARCtrl.Core": "[2.1.0-alpha.3, )",
"ARCtrl.Json": "[2.1.0-alpha.3, )",
"ARCtrl.Spreadsheet": "[2.1.0-alpha.3, )",
"ARCtrl.Yaml": "[2.1.0-alpha.3, )"
"ARCtrl.Core": "[1.0.0, )",
"ARCtrl.Json": "[1.0.0, )",
"ARCtrl.Spreadsheet": "[1.0.0, )",
"ARCtrl.Yaml": "[1.0.0, )"
}
},
"arctrl.core": {
"type": "Project",
"dependencies": {
"ARCtrl.CWL": "[2.1.0-alpha.3, )",
"ARCtrl.FileSystem": "[2.1.0-alpha.3, )"
"ARCtrl.CWL": "[1.0.0, )",
"ARCtrl.FileSystem": "[1.0.0, )"
}
},
"arctrl.cwl": {
"type": "Project"
"type": "Project",
"dependencies": {
"DynamicObj": "[4.0.0, )",
"YAMLicious": "[0.0.3, )"
}
},
"arctrl.filesystem": {
"type": "Project",
Expand All @@ -72,8 +135,8 @@
"arctrl.json": {
"type": "Project",
"dependencies": {
"ARCtrl.Core": "[2.1.0-alpha.3, )",
"ARCtrl.ROCrate": "[2.1.0-alpha.3, )",
"ARCtrl.Core": "[1.0.0, )",
"ARCtrl.ROCrate": "[1.0.0, )",
"Thoth.Json.Core": "[0.4.0, )"
}
},
Expand All @@ -87,23 +150,23 @@
"arctrl.spreadsheet": {
"type": "Project",
"dependencies": {
"ARCtrl.Core": "[2.1.0-alpha.3, )",
"ARCtrl.FileSystem": "[2.1.0-alpha.3, )",
"ARCtrl.Core": "[1.0.0, )",
"ARCtrl.FileSystem": "[1.0.0, )",
"FsSpreadsheet": "[6.3.0-alpha.4, )"
}
},
"arctrl.validationpackages": {
"type": "Project",
"dependencies": {
"ARCtrl.Core": "[2.1.0-alpha.3, )"
"ARCtrl.Core": "[1.0.0, )"
}
},
"arctrl.yaml": {
"type": "Project",
"dependencies": {
"ARCtrl.Core": "[2.1.0-alpha.3, )",
"ARCtrl.ValidationPackages": "[2.1.0-alpha.3, )",
"YAMLicious": "[0.0.1, )"
"ARCtrl.Core": "[1.0.0, )",
"ARCtrl.ValidationPackages": "[1.0.0, )",
"YAMLicious": "[0.0.3, )"
}
},
"DynamicObj": {
Expand Down Expand Up @@ -152,9 +215,9 @@
},
"YAMLicious": {
"type": "CentralTransitive",
"requested": "[0.0.1, )",
"resolved": "0.0.1",
"contentHash": "3QQH1VxkTdtU/RZgrzZwNNLAt8zg2Di65wh1dgS2OB1IT3NqFGyjhU+A60siB1+8rxXUe4Ou5nOVGvgDtydYug==",
"requested": "[0.0.3, )",
"resolved": "0.0.3",
"contentHash": "hpvlVVMi+ZNMKt2Eg4XTo2VQtp7alcJdzNuRWiej9b2cD6N0Z4Ly4ksoju8H4Od20lNR29ftMg+Bb5ZuLZt7Wg==",
"dependencies": {
"FSharp.Core": "8.0.300",
"Fable.Core": "4.3.0"
Expand Down
13 changes: 12 additions & 1 deletion src/CWL/ARCtrl.CWL.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@
<Import Project="../Package.Metadata.props" />

<ItemGroup>
<Compile Include="Library.fs" />
<Compile Include="CWLTypes.fs" />
<Compile Include="Requirements.fs" />
<Compile Include="Outputs.fs" />
<Compile Include="Inputs.fs" />
<Compile Include="WorkflowSteps.fs" />
<Compile Include="CWL.fs" />
<Compile Include="Decode.fs" />
<Compile Include="Encode.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="YAMLicious"/>
<PackageReference Include="DynamicObj"/>
</ItemGroup>
</Project>
120 changes: 120 additions & 0 deletions src/CWL/CWL.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
namespace ARCtrl

open ARCtrl.CWL
open DynamicObj
open CWLTypes
open Requirements
open Inputs
open Outputs
open WorkflowSteps
open Fable.Core

module CWLProcessingUnits =
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some of these types (the top-level ones) should definitely be directly in the ARCtrl namespace. Maybe take a look at ARCtrl.Core, where ArcAssay and such are directly in the ARCtrl namespace.


[<AttachMembers>]
type CWLToolDescription (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add [AttachMembers] attribute to each class. See ArcAssay as reference. This is important for js and py usability

cwlVersion: string,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How vastly differing are the cwl versions? Do we have a default version in the specs? If not, we should pick one and set this field here to optional with a default value.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We ask for version 1.2 (current one) or higher. The version is a mandatory field in cwl files and always present, so it can always be read.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but this type is not exclusively for parsing but also for being created, edited and such. I don't think we should have this as a mandatory field in the constructor.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Even if you want to create or edit cwl, you need this field for it to be valid. So making it optional wouldn't make sense imo. A creator which automatically sets it to 1.2 could be an option.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, having it as an optional parameter in the constructor with an internal default value is exactly what I meant.

cls: CWLClass,
outputs: ResizeArray<Output>,
?baseCommand: ResizeArray<string>,
?requirements: ResizeArray<Requirement>,
?hints: ResizeArray<Requirement>,
?inputs: ResizeArray<Input>,
?metadata: DynamicObj
) =
inherit DynamicObj ()

let mutable _cwlVersion: string = cwlVersion
let mutable _class: CWLClass = cls
let mutable _outputs: ResizeArray<Output> = outputs
let mutable _baseCommand: ResizeArray<string> option = baseCommand
let mutable _requirements: ResizeArray<Requirement> option = requirements
let mutable _hints: ResizeArray<Requirement> option = hints
let mutable _inputs: ResizeArray<Input> option = inputs
let mutable _metadata: DynamicObj option = metadata

member this.CWLVersion
with get() = _cwlVersion
and set(version) = _cwlVersion <- version

member this.Class
with get() = _class
and set(cls) = _class <- cls

member this.Outputs
with get() = _outputs
and set(outputs) = _outputs <- outputs

member this.BaseCommand
with get() = _baseCommand
and set(baseCommand) = _baseCommand <- baseCommand

member this.Requirements
with get() = _requirements
and set(requirements) = _requirements <- requirements

member this.Hints
with get() = _hints
and set(hints) = _hints <- hints

member this.Inputs
with get() = _inputs
and set(inputs) = _inputs <- inputs

member this.Metadata
with get() = _metadata
and set(metadata) = _metadata <- metadata

[<AttachMembers>]
type CWLWorkflowDescription(
cwlVersion: string,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same thing with version

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See answer above

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See answer above

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See answer above

cls: CWLClass,
steps: ResizeArray<WorkflowStep>,
inputs: ResizeArray<Input>,
outputs: ResizeArray<Output>,
?requirements: ResizeArray<Requirement>,
?hints: ResizeArray<Requirement>,
?metadata: DynamicObj
) =
inherit DynamicObj()

let mutable _cwlVersion: string = cwlVersion
let mutable _class: CWLClass = cls
let mutable _steps: ResizeArray<WorkflowStep> = steps
let mutable _inputs: ResizeArray<Input> = inputs
let mutable _outputs: ResizeArray<Output> = outputs
let mutable _requirements: ResizeArray<Requirement> option = requirements
let mutable _hints: ResizeArray<Requirement> option = hints
let mutable _metadata: DynamicObj option = metadata

member this.CWLVersion
with get() = _cwlVersion
and set(version) = _cwlVersion <- version

member this.Class
with get() = _class
and set(cls) = _class <- cls

member this.Steps
with get() = _steps
and set(steps) = _steps <- steps

member this.Inputs
with get() = _inputs
and set(inputs) = _inputs <- inputs

member this.Outputs
with get() = _outputs
and set(outputs) = _outputs <- outputs

member this.Requirements
with get() = _requirements
and set(requirements) = _requirements <- requirements

member this.Hints
with get() = _hints
and set(hints) = _hints <- hints

member this.Metadata
with get() = _metadata
and set(metadata) = _metadata <- metadata
Loading