@platforma-sdk/workflow-tengo 2.8.1 → 2.8.3

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 +8 -8
@@ -1,207 +1,181 @@
1
1
  ll := import("@platforma-sdk/workflow-tengo:ll")
2
2
  smart := import("@platforma-sdk/workflow-tengo:smart")
3
3
  constants := import("@platforma-sdk/workflow-tengo:constants")
4
- render := import("@platforma-sdk/workflow-tengo:render")
5
4
  json := import("json")
6
5
 
7
6
 
8
7
  _CONTEXT_FIELD_NAME := "ctx"
9
8
 
10
- // options scheme for query
11
9
  _OPTIONS_SCHEME := {
12
- "spec,?": `bool`,
13
- "data,?": `bool`,
14
- "single,?": `bool`,
15
- "first,?": `bool`,
16
- "errIfMissing,?": `bool`
10
+ "spec,?": `bool`,
11
+ "data,?": `bool`,
12
+ "single,?": `bool`,
13
+ "first,?": `bool`,
14
+ "errIfMissing,?": `bool`
17
15
  }
18
16
 
19
- // default query options
20
17
  _DEFAULT_OPTIONS := {
21
- /** Return specs in the results */
22
- spec: true,
23
- /** Return data in the results */
24
- data: true,
25
- /** Asserts that the resulting list has one element and returns it */
26
- single: false,
27
- /** Returns first available result of the query */
28
- first: false,
29
- /** Throw error if no results found */
30
- errIfMissing: false
31
- }
32
-
33
- /**
34
- * Query results pool.
35
- *
36
- * @param spec: query spec
37
- * @param ctx: results pool (context) to query
38
- * @param options: an options map
39
- * @return result: a list of {ref: spec: data:} objects (data will be absent if not requested)
40
- */
18
+ spec: true,
19
+ data: true,
20
+ single: false,
21
+ first: false,
22
+ errIfMissing: false
23
+ }
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
41
32
  create := func(spec, ctx, ...options) {
42
33
 
43
- // @TODO validate spec
44
34
 
45
- ops := copy(_DEFAULT_OPTIONS)
46
- if len(options) > 0 {
47
- ll.assert(len(options) == 1, "expected map, got array: ", options)
35
+ ops := copy(_DEFAULT_OPTIONS)
36
+ if len(options) > 0 {
37
+ ll.assert(len(options) == 1, "expected map, got array: ", options)
48
38
 
49
- // @TODO validate options
50
39
 
51
- // override defaults
52
- for k, v in options[0] {
53
- ops[k] = v
54
- }
55
- }
40
+ for k, v in options[0] {
41
+ ops[k] = v
42
+ }
43
+ }
56
44
 
57
- query := json.encode({
58
- query: spec,
59
- setErrorIfMissing: ops.errIfMissing
60
- })
45
+ query := json.encode({
46
+ query: spec,
47
+ setErrorIfMissing: ops.errIfMissing
48
+ })
61
49
 
62
- builder := undefined
63
- if ops.first {
64
- builder = smart.ephemeralBuilder(constants.RTYPE_BRESOLVE_FIRST, query)
65
- } else {
66
- // return all query results
67
- builder = smart.ephemeralBuilder(constants.RTYPE_BRESOLVE_CHOICE, query)
68
- }
50
+ builder := undefined
51
+ if ops.first {
52
+ builder = smart.ephemeralBuilder(constants.RTYPE_BRESOLVE_FIRST, query)
53
+ } else {
54
+ builder = smart.ephemeralBuilder(constants.RTYPE_BRESOLVE_CHOICE, query)
55
+ }
69
56
 
70
- builder.createInputField(_CONTEXT_FIELD_NAME).set(ctx)
71
- resolve := builder.lockInputsAndBuild()
57
+ builder.createInputField(_CONTEXT_FIELD_NAME).set(ctx)
58
+ resolve := builder.lockInputsAndBuild()
72
59
 
73
60
 
74
- // create a special type to store query results
75
61
 
76
- rb := smart.structBuilder(constants.RTYPE_QUERY_RESULT)
62
+ rb := smart.structBuilder(constants.RTYPE_QUERY_RESULT)
77
63
 
78
- // save options
79
- rb.createInputField("ops").setJson(ops)
64
+ rb.createInputField("ops").setJson(ops)
80
65
 
81
- if ops.spec {
82
- rb.createInputField("spec").set(resolve.getFutureOutputField("spec"))
83
- }
66
+ if ops.spec {
67
+ rb.createInputField("spec").set(resolve.getFutureOutputField("spec"))
68
+ }
84
69
 
85
- // pass data only if needed, otherwise we are not waiting for data to complete
86
- if ops.data {
87
- rb.createInputField("data").set(resolve.getFutureOutputField("data"))
88
- }
70
+ if ops.data {
71
+ rb.createInputField("data").set(resolve.getFutureOutputField("data"))
72
+ }
89
73
 
90
- // the data structure differs in this case; the single ref, data and spec are stored
91
- // directly as result fields
92
- if ops.first {
93
- rb.createInputField("ref").set(resolve.getFutureOutputField("address"))
94
- }
74
+ if ops.first {
75
+ rb.createInputField("ref").set(resolve.getFutureOutputField("address"))
76
+ }
95
77
 
96
- return rb.lockAndBuild()
78
+ return rb.lockAndBuild()
97
79
  }
98
80
 
99
- /**
100
- * Inputs preprocessor used to convert query result into array of {ref: spec: data:} objects
101
- */
81
+
82
+
102
83
  resultUnmarshaller := func() {
103
- return {
104
- canParse: func(r) {
105
- return smart.isResource(r) && r.info().Type.Name == constants.RTYPE_QUERY_RESULT.Name
106
- },
107
-
108
- parse: func(resource, parser) {
109
-
110
- ops := resource.get("ops").getDataAsJson()
111
-
112
- if ops.first {
113
- // special case, single element
114
-
115
- // is no result
116
- isNR := func(r) {
117
- return r.info().Type.Name == constants.RTYPE_BRESOLVE_NO_RESULT.Name
118
- }
119
-
120
- if isNR(resource.get("ref")) {
121
- return undefined
122
- }
123
-
124
- result := {
125
- ref: resource.get("ref").getDataAsJson(),
126
- spec: resource.get("spec").getDataAsJson()
127
- }
128
-
129
- // only if the data is there
130
- if resource.hasInputField("data") {
131
-
132
- // even if spec is present, the data may be still not available
133
- if isNR(resource.get("data")) {
134
- result.data = undefined
135
- } else {
136
- result.data = parser(resource.get("data"))
137
- }
138
- }
139
-
140
- return ll.toStrict(result)
141
- } else {
142
- // format list of results
143
-
144
- spec := resource.get("spec").inputs()
145
- data := undefined
146
- if resource.hasInputField("data") {
147
- data = resource.get("data").inputs()
148
- }
149
-
150
- result := []
151
- for ref, s in spec {
152
- r := {
153
- ref: json.decode(ref),
154
- spec: s.getValueAsJson()
155
- }
156
-
157
- // only if the data is there
158
- if !is_undefined(data) {
159
- r.data = parser(data[ref].getValue())
160
- }
161
-
162
- result = append(result, ll.toStrict(r))
163
- }
164
-
165
- if ops.single {
166
- ll.assert(len(result) == 1, "expected single element, got ", len(result))
167
-
168
- result = result[0]
169
- }
170
-
171
- return result
172
- }
173
- }
174
- }
175
- }
176
-
177
- /**
178
- * Query results pool to find spec & data for a given ref.
179
- *
180
- * @param ref: a ref object ({blockId: name:})
181
- * @param ctx: results pool (context) to query
182
- * @return result: a {ref: spec: data:} object
183
- */
84
+ return {
85
+ canParse: func(r) {
86
+ return smart.isResource(r) && r.info().Type.Name == constants.RTYPE_QUERY_RESULT.Name
87
+ },
88
+
89
+ parse: func(resource, parser) {
90
+
91
+ ops := resource.get("ops").getDataAsJson()
92
+
93
+ if ops.first {
94
+
95
+ isNR := func(r) {
96
+ return r.info().Type.Name == constants.RTYPE_BRESOLVE_NO_RESULT.Name
97
+ }
98
+
99
+ if isNR(resource.get("ref")) {
100
+ return undefined
101
+ }
102
+
103
+ result := {
104
+ ref: resource.get("ref").getDataAsJson(),
105
+ spec: resource.get("spec").getDataAsJson()
106
+ }
107
+
108
+ if resource.hasInputField("data") {
109
+
110
+ if isNR(resource.get("data")) {
111
+ result.data = undefined
112
+ } else {
113
+ result.data = parser(resource.get("data"))
114
+ }
115
+ }
116
+
117
+ return ll.toStrict(result)
118
+ } else {
119
+
120
+ spec := resource.get("spec").inputs()
121
+ data := undefined
122
+ if resource.hasInputField("data") {
123
+ data = resource.get("data").inputs()
124
+ }
125
+
126
+ result := []
127
+ for ref, s in spec {
128
+ r := {
129
+ ref: json.decode(ref),
130
+ spec: s.getValueAsJson()
131
+ }
132
+
133
+ if !is_undefined(data) {
134
+ r.data = parser(data[ref].getValue())
135
+ }
136
+
137
+ result = append(result, ll.toStrict(r))
138
+ }
139
+
140
+ if ops.single {
141
+ ll.assert(len(result) == 1, "expected single element, got ", len(result))
142
+
143
+ result = result[0]
144
+ }
145
+
146
+ return result
147
+ }
148
+ }
149
+ }
150
+ }
151
+
152
+
153
+
154
+
155
+
156
+
157
+
184
158
  resolve := func(ref, ctx, ...options) {
185
159
 
186
- spec := {
187
- type: "Direct",
188
- block_id: ref.blockId, // @TODO use consistent naming in pl
189
- output_name: ref.name // @TODO use consistent naming in pl
190
- }
160
+ spec := {
161
+ type: "Direct",
162
+ block_id: ref.blockId, // @TODO use consistent naming in pl
163
+ output_name: ref.name // @TODO use consistent naming in pl
164
+ }
191
165
 
192
- ops := {}
166
+ ops := {}
193
167
 
194
- if len(options) > 0 {
195
- ops = options[0]
196
- }
168
+ if len(options) > 0 {
169
+ ops = options[0]
170
+ }
197
171
 
198
- ops.first = true
172
+ ops.first = true
199
173
 
200
- return create(spec, ctx, ops)
174
+ return create(spec, ctx, ops)
201
175
  }
202
176
 
203
177
  export ll.toStrict({
204
- create: create,
205
- resolve: resolve,
206
- resultUnmarshaller: resultUnmarshaller
178
+ create: create,
179
+ resolve: resolve,
180
+ resultUnmarshaller: resultUnmarshaller
207
181
  })
@@ -1,8 +1,7 @@
1
1
  ll := import("@platforma-sdk/workflow-tengo:ll")
2
2
 
3
- // a dummy prefix used to mimic field with empty string name
4
3
  NO_PREFIX_EXPORT := "_"
5
4
 
6
5
  export ll.toStrict({
7
- NO_PREFIX_EXPORT: NO_PREFIX_EXPORT
6
+ NO_PREFIX_EXPORT: NO_PREFIX_EXPORT
8
7
  })
@@ -1,4 +1,3 @@
1
- /** Library to work with context resources */
2
1
 
3
2
  ll := import("@platforma-sdk/workflow-tengo:ll")
4
3
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -9,48 +8,44 @@ _BLOCK_ID_FIELD := "id"
9
8
  _PARENT_CTX_FIELD := "parent"
10
9
  _EXPORTS_OUTPUT_PREFIX := "values/"
11
10
 
12
- /**
13
- * Create a new context builder
14
- *
15
- * @param block block (smart.Resource)
16
- * @param parentContext parent context (smart.Resource)
17
- */
11
+
12
+
13
+
14
+
15
+
18
16
  builder := func(block, parentContext) {
19
17
 
20
- super := smart.ephemeralBuilder(constants.RTYPE_CONTEXT)
18
+ super := smart.ephemeralBuilder(constants.RTYPE_CONTEXT)
19
+
20
+ super.createInputField(_BLOCK_ID_FIELD).setRefOrJson(block)
21
21
 
22
- // set blockId associated with this context
23
- super.createInputField(_BLOCK_ID_FIELD).setRefOrJson(block)
22
+ super.createInputField(_PARENT_CTX_FIELD).set(parentContext)
24
23
 
25
- // set parent context
26
- super.createInputField(_PARENT_CTX_FIELD).set(parentContext)
24
+ self := undefined
25
+ self = ll.toStrict(oop.inherit(super, {
27
26
 
28
- self := undefined
29
- self = ll.toStrict(oop.inherit(super, {
30
27
 
31
- /**
32
- * Add export to the context
33
- *
34
- * @param name string name of the export field
35
- * @param value resource/field value
36
- *
37
- */
38
- add: func(name, value) {
39
- field := super.createInputField(_EXPORTS_OUTPUT_PREFIX + name)
40
28
 
41
- field.setRefOrJson(value)
42
29
 
43
- return self
44
- },
45
30
 
46
- build: func() {
47
- return super.lockAndBuild()
48
- }
49
- }))
50
31
 
51
- return self
32
+
33
+ add: func(name, value) {
34
+ field := super.createInputField(_EXPORTS_OUTPUT_PREFIX + name)
35
+
36
+ field.setRefOrJson(value)
37
+
38
+ return self
39
+ },
40
+
41
+ build: func() {
42
+ return super.lockAndBuild()
43
+ }
44
+ }))
45
+
46
+ return self
52
47
  }
53
48
 
54
49
  export ll.toStrict({
55
- builder: builder
50
+ builder: builder
56
51
  })