• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ProteinsWebTeam / interpro7-client / 10298555325

08 Aug 2024 08:22AM UTC coverage: 25.376% (+2.5%) from 22.889%
10298555325

Pull #641

github

web-flow
Merge 8b67ca91f into 9398226d6
Pull Request #641: Re-factory of the Search By Sequence area

521 of 2519 branches covered (20.68%)

Branch coverage included in aggregate %.

7 of 9 new or added lines in 4 files covered. (77.78%)

6 existing lines in 2 files now uncovered.

1131 of 3991 relevant lines covered (28.34%)

92.24 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.73
/src/utils/processDescription/handlers/index.js
1
// @flow
2
import { get, set } from 'lodash-es';
3

4
/*:: type PossibleMain = (
5
  'entry' |
6
  'protein' |
7
  'structure' |
8
  'taxonomy' |
9
  'proteome' |
10
  'set' |
11
  'search' |
12
  'result'
13
); */
14

15
/*:: export type DescriptionMain = {|
16
    key: ?PossibleMain,
17
    numberOfFilters: number,
18
|} */
19
/*:: export type Description = {|
20
  main: DescriptionMain,
21
  entry: {|
22
    isFilter: ?boolean,
23
    integration: ?string,
24
    db: ?string,
25
    accession: ?string,
26
    memberDB: ?string,
27
    memberDBAccession: ?string,
28
    detail: ?string,
29
    order: ?number,
30
  |},
31
  protein: {|
32
    isFilter: ?boolean,
33
    db: ?string,
34
    accession: ?string,
35
    detail: ?string,
36
    order: ?number,
37
  |},
38
  structure: {|
39
    isFilter: ?boolean,
40
    db: ?string,
41
    accession: ?string,
42
    chain: ?string,
43
    detail: ?string,
44
    order: ?number,
45
  |},
46
  taxonomy: {|
47
    isFilter: ?boolean,
48
    db: ?string,
49
    accession: ?string,
50
    detail: ?string,
51
    order: ?number,
52
  |},
53
  proteome: {|
54
    isFilter: ?boolean,
55
    db: ?string,
56
    accession: ?string,
57
    detail: ?string,
58
    order: ?number,
59
  |},
60
  set: {|
61
    isFilter: ?boolean,
62
    db: ?string,
63
    accession: ?string,
64
    detail: ?string,
65
    order: ?number,
66
  |},
67
  search: {|
68
    type: ?string,
69
    value: ?string,
70
  |},
71
  result: {|
72
    type: ?string,
73
    accession: ?string,
74
    detail: ?string,
75
  |},
76
  other: Array<string>,
77
|}; */
78

79
/*:: export type Handler = {|
80
  name: string,
81
  children: Set<Handler>,
82
  key: ?Array<string>,
83
  getKey: Description => ?Array<string>,
84
  cleanedUp: ?string,
85
  cleanUp: (string, ?Description) => ?string,
86
  regexp: RegExp,
87
  match: (string, Description) => ?boolean,
88
  handle: (Description, ?string, ?string, ...args: Array<string>) => Description,
89
|}; */
90

91
/*:: type PropertiesObject = {
92
  [key: string]: PropertyDescriptor<any>,
93
}; */
94

95
// node templates
96
const templateHandler /*: Handler */ = {
80✔
97
  // can be used for debugging
98
  name: 'templateHandler',
99
  // set of all possible chil handlers
100
  children: new Set(),
101
  // accession key in the description object for this handler
102
  key: null,
103
  // return accession key depending on current state of description
104
  getKey: (_description) => null,
36✔
105
  // cleaned up version of the value for this handler
106
  cleanedUp: null,
107
  // returns cleaned up value
108
  cleanUp: (value, _description) => value.toLowerCase(),
51✔
109
  regexp: /.*/,
110
  // match function for this handler,
111
  // used after processing parent handler to choose which child
112
  // can handle the next value
113
  match(current, _description) {
114
    // $FlowFixMe object-this-reference
115
    return this.regexp.test(current);
1,234✔
116
  },
117
  // main handle function, mutates description object, setting the cleaned up
118
  // value to the key in description
119
  handle(description, current, next, ...rest) {
120
    // $FlowFixMe object-this-reference
121
    const key = this.key || this.getKey(description);
126✔
122
    if (key && current) {
126✔
123
      set(
90✔
124
        description,
125
        key,
126
        // $FlowFixMe object-this-reference
127
        this.cleanedUp || this.cleanUp(current, description),
165✔
128
      );
129
      if (key[1] && key[1] === 'isFilter') {
90✔
130
        description.main.numberOfFilters++;
7✔
131
        description[key[0]].order = description.main.numberOfFilters;
7✔
132
      }
133
    }
134
    if (!next) return description;
126✔
135
    // $FlowFixMe object-this-reference
136
    for (const child of this.children) {
90✔
137
      if (child.match(next, description)) {
288✔
138
        return child.handle(description, next, ...rest);
90✔
139
      }
140
    }
141
    throw new Error('404');
×
142
  },
143
};
144

145
// nodes
146
const memberDB = new Set([
80✔
147
  {
148
    name: 'cathgene3d',
149
    re: /^G3DSA:[0-9]{1}\.[0-9]{2,3}\.[0-9]{1,4}\.[0-9]{1,5}$/i,
150
  },
151
  { name: 'cdd', re: /^(?:[cs])d[0-9]{5}$/i },
152
  { name: 'hamap', re: /^MF_[0-9]{5}(_([AB]){1})?$/i },
153
  { name: 'panther', re: /^PTHR[0-9]{5}(:SF[0-9]{1,4})?$/i },
154
  { name: 'pfam', re: /^PF[0-9]{5}$/i },
155
  { name: 'pirsf', re: /^PIRSF[0-9]{6}$/i },
156
  { name: 'prints', re: /^PR[0-9]{5}$/i },
157
  { name: 'prosite', re: /^PS[0-9]{5}$/i },
158
  { name: 'profile', re: /^PS[0-9]{5}$/i },
159
  { name: 'sfld', re: /^sfld[gfs]\d{5}$/i },
160
  { name: 'smart', re: /^SM[0-9]{5}$/i },
161
  { name: 'ssf', re: /^SSF[0-9]{5,6}$/i },
162
  // { name: 'tigrfams', re: /^TIGR[0-9]{5}$/i },
163
  { name: 'tigrfams', re: /^(TIGR[0-9]{5})|(NF[0-9]{6})$/i },
164
  { name: 'ncbifam', re: /^(TIGR[0-9]{5})|(NF[0-9]{6})$/i },
165
  { name: 'mobidblt', re: /^(\w|-)+$/ },
166
  { name: 'elm', re: /^ELME[0-9]{6}$/ },
167
  { name: 'antifam', re: /^ANF[0-9]{5}$/ },
168
]);
169
const interPro = { name: 'InterPro', re: /IPR[0-9]{6}/i };
80✔
170

171
export const setDBs /*: Set<Object> */ = new Set([
80✔
172
  {
173
    name: 'pfam',
174
    dbName: 'Pfam',
175
    re: /^[Cc][lL][0-9]{4}$/,
176
  },
177
  {
178
    name: 'cdd',
179
    dbName: 'CDD',
180
    re: /^[Cc][lL][0-9]{5}$/,
181
    url_template:
182
      'https://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid={id}',
183
  },
184
  {
185
    name: 'pirsf',
186
    dbName: 'PIRSF',
187
    re: /^[Pp][Ii][Rr][Ss][Ff][0-9]{6}$/,
188
    url_template: 'https://pir.georgetown.edu/cgi-bin/pf_sf_tree.pl?id={id}',
189
  },
190
  {
191
    name: 'panther',
192
    dbName: 'PANTHER',
193
    re: /^PTHR[0-9]{5}(:SF[0-9]{1,3})?$/i,
194
    url_template:
195
      'http://www.pantherdb.org/panther/family.do?clsAccession={id}',
196
  },
197
]);
198

199
const isEmpty = (object) => !Object.values(object).some(Boolean);
1,190✔
200

201
// Constructors
202
// prettier-ignore
203
const handlerConstructor = (
80✔
204
  propertiesObject /*: PropertiesObject */,
205
) /*: Handler */ => Object.create(templateHandler, propertiesObject);
2,800✔
206

207
// prettier-ignore
208
const typeConstructor = (type /*: PossibleMain */) /*: Handler */ =>
80✔
209
  handlerConstructor({
640✔
210
    name: {
211
      value: `${type}Handler`,
212
    },
213
    getKey: {
214
      value: ({ main: { key } }) => (key ? [type, 'isFilter'] : ['main', 'key']),
34✔
215
    },
216
    cleanUp: {
217
      value: (_, description) => get(description, ['main', 'key']) ? true : type,
3,141✔
218
    },
219
    match: {
220
      value: (current, { main: { key }, [type]: typeObject }) => {
221
        switch (typeof current) {
6,221!
222
          case 'string':
223
            return current.toLowerCase() === type && isEmpty(typeObject);
4,222✔
224
          case 'boolean':
225
            return !!key && key !== type;
1,999✔
226
          default:
227
            return false;
×
228
        }
229
      },
230
    },
231
  });
232

233
// Entry handlers
234
export const entryHandler /*: Handler */ = typeConstructor('entry');
80✔
235

236
export const integrationHandler /*: Handler */ = handlerConstructor({
80✔
237
  name: {
238
    value: 'integrationHandler',
239
  },
240
  key: {
241
    value: ['entry', 'integration'],
242
  },
243
  regexp: {
244
    value: /^((un)?integrated|all)$/i,
245
  },
246
});
247

248
export const interProHandler /*: Handler */ = handlerConstructor({
80✔
249
  name: {
250
    value: 'interProHandler',
251
  },
252
  key: {
253
    value: ['entry', 'db'],
254
  },
255
  cleanedUp: {
256
    value: 'InterPro',
257
  },
258
  regexp: {
259
    value: /^interpro$/i,
260
  },
261
});
262

263
export const memberDBHandler /*: Handler */ = handlerConstructor({
80✔
264
  name: {
265
    value: 'memberDBHandler',
266
  },
267
  getKey: {
268
    value: ({ entry: { db } }) => [
5✔
269
      'entry',
270
      db === 'InterPro' ? 'memberDB' : 'db',
5✔
271
    ],
272
  },
273
  match: {
274
    value(current) {
275
      // $FlowFixMe object-this-reference
276
      const _current = this.cleanUp(current);
12✔
277
      for (const { name } of memberDB) {
12✔
278
        if (name === _current) return true;
66✔
279
      }
280
    },
281
  },
282
});
283

284
export const allEntriesHandler /*: Handler */ = handlerConstructor({
80✔
285
  name: {
286
    value: 'allEntriesHandler',
287
  },
288
  key: {
289
    value: ['entry', 'db'],
290
  },
291
  cleanedUp: {
292
    value: 'all',
293
  },
294
  regexp: {
295
    value: /^all$/i,
296
  },
297
});
298

299
export const interProAccessionHandler /*: Handler */ = handlerConstructor({
80✔
300
  name: {
301
    value: 'interProAccessionHandler',
302
  },
303
  key: {
304
    value: ['entry', 'accession'],
305
  },
306
  cleanUp: {
307
    value: (value) => value.toUpperCase(),
19✔
308
  },
309
  regexp: {
310
    value: interPro.re,
311
  },
312
});
313

314
export const memberDBAccessionHandler /*: Handler */ = handlerConstructor({
80✔
315
  name: {
316
    value: 'memberDBAccessionHandler',
317
  },
318
  getKey: {
319
    value: ({ entry: { db } }) => [
3✔
320
      'entry',
321
      db === 'InterPro' ? 'memberDBAccession' : 'accession',
3✔
322
    ],
323
  },
324
  cleanUp: {
325
    value: (value) => value.toUpperCase(),
14✔
326
  },
327
  match: {
328
    value(current, { entry: { db, memberDB: mdb } }) {
329
      const _mdb = db === 'InterPro' ? mdb : db;
7✔
330
      // $FlowFixMe object-this-reference
331
      const _current = this.cleanUp(current);
7✔
332
      for (const { name, re } of memberDB) {
7✔
333
        if (name === _mdb && re.test(_current)) return true;
32✔
334
      }
335
    },
336
  },
337
});
338

339
// Protein handlers
340
export const proteinHandler /*: Handler */ = typeConstructor('protein');
80✔
341

342
export const proteinDBHandler /*: Handler */ = handlerConstructor({
80✔
343
  name: {
344
    value: 'proteinDBHandler',
345
  },
346
  key: {
347
    value: ['protein', 'db'],
348
  },
349
  cleanUp: {
350
    value: (value) => value.toLowerCase().replace('uniprot', 'UniProt'),
16✔
351
  },
352
  regexp: {
353
    value: /^((un)?reviewed|uniprot)$/i,
354
  },
355
});
356

357
export const proteinAccessionHandler /*: Handler */ = handlerConstructor({
80✔
358
  name: {
359
    value: 'proteinAccessionHandler',
360
  },
361
  key: {
362
    value: ['protein', 'accession'],
363
  },
364
  cleanUp: {
365
    value: (value) => value.toUpperCase(),
9✔
366
  },
367
  regexp: {
368
    value:
369
      /^([OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9]([A-Z][A-Z0-9]{2}[0-9]){1,2})$/i,
370
  },
371
});
372
export const orderHandler /*: Handler */ = handlerConstructor({
80✔
373
  name: {
374
    value: 'orderHandler',
375
  },
376
  getKey: {
377
    value: ({ main: { key } }) => (key ? [key, 'order'] : null),
×
378
  },
379
  cleanUp: {
380
    value: (value, _description) => value,
1,080✔
381
  },
382
  regexp: {
383
    value: /^(\d+)$/i,
384
  },
385
});
386

387
// Structure handlers
388
export const structureHandler /*: Handler */ = typeConstructor('structure');
80✔
389

390
export const structureDBHandler /*: Handler */ = handlerConstructor({
80✔
391
  name: {
392
    value: 'structureDBHandler',
393
  },
394
  key: {
395
    value: ['structure', 'db'],
396
  },
397
  cleanedUp: {
398
    value: 'PDB',
399
  },
400
  match: {
401
    value(current) {
402
      // $FlowFixMe object-this-reference
403
      return current.toUpperCase() === this.cleanedUp;
7✔
404
    },
405
  },
406
});
407

408
export const structureAccessionHandler /*: Handler */ = handlerConstructor({
80✔
409
  name: {
410
    value: 'structureAccessionHandler',
411
  },
412
  key: {
413
    value: ['structure', 'accession'],
414
  },
415
  regexp: {
416
    value: /^[1-9][A-Za-z0-9]{3}$/i,
417
  },
418
});
419

420
export const structureChainHandler /*: Handler */ = handlerConstructor({
80✔
421
  name: {
422
    value: 'structureChainHandler',
423
  },
424
  key: {
425
    value: ['structure', 'chain'],
426
  },
427
  cleanUp: {
428
    value: (value) => value.toUpperCase(),
2✔
429
  },
430
  regexp: {
431
    value: /^[A-Z0-9]+$/i,
432
  },
433
});
434

435
// taxonomy handlers
436
export const taxonomyHandler /*: Handler */ = typeConstructor('taxonomy');
80✔
437

438
export const taxonomyDBHandler /*: Handler */ = handlerConstructor({
80✔
439
  name: {
440
    value: 'taxonomyDBHandler',
441
  },
442
  key: {
443
    value: ['taxonomy', 'db'],
444
  },
445
  cleanedUp: {
446
    value: 'uniprot',
447
  },
448
  match: {
449
    value(current) {
450
      // $FlowFixMe object-this-reference
451
      return current.toLowerCase() === this.cleanedUp;
6✔
452
    },
453
  },
454
});
455

456
export const taxonomyAccessionHandler /*: Handler */ = handlerConstructor({
80✔
457
  name: {
458
    value: 'taxonomyAccessionHandler',
459
  },
460
  key: {
461
    value: ['taxonomy', 'accession'],
462
  },
463
  cleanUp: {
464
    value: (value) => value,
3✔
465
  },
466
  regexp: {
467
    value: /^[1-9]\d*$/,
468
  },
469
});
470

471
// proteome handlers
472
export const proteomeHandler /*: Handler */ = typeConstructor('proteome');
80✔
473

474
export const proteomeDBHandler /*: Handler */ = handlerConstructor({
80✔
475
  name: {
476
    value: 'proteomeDBHandler',
477
  },
478
  key: {
479
    value: ['proteome', 'db'],
480
  },
481
  cleanedUp: {
482
    value: 'uniprot',
483
  },
484
  match: {
485
    value(current) {
486
      // $FlowFixMe object-this-reference
487
      return current.toLowerCase() === this.cleanedUp;
2✔
488
    },
489
  },
490
});
491

492
export const proteomeAccessionHandler /*: Handler */ = handlerConstructor({
80✔
493
  name: {
494
    value: 'proteomeAccessionHandler',
495
  },
496
  key: {
497
    value: ['proteome', 'accession'],
498
  },
499
  cleanUp: {
500
    value: (value) => value.toUpperCase(),
×
501
  },
502
  regexp: {
503
    value: /^UP\d{9}$/i,
504
  },
505
});
506

507
// Set handlers
508
export const setHandler /*: Handler */ = typeConstructor('set');
80✔
509

510
export const setDBHandler /*: Handler */ = handlerConstructor({
80✔
511
  name: {
512
    value: 'setDBHandler',
513
  },
514
  key: {
515
    value: ['set', 'db'],
516
  },
517
  cleanUp: {
518
    value: (value) => value.toLowerCase().replace('interpro', 'InterPro'),
6✔
519
  },
520
  match: {
521
    value(current) {
522
      // $FlowFixMe object-this-reference
523
      const _current = this.cleanUp(current);
3✔
524
      for (const { name } of setDBs) {
3✔
525
        if (name === _current) return true;
3!
526
      }
527
      return _current === 'all' || _current === 'InterPro';
×
528
    },
529
  },
530
});
531

532
export const setAccessionHandler /*: Handler */ = handlerConstructor({
80✔
533
  name: {
534
    value: 'setAccessionHandler',
535
  },
536
  key: {
537
    value: ['set', 'accession'],
538
  },
539
  cleanUp: {
540
    value: (value) => value,
4✔
541
  },
542
  match: {
543
    value(current) {
544
      // $FlowFixMe object-this-reference
545
      const _current = this.cleanUp(current);
2✔
546
      for (const { re } of setDBs) {
2✔
547
        if (re.test(_current)) return true;
2!
548
      }
549
    },
550
  },
551
});
552

553
// Search handlers
554
export const searchHandler /*: Handler */ = typeConstructor('search');
80✔
555

556
export const searchTypeHandler /*: Handler */ = handlerConstructor({
80✔
557
  name: {
558
    value: 'searchTypeHandler',
559
  },
560
  key: {
561
    value: ['search', 'type'],
562
  },
563
  regexp: {
564
    value: /^(text|sequence|ida)$/i,
565
  },
566
});
567

568
export const searchValueHandler /*: Handler */ = handlerConstructor({
80✔
569
  name: {
570
    value: 'searchValueHandler',
571
  },
572
  key: {
573
    value: ['search', 'value'],
574
  },
575
  cleanUp: {
576
    value: (value) => value,
7✔
577
  },
578
});
579

580
// result handlers
581
export const resultHandler /*: Handler */ = typeConstructor('result');
80✔
582

583
export const resultTypeHandler /*: Handler */ = handlerConstructor({
80✔
584
  name: {
585
    value: 'resultTypeHandler',
586
  },
587
  key: {
588
    value: ['result', 'type'],
589
  },
590
  cleanUp: {
591
    value: (value) =>
592
      /^InterProScan$/i.test(value) ? 'InterProScan' : 'download',
×
593
  },
594
  regexp: {
595
    value: /^(interproscan|download)$/i,
596
  },
597
});
598
export const IPscanRegex =
599
  /^(iprscan5-[SRI]\d{8}-\d{6}-\d{4}-\d+-\w{2,4}(-\d+)?|internal-[1-9]\d*-[1-9]\d*)|imported_file-.+(-\d+)?$/;
80✔
600
export const resultIPScanJobHandler /*: Handler */ = handlerConstructor({
80✔
601
  name: {
602
    value: 'resultIPScanJobHandler',
603
  },
604
  key: {
605
    value: ['result', 'job'],
606
  },
607
  cleanUp: {
NEW
608
    value: (value) => value,
×
609
  },
610
  regexp: {
611
    value: IPscanRegex,
612
  },
613
});
614
export const resultIPScanAccessionHandler /*: Handler */ = handlerConstructor({
80✔
615
  name: {
616
    value: 'resultIPScanAccessionHandler',
617
  },
618
  key: {
619
    value: ['result', 'accession'],
620
  },
621
  cleanUp: {
622
    value: (value) => value,
×
623
  },
624
  regexp: {
625
    value: IPscanRegex,
626
  },
627
});
628

629
export const resultDownloadAccessionHandler /*: Handler */ = handlerConstructor(
80✔
630
  {
631
    name: {
632
      value: 'resultDownloadAccessionHandler',
633
    },
634
    key: {
635
      value: ['result', 'accession'],
636
    },
637
    cleanUp: {
638
      value: (value) => value,
×
639
    },
640
    regexp: {
641
      value: /^download-[1-9]\d*-\d+$/,
642
    },
643
  },
644
);
645

646
// Common and other handlers
647
export const detailHandler /*: Handler */ = handlerConstructor({
80✔
648
  name: {
649
    value: 'detailHandler',
650
  },
651
  getKey: {
652
    value: ({ main: { key } }) => [key, 'detail'],
2✔
653
  },
654
});
655

656
export const otherHandler /*: Handler */ = handlerConstructor({
80✔
657
  name: {
658
    value: 'otherHandler',
659
  },
660
  getKey: {
661
    value: ({ other }) => ['other', other.length],
13✔
662
  },
663
  cleanUp: {
664
    value: (value, { other }) =>
665
      other?.[0] === 'potm' ? value : value.toLowerCase(),
13!
666
  },
667
});
668

669
export const rootHandler /*: Handler */ = handlerConstructor({
80✔
670
  name: {
671
    value: 'rootHandler',
672
  },
673
  handle: {
674
    value(description /*: Description */, ...rest /*: Array<string> */) {
675
      // $FlowFixMe object-this-reference
676
      return templateHandler.handle.call(this, description, null, ...rest);
36✔
677
    },
678
  },
679
});
680

681
// Define edges of the directed graph of path part handlers
682
// -> link all handlers to their possible children
683

684
// Entry
685
entryHandler.children = new Set([
80✔
686
  integrationHandler,
687
  interProHandler,
688
  memberDBHandler,
689
  proteinHandler,
690
  structureHandler,
691
  taxonomyHandler,
692
  proteomeHandler,
693
  setHandler,
694
]);
695

696
integrationHandler.children = new Set([
80✔
697
  memberDBHandler,
698
  proteinHandler,
699
  structureHandler,
700
  taxonomyHandler,
701
  proteomeHandler,
702
  setHandler,
703
]);
704

705
interProHandler.children = new Set([
80✔
706
  proteinHandler,
707
  structureHandler,
708
  taxonomyHandler,
709
  proteomeHandler,
710
  setHandler,
711
  interProAccessionHandler,
712
]);
713

714
memberDBHandler.children = new Set([
80✔
715
  proteinHandler,
716
  structureHandler,
717
  taxonomyHandler,
718
  proteomeHandler,
719
  setHandler,
720
  memberDBAccessionHandler,
721
]);
722

723
interProAccessionHandler.children = new Set([
80✔
724
  proteinHandler,
725
  structureHandler,
726
  taxonomyHandler,
727
  proteomeHandler,
728
  setHandler,
729
  memberDBHandler,
730
  detailHandler,
731
]);
732

733
memberDBAccessionHandler.children = new Set([
80✔
734
  proteinHandler,
735
  structureHandler,
736
  taxonomyHandler,
737
  proteomeHandler,
738
  setHandler,
739
  detailHandler,
740
]);
741

742
// Protein
743
proteinHandler.children = new Set([
80✔
744
  proteinDBHandler,
745
  entryHandler,
746
  structureHandler,
747
  taxonomyHandler,
748
  proteomeHandler,
749
  setHandler,
750
]);
751

752
proteinDBHandler.children = new Set([
80✔
753
  entryHandler,
754
  structureHandler,
755
  taxonomyHandler,
756
  proteomeHandler,
757
  setHandler,
758
  proteinAccessionHandler,
759
]);
760

761
proteinAccessionHandler.children = new Set([
80✔
762
  entryHandler,
763
  structureHandler,
764
  taxonomyHandler,
765
  proteomeHandler,
766
  setHandler,
767
  detailHandler,
768
]);
769

770
// Structure
771
structureHandler.children = new Set([
80✔
772
  structureDBHandler,
773
  entryHandler,
774
  proteinHandler,
775
  taxonomyHandler,
776
  proteomeHandler,
777
  setHandler,
778
]);
779

780
structureDBHandler.children = new Set([
80✔
781
  entryHandler,
782
  proteinHandler,
783
  taxonomyHandler,
784
  proteomeHandler,
785
  setHandler,
786
  structureAccessionHandler,
787
]);
788

789
structureAccessionHandler.children = new Set([
80✔
790
  entryHandler,
791
  proteinHandler,
792
  taxonomyHandler,
793
  proteomeHandler,
794
  setHandler,
795
  structureChainHandler,
796
  detailHandler,
797
]);
798

799
structureChainHandler.children = new Set([
80✔
800
  entryHandler,
801
  proteinHandler,
802
  taxonomyHandler,
803
  proteomeHandler,
804
  setHandler,
805
  detailHandler,
806
]);
807

808
// Taxonomy
809
taxonomyHandler.children = new Set([
80✔
810
  taxonomyDBHandler,
811
  entryHandler,
812
  proteinHandler,
813
  structureHandler,
814
  proteomeHandler,
815
  setHandler,
816
]);
817

818
taxonomyDBHandler.children = new Set([
80✔
819
  entryHandler,
820
  proteinHandler,
821
  structureHandler,
822
  proteomeHandler,
823
  setHandler,
824
  taxonomyAccessionHandler,
825
]);
826

827
taxonomyAccessionHandler.children = new Set([
80✔
828
  entryHandler,
829
  proteinHandler,
830
  proteomeHandler,
831
  structureHandler,
832
  setHandler,
833
  detailHandler,
834
]);
835

836
// Poteome
837
proteomeHandler.children = new Set([
80✔
838
  proteomeDBHandler,
839
  entryHandler,
840
  proteinHandler,
841
  structureHandler,
842
  taxonomyHandler,
843
  setHandler,
844
]);
845

846
proteomeDBHandler.children = new Set([
80✔
847
  entryHandler,
848
  proteinHandler,
849
  structureHandler,
850
  taxonomyHandler,
851
  setHandler,
852
  proteomeAccessionHandler,
853
]);
854

855
proteomeAccessionHandler.children = new Set([
80✔
856
  entryHandler,
857
  proteinHandler,
858
  structureHandler,
859
  taxonomyHandler,
860
  setHandler,
861
  detailHandler,
862
]);
863

864
// Set
865
setHandler.children = new Set([
80✔
866
  setDBHandler,
867
  entryHandler,
868
  proteinHandler,
869
  structureHandler,
870
  taxonomyHandler,
871
  proteomeHandler,
872
]);
873

874
setDBHandler.children = new Set([
80✔
875
  entryHandler,
876
  proteinHandler,
877
  structureHandler,
878
  taxonomyHandler,
879
  proteomeHandler,
880
  setAccessionHandler,
881
]);
882

883
setAccessionHandler.children = new Set([
80✔
884
  entryHandler,
885
  proteinHandler,
886
  structureHandler,
887
  taxonomyHandler,
888
  proteomeHandler,
889
  detailHandler,
890
]);
891

892
// Search
893
searchHandler.children = new Set([searchTypeHandler]);
80✔
894

895
searchTypeHandler.children = new Set([searchValueHandler]);
80✔
896

897
// result
898
resultHandler.children = new Set([resultTypeHandler]);
80✔
899

900
resultTypeHandler.children = new Set([resultIPScanJobHandler]);
80✔
901

902
resultIPScanJobHandler.children = new Set([resultIPScanAccessionHandler]);
80✔
903

904
resultIPScanAccessionHandler.children = new Set([entryHandler, detailHandler]);
80✔
905

906
// Common and other
907
otherHandler.children = new Set([otherHandler]);
80✔
908

909
rootHandler.children = new Set([
80✔
910
  entryHandler,
911
  proteinHandler,
912
  structureHandler,
913
  taxonomyHandler,
914
  proteomeHandler,
915
  setHandler,
916
  searchHandler,
917
  resultHandler,
918
  otherHandler,
919
]);
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc