@jbrowse/plugin-gff3 1.7.9 → 2.0.0

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 (39) hide show
  1. package/dist/Gff3Adapter/Gff3Adapter.js +284 -391
  2. package/dist/Gff3Adapter/Gff3Adapter.js.map +1 -0
  3. package/dist/Gff3Adapter/configSchema.js +9 -21
  4. package/dist/Gff3Adapter/configSchema.js.map +1 -0
  5. package/dist/Gff3Adapter/index.js +8 -14
  6. package/dist/Gff3Adapter/index.js.map +1 -0
  7. package/dist/Gff3TabixAdapter/Gff3TabixAdapter.js +305 -386
  8. package/dist/Gff3TabixAdapter/Gff3TabixAdapter.js.map +1 -0
  9. package/dist/Gff3TabixAdapter/configSchema.js +27 -40
  10. package/dist/Gff3TabixAdapter/configSchema.js.map +1 -0
  11. package/dist/Gff3TabixAdapter/index.js +8 -14
  12. package/dist/Gff3TabixAdapter/index.js.map +1 -0
  13. package/dist/index.js +109 -130
  14. package/dist/index.js.map +1 -0
  15. package/esm/Gff3Adapter/Gff3Adapter.d.ts +17 -0
  16. package/esm/Gff3Adapter/Gff3Adapter.js +146 -0
  17. package/esm/Gff3Adapter/Gff3Adapter.js.map +1 -0
  18. package/esm/Gff3Adapter/configSchema.d.ts +2 -0
  19. package/esm/Gff3Adapter/configSchema.js +8 -0
  20. package/esm/Gff3Adapter/configSchema.js.map +1 -0
  21. package/esm/Gff3Adapter/index.d.ts +1 -0
  22. package/esm/Gff3Adapter/index.js +2 -0
  23. package/esm/Gff3Adapter/index.js.map +1 -0
  24. package/esm/Gff3TabixAdapter/Gff3TabixAdapter.d.ts +20 -0
  25. package/esm/Gff3TabixAdapter/Gff3TabixAdapter.js +186 -0
  26. package/esm/Gff3TabixAdapter/Gff3TabixAdapter.js.map +1 -0
  27. package/esm/Gff3TabixAdapter/configSchema.d.ts +2 -0
  28. package/esm/Gff3TabixAdapter/configSchema.js +27 -0
  29. package/esm/Gff3TabixAdapter/configSchema.js.map +1 -0
  30. package/esm/Gff3TabixAdapter/index.d.ts +1 -0
  31. package/esm/Gff3TabixAdapter/index.js +2 -0
  32. package/esm/Gff3TabixAdapter/index.js.map +1 -0
  33. package/esm/index.d.ts +6 -0
  34. package/esm/index.js +62 -0
  35. package/esm/index.js.map +1 -0
  36. package/package.json +17 -9
  37. package/src/Gff3Adapter/Gff3Adapter.ts +5 -8
  38. package/dist/Gff3Adapter/Gff3Adapter.test.js +0 -71
  39. package/dist/Gff3TabixAdapter/Gff3TabixAdapter.test.js +0 -74
@@ -0,0 +1,186 @@
1
+ /* eslint-disable no-underscore-dangle */
2
+ import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter';
3
+ import { doesIntersect2 } from '@jbrowse/core/util/range';
4
+ import { openLocation } from '@jbrowse/core/util/io';
5
+ import { ObservableCreate } from '@jbrowse/core/util/rxjs';
6
+ import SimpleFeature from '@jbrowse/core/util/simpleFeature';
7
+ import { TabixIndexedFile } from '@gmod/tabix';
8
+ import gff from '@gmod/gff';
9
+ import { readConfObject, } from '@jbrowse/core/configuration';
10
+ export default class extends BaseFeatureDataAdapter {
11
+ constructor(config, getSubAdapter, pluginManager) {
12
+ super(config, getSubAdapter, pluginManager);
13
+ const gffGzLocation = readConfObject(config, 'gffGzLocation');
14
+ const indexType = readConfObject(config, ['index', 'indexType']);
15
+ const location = readConfObject(config, ['index', 'location']);
16
+ const dontRedispatch = readConfObject(config, 'dontRedispatch');
17
+ this.dontRedispatch = dontRedispatch || ['chromosome', 'contig', 'region'];
18
+ this.gff = new TabixIndexedFile({
19
+ filehandle: openLocation(gffGzLocation, this.pluginManager),
20
+ csiFilehandle: indexType === 'CSI'
21
+ ? openLocation(location, this.pluginManager)
22
+ : undefined,
23
+ tbiFilehandle: indexType !== 'CSI'
24
+ ? openLocation(location, this.pluginManager)
25
+ : undefined,
26
+ chunkCacheSize: 50 * 2 ** 20,
27
+ renameRefSeqs: (n) => n,
28
+ });
29
+ }
30
+ async getRefNames(opts = {}) {
31
+ return this.gff.getReferenceSequenceNames(opts);
32
+ }
33
+ async getHeader() {
34
+ return this.gff.getHeader();
35
+ }
36
+ getFeatures(query, opts = {}) {
37
+ return ObservableCreate(async (observer) => {
38
+ const metadata = await this.gff.getMetadata();
39
+ this.getFeaturesHelper(query, opts, metadata, observer, true);
40
+ }, opts.signal);
41
+ }
42
+ async getFeaturesHelper(query, opts = {}, metadata, observer, allowRedispatch, originalQuery = query) {
43
+ try {
44
+ const lines = [];
45
+ await this.gff.getLines(query.refName, query.start, query.end, (line, fileOffset) => {
46
+ lines.push(this.parseLine(metadata.columnNumbers, line, fileOffset));
47
+ });
48
+ if (allowRedispatch && lines.length) {
49
+ let minStart = Infinity;
50
+ let maxEnd = -Infinity;
51
+ lines.forEach(line => {
52
+ const featureType = line.fields[2];
53
+ // only expand redispatch range if feature is not a "dontRedispatch" type
54
+ // skips large regions like chromosome,region
55
+ if (!this.dontRedispatch.includes(featureType)) {
56
+ const start = line.start - 1; // gff is 1-based
57
+ if (start < minStart) {
58
+ minStart = start;
59
+ }
60
+ if (line.end > maxEnd) {
61
+ maxEnd = line.end;
62
+ }
63
+ }
64
+ });
65
+ if (maxEnd > query.end || minStart < query.start) {
66
+ // make a new feature callback to only return top-level features
67
+ // in the original query range
68
+ this.getFeaturesHelper({ ...query, start: minStart, end: maxEnd }, opts, metadata, observer, false, query);
69
+ return;
70
+ }
71
+ }
72
+ const gff3 = lines
73
+ .map((lineRecord) => {
74
+ if (lineRecord.fields[8] && lineRecord.fields[8] !== '.') {
75
+ if (!lineRecord.fields[8].includes('_lineHash')) {
76
+ lineRecord.fields[8] += `;_lineHash=${lineRecord.lineHash}`;
77
+ }
78
+ }
79
+ else {
80
+ lineRecord.fields[8] = `_lineHash=${lineRecord.lineHash}`;
81
+ }
82
+ return lineRecord.fields.join('\t');
83
+ })
84
+ .join('\n');
85
+ const features = gff.parseStringSync(gff3, {
86
+ parseFeatures: true,
87
+ parseComments: false,
88
+ parseDirectives: false,
89
+ parseSequences: false,
90
+ });
91
+ features.forEach(featureLocs => this.formatFeatures(featureLocs).forEach(f => {
92
+ if (doesIntersect2(f.get('start'), f.get('end'), originalQuery.start, originalQuery.end)) {
93
+ observer.next(f);
94
+ }
95
+ }));
96
+ observer.complete();
97
+ }
98
+ catch (e) {
99
+ observer.error(e);
100
+ }
101
+ }
102
+ parseLine(columnNumbers, line, fileOffset) {
103
+ const fields = line.split('\t');
104
+ // note: index column numbers are 1-based
105
+ return {
106
+ start: +fields[columnNumbers.start - 1],
107
+ end: +fields[columnNumbers.end - 1],
108
+ lineHash: fileOffset,
109
+ fields,
110
+ };
111
+ }
112
+ formatFeatures(featureLocs) {
113
+ return featureLocs.map(featureLoc => new SimpleFeature({
114
+ data: this.featureData(featureLoc),
115
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
116
+ id: `${this.id}-offset-${featureLoc.attributes._lineHash[0]}`,
117
+ }));
118
+ }
119
+ featureData(data) {
120
+ const f = { ...data };
121
+ f.start -= 1; // convert to interbase
122
+ if (data.strand === '+') {
123
+ f.strand = 1;
124
+ }
125
+ else if (data.strand === '-') {
126
+ f.strand = -1;
127
+ }
128
+ else if (data.strand === '.') {
129
+ f.strand = 0;
130
+ }
131
+ else {
132
+ f.strand = undefined;
133
+ }
134
+ f.phase = Number(data.phase);
135
+ f.refName = data.seq_id;
136
+ if (data.score === null) {
137
+ delete f.score;
138
+ }
139
+ if (data.phase === null) {
140
+ delete f.score;
141
+ }
142
+ const defaultFields = [
143
+ 'start',
144
+ 'end',
145
+ 'seq_id',
146
+ 'score',
147
+ 'type',
148
+ 'source',
149
+ 'phase',
150
+ 'strand',
151
+ ];
152
+ const dataAttributes = data.attributes || {};
153
+ Object.keys(dataAttributes).forEach(a => {
154
+ let b = a.toLowerCase();
155
+ if (defaultFields.includes(b)) {
156
+ // add "suffix" to tag name if it already exists
157
+ // reproduces behavior of NCList
158
+ b += '2';
159
+ }
160
+ if (dataAttributes[a] !== null) {
161
+ let attr = dataAttributes[a];
162
+ if (Array.isArray(attr) && attr.length === 1) {
163
+ ;
164
+ [attr] = attr;
165
+ }
166
+ f[b] = attr;
167
+ }
168
+ });
169
+ f.refName = f.seq_id;
170
+ // the SimpleFeature constructor takes care of recursively inflating subfeatures
171
+ if (data.child_features && data.child_features.length) {
172
+ f.subfeatures = data.child_features
173
+ .map(childLocs => childLocs.map(childLoc => this.featureData(childLoc)))
174
+ .flat();
175
+ }
176
+ delete f.child_features;
177
+ delete f.data;
178
+ delete f.derived_features;
179
+ delete f._linehash;
180
+ delete f.attributes;
181
+ delete f.seq_id;
182
+ return f;
183
+ }
184
+ freeResources( /* { region } */) { }
185
+ }
186
+ //# sourceMappingURL=Gff3TabixAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Gff3TabixAdapter.js","sourceRoot":"","sources":["../../src/Gff3TabixAdapter/Gff3TabixAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("@jbrowse/core/configuration").AnyConfigurationSchemaType;
2
+ export default _default;
@@ -0,0 +1,27 @@
1
+ import { types } from 'mobx-state-tree';
2
+ import { ConfigurationSchema } from '@jbrowse/core/configuration';
3
+ export default ConfigurationSchema('Gff3TabixAdapter', {
4
+ gffGzLocation: {
5
+ type: 'fileLocation',
6
+ defaultValue: { uri: '/path/to/my.gff.gz', locationType: 'UriLocation' },
7
+ },
8
+ index: ConfigurationSchema('Gff3TabixIndex', {
9
+ indexType: {
10
+ model: types.enumeration('IndexType', ['TBI', 'CSI']),
11
+ type: 'stringEnum',
12
+ defaultValue: 'TBI',
13
+ },
14
+ location: {
15
+ type: 'fileLocation',
16
+ defaultValue: {
17
+ uri: '/path/to/my.gff.gz.tbi',
18
+ locationType: 'UriLocation',
19
+ },
20
+ },
21
+ }),
22
+ dontRedispatch: {
23
+ type: 'stringArray',
24
+ defaultValue: ['chromosome', 'region'],
25
+ },
26
+ }, { explicitlyTyped: true });
27
+ //# sourceMappingURL=configSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/Gff3TabixAdapter/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,eAAe,mBAAmB,CAChC,kBAAkB,EAClB;IACE,aAAa,EAAE;QACb,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE;KACzE;IACD,KAAK,EAAE,mBAAmB,CAAC,gBAAgB,EAAE;QAC3C,SAAS,EAAE;YACT,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrD,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,KAAK;SACpB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE;gBACZ,GAAG,EAAE,wBAAwB;gBAC7B,YAAY,EAAE,aAAa;aAC5B;SACF;KACF,CAAC;IACF,cAAc,EAAE;QACd,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;KACvC;CACF,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1B,CAAA"}
@@ -0,0 +1 @@
1
+ export { default as configSchema } from './configSchema';
@@ -0,0 +1,2 @@
1
+ export { default as configSchema } from './configSchema';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Gff3TabixAdapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import PluginManager from '@jbrowse/core/PluginManager';
2
+ import Plugin from '@jbrowse/core/Plugin';
3
+ export default class extends Plugin {
4
+ name: string;
5
+ install(pluginManager: PluginManager): void;
6
+ }
package/esm/index.js ADDED
@@ -0,0 +1,62 @@
1
+ import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType';
2
+ import Plugin from '@jbrowse/core/Plugin';
3
+ import { configSchema as gff3TabixAdapterConfigSchema } from './Gff3TabixAdapter';
4
+ import { makeIndex, makeIndexType, getFileName, } from '@jbrowse/core/util/tracks';
5
+ import { configSchema as gff3AdapterConfigSchema } from './Gff3Adapter';
6
+ export default class extends Plugin {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.name = 'GFF3Plugin';
10
+ }
11
+ install(pluginManager) {
12
+ pluginManager.addAdapterType(() => new AdapterType({
13
+ name: 'Gff3TabixAdapter',
14
+ configSchema: gff3TabixAdapterConfigSchema,
15
+ getAdapterClass: () => import('./Gff3TabixAdapter/Gff3TabixAdapter').then(r => r.default),
16
+ }));
17
+ pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', (adapterGuesser) => {
18
+ return (file, index, adapterHint) => {
19
+ const regexGuess = /\.gff3?\.b?gz$/i;
20
+ const adapterName = 'Gff3TabixAdapter';
21
+ const fileName = getFileName(file);
22
+ const indexName = index && getFileName(index);
23
+ if (regexGuess.test(fileName) || adapterHint === adapterName) {
24
+ return {
25
+ type: adapterName,
26
+ bamLocation: file,
27
+ gffGzLocation: file,
28
+ index: {
29
+ location: index || makeIndex(file, '.tbi'),
30
+ indexType: makeIndexType(indexName, 'CSI', 'TBI'),
31
+ },
32
+ };
33
+ }
34
+ return adapterGuesser(file, index, adapterHint);
35
+ };
36
+ });
37
+ pluginManager.addAdapterType(() => new AdapterType({
38
+ name: 'Gff3Adapter',
39
+ configSchema: gff3AdapterConfigSchema,
40
+ getAdapterClass: () => import('./Gff3Adapter/Gff3Adapter').then(r => r.default),
41
+ }));
42
+ pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', (adapterGuesser) => {
43
+ return (file, index, adapterHint) => {
44
+ const regexGuess = /\.gff3?$/i;
45
+ const adapterName = 'Gff3Adapter';
46
+ const fileName = getFileName(file);
47
+ const obj = {
48
+ type: adapterName,
49
+ gffLocation: file,
50
+ };
51
+ if (regexGuess.test(fileName) && !adapterHint) {
52
+ return obj;
53
+ }
54
+ else if (adapterHint === adapterName) {
55
+ return obj;
56
+ }
57
+ return adapterGuesser(file, index, adapterHint);
58
+ };
59
+ });
60
+ }
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-gff3",
3
- "version": "1.7.9",
3
+ "version": "2.0.0",
4
4
  "description": "JBrowse 2 gff3.",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -20,17 +20,21 @@
20
20
  "main": "dist/index.js",
21
21
  "files": [
22
22
  "dist",
23
- "src"
23
+ "src",
24
+ "esm"
24
25
  ],
25
26
  "scripts": {
26
- "build": "babel src --root-mode upward --out-dir dist --extensions .ts,.js,.tsx,.jsx",
27
- "postbuild": "tsc --build tsconfig.build.json",
27
+ "build": "npm-run-all build:*",
28
28
  "test": "cd ../..; jest plugins/gff3 --passWithNoTests",
29
29
  "prepublishOnly": "yarn test",
30
30
  "prepack": "yarn build; yarn useDist",
31
31
  "postpack": "yarn useSrc",
32
32
  "useDist": "node ../../scripts/useDist.js",
33
- "useSrc": "node ../../scripts/useSrc.js"
33
+ "useSrc": "node ../../scripts/useSrc.js",
34
+ "prebuild": "npm run clean",
35
+ "build:esm": "tsc --build tsconfig.build.esm.json",
36
+ "build:es5": "tsc --build tsconfig.build.es5.json",
37
+ "clean": "rimraf dist esm *.tsbuildinfo"
34
38
  },
35
39
  "dependencies": {
36
40
  "@babel/runtime": "^7.17.9",
@@ -42,9 +46,10 @@
42
46
  "peerDependencies": {
43
47
  "@jbrowse/core": "^1.0.0",
44
48
  "@jbrowse/plugin-linear-genome-view": "^1.0.0",
45
- "@material-ui/core": "^4.12.2",
46
- "mobx-react": "^6.0.0",
47
- "mobx-state-tree": "3.14.1",
49
+ "@mui/material": "^5.0.0",
50
+ "mobx": "^6.0.0",
51
+ "mobx-react": "^7.0.0",
52
+ "mobx-state-tree": "^5.0.0",
48
53
  "prop-types": "^15.0.0",
49
54
  "react": ">=16.8.0",
50
55
  "rxjs": "^6.0.0"
@@ -52,5 +57,8 @@
52
57
  "publishConfig": {
53
58
  "access": "public"
54
59
  },
55
- "gitHead": "a6504c385d703ce6e755d05652ef659ffe28c864"
60
+ "distModule": "esm/index.js",
61
+ "srcModule": "src/index.ts",
62
+ "module": "esm/index.js",
63
+ "gitHead": "ecc7f5d47351a5ea04bc00f3a6eb6dfb607342e6"
56
64
  }
@@ -3,7 +3,6 @@ import {
3
3
  BaseOptions,
4
4
  } from '@jbrowse/core/data_adapters/BaseAdapter'
5
5
  import { NoAssemblyRegion } from '@jbrowse/core/util/types'
6
- import { readConfObject } from '@jbrowse/core/configuration'
7
6
  import { openLocation } from '@jbrowse/core/util/io'
8
7
  import { ObservableCreate } from '@jbrowse/core/util/rxjs'
9
8
  import IntervalTree from '@flatten-js/interval-tree'
@@ -23,16 +22,14 @@ export default class extends BaseFeatureDataAdapter {
23
22
  }>
24
23
 
25
24
  private async loadDataP() {
26
- const buffer = await openLocation(
27
- readConfObject(this.config, 'gffLocation'),
28
- this.pluginManager,
29
- ).readFile()
30
- const buf = isGzip(buffer) ? await unzip(buffer) : buffer
25
+ const pm = this.pluginManager
26
+ const buf = await openLocation(this.getConf('gffLocation'), pm).readFile()
27
+ const buffer = isGzip(buf) ? await unzip(buf) : buf
31
28
  // 512MB max chrome string length is 512MB
32
- if (buf.length > 536_870_888) {
29
+ if (buffer.length > 536_870_888) {
33
30
  throw new Error('Data exceeds maximum string length (512MB)')
34
31
  }
35
- const data = new TextDecoder('utf8', { fatal: true }).decode(buf)
32
+ const data = new TextDecoder('utf8', { fatal: true }).decode(buffer)
36
33
  const lines = data.split('\n')
37
34
  const headerLines = []
38
35
  for (let i = 0; i < lines.length && lines[i].startsWith('#'); i++) {
@@ -1,71 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
-
7
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
-
9
- var _operators = require("rxjs/operators");
10
-
11
- var _configSchema = _interopRequireDefault(require("./configSchema"));
12
-
13
- var _Gff3Adapter = _interopRequireDefault(require("./Gff3Adapter"));
14
-
15
- var _webEncoding = require("web-encoding");
16
-
17
- window.TextDecoder = _webEncoding.TextDecoder;
18
- describe('adapter can fetch features from volvox.gff3', function () {
19
- var adapter;
20
- beforeEach(function () {
21
- adapter = new _Gff3Adapter.default(_configSchema.default.create({
22
- gffLocation: {
23
- localPath: require.resolve('../test_data/volvox.sort.gff3')
24
- }
25
- }));
26
- });
27
- it('test getfeatures on gff plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
28
- var features, featuresArray, featuresJsonArray;
29
- return _regenerator.default.wrap(function _callee$(_context) {
30
- while (1) {
31
- switch (_context.prev = _context.next) {
32
- case 0:
33
- features = adapter.getFeatures({
34
- refName: 'ctgB',
35
- start: 0,
36
- end: 200000
37
- });
38
- _context.t0 = expect;
39
- _context.next = 4;
40
- return adapter.hasDataForRefName('ctgA');
41
-
42
- case 4:
43
- _context.t1 = _context.sent;
44
- (0, _context.t0)(_context.t1).toBe(true);
45
- _context.t2 = expect;
46
- _context.next = 9;
47
- return adapter.hasDataForRefName('ctgB');
48
-
49
- case 9:
50
- _context.t3 = _context.sent;
51
- (0, _context.t2)(_context.t3).toBe(true);
52
- _context.next = 13;
53
- return features.pipe((0, _operators.toArray)()).toPromise();
54
-
55
- case 13:
56
- featuresArray = _context.sent;
57
- // There are only 4 features in ctgB
58
- expect(featuresArray.length).toBe(4);
59
- featuresJsonArray = featuresArray.map(function (f) {
60
- return f.toJSON();
61
- });
62
- expect(featuresJsonArray).toMatchSnapshot();
63
-
64
- case 17:
65
- case "end":
66
- return _context.stop();
67
- }
68
- }
69
- }, _callee);
70
- })));
71
- });
@@ -1,74 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
-
7
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
-
9
- var _operators = require("rxjs/operators");
10
-
11
- var _configSchema = _interopRequireDefault(require("./configSchema"));
12
-
13
- var _Gff3TabixAdapter = _interopRequireDefault(require("./Gff3TabixAdapter"));
14
-
15
- describe('adapter can fetch features from volvox.gff3', function () {
16
- var adapter;
17
- beforeEach(function () {
18
- adapter = new _Gff3TabixAdapter.default(_configSchema.default.create({
19
- gffGzLocation: {
20
- localPath: require.resolve('../test_data/volvox.sort.gff3.gz')
21
- },
22
- index: {
23
- location: {
24
- localPath: require.resolve('../test_data/volvox.sort.gff3.gz.tbi')
25
- }
26
- }
27
- }));
28
- });
29
- it('test getfeatures on gff plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
30
- var features, featuresArray, featuresJsonArray;
31
- return _regenerator.default.wrap(function _callee$(_context) {
32
- while (1) {
33
- switch (_context.prev = _context.next) {
34
- case 0:
35
- features = adapter.getFeatures({
36
- refName: 'ctgB',
37
- start: 0,
38
- end: 200000,
39
- assemblyName: 'volvox'
40
- });
41
- _context.t0 = expect;
42
- _context.next = 4;
43
- return adapter.hasDataForRefName('ctgA');
44
-
45
- case 4:
46
- _context.t1 = _context.sent;
47
- (0, _context.t0)(_context.t1).toBe(true);
48
- _context.t2 = expect;
49
- _context.next = 9;
50
- return adapter.hasDataForRefName('ctgB');
51
-
52
- case 9:
53
- _context.t3 = _context.sent;
54
- (0, _context.t2)(_context.t3).toBe(true);
55
- _context.next = 13;
56
- return features.pipe((0, _operators.toArray)()).toPromise();
57
-
58
- case 13:
59
- featuresArray = _context.sent;
60
- // There are only 4 features in ctgB
61
- expect(featuresArray.length).toBe(4);
62
- featuresJsonArray = featuresArray.map(function (f) {
63
- return f.toJSON();
64
- });
65
- expect(featuresJsonArray).toMatchSnapshot();
66
-
67
- case 17:
68
- case "end":
69
- return _context.stop();
70
- }
71
- }
72
- }, _callee);
73
- })));
74
- });