@datagrok/bio 1.9.1 → 1.10.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.
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "name": "Leonid Stolbov",
6
6
  "email": "lstolbov@datagrok.ai"
7
7
  },
8
- "version": "1.9.1",
8
+ "version": "1.10.2",
9
9
  "description": "Bio is a [package](https://datagrok.ai/help/develop/develop#packages) for the [Datagrok](https://datagrok.ai) platform",
10
10
  "repository": {
11
11
  "type": "git",
@@ -14,7 +14,8 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "@biowasm/aioli": ">=2.4.0",
17
- "@datagrok-libraries/bio": "^3.3.1",
17
+ "@datagrok-libraries/bio": "^4.1.0",
18
+ "@datagrok-libraries/chem-meta": "1.0.0",
18
19
  "@datagrok-libraries/ml": "^4.0.0",
19
20
  "@datagrok-libraries/utils": "^1.6.2",
20
21
  "cash-dom": "latest",
package/src/package.ts CHANGED
@@ -24,7 +24,11 @@ import {representationsWidget} from './widgets/representations';
24
24
  import {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';
25
25
  import {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';
26
26
  import {removeEmptyStringRows} from '@datagrok-libraries/utils/src/dataframe-utils';
27
- import {generateManySequences, generateLongSequence} from './tests/test-sequnces-generators';
27
+ import {
28
+ generateManySequences,
29
+ generateLongSequence,
30
+ performanceTest
31
+ } from './tests/test-sequnces-generators';
28
32
 
29
33
  //tags: init
30
34
  export async function initBio() {
@@ -32,39 +36,12 @@ export async function initBio() {
32
36
 
33
37
  //name: testManySequencesPerformance
34
38
  export function testManySequencesPerformance(): void {
35
- const startTime: number = Date.now();
36
- const csv = generateManySequences();
37
- const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);
38
- const col: DG.Column = df.columns.byName('MSA');
39
- df.columns.byName('MSA').semType = DG.SEMTYPE.MACROMOLECULE;
40
- col.setTag('units', 'separator');
41
- col.setTag('aligned', 'SEQ.MSA');
42
- col.setTag('alphabet', 'UN');
43
- col.setTag('separator', '/');
44
- grok.shell.addTableView(df);
45
-
46
- const endTime: number = Date.now();
47
- const elapsedTime: number = endTime - startTime;
48
- console.log(`Elapsed time: ${elapsedTime}ms`);
49
-
39
+ performanceTest(generateManySequences, 'Many sequences');
50
40
  }
41
+
51
42
  //name: testLongSequencesPerformance
52
43
  export function testLongSequencesPerformance(): void {
53
- const startTime: number = Date.now();
54
- const csv = generateLongSequence();
55
- const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);
56
- const col: DG.Column = df.columns.byName('MSA');
57
- df.columns.byName('MSA').semType = DG.SEMTYPE.MACROMOLECULE;
58
- col.setTag('units', 'separator');
59
- col.setTag('aligned', 'SEQ.MSA');
60
- col.setTag('alphabet', 'UN');
61
- col.setTag('separator', '/');
62
- grok.shell.addTableView(df);
63
-
64
- const endTime: number = Date.now();
65
- const elapsedTime: number = endTime - startTime;
66
- console.log(`Elapsed time: ${elapsedTime}ms`);
67
-
44
+ performanceTest(generateLongSequence, 'Long sequences');
68
45
  }
69
46
 
70
47
 
@@ -200,11 +177,11 @@ export async function sequenceSpaceTopMenu(table: DG.DataFrame, macroMolecule: D
200
177
  if (!encodedCol)
201
178
  return;
202
179
  const embedColsNames = getEmbeddingColsNames(table);
203
- const withoutEmptyValues = DG.DataFrame.fromColumns([macroMolecule]).clone();
180
+ const withoutEmptyValues = DG.DataFrame.fromColumns([encodedCol]).clone();
204
181
  const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, encodedCol);
205
182
 
206
183
  const chemSpaceParams = {
207
- seqCol: withoutEmptyValues.col(macroMolecule.name)!,
184
+ seqCol: withoutEmptyValues.col(encodedCol.name)!,
208
185
  methodName: methodName,
209
186
  similarityMetric: similarityMetric,
210
187
  embedAxesNames: embedColsNames
@@ -199,44 +199,44 @@ MWRSWY-CKHP
199
199
  test('NegativeSmiles', async () => { await _testNeg(readCsv('csvDfSmiles', csvDfSmiles), 'col1'); });
200
200
 
201
201
  test('Dna1', async () => {
202
- await _testPos(readCsv('csvDfDna1', csvDfDna1), 'seq', 'fasta', 'SEQ', 'DNA');
202
+ await _testPos(readCsv('csvDfDna1', csvDfDna1), 'seq', 'fasta', 'SEQ', 'DNA', 4, false);
203
203
  });
204
204
  test('Rna1', async () => {
205
- await _testPos(readCsv('csvDfRna1', csvDfRna1), 'seq', 'fasta', 'SEQ', 'RNA');
205
+ await _testPos(readCsv('csvDfRna1', csvDfRna1), 'seq', 'fasta', 'SEQ', 'RNA', 4, false);
206
206
  });
207
207
  test('AA1', async () => {
208
- await _testPos(readCsv('csvDfPt1', csvDfPt1), 'seq', 'fasta', 'SEQ', 'PT');
208
+ await _testPos(readCsv('csvDfPt1', csvDfPt1), 'seq', 'fasta', 'SEQ', 'PT', 20, false);
209
209
  });
210
210
  test('MsaDna1', async () => {
211
- await _testPos(readCsv('csvDfMsaDna1', csvDfMsaDna1), 'seq', 'fasta', 'SEQ.MSA', 'DNA');
211
+ await _testPos(readCsv('csvDfMsaDna1', csvDfMsaDna1), 'seq', 'fasta', 'SEQ.MSA', 'DNA', 4, false);
212
212
  });
213
213
 
214
214
  test('MsaAA1', async () => {
215
- await _testPos(readCsv('csvDfMsaPt1', csvDfMsaPt1), 'seq', 'fasta', 'SEQ.MSA', 'PT');
215
+ await _testPos(readCsv('csvDfMsaPt1', csvDfMsaPt1), 'seq', 'fasta', 'SEQ.MSA', 'PT', 20, false);
216
216
  });
217
217
 
218
218
  test('SepDna', async () => {
219
- await _testPos(readCsv('csvDfSepDna', csvDfSepDna), 'seq', 'separator', 'SEQ', 'DNA', '*');
219
+ await _testPos(readCsv('csvDfSepDna', csvDfSepDna), 'seq', 'separator', 'SEQ', 'DNA', 4, false, '*');
220
220
  });
221
221
  test('SepRna', async () => {
222
- await _testPos(readCsv('csvDfSepRna', csvDfSepRna), 'seq', 'separator', 'SEQ', 'RNA', '*');
222
+ await _testPos(readCsv('csvDfSepRna', csvDfSepRna), 'seq', 'separator', 'SEQ', 'RNA', 4, false, '*');
223
223
  });
224
224
  test('SepPt', async () => {
225
- await _testPos(readCsv('csvDfSepPt', csvDfSepPt), 'seq', 'separator', 'SEQ', 'PT', '-');
225
+ await _testPos(readCsv('csvDfSepPt', csvDfSepPt), 'seq', 'separator', 'SEQ', 'PT', 20, false, '-');
226
226
  });
227
227
  test('SepUn1', async () => {
228
- await _testPos(readCsv('csvDfSepUn1', csvDfSepUn1), 'seq', 'separator', 'SEQ', 'UN', '-');
228
+ await _testPos(readCsv('csvDfSepUn1', csvDfSepUn1), 'seq', 'separator', 'SEQ', 'UN', 8, true, '-');
229
229
  });
230
230
  test('SepUn2', async () => {
231
- await _testPos(readCsv('csvDfSepUn2', csvDfSepUn2), 'seq', 'separator', 'SEQ', 'UN', '/');
231
+ await _testPos(readCsv('csvDfSepUn2', csvDfSepUn2), 'seq', 'separator', 'SEQ', 'UN', 9, true, '/');
232
232
  });
233
233
 
234
234
  test('SepMsaN1', async () => {
235
- await _testPos(readCsv('csvDfSepMsaDna1', csvDfSepMsaDna1), 'seq', 'separator', 'SEQ.MSA', 'DNA', '-');
235
+ await _testPos(readCsv('csvDfSepMsaDna1', csvDfSepMsaDna1), 'seq', 'separator', 'SEQ.MSA', 'DNA', 4, false, '-');
236
236
  });
237
237
 
238
238
  test('SamplesFastaCsvPt', async () => {
239
- await _testPos(readSamples(Samples.fastaCsv), 'sequence', 'fasta', 'SEQ', 'PT');
239
+ await _testPos(readSamples(Samples.fastaCsv), 'sequence', 'fasta', 'SEQ', 'PT', 20, false);
240
240
  });
241
241
  test('SamplesFastaCsvNegativeEntry', async () => {
242
242
  await _testNeg(readSamples(Samples.fastaCsv), 'Entry');
@@ -249,7 +249,7 @@ MWRSWY-CKHP
249
249
  });
250
250
 
251
251
  test('SamplesFastaFastaPt', async () => {
252
- await _testPos(readSamples(Samples.fastaFasta, readFileFasta), 'sequence', 'fasta', 'SEQ', 'PT');
252
+ await _testPos(readSamples(Samples.fastaFasta, readFileFasta), 'sequence', 'fasta', 'SEQ', 'PT', 20, false);
253
253
  });
254
254
 
255
255
  // peptidesComplex contains monomers with spaces in AlignedSequence columns, which are forbidden
@@ -267,7 +267,7 @@ MWRSWY-CKHP
267
267
  });
268
268
 
269
269
  test('samplesMsaComplexUn', async () => {
270
- await _testPos(readSamples(Samples.msaComplex), 'MSA', 'separator', 'SEQ.MSA', 'UN', '/');
270
+ await _testPos(readSamples(Samples.msaComplex), 'MSA', 'separator', 'SEQ.MSA', 'UN', 161, true, '/');
271
271
  });
272
272
  test('samplesMsaComplexNegativeActivity', async () => {
273
273
  await _testNeg(readSamples(Samples.msaComplex), 'Activity');
@@ -282,7 +282,7 @@ MWRSWY-CKHP
282
282
  });
283
283
 
284
284
  test('samplesHelmCsvHELM', async () => {
285
- await _testPos(readSamples(Samples.helmCsv), 'HELM', 'helm', null, null, null);
285
+ await _testPos(readSamples(Samples.helmCsv), 'HELM', 'helm', null, null, 160, true, null);
286
286
  });
287
287
 
288
288
  test('samplesHelmCsvNegativeActivity', async () => {
@@ -298,7 +298,7 @@ MWRSWY-CKHP
298
298
  await _testNeg(readSamples(Samples.testHelmCsv), 'Test type');
299
299
  });
300
300
  test('samplesTestHelmPositiveHelmString', async () => {
301
- await _testPos(readSamples(Samples.testHelmCsv), 'HELM string', 'helm', null, null, null);
301
+ await _testPos(readSamples(Samples.testHelmCsv), 'HELM string', 'helm', null, null, 9, true, null);
302
302
  });
303
303
  test('samplesTestHelmNegativeValid', async () => {
304
304
  await _testNeg(readSamples(Samples.testHelmCsv), 'Valid?');
@@ -330,7 +330,7 @@ MWRSWY-CKHP
330
330
  });
331
331
 
332
332
  test('samplesFastaPtPosSequence', async () => {
333
- await _testPos(readSamples(Samples.fastaPtCsv), 'sequence', 'fasta', 'SEQ', 'PT');
333
+ await _testPos(readSamples(Samples.fastaPtCsv), 'sequence', 'fasta', 'SEQ', 'PT', 20, false);
334
334
  });
335
335
 
336
336
  test('samplesTestCerealNegativeCerealName', async () => {
@@ -388,7 +388,8 @@ export async function _testNeg(readDf: DfReaderFunc, colName: string) {
388
388
 
389
389
  export async function _testPos(
390
390
  readDf: DfReaderFunc, colName: string, units: string,
391
- aligned: string | null, alphabet: string | null, separator: string | null = null
391
+ aligned: string | null, alphabet: string | null, alphabetSize: number, alphabetIsMultichar: boolean,
392
+ separator: string | null = null
392
393
  ) {
393
394
  const df: DG.DataFrame = await readDf();
394
395
  const col: DG.Column = df.col(colName)!;
@@ -405,6 +406,8 @@ export async function _testPos(
405
406
  expect(col.getTag('separator'), separator);
406
407
 
407
408
  const uh = new UnitsHandler(col);
409
+ expect(uh.getAlphabetSize(), alphabetSize);
410
+ expect(uh.getAlphabetIsMultichar(), alphabetIsMultichar);
408
411
  if (!uh.isHelm()) {
409
412
  expect(uh.aligned, aligned);
410
413
  expect(uh.alphabet, alphabet);
@@ -1,3 +1,6 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import * as grok from 'datagrok-api/grok';
3
+
1
4
  export function generateManySequences(): string {
2
5
  let csvData = `MSA,Activity
3
6
  meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr//Phe_4Me,5.30751`;
@@ -9,14 +12,34 @@ meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr/
9
12
 
10
13
  export function generateLongSequence(): string {
11
14
  let longSequence = `meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr`;
12
- for (let i = 0; i < 10 ** 6; i++) {
15
+ for (let i = 0; i < 10 ** 5; i++) {
13
16
  longSequence += `/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/dv`;
14
17
  }
15
18
  longSequence += `//Phe_4Me,5.30751`;
16
- let csvData = `MSA,Activity
17
- \n ${longSequence}`;
18
- for (let i = 0; i <= 10 ** 2; i++) {
19
+ let csvData = `MSA,Activity `;
20
+ for (let i = 0; i <= 10 ** 1 * 4; i++) {
19
21
  csvData += `\n ${longSequence}`;
20
22
  }
21
23
  return csvData;
22
24
  }
25
+ export function setTagsMacromolecule(col: DG.Column) {
26
+ col.semType = DG.SEMTYPE.MACROMOLECULE;
27
+ col.setTag('units', 'separator');
28
+ col.setTag('aligned', 'SEQ.MSA');
29
+ col.setTag('alphabet', 'UN');
30
+ col.setTag('separator', '/');
31
+ return col;
32
+ }
33
+
34
+ export function performanceTest(generateFunc: () => string,testName: string) {
35
+ const startTime: number = Date.now();
36
+ const csv = generateFunc();
37
+ const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);
38
+ const col: DG.Column = df.columns.byName('MSA');
39
+ setTagsMacromolecule(col);
40
+ grok.shell.addTableView(df);
41
+
42
+ const endTime: number = Date.now();
43
+ const elapsedTime: number = endTime - startTime;
44
+ console.log(`Performance test: ${testName}: ${elapsedTime}ms`);
45
+ }
@@ -1,7 +1,7 @@
1
1
  import * as OCL from 'openchemlib/full.js';
2
2
  import * as grok from 'datagrok-api/grok';
3
3
 
4
- import {RDModule} from '@datagrok-libraries/bio/src/rdkit-api';
4
+ import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
5
5
 
6
6
  export async function getMacroMol(monomers: any[][]): Promise<string[]> {
7
7
  let result: string[] = [];
@@ -6,12 +6,13 @@ import {UnknownSeqPalette, UnknownSeqPalettes} from '@datagrok-libraries/bio/src
6
6
  import {SplitterFunc, WebLogo} from '@datagrok-libraries/bio/src/viewers/web-logo';
7
7
  import {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';
8
8
  import * as ui from 'datagrok-api/ui';
9
- import {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';
9
+ import {printLeftOrCentered, DrawStyle} from '@datagrok-libraries/bio/src/utils/cell-renderer';
10
10
 
11
11
  const undefinedColor = 'rgb(100,100,100)';
12
12
  const monomerToShortFunction: (amino: string, maxLengthOfMonomer: number) => string = WebLogo.monomerToShort;
13
13
  const gapRenderer = 5;
14
14
 
15
+
15
16
  function getPalleteByType(paletteType: string): SeqPalette {
16
17
  switch (paletteType) {
17
18
  case 'PT':
@@ -62,7 +63,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
62
63
  const maxLengthWordsSum = gridCell.cell.column.temp['bio-sum-maxLengthWords'];
63
64
  const maxIndex = gridCell.cell.column.temp['bio-maxIndex'];
64
65
  //@ts-ignore
65
- const argsX = e.layerX - gridCell.gridColumn.left - ((gridCell.bounds.x < 0) ? gridCell.bounds.x : 0);
66
+ const argsX = e.layerX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);
66
67
  let left = 0;
67
68
  let right = maxIndex;
68
69
  let found = false;
@@ -88,7 +89,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
88
89
  const separator = gridCell.cell.column.getTag('separator') ?? '';
89
90
  const splitterFunc: SplitterFunc = WebLogo.getSplitter('separator', separator);
90
91
  const subParts: string[] = splitterFunc(gridCell.cell.value);
91
- ui.tooltip.show(ui.div(subParts[left]), e.x + 16, e.y + 16);
92
+ (((subParts[left]?.length ?? 0) > 0)) ? ui.tooltip.show(ui.div(subParts[left]), e.x + 16, e.y + 16) : ui.tooltip.hide();
92
93
  }
93
94
 
94
95
  /**
@@ -110,6 +111,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
110
111
  const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;
111
112
  const cell = gridCell.cell;
112
113
  const [type, subtype, paletteType] = gridCell.cell.column.getTag(DG.TAGS.UNITS).split(':');
114
+ const minDistanceRenderer = 50;
113
115
  w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;
114
116
  g.save();
115
117
  g.beginPath();
@@ -125,15 +127,16 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
125
127
  const palette = getPalleteByType(paletteType);
126
128
 
127
129
  const separator = gridCell.cell.column.getTag('separator') ?? '';
128
- const splitterFunc: SplitterFunc = WebLogo.getSplitter(units, separator);
130
+ const splitLimit = gridCell.bounds.width / 5;
131
+ const splitterFunc: SplitterFunc = WebLogo.getSplitter(units, separator, gridCell.bounds.width / 5);
129
132
 
130
133
 
131
134
  const maxLengthOfMonomer = 8;
132
135
 
133
136
  let maxLengthWords: any = {};
134
- if (gridCell.cell.column.getTag('.calculatedCellRender') !== 'exist') {
137
+ if (gridCell.cell.column.getTag('.calculatedCellRender') !== splitLimit.toString()) {
135
138
  let samples = 0;
136
- while (samples < Math.max(Math.min(gridCell.cell.column.length, 100), gridCell.cell.column.length / 100)) {
139
+ while (samples < Math.min(gridCell.cell.column.length, 100)) {
137
140
  let column = gridCell.cell.column.get(samples);
138
141
  let subParts: string[] = splitterFunc(column);
139
142
  subParts.forEach((amino, index) => {
@@ -163,7 +166,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
163
166
  'bio-maxIndex': maxLengthWords['bio-maxIndex'],
164
167
  'bio-maxLengthWords': maxLengthWords
165
168
  };
166
- gridCell.cell.column.setTag('.calculatedCellRender', 'exist');
169
+ gridCell.cell.column.setTag('.calculatedCellRender', splitLimit.toString());
167
170
  } else {
168
171
  maxLengthWords = gridCell.cell.column.temp['bio-maxLengthWords'];
169
172
  }
@@ -171,15 +174,19 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
171
174
  const subParts: string[] = splitterFunc(cell.value);
172
175
  let x1 = x;
173
176
  let color = undefinedColor;
174
- let drawStyle = 'classic';
175
- if (gridCell.cell.column.getTag('aligned').includes('MSA')) {
176
- drawStyle = 'msa';
177
+ let drawStyle = DrawStyle.classic;
178
+ if (gridCell.cell.column.getTag('aligned').includes('MSA') && gridCell.cell.column.getTag('units') === 'separator') {
179
+ drawStyle = DrawStyle.MSA;
177
180
  }
178
- subParts.forEach((amino, index) => {
181
+ subParts.every((amino, index) => {
179
182
  color = palette.get(amino);
180
183
  g.fillStyle = undefinedColor;
181
184
  let last = index === subParts.length - 1;
182
185
  x1 = printLeftOrCentered(x1, y, w, h, g, monomerToShortFunction(amino, maxLengthOfMonomer), color, 0, true, 1.0, separator, last, drawStyle, maxLengthWords, index, gridCell);
186
+ if (x1 - minDistanceRenderer - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x) > gridCell.bounds.width) {
187
+ return false;
188
+ }
189
+ return true;
183
190
  });
184
191
 
185
192
  g.restore();
@@ -12,7 +12,9 @@ export interface ISequenceSpaceResult {
12
12
  }
13
13
 
14
14
  export async function sequenceSpace(spaceParams: ISequenceSpaceParams): Promise<ISequenceSpaceResult> {
15
- let preparedData: any;
15
+
16
+ // code deprecated since seqCol is encoded
17
+ /* let preparedData: any;
16
18
  if (!(spaceParams.seqCol!.tags[DG.TAGS.UNITS] === 'HELM')) {
17
19
  const sep = spaceParams.seqCol.getTag('separator');
18
20
  const sepFinal = sep ? sep === '.' ? '\\\.' : sep : '-';
@@ -23,10 +25,10 @@ export async function sequenceSpace(spaceParams: ISequenceSpaceParams): Promise<
23
25
  preparedData = spaceParams.seqCol.toList().map((v: string) => v.replace(regex, '')) as string[];
24
26
  } else {
25
27
  preparedData = spaceParams.seqCol.toList();
26
- }
28
+ } */
27
29
 
28
30
  const sequenceSpaceResult = await reduceDimensinalityWithNormalization(
29
- preparedData,
31
+ spaceParams.seqCol.toList(),
30
32
  spaceParams.methodName,
31
33
  spaceParams.similarityMetric as StringMetrics | BitArrayMetrics,
32
34
  spaceParams.options);
@@ -1,4 +1,4 @@
1
- <html><head><meta charset="utf-8"/><title>Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=fe2f9610d4ed. Commit cdfe422f.</title><style type="text/css">html,
1
+ <html><head><meta charset="utf-8"/><title>Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=eb4783c07294. Commit 0aa1538b.</title><style type="text/css">html,
2
2
  body {
3
3
  font-family: Arial, Helvetica, sans-serif;
4
4
  font-size: 1rem;
@@ -229,7 +229,7 @@ header {
229
229
  font-size: 1rem;
230
230
  padding: 0 0.5rem;
231
231
  }
232
- </style></head><body><div id="jesthtml-content"><header><h1 id="title">Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=fe2f9610d4ed. Commit cdfe422f.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-09-01 07:04:31</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><div class="suite-info"><div class="suite-path">/home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts</div><div class="suite-time warn">46.104s</div></div><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">passed</div><div class="test-duration">27.903s</div></div></div></div><div class="suite-consolelog"><div class="suite-consolelog-header">Console Log</div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/Bio/src/__jest__/test-node.ts:63:11)
232
+ </style></head><body><div id="jesthtml-content"><header><h1 id="title">Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=eb4783c07294. Commit 0aa1538b.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-09-02 13:13:34</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><div class="suite-info"><div class="suite-path">/home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts</div><div class="suite-time warn">45.182s</div></div><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">passed</div><div class="test-duration">30.315s</div></div></div></div><div class="suite-consolelog"><div class="suite-consolelog-header">Console Log</div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/Bio/src/__jest__/test-node.ts:63:11)
233
233
  at Generator.next (&lt;anonymous&gt;)
234
234
  at fulfilled (/home/runner/work/public/public/packages/Bio/src/__jest__/test-node.ts:28:58)
235
235
  at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Using web root: http://localhost:8080</pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:40:11