@platforma-sdk/workflow-tengo 2.9.6 → 2.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tengo/lib/assets.lib.tengo +52 -52
- package/dist/tengo/lib/assets.swinfo.lib.tengo +45 -45
- package/dist/tengo/lib/constants.lib.tengo +32 -32
- package/dist/tengo/lib/exec.R.internal.lib.tengo +29 -29
- package/dist/tengo/lib/exec.R.lib.tengo +166 -166
- package/dist/tengo/lib/exec.constants.lib.tengo +4 -4
- package/dist/tengo/lib/exec.descriptor.lib.tengo +31 -31
- package/dist/tengo/lib/exec.internal.lib.tengo +297 -297
- package/dist/tengo/lib/exec.lib.tengo +815 -815
- package/dist/tengo/lib/exec.monetization.lib.tengo +130 -130
- package/dist/tengo/lib/exec.package.lib.tengo +212 -212
- package/dist/tengo/lib/exec.python.internal.lib.tengo +6 -6
- package/dist/tengo/lib/exec.python.lib.tengo +146 -146
- package/dist/tengo/lib/exec.runcmd.lib.tengo +371 -371
- package/dist/tengo/lib/exec.runenv.lib.tengo +92 -92
- package/dist/tengo/lib/exec.stream.lib.tengo +40 -40
- package/dist/tengo/lib/file.internal.lib.tengo +77 -77
- package/dist/tengo/lib/file.lib.tengo +57 -57
- package/dist/tengo/lib/ll.lib.tengo +244 -244
- package/dist/tengo/lib/maps.lib.tengo +152 -152
- package/dist/tengo/lib/objects.lib.tengo +13 -13
- package/dist/tengo/lib/oop.lib.tengo +19 -19
- package/dist/tengo/lib/path.lib.tengo +125 -125
- package/dist/tengo/lib/pframes.constants.lib.tengo +28 -28
- package/dist/tengo/lib/pframes.export-pcolumn.lib.tengo +33 -33
- package/dist/tengo/lib/pframes.lib.tengo +43 -43
- package/dist/tengo/lib/pframes.ll.lib.tengo +72 -72
- package/dist/tengo/lib/pframes.pcolumn.lib.tengo +49 -49
- package/dist/tengo/lib/pframes.spec.lib.tengo +96 -96
- package/dist/tengo/lib/pframes.util.lib.tengo +288 -288
- package/dist/tengo/lib/pframes.xsv.lib.tengo +272 -272
- package/dist/tengo/lib/render.lib.tengo +75 -75
- package/dist/tengo/lib/sets.lib.tengo +68 -68
- package/dist/tengo/lib/slices.lib.tengo +258 -155
- package/dist/tengo/lib/smart.lib.tengo +1069 -1069
- package/dist/tengo/lib/test.lib.tengo +161 -161
- package/dist/tengo/lib/tpl.lib.tengo +515 -515
- package/dist/tengo/lib/tpl.state-await.lib.tengo +240 -240
- package/dist/tengo/lib/tpl.util.lib.tengo +9 -9
- package/dist/tengo/lib/validation.lib.tengo +378 -378
- package/dist/tengo/lib/workdir.lib.tengo +331 -331
- package/dist/tengo/lib/workdir.proc.lib.tengo +144 -144
- package/dist/tengo/lib/workdir.save.lib.tengo +130 -130
- package/dist/tengo/lib/workflow.bobject.lib.tengo +26 -26
- package/dist/tengo/lib/workflow.bquery.lib.tengo +165 -165
- package/dist/tengo/lib/workflow.constants.lib.tengo +2 -2
- package/dist/tengo/lib/workflow.context.lib.tengo +32 -32
- package/dist/tengo/lib/workflow.lib.tengo +206 -206
- package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
- package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
- package/dist/tengo/tpl/exec.monetization_to_json.plj.gz +0 -0
- package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
- package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.aggregate.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.map-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
- package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
- package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
- package/package.json +2 -2
|
@@ -1,158 +1,158 @@
|
|
|
1
|
-
|
|
1
|
+
/** Library for workdir processor templates */
|
|
2
2
|
|
|
3
3
|
tpl := import("@platforma-sdk/workflow-tengo:tpl")
|
|
4
4
|
ll := import("@platforma-sdk/workflow-tengo:ll")
|
|
5
5
|
wdSave := import("@platforma-sdk/workflow-tengo:workdir.save")
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
// the template has a defined outputs
|
|
8
8
|
tpl.defineOutputs(["result", "workdir"])
|
|
9
9
|
|
|
10
10
|
proc := func() {
|
|
11
|
-
self := undefined
|
|
12
|
-
|
|
13
|
-
self = {
|
|
14
|
-
|
|
15
|
-
_wdBefore: undefined,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
wdBefore: func() {
|
|
20
|
-
if is_undefined(self._wdBefore) {
|
|
21
|
-
self._wdBefore = tpl.inputs().workdir
|
|
22
|
-
}
|
|
23
|
-
return self._wdBefore
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
_filesInWd: undefined,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
filesInWd: func() {
|
|
31
|
-
if is_undefined(self._filesInWd) {
|
|
32
|
-
self._filesInWd = self.wdBefore().getDataAsJson().files
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return self._filesInWd
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
_wdAfterReadFiles: undefined,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
wdAfterReadFiles: func() {
|
|
43
|
-
if is_undefined(self._wdAfterReadFiles) {
|
|
44
|
-
|
|
45
|
-
if !is_undefined(tpl.inputs().wdAfterReadFiles) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
self._wdAfterReadFiles = tpl.inputs().wdAfterReadFiles
|
|
52
|
-
} else {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
self._wdAfterReadFiles = self.wdBefore()
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return self._wdAfterReadFiles
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
readFiles: func(cb) {
|
|
70
|
-
tpl.prepare(func(inputs){
|
|
71
|
-
inputs.files = self.filesInWd()
|
|
72
|
-
|
|
73
|
-
files := cb(inputs)
|
|
74
|
-
|
|
75
|
-
wdBuilder := wdSave.builder(self.wdBefore())
|
|
76
|
-
for _, fName in files {
|
|
77
|
-
wdBuilder.saveFileContent(fName)
|
|
78
|
-
}
|
|
79
|
-
wd := wdBuilder.build()
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
preps := {}
|
|
83
|
-
for key, fName in files {
|
|
84
|
-
preps[key] = wd.getSavedFileContent(fName)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
preps.wdAfterReadFiles = wd.getWorkdirAfter()
|
|
88
|
-
|
|
89
|
-
return preps
|
|
90
|
-
})
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
_wdFinalBuilder: undefined,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
wdFinalBuilder: func() {
|
|
98
|
-
if is_undefined(self._wdFinalBuilder) {
|
|
99
|
-
self._wdFinalBuilder = wdSave.builder(self.wdAfterReadFiles())
|
|
100
|
-
}
|
|
101
|
-
return self._wdFinalBuilder
|
|
102
|
-
},
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
saveFile: func(fName) {
|
|
110
|
-
self.wdFinalBuilder().saveFile(fName)
|
|
111
|
-
return self.wdFinalBuilder().getSavedFile(fName)
|
|
112
|
-
},
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
saveFileContent: func(fName) {
|
|
120
|
-
self.wdFinalBuilder().saveFileContent(fName)
|
|
121
|
-
return self.wdFinalBuilder().getSavedFileContent(fName)
|
|
122
|
-
},
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
body: func(cb) {
|
|
133
|
-
tpl.body(func(inputs) {
|
|
134
|
-
|
|
135
|
-
inputs.files = self.filesInWd()
|
|
136
|
-
result := cb(inputs)
|
|
137
|
-
wd := self.wdFinalBuilder().build()
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
result: result,
|
|
141
|
-
workdir: wd.getWorkdirAfter()
|
|
142
|
-
}
|
|
143
|
-
})
|
|
144
|
-
}
|
|
11
|
+
self := undefined
|
|
12
|
+
|
|
13
|
+
self = {
|
|
14
|
+
|
|
15
|
+
_wdBefore: undefined,
|
|
16
|
+
/**
|
|
17
|
+
* @return wd: resource - initial working directory resource
|
|
18
|
+
*/
|
|
19
|
+
wdBefore: func() {
|
|
20
|
+
if is_undefined(self._wdBefore) {
|
|
21
|
+
self._wdBefore = tpl.inputs().workdir
|
|
22
|
+
}
|
|
23
|
+
return self._wdBefore
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
_filesInWd: undefined,
|
|
27
|
+
/**
|
|
28
|
+
* @return fileNames: string[] - list of file paths currently existing in the working directory
|
|
29
|
+
*/
|
|
30
|
+
filesInWd: func() {
|
|
31
|
+
if is_undefined(self._filesInWd) {
|
|
32
|
+
self._filesInWd = self.wdBefore().getDataAsJson().files
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return self._filesInWd
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
_wdAfterReadFiles: undefined,
|
|
39
|
+
/**
|
|
40
|
+
* @return wd: resource - working directory resource after "readFiles" is done
|
|
41
|
+
*/
|
|
42
|
+
wdAfterReadFiles: func() {
|
|
43
|
+
if is_undefined(self._wdAfterReadFiles) {
|
|
44
|
+
|
|
45
|
+
if !is_undefined(tpl.inputs().wdAfterReadFiles) {
|
|
46
|
+
|
|
47
|
+
//
|
|
48
|
+
// this means readFiles was used and we are actually
|
|
49
|
+
// in the 'prepare' render
|
|
50
|
+
//
|
|
51
|
+
self._wdAfterReadFiles = tpl.inputs().wdAfterReadFiles
|
|
52
|
+
} else {
|
|
53
|
+
|
|
54
|
+
// no readFiles
|
|
55
|
+
self._wdAfterReadFiles = self.wdBefore()
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return self._wdAfterReadFiles
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Select files to read their content and pass it to the body function
|
|
64
|
+
*
|
|
65
|
+
* @param cb: callback - a callback which takes a list of file names (paths) existing in the working directory and
|
|
66
|
+
* returning a map of key -> file name containing files to get content from; each file content will be available in
|
|
67
|
+
* the body inputs with the corresponding key
|
|
68
|
+
*/
|
|
69
|
+
readFiles: func(cb) {
|
|
70
|
+
tpl.prepare(func(inputs){
|
|
71
|
+
inputs.files = self.filesInWd()
|
|
72
|
+
// key -> file name
|
|
73
|
+
files := cb(inputs)
|
|
74
|
+
|
|
75
|
+
wdBuilder := wdSave.builder(self.wdBefore())
|
|
76
|
+
for _, fName in files {
|
|
77
|
+
wdBuilder.saveFileContent(fName)
|
|
78
|
+
}
|
|
79
|
+
wd := wdBuilder.build()
|
|
80
|
+
|
|
81
|
+
// run prepare to get file contents in the inputs
|
|
82
|
+
preps := {}
|
|
83
|
+
for key, fName in files {
|
|
84
|
+
preps[key] = wd.getSavedFileContent(fName)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
preps.wdAfterReadFiles = wd.getWorkdirAfter()
|
|
88
|
+
|
|
89
|
+
return preps
|
|
90
|
+
})
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
_wdFinalBuilder: undefined,
|
|
94
|
+
/**
|
|
95
|
+
* Final workdir builder, after prepare
|
|
96
|
+
*/
|
|
97
|
+
wdFinalBuilder: func() {
|
|
98
|
+
if is_undefined(self._wdFinalBuilder) {
|
|
99
|
+
self._wdFinalBuilder = wdSave.builder(self.wdAfterReadFiles())
|
|
100
|
+
}
|
|
101
|
+
return self._wdFinalBuilder
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Save given file.
|
|
106
|
+
*
|
|
107
|
+
* @return ref: reference - a reference to saved file resource
|
|
108
|
+
*/
|
|
109
|
+
saveFile: func(fName) {
|
|
110
|
+
self.wdFinalBuilder().saveFile(fName)
|
|
111
|
+
return self.wdFinalBuilder().getSavedFile(fName)
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Save content of a given file.
|
|
116
|
+
*
|
|
117
|
+
* @return ref: reference - a reference to saved file content value resource
|
|
118
|
+
*/
|
|
119
|
+
saveFileContent: func(fName) {
|
|
120
|
+
self.wdFinalBuilder().saveFileContent(fName)
|
|
121
|
+
return self.wdFinalBuilder().getSavedFileContent(fName)
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Template body function
|
|
126
|
+
*
|
|
127
|
+
* @param cb: func - a callback function to run in template body; the inputs passed to the body will have the following fields:
|
|
128
|
+
* files: string[] - list of files in workdir
|
|
129
|
+
* args: map - additional arguments of the template processor
|
|
130
|
+
* ...filesContent: resources - fields with the content of files specified in 'readFiles'
|
|
131
|
+
*/
|
|
132
|
+
body: func(cb) {
|
|
133
|
+
tpl.body(func(inputs) {
|
|
134
|
+
|
|
135
|
+
inputs.files = self.filesInWd()
|
|
136
|
+
result := cb(inputs)
|
|
137
|
+
wd := self.wdFinalBuilder().build()
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
result: result,
|
|
141
|
+
workdir: wd.getWorkdirAfter()
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return ll.toStrict(self)
|
|
145
148
|
}
|
|
146
149
|
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
/** singleton instance */
|
|
151
151
|
instance := proc()
|
|
152
152
|
|
|
153
153
|
export ll.toStrict({
|
|
154
|
-
readFiles: instance.readFiles,
|
|
155
|
-
saveFile: instance.saveFile,
|
|
156
|
-
saveFileContent: instance.saveFileContent,
|
|
157
|
-
body: instance.body
|
|
154
|
+
readFiles: instance.readFiles,
|
|
155
|
+
saveFile: instance.saveFile,
|
|
156
|
+
saveFileContent: instance.saveFileContent,
|
|
157
|
+
body: instance.body
|
|
158
158
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/** A library providing workdir save resource builder */
|
|
2
2
|
|
|
3
3
|
ll := import("@platforma-sdk/workflow-tengo:ll")
|
|
4
4
|
oop := import("@platforma-sdk/workflow-tengo:oop")
|
|
@@ -15,144 +15,144 @@ _WORKDIR_AFTER_FIELD := "workdirOut"
|
|
|
15
15
|
_PROGRESS_FIELD := "progress"
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Generates a file save rule for a given file name.
|
|
20
|
+
*
|
|
21
|
+
* @param fileName: string - the name of the file.
|
|
22
|
+
* @return rule: map - the file save rule.
|
|
23
|
+
*/
|
|
24
24
|
getFileSaveRule := func(fileName) {
|
|
25
|
-
return {
|
|
26
|
-
blobKey: fileName,
|
|
27
|
-
type: "file",
|
|
28
|
-
filePath: fileName
|
|
29
|
-
}
|
|
25
|
+
return {
|
|
26
|
+
blobKey: fileName,
|
|
27
|
+
type: "file",
|
|
28
|
+
filePath: fileName
|
|
29
|
+
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Generates a value save rule for a given file name.
|
|
34
|
+
*
|
|
35
|
+
* @param fileName: string - the name of the file.
|
|
36
|
+
* @return rule: map - the value save rule.
|
|
37
|
+
*/
|
|
38
38
|
getContentSaveRule := func(fileName) {
|
|
39
|
-
return {
|
|
40
|
-
blobKey: fileName,
|
|
41
|
-
type: "content",
|
|
42
|
-
contentPath: fileName
|
|
43
|
-
}
|
|
39
|
+
return {
|
|
40
|
+
blobKey: fileName,
|
|
41
|
+
type: "content",
|
|
42
|
+
contentPath: fileName
|
|
43
|
+
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Creates a builder for workdir save resource
|
|
48
|
+
*/
|
|
49
49
|
builder := func(wdBefore) {
|
|
50
50
|
|
|
51
|
-
super := smart.ephemeralBuilder(constants.RTYPE_WORKDIR_SAVE)
|
|
52
|
-
|
|
53
|
-
super.getField(_WORKDIR_IN_FIELD).set(wdBefore)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
fRules := {}
|
|
57
|
-
|
|
58
|
-
cRules := {}
|
|
59
|
-
|
|
60
|
-
self := undefined
|
|
61
|
-
self = ll.toStrict(oop.inherit(super, {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
saveFile: func(fName) {
|
|
70
|
-
fRules = sets.add(fRules, fName)
|
|
71
|
-
return self
|
|
72
|
-
},
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
saveFileContent: func(fName) {
|
|
81
|
-
cRules = sets.add(cRules, fName)
|
|
82
|
-
return self
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
getSavedFiles: func() {
|
|
89
|
-
return self.getField(_SAVED_FILES_FIELD)
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
getSavedFilesContent: func() {
|
|
96
|
-
return self.getField(_SAVED_CONTENT_FIELD)
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
getWorkdirAfter: func() {
|
|
103
|
-
return self.getField(_WORKDIR_AFTER_FIELD)
|
|
104
|
-
},
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
getProgress: func() {
|
|
110
|
-
return self.getField(_PROGRESS_FIELD)
|
|
111
|
-
},
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
getSavedFile: func(fName) {
|
|
117
|
-
return self.getSavedFiles().getFutureInputField(fName)
|
|
118
|
-
},
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
getSavedFileContent: func(fName) {
|
|
124
|
-
return self.getSavedFilesContent().getFutureInputField(fName)
|
|
125
|
-
},
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
build: func() {
|
|
131
|
-
rules := []
|
|
132
|
-
for fName, _ in fRules {
|
|
133
|
-
rules = append(rules, getFileSaveRule(fName))
|
|
134
|
-
}
|
|
135
|
-
for fName, _ in cRules {
|
|
136
|
-
rules = append(rules, getContentSaveRule(fName))
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
super.getField(_RULES_FIELD).set(
|
|
140
|
-
smart.createValueResource(
|
|
141
|
-
constants.RTYPE_WORKDIR_SAVE_RULES,
|
|
142
|
-
json.encode(rules)
|
|
143
|
-
)
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
resource := super.lockAndBuild()
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return self
|
|
150
|
-
}
|
|
151
|
-
}))
|
|
152
|
-
|
|
153
|
-
return self
|
|
51
|
+
super := smart.ephemeralBuilder(constants.RTYPE_WORKDIR_SAVE)
|
|
52
|
+
// set input wd
|
|
53
|
+
super.getField(_WORKDIR_IN_FIELD).set(wdBefore)
|
|
54
|
+
|
|
55
|
+
// file save rules
|
|
56
|
+
fRules := {}
|
|
57
|
+
// content save rules
|
|
58
|
+
cRules := {}
|
|
59
|
+
|
|
60
|
+
self := undefined
|
|
61
|
+
self = ll.toStrict(oop.inherit(super, {
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Save file.
|
|
65
|
+
*
|
|
66
|
+
* @param fName: string - file name
|
|
67
|
+
*
|
|
68
|
+
*/
|
|
69
|
+
saveFile: func(fName) {
|
|
70
|
+
fRules = sets.add(fRules, fName)
|
|
71
|
+
return self
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Save file content.
|
|
76
|
+
*
|
|
77
|
+
* @param fName: string - file name
|
|
78
|
+
*
|
|
79
|
+
*/
|
|
80
|
+
saveFileContent: func(fName) {
|
|
81
|
+
cRules = sets.add(cRules, fName)
|
|
82
|
+
return self
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get field pointing to saved files map resource
|
|
87
|
+
*/
|
|
88
|
+
getSavedFiles: func() {
|
|
89
|
+
return self.getField(_SAVED_FILES_FIELD)
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Get field pointing to saved files content map resource
|
|
94
|
+
*/
|
|
95
|
+
getSavedFilesContent: func() {
|
|
96
|
+
return self.getField(_SAVED_CONTENT_FIELD)
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Get field pointing to workdir after resource
|
|
101
|
+
*/
|
|
102
|
+
getWorkdirAfter: func() {
|
|
103
|
+
return self.getField(_WORKDIR_AFTER_FIELD)
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Get field pointing to progress resource
|
|
108
|
+
*/
|
|
109
|
+
getProgress: func() {
|
|
110
|
+
return self.getField(_PROGRESS_FIELD)
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Get future field pointing to saved file resource
|
|
115
|
+
*/
|
|
116
|
+
getSavedFile: func(fName) {
|
|
117
|
+
return self.getSavedFiles().getFutureInputField(fName)
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get future field pointing to saved file content value resource
|
|
122
|
+
*/
|
|
123
|
+
getSavedFileContent: func(fName) {
|
|
124
|
+
return self.getSavedFilesContent().getFutureInputField(fName)
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Build resource
|
|
129
|
+
*/
|
|
130
|
+
build: func() {
|
|
131
|
+
rules := []
|
|
132
|
+
for fName, _ in fRules {
|
|
133
|
+
rules = append(rules, getFileSaveRule(fName))
|
|
134
|
+
}
|
|
135
|
+
for fName, _ in cRules {
|
|
136
|
+
rules = append(rules, getContentSaveRule(fName))
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
super.getField(_RULES_FIELD).set(
|
|
140
|
+
smart.createValueResource(
|
|
141
|
+
constants.RTYPE_WORKDIR_SAVE_RULES,
|
|
142
|
+
json.encode(rules)
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
resource := super.lockAndBuild()
|
|
147
|
+
|
|
148
|
+
// still return self to have all the methods
|
|
149
|
+
return self
|
|
150
|
+
}
|
|
151
|
+
}))
|
|
152
|
+
|
|
153
|
+
return self
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
export ll.toStrict({
|
|
157
|
-
builder: builder
|
|
157
|
+
builder: builder
|
|
158
158
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions to work with export objects & p-frames
|
|
3
|
+
*/
|
|
4
4
|
|
|
5
5
|
ll := import("@platforma-sdk/workflow-tengo:ll")
|
|
6
6
|
constants := import("@platforma-sdk/workflow-tengo:constants")
|
|
@@ -9,43 +9,43 @@ smart := import("@platforma-sdk/workflow-tengo:smart")
|
|
|
9
9
|
validation := import("@platforma-sdk/workflow-tengo:validation")
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
//
|
|
13
13
|
_pObjectSpecSchema := {
|
|
14
|
-
"__options__,closed": "",
|
|
14
|
+
"__options__,closed": "",
|
|
15
15
|
|
|
16
|
-
"kind": "string",
|
|
16
|
+
"kind": "string",
|
|
17
17
|
|
|
18
|
-
"valueType,?": `string,regex=json|File|DynamicFile|String|Double|Long|Int`,
|
|
18
|
+
"valueType,?": `string,regex=json|File|DynamicFile|String|Double|Long|Int`,
|
|
19
19
|
|
|
20
|
-
"name,?": {",any": "string"},
|
|
20
|
+
"name,?": {",any": "string"},
|
|
21
21
|
|
|
22
|
-
"domain,?": {",any": "string"},
|
|
22
|
+
"domain,?": {",any": "string"},
|
|
23
23
|
|
|
24
|
-
"axesSpec,?": [{
|
|
25
|
-
"type": "string,regex=String",
|
|
26
|
-
"name": "string",
|
|
27
|
-
"domain,?": {",any": "string"},
|
|
28
|
-
"annotations,?": {",any": "string"}
|
|
29
|
-
}],
|
|
24
|
+
"axesSpec,?": [{
|
|
25
|
+
"type": "string,regex=String",
|
|
26
|
+
"name": "string",
|
|
27
|
+
"domain,?": {",any": "string"},
|
|
28
|
+
"annotations,?": {",any": "string"}
|
|
29
|
+
}],
|
|
30
30
|
|
|
31
|
-
"annotations,?": {",any": "string"}
|
|
31
|
+
"annotations,?": {",any": "string"}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Creates export object spec from a given map
|
|
37
|
+
*
|
|
38
|
+
* @param spec: map
|
|
39
|
+
*/
|
|
40
40
|
createSpec := func(spec) {
|
|
41
|
-
ll.assert(ll.isMap(spec), "expected map got %v", spec)
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
ll.assert(ll.isMap(spec), "expected map got %v", spec)
|
|
44
42
|
|
|
43
|
+
// @TODO fix validation
|
|
44
|
+
// validation.assertValidJson(spec, _pObjectSpecSchema)
|
|
45
45
|
|
|
46
|
-
return smart.createValueResource(constants.RTYPE_BOBJECT_SPEC, json.encode(spec))
|
|
46
|
+
return smart.createValueResource(constants.RTYPE_BOBJECT_SPEC, json.encode(spec))
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
export ll.toStrict({
|
|
50
|
-
createSpec: createSpec
|
|
50
|
+
createSpec: createSpec
|
|
51
51
|
})
|