@platforma-sdk/workflow-tengo 2.8.0 → 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
@@ -5,43 +5,38 @@ file := import("@platforma-sdk/workflow-tengo:file")
5
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
6
  assets := import("@platforma-sdk/workflow-tengo:assets")
7
7
 
8
- // reference to the template doing nested super-partitioned export
9
8
  nestedTpl := assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-single-pcolumn")
10
9
 
11
- /** Implements core export logic for export-single-pcolumn and export-multiple-pcolumns templates */
12
10
  exportPColumnData := func(data) {
13
- if data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP_PARTITIONED) ||
14
- data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_JSON_SUPER_PARTITIONED) ||
15
- data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_BINARY_SUPER_PARTITIONED) {
16
- // super-partitioned data
17
-
18
- newData := smart.structBuilder(data.info().Type, data.info().Data)
19
- for key, partData in data.inputs() {
20
- newData.createInputField(key).set(render.createEphemeral(nestedTpl, { data: partData }).output("result"))
21
- }
22
- return newData.lockAndBuild()
23
-
24
- } else if data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP) ||
25
- data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_JSON_PARTITIONED) ||
26
- data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_BINARY_PARTITIONED) {
27
- // data directly referencing blob objects
28
-
29
- newData := smart.structBuilder(data.info().Type, data.info().Data)
30
- for key, partData in data.inputs() {
31
- newData.createInputField(key).set(file.exportFile(partData))
32
- }
33
- return newData.lockAndBuild()
34
-
35
- } else if data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_JSON) {
36
- // data embeds all information and needs no special exporting procedure
37
-
38
- return data
39
-
40
- } else {
41
- ll.panic("unknonw resource type: %v", data.info().Type)
42
- }
11
+ if data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP_PARTITIONED) ||
12
+ data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_JSON_SUPER_PARTITIONED) ||
13
+ data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_BINARY_SUPER_PARTITIONED) {
14
+
15
+ newData := smart.structBuilder(data.info().Type, data.info().Data)
16
+ for key, partData in data.inputs() {
17
+ newData.createInputField(key).set(render.createEphemeral(nestedTpl, { data: partData }).output("result"))
18
+ }
19
+ return newData.lockAndBuild()
20
+
21
+ } else if data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP) ||
22
+ data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_JSON_PARTITIONED) ||
23
+ data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_BINARY_PARTITIONED) {
24
+
25
+ newData := smart.structBuilder(data.info().Type, data.info().Data)
26
+ for key, partData in data.inputs() {
27
+ newData.createInputField(key).set(file.exportFile(partData))
28
+ }
29
+ return newData.lockAndBuild()
30
+
31
+ } else if data.checkResourceType(pConstants.RTYPE_P_COLUMN_DATA_JSON) {
32
+
33
+ return data
34
+
35
+ } else {
36
+ ll.panic("unknonw resource type: %v", data.info().Type)
37
+ }
43
38
  }
44
39
 
45
40
  export ll.toStrict({
46
- exportPColumnData: exportPColumnData
41
+ exportPColumnData: exportPColumnData
47
42
  })
@@ -1,6 +1,5 @@
1
- /**
2
- * Working with p-frames
3
- */
1
+
2
+
4
3
 
5
4
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
5
  oop := import("@platforma-sdk/workflow-tengo:oop")
@@ -9,57 +8,53 @@ assets := import("@platforma-sdk/workflow-tengo:assets")
9
8
  render := import("@platforma-sdk/workflow-tengo:render")
10
9
  constants := import("@platforma-sdk/workflow-tengo:pframes.constants")
11
10
 
12
- /**
13
- * Given a reference to the p-frame, converts all inner resource files into resources that can be
14
- * downloaded from the UI side.
15
- */
11
+
12
+
13
+
16
14
  exportFrame := func(pf) {
17
- return render.createEphemeral(assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-pframe"), { pf: pf }).output("result")
15
+ return render.createEphemeral(assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-pframe"), { pf: pf }).output("result")
18
16
  }
19
17
 
20
- /**
21
- * Export single PColumn data
22
- */
18
+
19
+
23
20
  exportColumnData := func(data) {
24
- return render.createEphemeral(assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-single-pcolumn"), { data: data }).output("result")
21
+ return render.createEphemeral(assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-single-pcolumn"), { data: data }).output("result")
25
22
  }
26
23
 
27
- /**
28
- * Creates a builder for p-frame resource.
29
- */
24
+
25
+
30
26
  pFrameBuilder := func() {
31
- r := smart.structBuilder(constants.RTYPE_P_FRAME)
32
-
33
- self := undefined
34
- self = ll.toStrict(oop.inherit(r, {
35
-
36
- add: func(column, spec, data) {
37
- if (!is_undefined(spec)) {
38
- r.createInputField(column + ".spec").setRefOrJson(spec)
39
- }
40
- if (!is_undefined(data)) {
41
- r.createInputField(column + ".data").setRefOrJson(data)
42
- }
43
- return self
44
- },
45
-
46
- build: func() {
47
- return r.lockAndBuild()
48
- }
49
- }))
50
- return self
27
+ r := smart.structBuilder(constants.RTYPE_P_FRAME)
28
+
29
+ self := undefined
30
+ self = ll.toStrict(oop.inherit(r, {
31
+
32
+ add: func(column, spec, data) {
33
+ if (!is_undefined(spec)) {
34
+ r.createInputField(column + ".spec").setRefOrJson(spec)
35
+ }
36
+ if (!is_undefined(data)) {
37
+ r.createInputField(column + ".data").setRefOrJson(data)
38
+ }
39
+ return self
40
+ },
41
+
42
+ build: func() {
43
+ return r.lockAndBuild()
44
+ }
45
+ }))
46
+ return self
51
47
  }
52
48
 
53
- /**
54
- * Creates a builder for a resource map p-column's data.
55
- */
49
+
50
+
56
51
  pColumnResourceMapDataBuilder := func(keyLength) {
57
- ll.panic("pframes.pColumnResourceMapDataBuilder is not supported any more; use pcolumn.resourceMapBuilder")
52
+ ll.panic("pframes.pColumnResourceMapDataBuilder is not supported any more; use pcolumn.resourceMapBuilder")
58
53
  }
59
54
 
60
55
  export ll.toStrict({
61
- exportFrame: exportFrame,
62
- pFrameBuilder: pFrameBuilder,
63
- exportColumnData: exportColumnData,
64
- pColumnResourceMapDataBuilder: pColumnResourceMapDataBuilder
56
+ exportFrame: exportFrame,
57
+ pFrameBuilder: pFrameBuilder,
58
+ exportColumnData: exportColumnData,
59
+ pColumnResourceMapDataBuilder: pColumnResourceMapDataBuilder
65
60
  })
@@ -1,86 +1,83 @@
1
- /**
2
- * Set of basic operations for PColumn data payload
3
- */
1
+
2
+
4
3
 
5
4
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
5
  assets := import("@platforma-sdk/workflow-tengo:assets")
7
6
  smart := import("@platforma-sdk/workflow-tengo:smart")
8
7
  render := import("@platforma-sdk/workflow-tengo:render")
9
- pConstants := import("@platforma-sdk/workflow-tengo:pframes.constants")
10
8
 
11
9
  llAggTpl := assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.aggregate")
12
10
 
13
- /**
14
- * Instantiate an aggregation pipeline for the given inputs, and returns rendered ephemeral template.
15
- * Use r.output("output_name") method to get corresponding result, where r is an object returned by
16
- * this method.
17
- *
18
- * Contract for the body template:
19
- *
20
- * Inputs:
21
- * "__key__" - will be set to the json representation of the group key (i.e. keys in all
22
- * positions not specified in the indices parameter)
23
- * "__value__" - "PColumnData/ResourceMap" resource with all the records in the current group
24
- * ...extra - all values or references passed to optional last parameter of this method
25
- * will be forwarded to the template as is
26
- *
27
- * Outputs:
28
- * array of output names to collect from aggregation operations is specified as a parameter
29
- * of this operation
30
- *
31
- * @param data data resource (currently only PColumnData/ResourceMap is supported)
32
- * @param indices indices to aggregate over (these indices will be stripped from the input map,
33
- * meaning of this parameter is the opposite of GROUP BY from SQL)
34
- * @param bodyTpl reference to the template implementing particular aggregation (see contract above)
35
- * @param outputs array of output settings to to collect from rendered templates
36
- *
37
- * Common fields for all subtypes:
38
- * {
39
- * name: string - name of the output
40
- * path?: string[] - [optional] overrides the path inside the body template
41
- * result, first name is interpreted as output name. If
42
- * not specified path equals to `[name]`.
43
- * }
44
- *
45
- * Variants:
46
- * | { type: "Resource" } // - assume normal singular resource is produced by
47
- * this output
48
- * | {
49
- * type: "ResourceMap",
50
- * keyLength: number // - expected key length of result from each operation
51
- * } // - assume each record is ResourceMap
52
- * | {
53
- * type: "BinaryPartitioned" | "JsonPartitioned",
54
- * partitionKeyLength: number // - expected partition length of result from
55
- * each operation
56
- * } // - assume each record is a partitionded Json or Binary PColumn data itself
57
- *
58
- * @param isEph if true, body template will be rendered as ephemeral
59
- * @param extra optional map of parameters to pass to the template
60
- */
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
61
58
  aggregate := func(data, indices, bodyTpl, outputs, isEph, ...extra) {
62
- renderInputs := {
63
- params: smart.createJsonResource({
64
- indices: indices,
65
- eph: isEph,
66
- outputs: outputs
67
- }),
68
- body: bodyTpl,
69
- data: data
70
- }
71
-
72
- if len(extra) == 1 {
73
- for k, v in extra[0] {
74
- renderInputs["__extra_" + k] = v
75
- }
76
- } else if len(extra) != 0 {
77
- ll.panic("Wrong number of parameters for aggregate method.")
78
- }
79
-
80
- renderResult := render.createEphemeral(llAggTpl, renderInputs)
81
- return renderResult;
59
+ renderInputs := {
60
+ params: smart.createJsonResource({
61
+ indices: indices,
62
+ eph: isEph,
63
+ outputs: outputs
64
+ }),
65
+ body: bodyTpl,
66
+ data: data
67
+ }
68
+
69
+ if len(extra) == 1 {
70
+ for k, v in extra[0] {
71
+ renderInputs["__extra_" + k] = v
72
+ }
73
+ } else if len(extra) != 0 {
74
+ ll.panic("Wrong number of parameters for aggregate method.")
75
+ }
76
+
77
+ renderResult := render.createEphemeral(llAggTpl, renderInputs)
78
+ return renderResult;
82
79
  }
83
80
 
84
81
  export ll.toStrict({
85
- aggregate: aggregate
82
+ aggregate: aggregate
86
83
  })
@@ -1,71 +1,65 @@
1
- /**
2
- * Working with a single p-column
3
- */
1
+
2
+
4
3
 
5
4
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
5
  oop := import("@platforma-sdk/workflow-tengo:oop")
7
6
  json := import("json")
8
7
  smart := import("@platforma-sdk/workflow-tengo:smart")
9
- assets := import("@platforma-sdk/workflow-tengo:assets")
10
- render := import("@platforma-sdk/workflow-tengo:render")
11
8
  constants := import("@platforma-sdk/workflow-tengo:pframes.constants")
12
9
 
13
- /**
14
- * Returns true if given resource is a p-column resource map data
15
- */
10
+
11
+
16
12
  isResourceMap := func(r) {
17
- return smart.isResource(r) && r.info().Type.Name == constants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP.Name
13
+ return smart.isResource(r) && r.info().Type.Name == constants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP.Name
18
14
  }
19
15
 
20
- /**
21
- * Creates a builder for a resource map p-column's data.
22
- *
23
- * @param keyLength: int - key length
24
- */
16
+
17
+
18
+
19
+
25
20
  resourceMapBuilder := func(keyLength) {
26
- r := smart.structBuilder(
27
- constants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP,
28
- json.encode({ keyLength: keyLength })
29
- )
30
-
31
- self := undefined
32
- self = ll.toStrict(oop.inherit(r, {
33
-
34
- add: func(key, data) {
35
- ll.assert(is_array(key), "key must be an array, got ", key)
36
- ll.assert(len(key) == keyLength, "array length does not match specified keyLength", key, keyLength)
37
- r.createInputField(json.encode(key)).setRefOrJson(data)
38
- return self
39
- },
40
-
41
- build: func() {
42
- return r.lockAndBuild()
43
- }
44
- }))
45
- return self
21
+ r := smart.structBuilder(
22
+ constants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP,
23
+ json.encode({ keyLength: keyLength })
24
+ )
25
+
26
+ self := undefined
27
+ self = ll.toStrict(oop.inherit(r, {
28
+
29
+ add: func(key, data) {
30
+ ll.assert(is_array(key), "key must be an array, got ", key)
31
+ ll.assert(len(key) == keyLength, "array length does not match specified keyLength", key, keyLength)
32
+ r.createInputField(json.encode(key)).setRefOrJson(data)
33
+ return self
34
+ },
35
+
36
+ build: func() {
37
+ return r.lockAndBuild()
38
+ }
39
+ }))
40
+ return self
46
41
  }
47
42
 
48
- /**
49
- * Convert map object to a p-column resource map.
50
- *
51
- * @param map - tengo map
52
- * @param keyLength: int - length of the partitioned key
53
- * @param keyParser: func - function to parse string map keys and return array of p-column keys
54
- */
43
+
44
+
45
+
46
+
47
+
48
+
55
49
  fromMap := func(map, keyLength, keyParser) {
56
- b := resourceMapBuilder(keyLength)
50
+ b := resourceMapBuilder(keyLength)
57
51
 
58
- for k, v in map {
59
- arr := keyParser(k)
60
- ll.assert(is_array(arr), "keyParser should return array")
61
- b.add(arr, v)
62
- }
52
+ for k, v in map {
53
+ arr := keyParser(k)
54
+ ll.assert(is_array(arr), "keyParser should return array")
55
+ b.add(arr, v)
56
+ }
63
57
 
64
- return b.build()
58
+ return b.build()
65
59
  }
66
60
 
67
61
  export ll.toStrict({
68
- fromMap: fromMap,
69
- isResourceMap: isResourceMap,
70
- resourceMapBuilder: resourceMapBuilder
62
+ fromMap: fromMap,
63
+ isResourceMap: isResourceMap,
64
+ resourceMapBuilder: resourceMapBuilder
71
65
  })
@@ -1,136 +1,110 @@
1
- /**
2
- * PFrames spec library:
3
- * - well known domains, annotations and column names.
4
- * - utility methods to manipulate column and axis spec
5
- */
1
+
2
+
3
+
4
+
6
5
 
7
6
  ll := import("@platforma-sdk/workflow-tengo:ll")
8
7
  maps := import("@platforma-sdk/workflow-tengo:maps")
9
8
  validation := import("@platforma-sdk/workflow-tengo:validation")
10
9
  json := import("json")
11
10
 
12
- //
13
- // Common schemas
14
- //
15
11
 
16
12
  P_AXIS_SPEC_SCHEMA := {
17
- // `__options__,closed`: ``, // commented out to keep the room for future schema modifications
18
- `type`: `string,regex=Int|Long|Float|Double|String`,
19
- `name`: `string`,
20
- `domain,?`: { any: `string` },
21
- `annotations,?`: { any: `string` },
22
- `parentAxes,?`: `any` // [ `number` ]
13
+ `type`: `string,regex=Int|Long|Float|Double|String`,
14
+ `name`: `string`,
15
+ `domain,?`: { any: `string` },
16
+ `annotations,?`: { any: `string` },
17
+ `parentAxes,?`: `any` // [ `number` ]
23
18
  }
24
19
 
25
20
  P_COLUMN_SPEC_SCHEMA := {
26
- // `__options__,closed`: ``, // commented out to keep the room for future schema modifications
27
- `kind`: `string,regex=PColumn`,
28
- `valueType`: `string`,
29
- `name`: `string`,
30
- `domain,?`: { any: `string` },
31
- `annotations,?`: { any: `string` },
32
- `parentAxes,?`: `any`, // [ `number` ]
33
- `axesSpec,?`: [ P_AXIS_SPEC_SCHEMA ]
21
+ `kind`: `string,regex=PColumn`,
22
+ `valueType`: `string`,
23
+ `name`: `string`,
24
+ `domain,?`: { any: `string` },
25
+ `annotations,?`: { any: `string` },
26
+ `parentAxes,?`: `any`, // [ `number` ]
27
+ `axesSpec,?`: [ P_AXIS_SPEC_SCHEMA ]
34
28
  }
35
29
 
36
30
  KIND_P_COLUMN := "PColumn"
37
31
 
38
- //
39
- // Column / axis names
40
- //
41
32
 
42
- /** Column containing labels for axis keys */
43
33
  N_LABEL := "pl7.app/label"
44
34
 
45
- //
46
- // Column / axis domains
47
- //
48
35
 
49
- /** Domain marking column or axis as block-specific, value must contain block id */
50
36
  D_BLOCK := "pl7.app/block"
51
37
 
52
- //
53
- // Column / axis annotations
54
- //
55
38
 
56
- /** Annotation with axis or column label */
57
39
  A_LABEL := "pl7.app/label"
58
- /**
59
- * Annotation containing trace of operations resulting in a corresponding column.
60
- *
61
- * Value must containe JSON encoded array of structures:
62
- * {
63
- * type: string - type of the step, often equals to block package name (i.e. milaboratories.mixcr-clonotyping)
64
- * label: string - string representation of the operation often a block title
65
- * importance: number - higher the number higher the change label from trace step will be used to derive column label
66
- * id: string - unique identifier of operation, often a block id
67
- * }
68
- */
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
69
50
  A_TRACE := "pl7.app/trace"
70
51
 
71
- //
72
- // Utility methods
73
- //
74
52
 
75
53
  _TRACE_STEP_SCHEMA := {
76
- `type`: `string`,
77
- `label`: `string`,
78
- `importance,?`: `number`,
79
- `id,?`: `string`,
80
- `__options__,closed`: ``
54
+ `type`: `string`,
55
+ `label`: `string`,
56
+ `importance,?`: `number`,
57
+ `id,?`: `string`,
58
+ `__options__,closed`: ``
81
59
  }
82
60
 
83
61
  _TRACE_SCHEMA := [_TRACE_STEP_SCHEMA]
84
62
 
85
- /**
86
- * Calculates content of pl7.app/trace annotation, given input column spec, or annotations section
87
- * of specs, or directly content of pl7.app/trace from the input column spec.
88
- *
89
- * Basically validates and adds provided steps.
90
- */
63
+
64
+
65
+
66
+
67
+
91
68
  makeTrace := func(input, ...steps) {
92
- // validating input step structure
93
- validation.assertJsonSchema(steps, _TRACE_SCHEMA)
94
-
95
- currentTraceContent := undefined
96
- if is_string(input) {
97
- currentTraceContent = input
98
- } else if is_string(input[A_TRACE]) {
99
- currentTraceContent = input[A_TRACE]
100
- } else if is_string(input["annotations"][A_TRACE]) {
101
- currentTraceContent = input["annotations"][A_TRACE]
102
- }
103
-
104
- currentTrace := []
105
- if !is_undefined(currentTraceContent) {
106
- currentTrace = json.decode(currentTraceContent)
107
- // validating trace we just parsed
108
- validation.assertJsonSchema(currentTrace, _TRACE_SCHEMA)
109
- }
110
-
111
- currentTrace = append(currentTrace, steps...)
112
- currentTraceStr := string(json.encode(currentTrace))
113
-
114
- return ll.toStrict({
115
- value: currentTrace,
116
- valueStr: currentTraceStr,
117
- /** Injects trace information into column spec */
118
- inject: func(spec) {
119
- validation.assertJsonSchema(spec, P_COLUMN_SPEC_SCHEMA)
120
- return maps.deepMerge(spec, {annotations: {"pl7.app/trace": currentTraceStr}})
121
- }
122
- })
69
+ validation.assertJsonSchema(steps, _TRACE_SCHEMA)
70
+
71
+ currentTraceContent := undefined
72
+ if is_string(input) {
73
+ currentTraceContent = input
74
+ } else if is_string(input[A_TRACE]) {
75
+ currentTraceContent = input[A_TRACE]
76
+ } else if is_string(input["annotations"][A_TRACE]) {
77
+ currentTraceContent = input["annotations"][A_TRACE]
78
+ }
79
+
80
+ currentTrace := []
81
+ if !is_undefined(currentTraceContent) {
82
+ currentTrace = json.decode(currentTraceContent)
83
+ validation.assertJsonSchema(currentTrace, _TRACE_SCHEMA)
84
+ }
85
+
86
+ currentTrace = append(currentTrace, steps...)
87
+ currentTraceStr := string(json.encode(currentTrace))
88
+
89
+ return ll.toStrict({
90
+ value: currentTrace,
91
+ valueStr: currentTraceStr,
92
+ inject: func(spec) {
93
+ validation.assertJsonSchema(spec, P_COLUMN_SPEC_SCHEMA)
94
+ return maps.deepMerge(spec, {annotations: {"pl7.app/trace": currentTraceStr}})
95
+ }
96
+ })
123
97
  }
124
98
 
125
99
  export ll.toStrict({
126
- KIND_P_COLUMN: KIND_P_COLUMN,
100
+ KIND_P_COLUMN: KIND_P_COLUMN,
127
101
 
128
- N_LABEL: N_LABEL,
102
+ N_LABEL: N_LABEL,
129
103
 
130
- D_BLOCK: D_BLOCK,
104
+ D_BLOCK: D_BLOCK,
131
105
 
132
- A_LABEL: A_LABEL,
133
- A_TRACE: A_TRACE,
106
+ A_LABEL: A_LABEL,
107
+ A_TRACE: A_TRACE,
134
108
 
135
- makeTrace: makeTrace
109
+ makeTrace: makeTrace
136
110
  })