@platforma-sdk/workflow-tengo 2.8.1 → 2.8.2

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.
Files changed (59) hide show
  1. package/dist/tengo/lib/assets.lib.tengo +76 -82
  2. package/dist/tengo/lib/constants.lib.tengo +28 -31
  3. package/dist/tengo/lib/exec.R.internal.lib.tengo +14 -14
  4. package/dist/tengo/lib/exec.R.lib.tengo +158 -167
  5. package/dist/tengo/lib/exec.internal.lib.tengo +222 -234
  6. package/dist/tengo/lib/exec.lib.tengo +647 -714
  7. package/dist/tengo/lib/exec.package.lib.tengo +229 -238
  8. package/dist/tengo/lib/exec.python.internal.lib.tengo +5 -6
  9. package/dist/tengo/lib/exec.python.lib.tengo +138 -146
  10. package/dist/tengo/lib/exec.runcmd.lib.tengo +234 -253
  11. package/dist/tengo/lib/exec.runenv.lib.tengo +88 -92
  12. package/dist/tengo/lib/exec.stream.lib.tengo +36 -40
  13. package/dist/tengo/lib/file.internal.lib.tengo +70 -77
  14. package/dist/tengo/lib/file.lib.tengo +54 -57
  15. package/dist/tengo/lib/ll.lib.tengo +217 -241
  16. package/dist/tengo/lib/maps.lib.tengo +98 -106
  17. package/dist/tengo/lib/objects.lib.tengo +11 -13
  18. package/dist/tengo/lib/oop.lib.tengo +16 -19
  19. package/dist/tengo/lib/path.lib.tengo +116 -125
  20. package/dist/tengo/lib/pframes.constants.lib.tengo +25 -28
  21. package/dist/tengo/lib/pframes.export-pcolumn.lib.tengo +28 -33
  22. package/dist/tengo/lib/pframes.lib.tengo +38 -43
  23. package/dist/tengo/lib/pframes.ll.lib.tengo +70 -73
  24. package/dist/tengo/lib/pframes.pcolumn.lib.tengo +45 -51
  25. package/dist/tengo/lib/pframes.spec.lib.tengo +70 -96
  26. package/dist/tengo/lib/pframes.util.lib.tengo +154 -289
  27. package/dist/tengo/lib/pframes.xsv.lib.tengo +260 -273
  28. package/dist/tengo/lib/render.lib.tengo +65 -76
  29. package/dist/tengo/lib/sets.lib.tengo +61 -68
  30. package/dist/tengo/lib/slices.lib.tengo +169 -180
  31. package/dist/tengo/lib/smart.lib.tengo +956 -1069
  32. package/dist/tengo/lib/test.lib.tengo +129 -161
  33. package/dist/tengo/lib/tpl.lib.tengo +448 -516
  34. package/dist/tengo/lib/tpl.state-await.lib.tengo +226 -241
  35. package/dist/tengo/lib/tpl.util.lib.tengo +4 -9
  36. package/dist/tengo/lib/validation.lib.tengo +334 -379
  37. package/dist/tengo/lib/workdir.lib.tengo +309 -332
  38. package/dist/tengo/lib/workdir.proc.lib.tengo +126 -144
  39. package/dist/tengo/lib/workdir.save.lib.tengo +113 -130
  40. package/dist/tengo/lib/workflow.bobject.lib.tengo +21 -26
  41. package/dist/tengo/lib/workflow.bquery.lib.tengo +140 -166
  42. package/dist/tengo/lib/workflow.constants.lib.tengo +1 -2
  43. package/dist/tengo/lib/workflow.context.lib.tengo +27 -32
  44. package/dist/tengo/lib/workflow.lib.tengo +167 -207
  45. package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
  46. package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
  47. package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
  48. package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
  49. package/dist/tengo/tpl/pframes.aggregate.plj.gz +0 -0
  50. package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
  51. package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
  52. package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
  53. package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
  54. package/dist/tengo/tpl/pframes.map-pframe.plj.gz +0 -0
  55. package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
  56. package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
  57. package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
  58. package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
  59. package/package.json +5 -5
@@ -1,158 +1,140 @@
1
- /** Library for workdir processor templates */
2
1
 
3
2
  tpl := import("@platforma-sdk/workflow-tengo:tpl")
4
3
  ll := import("@platforma-sdk/workflow-tengo:ll")
5
4
  wdSave := import("@platforma-sdk/workflow-tengo:workdir.save")
6
5
 
7
- // the template has a defined outputs
8
6
  tpl.defineOutputs(["result", "workdir"])
9
7
 
10
8
  proc := func() {
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)
9
+ self := undefined
10
+
11
+ self = {
12
+
13
+ _wdBefore: undefined,
14
+
15
+
16
+ wdBefore: func() {
17
+ if is_undefined(self._wdBefore) {
18
+ self._wdBefore = tpl.inputs().workdir
19
+ }
20
+ return self._wdBefore
21
+ },
22
+
23
+ _filesInWd: undefined,
24
+
25
+
26
+ filesInWd: func() {
27
+ if is_undefined(self._filesInWd) {
28
+ self._filesInWd = self.wdBefore().getDataAsJson().files
29
+ }
30
+
31
+ return self._filesInWd
32
+ },
33
+
34
+ _wdAfterReadFiles: undefined,
35
+
36
+
37
+ wdAfterReadFiles: func() {
38
+ if is_undefined(self._wdAfterReadFiles) {
39
+
40
+ if !is_undefined(tpl.inputs().wdAfterReadFiles) {
41
+
42
+ self._wdAfterReadFiles = tpl.inputs().wdAfterReadFiles
43
+ } else {
44
+
45
+ self._wdAfterReadFiles = self.wdBefore()
46
+ }
47
+ }
48
+
49
+ return self._wdAfterReadFiles
50
+ },
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+ readFiles: func(cb) {
59
+ tpl.prepare(func(inputs){
60
+ inputs.files = self.filesInWd()
61
+ files := cb(inputs)
62
+
63
+ wdBuilder := wdSave.builder(self.wdBefore())
64
+ for _, fName in files {
65
+ wdBuilder.saveFileContent(fName)
66
+ }
67
+ wd := wdBuilder.build()
68
+
69
+ preps := {}
70
+ for key, fName in files {
71
+ preps[key] = wd.getSavedFileContent(fName)
72
+ }
73
+
74
+ preps.wdAfterReadFiles = wd.getWorkdirAfter()
75
+
76
+ return preps
77
+ })
78
+ },
79
+
80
+ _wdFinalBuilder: undefined,
81
+
82
+
83
+ wdFinalBuilder: func() {
84
+ if is_undefined(self._wdFinalBuilder) {
85
+ self._wdFinalBuilder = wdSave.builder(self.wdAfterReadFiles())
86
+ }
87
+ return self._wdFinalBuilder
88
+ },
89
+
90
+
91
+
92
+
93
+
94
+ saveFile: func(fName) {
95
+ self.wdFinalBuilder().saveFile(fName)
96
+ return self.wdFinalBuilder().getSavedFile(fName)
97
+ },
98
+
99
+
100
+
101
+
102
+
103
+ saveFileContent: func(fName) {
104
+ self.wdFinalBuilder().saveFileContent(fName)
105
+ return self.wdFinalBuilder().getSavedFileContent(fName)
106
+ },
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+ body: func(cb) {
116
+ tpl.body(func(inputs) {
117
+
118
+ inputs.files = self.filesInWd()
119
+ result := cb(inputs)
120
+ wd := self.wdFinalBuilder().build()
121
+
122
+ return {
123
+ result: result,
124
+ workdir: wd.getWorkdirAfter()
125
+ }
126
+ })
127
+ }
128
+ }
129
+
130
+ return ll.toStrict(self)
148
131
  }
149
132
 
150
- /** singleton instance */
151
133
  instance := proc()
152
134
 
153
135
  export ll.toStrict({
154
- readFiles: instance.readFiles,
155
- saveFile: instance.saveFile,
156
- saveFileContent: instance.saveFileContent,
157
- body: instance.body
136
+ readFiles: instance.readFiles,
137
+ saveFile: instance.saveFile,
138
+ saveFileContent: instance.saveFileContent,
139
+ body: instance.body
158
140
  })
@@ -1,4 +1,3 @@
1
- /** A library providing workdir save resource builder */
2
1
 
3
2
  ll := import("@platforma-sdk/workflow-tengo:ll")
4
3
  oop := import("@platforma-sdk/workflow-tengo:oop")
@@ -15,144 +14,128 @@ _WORKDIR_AFTER_FIELD := "workdirOut"
15
14
  _PROGRESS_FIELD := "progress"
16
15
 
17
16
 
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
- */
17
+
18
+
19
+
20
+
21
+
24
22
  getFileSaveRule := func(fileName) {
25
- return {
26
- blobKey: fileName,
27
- type: "file",
28
- filePath: fileName
29
- }
23
+ return {
24
+ blobKey: fileName,
25
+ type: "file",
26
+ filePath: fileName
27
+ }
30
28
  }
31
29
 
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
- */
30
+
31
+
32
+
33
+
34
+
38
35
  getContentSaveRule := func(fileName) {
39
- return {
40
- blobKey: fileName,
41
- type: "content",
42
- contentPath: fileName
43
- }
36
+ return {
37
+ blobKey: fileName,
38
+ type: "content",
39
+ contentPath: fileName
44
40
  }
41
+ }
42
+
43
+
45
44
 
46
- /**
47
- * Creates a builder for workdir save resource
48
- */
49
45
  builder := func(wdBefore) {
50
46
 
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
47
+ super := smart.ephemeralBuilder(constants.RTYPE_WORKDIR_SAVE)
48
+ super.getField(_WORKDIR_IN_FIELD).set(wdBefore)
49
+
50
+ fRules := {}
51
+ cRules := {}
52
+
53
+ self := undefined
54
+ self = ll.toStrict(oop.inherit(super, {
55
+
56
+
57
+
58
+
59
+
60
+
61
+ saveFile: func(fName) {
62
+ fRules = sets.add(fRules, fName)
63
+ return self
64
+ },
65
+
66
+
67
+
68
+
69
+
70
+
71
+ saveFileContent: func(fName) {
72
+ cRules = sets.add(cRules, fName)
73
+ return self
74
+ },
75
+
76
+
77
+
78
+ getSavedFiles: func() {
79
+ return self.getField(_SAVED_FILES_FIELD)
80
+ },
81
+
82
+
83
+
84
+ getSavedFilesContent: func() {
85
+ return self.getField(_SAVED_CONTENT_FIELD)
86
+ },
87
+
88
+
89
+
90
+ getWorkdirAfter: func() {
91
+ return self.getField(_WORKDIR_AFTER_FIELD)
92
+ },
93
+
94
+
95
+
96
+ getProgress: func() {
97
+ return self.getField(_PROGRESS_FIELD)
98
+ },
99
+
100
+
101
+
102
+ getSavedFile: func(fName) {
103
+ return self.getSavedFiles().getFutureInputField(fName)
104
+ },
105
+
106
+
107
+
108
+ getSavedFileContent: func(fName) {
109
+ return self.getSavedFilesContent().getFutureInputField(fName)
110
+ },
111
+
112
+
113
+
114
+ build: func() {
115
+ rules := []
116
+ for fName, _ in fRules {
117
+ rules = append(rules, getFileSaveRule(fName))
118
+ }
119
+ for fName, _ in cRules {
120
+ rules = append(rules, getContentSaveRule(fName))
121
+ }
122
+
123
+ super.getField(_RULES_FIELD).set(
124
+ smart.createValueResource(
125
+ constants.RTYPE_WORKDIR_SAVE_RULES,
126
+ json.encode(rules)
127
+ )
128
+ )
129
+
130
+ resource := super.lockAndBuild()
131
+
132
+ return self
133
+ }
134
+ }))
135
+
136
+ return self
154
137
  }
155
138
 
156
139
  export ll.toStrict({
157
- builder: builder
140
+ builder: builder
158
141
  })
@@ -1,6 +1,5 @@
1
- /**
2
- * Utility functions to work with export objects & p-frames
3
- */
1
+
2
+
4
3
 
5
4
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
5
  constants := import("@platforma-sdk/workflow-tengo:constants")
@@ -9,43 +8,39 @@ smart := import("@platforma-sdk/workflow-tengo:smart")
9
8
  validation := import("@platforma-sdk/workflow-tengo:validation")
10
9
 
11
10
 
12
- //
13
11
  _pObjectSpecSchema := {
14
- "__options__,closed": "",
12
+ "__options__,closed": "",
15
13
 
16
- "kind": "string",
14
+ "kind": "string",
17
15
 
18
- "valueType,?": `string,regex=json|File|DynamicFile|String|Double|Long|Int`,
16
+ "valueType,?": `string,regex=json|File|DynamicFile|String|Double|Long|Int`,
19
17
 
20
- "name,?": {",any": "string"},
18
+ "name,?": {",any": "string"},
21
19
 
22
- "domain,?": {",any": "string"},
20
+ "domain,?": {",any": "string"},
23
21
 
24
- "axesSpec,?": [{
25
- "type": "string,regex=String",
26
- "name": "string",
27
- "domain,?": {",any": "string"},
28
- "annotations,?": {",any": "string"}
29
- }],
22
+ "axesSpec,?": [{
23
+ "type": "string,regex=String",
24
+ "name": "string",
25
+ "domain,?": {",any": "string"},
26
+ "annotations,?": {",any": "string"}
27
+ }],
30
28
 
31
- "annotations,?": {",any": "string"}
29
+ "annotations,?": {",any": "string"}
32
30
  }
33
31
 
34
32
 
35
- /**
36
- * Creates export object spec from a given map
37
- *
38
- * @param spec: map
39
- */
33
+
34
+
35
+
36
+
40
37
  createSpec := func(spec) {
41
- ll.assert(ll.isMap(spec), "expected map got %v", spec)
38
+ ll.assert(ll.isMap(spec), "expected map got %v", spec)
42
39
 
43
- // @TODO fix validation
44
- // validation.assertValidJson(spec, _pObjectSpecSchema)
45
40
 
46
- return smart.createValueResource(constants.RTYPE_BOBJECT_SPEC, json.encode(spec))
41
+ return smart.createValueResource(constants.RTYPE_BOBJECT_SPEC, json.encode(spec))
47
42
  }
48
43
 
49
44
  export ll.toStrict({
50
- createSpec: createSpec
45
+ createSpec: createSpec
51
46
  })