diff --git a/package-lock.json b/package-lock.json index e4144a016c1a7ebdb30a33ef67553d6cf351de40..a182e4106aefca0f6398e10d764ad3072ddcab85 100644 Binary files a/package-lock.json and b/package-lock.json differ diff --git a/package.json b/package.json index a6d47ae62eacfae1ed86cf3a366589a0d5b6e663..c0338722ff1886873e60d13c82fad01e9fc1da23 100644 --- a/package.json +++ b/package.json @@ -88,54 +88,54 @@ ], "license": "MIT", "devDependencies": { - "@graphql-codegen/add": "^2.0.2", - "@graphql-codegen/cli": "^1.19.4", - "@graphql-codegen/time": "^2.0.2", - "@graphql-codegen/typescript": "^1.19.0", - "@graphql-codegen/typescript-graphql-files-modules": "^1.18.1", - "@graphql-codegen/typescript-graphql-request": "^2.0.3", - "@graphql-codegen/typescript-operations": "^1.17.12", - "@types/cors": "^2.8.8", - "@typescript-eslint/eslint-plugin": "^4.9.1", - "@typescript-eslint/parser": "^4.9.1", + "@graphql-codegen/add": "^3.1.0", + "@graphql-codegen/cli": "^2.2.0", + "@graphql-codegen/time": "^3.1.0", + "@graphql-codegen/typescript": "^2.2.2", + "@graphql-codegen/typescript-graphql-files-modules": "^2.1.0", + "@graphql-codegen/typescript-graphql-request": "^4.1.4", + "@graphql-codegen/typescript-operations": "^2.1.4", + "@types/cors": "^2.8.12", + "@typescript-eslint/eslint-plugin": "^4.31.0", + "@typescript-eslint/parser": "^4.31.0", "benchmark": "^2.1.4", - "concurrently": "^5.3.0", - "cpx2": "^3.0.0", + "concurrently": "^6.2.1", + "cpx2": "^3.0.2", "crypto-browserify": "^3.12.0", - "css-loader": "^5.0.1", - "eslint": "^7.15.0", + "css-loader": "^6.2.0", + "eslint": "^7.32.0", "extra-watch-webpack-plugin": "^1.0.3", "file-loader": "^6.2.0", - "fs-extra": "^9.0.1", - "graphql": "^15.4.0", - "http-server": "^0.12.3", - "jest": "^26.6.3", - "mini-css-extract-plugin": "^1.3.2", - "node-sass": "^6.0.0", + "fs-extra": "^10.0.0", + "graphql": "^15.5.3", + "http-server": "^13.0.1", + "jest": "^27.1.1", + "mini-css-extract-plugin": "^2.3.0", + "node-sass": "^6.0.1", "path-browserify": "^1.0.1", "raw-loader": "^4.0.2", - "sass-loader": "^11.1.1", - "simple-git": "^2.25.0", + "sass-loader": "^12.1.0", + "simple-git": "^2.45.1", "stream-browserify": "^3.0.0", - "style-loader": "^2.0.0", - "ts-jest": "^26.4.4", - "typescript": "^4.4.2", - "webpack": "^5.37.1", - "webpack-cli": "^4.7.0", + "style-loader": "^3.2.1", + "ts-jest": "^27.0.5", + "typescript": "^4.4.3", + "webpack": "^5.52.1", + "webpack-cli": "^4.8.0", "webpack-version-file-plugin": "^0.4.0" }, "dependencies": { - "@types/argparse": "^1.0.38", - "@types/benchmark": "^2.1.0", - "@types/compression": "1.7.0", - "@types/express": "^4.17.9", - "@types/jest": "^26.0.18", - "@types/node": "^14.14.11", - "@types/node-fetch": "^2.5.7", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@types/swagger-ui-dist": "3.30.0", - "argparse": "^1.0.10", + "@types/argparse": "^2.0.10", + "@types/benchmark": "^2.1.1", + "@types/compression": "1.7.2", + "@types/express": "^4.17.13", + "@types/jest": "^27.0.1", + "@types/node": "^16.9.1", + "@types/node-fetch": "^2.5.12", + "@types/react": "^17.0.20", + "@types/react-dom": "^17.0.9", + "@types/swagger-ui-dist": "3.30.1", + "argparse": "^2.0.1", "body-parser": "^1.19.0", "compression": "^1.7.4", "cors": "^2.8.5", @@ -143,13 +143,13 @@ "h264-mp4-encoder": "^1.0.12", "immer": "^9.0.6", "immutable": "^3.8.2", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.2", "react": "^17.0.2", "react-dom": "^17.0.2", "rxjs": "^7.3.0", - "swagger-ui-dist": "^3.37.2", + "swagger-ui-dist": "^3.52.1", "tslib": "^2.3.1", - "util.promisify": "^1.0.1", - "xhr2": "^0.2.0" + "util.promisify": "^1.1.1", + "xhr2": "^0.2.1" } } diff --git a/src/cli/chem-comp-dict/create-ions.ts b/src/cli/chem-comp-dict/create-ions.ts index d2c5a27f0ef345824d75a50d0bf30d0919d52d75..2c0ed76b46b1b25334100e58a9539ea02a8ccabc 100644 --- a/src/cli/chem-comp-dict/create-ions.ts +++ b/src/cli/chem-comp-dict/create-ions.ts @@ -54,20 +54,20 @@ async function run(out: string, forceDownload = false) { } const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Extract and save IonNames from CCD.' }); -parser.addArgument('out', { +parser.add_argument('out', { help: 'Generated file output path.' }); -parser.addArgument([ '--forceDownload', '-f' ], { - action: 'storeTrue', +parser.add_argument('--forceDownload', '-f', { + action: 'store_true', help: 'Force download of CCD and PVCD.' }); interface Args { out: string, forceDownload?: boolean, } -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); run(args.out, args.forceDownload); diff --git a/src/cli/chem-comp-dict/create-table.ts b/src/cli/chem-comp-dict/create-table.ts index f20af5933515312cce4663262436f1de07e55e8b..03da1a3ee772f5e1a890329456f77bea9ca4c76b 100644 --- a/src/cli/chem-comp-dict/create-table.ts +++ b/src/cli/chem-comp-dict/create-table.ts @@ -265,21 +265,21 @@ const CCB_TABLE_NAME = 'CHEM_COMP_BONDS'; const CCA_TABLE_NAME = 'CHEM_COMP_ATOMS'; const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Create a cif file with one big table of all chem_comp_bond entries from the CCD and PVCD.' }); -parser.addArgument('out', { +parser.add_argument('out', { help: 'Generated file output path.' }); -parser.addArgument([ '--forceDownload', '-f' ], { - action: 'storeTrue', +parser.add_argument('--forceDownload', '-f', { + action: 'store_true', help: 'Force download of CCD and PVCD.' }); -parser.addArgument([ '--binary', '-b' ], { - action: 'storeTrue', +parser.add_argument('--binary', '-b', { + action: 'store_true', help: 'Output as BinaryCIF.' }); -parser.addArgument(['--ccaOut', '-a'], { +parser.add_argument('--ccaOut', '-a', { help: 'Optional generated file output path for chem_comp_atom data.', required: false }); @@ -289,6 +289,6 @@ interface Args { binary?: boolean, ccaOut?: string } -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); run(args.out, args.binary, args.forceDownload, args.ccaOut); diff --git a/src/cli/cif2bcif/index.ts b/src/cli/cif2bcif/index.ts index bcf5dbab2b670f14b5f3597892931fefcb80b2b5..5dcd39af50cfa70dd78abb516e8e1c9c86e7ccc1 100644 --- a/src/cli/cif2bcif/index.ts +++ b/src/cli/cif2bcif/index.ts @@ -37,20 +37,20 @@ function run(args: Args) { } const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Convert any CIF file to a BCIF file' }); -parser.addArgument([ 'src' ], { +parser.add_argument('src', { help: 'Source CIF path' }); -parser.addArgument([ 'out' ], { +parser.add_argument('out', { help: 'Output BCIF path' }); -parser.addArgument([ '-c', '--config' ], { +parser.add_argument('-c', '--config', { help: 'Optional encoding strategy/precision config path', required: false }); -parser.addArgument([ '-f', '--filter' ], { +parser.add_argument('-f', '--filter', { help: 'Optional filter whitelist/blacklist path', required: false }); @@ -61,7 +61,7 @@ interface Args { config?: string filter?: string } -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); if (args) { run(args); diff --git a/src/cli/cifschema/index.ts b/src/cli/cifschema/index.ts index d3846e7a34466ed4d374e03d130096efd8222811..bfcdf04f719057032a2ff2633903335d38b083bf 100644 --- a/src/cli/cifschema/index.ts +++ b/src/cli/cifschema/index.ts @@ -178,44 +178,44 @@ const CIF_CORE_ATTR_PATH = `${DIC_DIR}/templ_attr.cif`; const CIF_CORE_ATTR_URL = 'https://raw.githubusercontent.com/COMCIFS/cif_core/master/templ_attr.cif'; const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Create schema from mmcif dictionary (v50 plus IHM and entity_branch extensions, downloaded from wwPDB)' }); -parser.addArgument([ '--preset', '-p' ], { - defaultValue: '', +parser.add_argument('--preset', '-p', { + default: '', choices: ['', 'mmCIF', 'CCD', 'BIRD', 'CifCore'], help: 'Preset name' }); -parser.addArgument([ '--name', '-n' ], { - defaultValue: '', +parser.add_argument('--name', '-n', { + default: '', help: 'Schema name' }); -parser.addArgument([ '--out', '-o' ], { +parser.add_argument('--out', '-o', { help: 'Generated schema output path, if not given printed to stdout' }); -parser.addArgument([ '--targetFormat', '-tf' ], { - defaultValue: 'typescript-molstar', +parser.add_argument('--targetFormat', '-tf', { + default: 'typescript-molstar', choices: ['typescript-molstar', 'json-internal'], help: 'Target format' }); -parser.addArgument([ '--dicPath', '-d' ], { - defaultValue: '', +parser.add_argument('--dicPath', '-d', { + default: '', help: 'Path to dictionary' }); -parser.addArgument([ '--fieldNamesPath', '-fn' ], { - defaultValue: '', +parser.add_argument('--fieldNamesPath', '-fn', { + default: '', help: 'Field names to include' }); -parser.addArgument([ '--forceDicDownload', '-f' ], { - action: 'storeTrue', +parser.add_argument('--forceDicDownload', '-f', { + action: 'store_true', help: 'Force download of dictionaries' }); -parser.addArgument([ '--moldataImportPath', '-mip' ], { - defaultValue: 'molstar/lib/mol-data', +parser.add_argument('--moldataImportPath', '-mip', { + default: 'molstar/lib/mol-data', help: 'mol-data import path (for typescript target only)' }); -parser.addArgument([ '--addAliases', '-aa' ], { - action: 'storeTrue', +parser.add_argument('--addAliases', '-aa', { + action: 'store_true', help: 'Add field name/path aliases' }); interface Args { @@ -230,7 +230,7 @@ interface Args { moldataImportPath: string addAliases: boolean } -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); const FORCE_DIC_DOWNLOAD = args.forceDicDownload; diff --git a/src/cli/lipid-params/index.ts b/src/cli/lipid-params/index.ts index d0895a12e7b938bc7753ab5e21cb50b2dbe43790..ee1bf4ad58c4b24ed613c86ce2a47a8dfc403a6a 100644 --- a/src/cli/lipid-params/index.ts +++ b/src/cli/lipid-params/index.ts @@ -70,21 +70,21 @@ export const LipidNames = new Set(${lipidNames.replace(/"/g, "'").replace(/,/g, } const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Create lipid params (from martini lipids itp)' }); -parser.addArgument([ '--out', '-o' ], { +parser.add_argument('--out', '-o', { help: 'Generated lipid params output path, if not given printed to stdout' }); -parser.addArgument([ '--forceDownload', '-f' ], { - action: 'storeTrue', +parser.add_argument('--forceDownload', '-f', { + action: 'store_true', help: 'Force download of martini lipids itp' }); interface Args { out: string forceDownload: boolean } -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); const FORCE_DOWNLOAD = args.forceDownload; diff --git a/src/cli/structure-info/model.ts b/src/cli/structure-info/model.ts index c909b9d91a2871420e8693390c7881b01e94e661..d42c67187e2e8a256b180fd6a5e5103a0601d4c4 100644 --- a/src/cli/structure-info/model.ts +++ b/src/cli/structure-info/model.ts @@ -230,21 +230,21 @@ async function runFile(filename: string, args: Args) { } const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Print info about a structure, mainly to test and showcase the mol-model module' }); -parser.addArgument(['--download', '-d'], { help: 'Pdb entry id' }); -parser.addArgument(['--file', '-f'], { help: 'filename' }); - -parser.addArgument(['--models'], { help: 'print models info', action: 'storeTrue' }); -parser.addArgument(['--seq'], { help: 'print sequence', action: 'storeTrue' }); -parser.addArgument(['--units'], { help: 'print units', action: 'storeTrue' }); -parser.addArgument(['--sym'], { help: 'print symmetry', action: 'storeTrue' }); -parser.addArgument(['--rings'], { help: 'print rings', action: 'storeTrue' }); -parser.addArgument(['--intraBonds'], { help: 'print intra unit bonds', action: 'storeTrue' }); -parser.addArgument(['--interBonds'], { help: 'print inter unit bonds', action: 'storeTrue' }); -parser.addArgument(['--mod'], { help: 'print modified residues', action: 'storeTrue' }); -parser.addArgument(['--sec'], { help: 'print secoundary structure', action: 'storeTrue' }); +parser.add_argument('--download', '-d', { help: 'Pdb entry id' }); +parser.add_argument('--file', '-f', { help: 'filename' }); + +parser.add_argument('--models', { help: 'print models info', action: 'store_true' }); +parser.add_argument('--seq', { help: 'print sequence', action: 'store_true' }); +parser.add_argument('--units', { help: 'print units', action: 'store_true' }); +parser.add_argument('--sym', { help: 'print symmetry', action: 'store_true' }); +parser.add_argument('--rings', { help: 'print rings', action: 'store_true' }); +parser.add_argument('--intraBonds', { help: 'print intra unit bonds', action: 'store_true' }); +parser.add_argument('--interBonds', { help: 'print inter unit bonds', action: 'store_true' }); +parser.add_argument('--mod', { help: 'print modified residues', action: 'store_true' }); +parser.add_argument('--sec', { help: 'print secoundary structure', action: 'store_true' }); interface Args { download?: string, file?: string, @@ -260,7 +260,7 @@ interface Args { mod?: boolean, sec?: boolean, } -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); if (args.download) runDL(args.download, args); else if (args.file) runFile(args.file, args); diff --git a/src/cli/structure-info/volume.ts b/src/cli/structure-info/volume.ts index 27b13ba0ef4d3da9acaa077a5d8e825655f01f9b..4e3ad62cd2a8887a8a631bc8ed9f9109d658c57d 100644 --- a/src/cli/structure-info/volume.ts +++ b/src/cli/structure-info/volume.ts @@ -75,13 +75,13 @@ async function run(url: string, meshFilename: string) { } const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Info about VolumeData from mol-model module' }); -parser.addArgument([ '--emdb', '-e' ], { +parser.add_argument('--emdb', '-e', { help: 'EMDB id, for example 8116', }); -parser.addArgument([ '--mesh' ], { +parser.add_argument('--mesh', { help: 'Mesh filename', required: true }); @@ -89,6 +89,6 @@ interface Args { emdb?: string, mesh: string } -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); run(`https://ds.litemol.org/em/emd-${args.emdb}/cell?detail=4`, args.mesh); \ No newline at end of file diff --git a/src/extensions/rcsb/graphql/codegen.yml b/src/extensions/rcsb/graphql/codegen.yml index a6d7ebd1720ee984e7f136f927ce03c6c69d403b..d5d458bde1d80705a88f1d8b9b2717cfeabb7d34 100644 --- a/src/extensions/rcsb/graphql/codegen.yml +++ b/src/extensions/rcsb/graphql/codegen.yml @@ -1,12 +1,13 @@ schema: https://data.rcsb.org/graphql documents: './src/extensions/rcsb/graphql/symmetry.gql.ts' generates: - './src/extensions/rcsb/graphql/types.ts': - plugins: - - add: '/* eslint-disable */' - - time - - typescript - - typescript-operations - config: - immutableTypes: true - skipTypename: true \ No newline at end of file + './src/extensions/rcsb/graphql/types.ts': + plugins: + - add: + content: '/* eslint-disable */' + - time + - typescript + - typescript-operations + config: + immutableTypes: true + skipTypename: true \ No newline at end of file diff --git a/src/perf-tests/mol-script.ts b/src/perf-tests/mol-script.ts index 4231f8bda35836acdc37d334db1f30b9478fdbdc..32e9cff781369ef5341d7d81d9d39670cf312100 100644 --- a/src/perf-tests/mol-script.ts +++ b/src/perf-tests/mol-script.ts @@ -68,7 +68,7 @@ export async function testQ() { const { structure } = await getModelsAndStructure(frame); const model = structure.models[0]; - const rawData = await fetch(`https://www.ebi.ac.uk/pdbe/api/validation/residuewise_outlier_summary/entry/${model.entryId.toLowerCase()}`, { timeout: 1500 }); + const rawData = await fetch(`https://www.ebi.ac.uk/pdbe/api/validation/residuewise_outlier_summary/entry/${model.entryId.toLowerCase()}`); const data = StructureQualityReport.fromJson(model, await rawData.json()); StructureQualityReportProvider.set(model, { serverUrl: '' }, data); diff --git a/src/servers/model/config.ts b/src/servers/model/config.ts index 7de2563951883e5cd502caefcda147d16a357d6b..0cfd9d6b42edfd409a408707d0aef441728715e5 100644 --- a/src/servers/model/config.ts +++ b/src/servers/model/config.ts @@ -117,65 +117,65 @@ export let mapSourceAndIdToFilename: (source: string, id: string) => [string, Mo }; function addServerArgs(parser: argparse.ArgumentParser) { - parser.addArgument([ '--apiPrefix' ], { - defaultValue: DefaultModelServerConfig.apiPrefix, + parser.add_argument('--apiPrefix', { + default: DefaultModelServerConfig.apiPrefix, metavar: 'PREFIX', help: `Specify the prefix of the API, i.e. <host>/<apiPrefix>/<API queries>` }); - parser.addArgument([ '--defaultPort' ], { - defaultValue: DefaultModelServerConfig.defaultPort, + parser.add_argument('--defaultPort', { + default: DefaultModelServerConfig.defaultPort, metavar: 'PORT', type: 'int', help: `Specify the port the server is running on` }); - parser.addArgument([ '--cacheMaxSizeInBytes' ], { - defaultValue: DefaultModelServerConfig.cacheMaxSizeInBytes, + parser.add_argument('--cacheMaxSizeInBytes', { + default: DefaultModelServerConfig.cacheMaxSizeInBytes, metavar: 'CACHE_SIZE', type: 'int', help: `0 for off.` }); - parser.addArgument([ '--cacheEntryTimeoutMs' ], { - defaultValue: DefaultModelServerConfig.cacheEntryTimeoutMs, + parser.add_argument('--cacheEntryTimeoutMs', { + default: DefaultModelServerConfig.cacheEntryTimeoutMs, metavar: 'CACHE_TIMEOUT', type: 'int', help: `Specify in ms how long to keep entries in cache.` }); - parser.addArgument([ '--requestTimeoutMs' ], { - defaultValue: DefaultModelServerConfig.requestTimeoutMs, + parser.add_argument('--requestTimeoutMs', { + default: DefaultModelServerConfig.requestTimeoutMs, metavar: 'REQUEST_TIMEOUT', type: 'int', help: `The maximum number of ms the server spends on a request.` }); - parser.addArgument([ '--queryTimeoutMs' ], { - defaultValue: DefaultModelServerConfig.queryTimeoutMs, + parser.add_argument('--queryTimeoutMs', { + default: DefaultModelServerConfig.queryTimeoutMs, metavar: 'QUERY_TIMEOUT', type: 'int', help: `The maximum time the server dedicates to executing a query in ms.\nDoes not include the time it takes to read and export the data.` }); - parser.addArgument([ '--shutdownTimeoutMinutes' ], { - defaultValue: DefaultModelServerConfig.shutdownTimeoutMinutes, + parser.add_argument('--shutdownTimeoutMinutes', { + default: DefaultModelServerConfig.shutdownTimeoutMinutes, metavar: 'TIME', type: 'int', help: `0 for off, server will shut down after this amount of minutes.` }); - parser.addArgument([ '--shutdownTimeoutVarianceMinutes' ], { - defaultValue: DefaultModelServerConfig.shutdownTimeoutVarianceMinutes, + parser.add_argument('--shutdownTimeoutVarianceMinutes', { + default: DefaultModelServerConfig.shutdownTimeoutVarianceMinutes, metavar: 'VARIANCE', type: 'int', help: `modifies the shutdown timer by +/- timeoutVarianceMinutes (to avoid multiple instances shutting at the same time)` }); - parser.addArgument([ '--maxQueryManyQueries' ], { - defaultValue: DefaultModelServerConfig.maxQueryManyQueries, + parser.add_argument('--maxQueryManyQueries', { + default: DefaultModelServerConfig.maxQueryManyQueries, metavar: 'QUERY_MANY_LIMIT', type: 'int', help: `maximum number of queries allowed by the query-many at a time` }); - parser.addArgument([ '--defaultSource' ], { - defaultValue: DefaultModelServerConfig.defaultSource, + parser.add_argument('--defaultSource', { + default: DefaultModelServerConfig.defaultSource, metavar: 'DEFAULT_SOURCE', help: `modifies which 'sourceMap' source to use by default` }); - parser.addArgument([ '--sourceMap' ], { + parser.add_argument('--sourceMap', { nargs: 2, action: 'append', metavar: ['SOURCE', 'PATH'] as any, @@ -188,7 +188,7 @@ function addServerArgs(parser: argparse.ArgumentParser) { `Supported formats: ${ModelServerFetchFormats.join(', ')}` ].join('\n'), }); - parser.addArgument([ '--sourceMapUrl' ], { + parser.add_argument('--sourceMapUrl', { nargs: 3, action: 'append', metavar: ['SOURCE', 'PATH', 'SOURCE_MAP_FORMAT'] as any, @@ -224,15 +224,15 @@ interface ServerJsonConfig { } function addJsonConfigArgs(parser: argparse.ArgumentParser) { - parser.addArgument(['--cfg'], { + parser.add_argument('--cfg', { help: [ 'JSON config file path', 'If a property is not specified, cmd line param/OS variable/default value are used.' ].join('\n'), required: false }); - parser.addArgument(['--printCfg'], { help: 'Print current config for validation and exit.', required: false, nargs: 0 }); - parser.addArgument(['--cfgTemplate'], { help: 'Prints default JSON config template to be modified and exits.', required: false, nargs: 0 }); + parser.add_argument('--printCfg', { help: 'Print current config for validation and exit.', required: false, nargs: 0 }); + parser.add_argument('--cfgTemplate', { help: 'Prints default JSON config template to be modified and exits.', required: false, nargs: 0 }); } function setConfig(config: ModelServerConfig) { @@ -260,13 +260,12 @@ function validateConfigAndSetupSourceMap() { function parseConfigArguments() { const parser = new argparse.ArgumentParser({ - version: VERSION, - addHelp: true, + add_help: true, description: `ModelServer ${VERSION}, (c) 2018-2020, Mol* contributors` }); addJsonConfigArgs(parser); addServerArgs(parser); - return parser.parseArgs() as ModelServerConfig & ServerJsonConfig; + return parser.parse_args() as ModelServerConfig & ServerJsonConfig; } export function configureServer() { diff --git a/src/servers/model/preprocess.ts b/src/servers/model/preprocess.ts index 6da907e4a6083cd40f2e0ece8e2b43e5ea7c93a3..9a4b4efd9904df8c1d198261b85812659ead4af3 100644 --- a/src/servers/model/preprocess.ts +++ b/src/servers/model/preprocess.ts @@ -5,10 +5,10 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -import * as cluster from 'cluster'; +import cluster from 'cluster'; import { runChild } from './preprocess/parallel'; -if (cluster.isMaster) { +if (cluster.isPrimary) { require('./preprocess/master'); } else { runChild(); diff --git a/src/servers/model/preprocess/master.ts b/src/servers/model/preprocess/master.ts index 687b9fe41931fbc50c7bbd61af8d11c2b857944d..d16875bd7308c0e338dc93053a7932e8c9165adf 100644 --- a/src/servers/model/preprocess/master.ts +++ b/src/servers/model/preprocess/master.ts @@ -29,18 +29,18 @@ function description() { } const cmdParser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: description() }); -cmdParser.addArgument(['--input', '-i'], { help: 'Input filename', required: false }); -cmdParser.addArgument(['--outCIF', '-oc'], { help: 'Output CIF filename', required: false }); -cmdParser.addArgument(['--outBCIF', '-ob'], { help: 'Output BinaryCIF filename', required: false }); +cmdParser.add_argument('--input', '-i', { help: 'Input filename', required: false }); +cmdParser.add_argument('--outCIF', '-oc', { help: 'Output CIF filename', required: false }); +cmdParser.add_argument('--outBCIF', '-ob', { help: 'Output BinaryCIF filename', required: false }); // TODO: add back? cmdParser.addArgument(['--bulk', '-b'], { help: 'Bulk JSON ({ numProcesses?: number, entries: { source: string, cif?: string, bcif?: string }[] })', required: false }); -cmdParser.addArgument(['--cfg', '-c'], { help: 'Config file path', required: false }); -cmdParser.addArgument(['--folderIn', '-fin'], { help: 'Convert folder', required: false }); -cmdParser.addArgument(['--folderOutCIF', '-foc'], { help: 'Convert folder text output', required: false }); -cmdParser.addArgument(['--folderOutBCIF', '-fob'], { help: 'Convert folder binary output', required: false }); -cmdParser.addArgument(['--folderNumProcesses', '-fp'], { help: 'Convert folder num processes', required: false }); +cmdParser.add_argument('--cfg', '-c', { help: 'Config file path', required: false }); +cmdParser.add_argument('--folderIn', '-fin', { help: 'Convert folder', required: false }); +cmdParser.add_argument('--folderOutCIF', '-foc', { help: 'Convert folder text output', required: false }); +cmdParser.add_argument('--folderOutBCIF', '-fob', { help: 'Convert folder binary output', required: false }); +cmdParser.add_argument('--folderNumProcesses', '-fp', { help: 'Convert folder num processes', required: false }); interface CmdArgs { // bulk?: string, @@ -61,10 +61,10 @@ export interface PreprocessConfig { customProperties?: ModelPropertyProviderConfig | string } -const cmdArgs = cmdParser.parseArgs() as CmdArgs; +const cmdArgs = cmdParser.parse_args() as CmdArgs; if (Object.keys(cmdArgs).filter(k => (cmdArgs as any)[k] !== null).length === 0 || typeof cmdArgs.help !== 'undefined') { - cmdParser.printHelp(); + cmdParser.print_help(); process.exit(0); } diff --git a/src/servers/model/preprocess/parallel.ts b/src/servers/model/preprocess/parallel.ts index 399e06c920378a7b76d4df3abaaa207f46960d4d..e20e665b7b0b691d8ac9fb60be2bb8ae05e64a7d 100644 --- a/src/servers/model/preprocess/parallel.ts +++ b/src/servers/model/preprocess/parallel.ts @@ -5,7 +5,7 @@ */ import * as path from 'path'; -import * as cluster from 'cluster'; +import cluster from 'cluster'; import { now } from '../../../mol-util/now'; import { PerformanceMonitor } from '../../../mol-util/performance-monitor'; import { preprocessFile } from './preprocess'; diff --git a/src/servers/model/properties/providers/pdbe.ts b/src/servers/model/properties/providers/pdbe.ts index 09f818bf3c3c352959955bf1ec95fa281b42d1ed..adaf0a7ff2a73ff98bad88ddf2f7af3b3ea4dd26 100644 --- a/src/servers/model/properties/providers/pdbe.ts +++ b/src/servers/model/properties/providers/pdbe.ts @@ -77,12 +77,12 @@ function apiQueryProvider(urlPrefix: string, cache: any) { const rawData = await fetchRetry(`${urlPrefix}/${model.entryId.toLowerCase()}`, 1500, 5); // TODO: is this ok? if (rawData.status !== 200) return { }; - const json = (await rawData.json())[model.entryId.toLowerCase()] || { }; + const json = ((await rawData.json()) as any)[model.entryId.toLowerCase()] || { }; cache[cacheKey] = json; return json; } catch (e) { // TODO: handle better - ConsoleLogger.warn('Props', `Count not retrieve prop @${`${urlPrefix}/${model.entryId.toLowerCase()}`}`); + ConsoleLogger.warn('Props', `Could not retrieve prop @${`${urlPrefix}/${model.entryId.toLowerCase()}`}`); return { }; } }; diff --git a/src/servers/model/utils/fetch-props-pdbe.ts b/src/servers/model/utils/fetch-props-pdbe.ts index a08094e07d2e51ab6eca43011b231f2e254ace3e..2da0804507c30f23cceea224e612b6d7265ebe0e 100644 --- a/src/servers/model/utils/fetch-props-pdbe.ts +++ b/src/servers/model/utils/fetch-props-pdbe.ts @@ -13,19 +13,19 @@ import { now } from '../../../mol-util/now'; import { PerformanceMonitor } from '../../../mol-util/performance-monitor'; const cmdParser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: 'Download JSON data from PDBe API' }); -cmdParser.addArgument(['--in'], { help: 'Input folder', required: true }); -cmdParser.addArgument(['--out'], { help: 'Output folder', required: true }); +cmdParser.add_argument('--in', { help: 'Input folder', required: true }); +cmdParser.add_argument('--out', { help: 'Output folder', required: true }); interface CmdArgs { in: string, out: string } -const cmdArgs = cmdParser.parseArgs() as CmdArgs; +const cmdArgs = cmdParser.parse_args() as CmdArgs; function getPDBid(name: string) { let idx = name.indexOf('_'); @@ -73,7 +73,7 @@ async function process() { for (let ee of e.entries) { const query = await fetch(`https://www.ebi.ac.uk/pdbe/api/validation/residuewise_outlier_summary/entry/${ee}`); try { - if (query.status === 200) data[ee] = (await query.json())[ee] || { }; + if (query.status === 200) data[ee] = ((await query.json()) as any)[ee] || { }; else console.error(ee, query.status); } catch (e) { console.error(ee, '' + e); diff --git a/src/servers/model/utils/fetch-retry.ts b/src/servers/model/utils/fetch-retry.ts index 4ce146bb6bc50ad9987cbe1d86084f0bdb004827..9ba80b1121c6b1cfdd531c3520c112d15cb1ffe6 100644 --- a/src/servers/model/utils/fetch-retry.ts +++ b/src/servers/model/utils/fetch-retry.ts @@ -17,15 +17,16 @@ function isRetriableNetworkError(error: any) { } export async function fetchRetry(url: string, timeout: number, retryCount: number, onRetry?: () => void): Promise<Response> { - const result = await retryIf(() => fetch(url, { timeout }), { - retryThenIf: r => r.status === 408 /** timeout */ || r.status === 429 /** too mant requests */ || (r.status >= 500 && r.status < 600), + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeout); + const result = await retryIf(() => fetch(url, { signal: controller.signal }), { + retryThenIf: r => r.status === 408 /** timeout */ || r.status === 429 /** too many requests */ || (r.status >= 500 && r.status < 600), // TODO test retryCatchIf retryCatchIf: e => isRetriableNetworkError(e), onRetry, retryCount }); + clearTimeout(id); return result; - // if (result.status >= 200 && result.status < 300) return result; - // throw new Error(result.statusText); } diff --git a/src/servers/plugin-state/config.ts b/src/servers/plugin-state/config.ts index 38ecd7667bf88590647b486621ff1d1a0d39770b..e89dbefbf12add0e5f08313d3b8329e6dfcfc935 100644 --- a/src/servers/plugin-state/config.ts +++ b/src/servers/plugin-state/config.ts @@ -15,14 +15,14 @@ export interface Config { export function getConfig() { const cmdParser = new argparse.ArgumentParser({ - addHelp: true + add_help: true }); - cmdParser.addArgument(['--working-folder'], { help: 'Working forlder path.', required: true }); - cmdParser.addArgument(['--port'], { help: 'Server port. Altenatively use ENV variable PORT.', type: 'int', required: false }); - cmdParser.addArgument(['--api-prefix'], { help: 'Server API prefix.', defaultValue: '', required: false }); - cmdParser.addArgument(['--max-states'], { help: 'Maxinum number of states that could be saved.', defaultValue: 40, type: 'int', required: false }); + cmdParser.add_argument('--working-folder', { help: 'Working forlder path.', required: true }); + cmdParser.add_argument('--port', { help: 'Server port. Altenatively use ENV variable PORT.', type: 'int', required: false }); + cmdParser.add_argument('--api-prefix', { help: 'Server API prefix.', default: '', required: false }); + cmdParser.add_argument('--max-states', { help: 'Maxinum number of states that could be saved.', default: 40, type: 'int', required: false }); - const config = cmdParser.parseArgs() as Config; + const config = cmdParser.parse_args() as Config; if (!config.port) config.port = process.env.port || 1339; return config; } diff --git a/src/servers/volume/config.ts b/src/servers/volume/config.ts index b1ac9db61a63b6cb92b46253d432579a845fe8c1..53d247d7205284c441f20ba1eef93fa728c6f69c 100644 --- a/src/servers/volume/config.ts +++ b/src/servers/volume/config.ts @@ -7,7 +7,7 @@ import * as argparse from 'argparse'; import { ObjectKeys } from '../../mol-util/type-helpers'; -import { VOLUME_SERVER_HEADER, VOLUME_SERVER_VERSION } from './server/version'; +import { VOLUME_SERVER_HEADER } from './server/version'; import * as fs from 'fs'; const DefaultServerConfig = { @@ -19,22 +19,22 @@ const DefaultServerConfig = { }; function addLimitsArgs(parser: argparse.ArgumentParser) { - parser.addArgument([ '--maxRequestBlockCount' ], { - defaultValue: DefaultLimitsConfig.maxRequestBlockCount, + parser.add_argument('--maxRequestBlockCount', { + default: DefaultLimitsConfig.maxRequestBlockCount, metavar: 'COUNT', help: `Maximum number of blocks that could be read in 1 query. This is somewhat tied to the maxOutputSizeInVoxelCountByPrecisionLevel in that the <maximum number of voxel> = maxRequestBlockCount * <block size>^3. The default block size is 96 which corresponds to 28,311,552 voxels with 32 max blocks.` }); - parser.addArgument([ '--maxFractionalBoxVolume' ], { - defaultValue: DefaultLimitsConfig.maxFractionalBoxVolume, + parser.add_argument('--maxFractionalBoxVolume', { + default: DefaultLimitsConfig.maxFractionalBoxVolume, metavar: 'VOLUME', help: `The maximum fractional volume of the query box (to prevent queries that are too big).` }); - parser.addArgument([ '--maxOutputSizeInVoxelCountByPrecisionLevel' ], { + parser.add_argument('--maxOutputSizeInVoxelCountByPrecisionLevel', { nargs: '+', - defaultValue: DefaultLimitsConfig.maxOutputSizeInVoxelCountByPrecisionLevel, + default: DefaultLimitsConfig.maxOutputSizeInVoxelCountByPrecisionLevel, metavar: 'LEVEL', help: `What is the (approximate) maximum desired size in voxel count by precision level Rule of thumb: <response gzipped size> in [<voxel count> / 8, <voxel count> / 4]. @@ -43,31 +43,31 @@ The maximum number of voxels is tied to maxRequestBlockCount.` } function addServerArgs(parser: argparse.ArgumentParser) { - parser.addArgument([ '--apiPrefix' ], { - defaultValue: DefaultServerConfig.apiPrefix, + parser.add_argument('--apiPrefix', { + default: DefaultServerConfig.apiPrefix, metavar: 'PREFIX', help: `Specify the prefix of the API, i.e. <host>/<apiPrefix>/<API queries>` }); - parser.addArgument([ '--defaultPort' ], { - defaultValue: DefaultServerConfig.defaultPort, + parser.add_argument('--defaultPort', { + default: DefaultServerConfig.defaultPort, metavar: 'PORT', type: 'int', help: `Specify the port the server is running on` }); - parser.addArgument([ '--shutdownTimeoutMinutes' ], { - defaultValue: DefaultServerConfig.shutdownTimeoutMinutes, + parser.add_argument('--shutdownTimeoutMinutes', { + default: DefaultServerConfig.shutdownTimeoutMinutes, metavar: 'TIME', type: 'int', help: `0 for off, server will shut down after this amount of minutes.` }); - parser.addArgument([ '--shutdownTimeoutVarianceMinutes' ], { - defaultValue: DefaultServerConfig.shutdownTimeoutVarianceMinutes, + parser.add_argument('--shutdownTimeoutVarianceMinutes', { + default: DefaultServerConfig.shutdownTimeoutVarianceMinutes, metavar: 'VARIANCE', type: 'int', help: `modifies the shutdown timer by +/- timeoutVarianceMinutes (to avoid multiple instances shutting at the same time)` }); - parser.addArgument([ '--idMap' ], { + parser.add_argument('--idMap', { nargs: 2, action: 'append', metavar: ['TYPE', 'PATH'] as any, @@ -84,15 +84,15 @@ function addServerArgs(parser: argparse.ArgumentParser) { } function addJsonConfigArgs(parser: argparse.ArgumentParser) { - parser.addArgument(['--cfg'], { + parser.add_argument('--cfg', { help: [ 'JSON config file path', 'If a property is not specified, cmd line param/OS variable/default value are used.' ].join('\n'), required: false }); - parser.addArgument(['--printCfg'], { help: 'Print current config for validation and exit.', required: false, nargs: 0 }); - parser.addArgument(['--cfgTemplate'], { help: 'Prints default JSON config template to be modified and exits.', required: false, nargs: 0 }); + parser.add_argument('--printCfg', { help: 'Print current config for validation and exit.', required: false, nargs: 0 }); + parser.add_argument('--cfgTemplate', { help: 'Prints default JSON config template to be modified and exits.', required: false, nargs: 0 }); } export interface ServerJsonConfig { @@ -156,14 +156,14 @@ const ServerConfigTemplate: FullServerConfig = { export function configureServer() { const parser = new argparse.ArgumentParser({ - version: VOLUME_SERVER_VERSION, - addHelp: true, + // version: VOLUME_SERVER_VERSION, + add_help: true, description: VOLUME_SERVER_HEADER }); addJsonConfigArgs(parser); addServerArgs(parser); addLimitsArgs(parser); - const config = parser.parseArgs() as FullServerConfig & ServerJsonConfig; + const config = parser.parse_args() as FullServerConfig & ServerJsonConfig; if (config.cfgTemplate !== null) { console.log(JSON.stringify(ServerConfigTemplate, null, 2)); @@ -192,16 +192,16 @@ export function configureServer() { export function configureLocal() { const parser = new argparse.ArgumentParser({ - version: VOLUME_SERVER_VERSION, - addHelp: true, + // version: VOLUME_SERVER_VERSION, + add_help: true, description: VOLUME_SERVER_HEADER }); - parser.addArgument(['--jobs'], { help: `Path to a JSON file with job specification.`, required: false }); - parser.addArgument(['--jobsTemplate'], { help: 'Print example template for jobs.json and exit.', required: false, nargs: 0 });; + parser.add_argument('--jobs', { help: `Path to a JSON file with job specification.`, required: false }); + parser.add_argument('--jobsTemplate', { help: 'Print example template for jobs.json and exit.', required: false, nargs: 0 });; addJsonConfigArgs(parser); addLimitsArgs(parser); - const config = parser.parseArgs() as LimitsConfig & ServerJsonConfig; + const config = parser.parse_args() as LimitsConfig & ServerJsonConfig; if (config.cfgTemplate !== null) { console.log(JSON.stringify(DefaultLimitsConfig, null, 2)); diff --git a/src/servers/volume/pack.ts b/src/servers/volume/pack.ts index f77a930dd3f6a292d58ec35bba0701f7013bf4ae..343bb772ecc29a6a242f2ef4a53d6c7fe1ffa229 100644 --- a/src/servers/volume/pack.ts +++ b/src/servers/volume/pack.ts @@ -63,31 +63,31 @@ interface EmArgs extends GeneralArgs { type Args = XrayArgs | EmArgs const parser = new argparse.ArgumentParser({ - addHelp: true, + add_help: true, description: `VolumeServer Packer ${VERSION}, (c) 2018-2019, Mol* contributors` }); -const subparsers = parser.addSubparsers({ +const subparsers = parser.add_subparsers({ title: 'Packing modes', dest: 'mode' }); function addGeneralArgs(parser: argparse.ArgumentParser) { - parser.addArgument(['output'], { help: `Output path.` }); - parser.addArgument(['--blockSizeInMB'], { defaultValue: 96, help: `Maximum block size.`, metavar: 'SIZE' }); - parser.addArgument(['--format'], { defaultValue: 'ccp4', help: `Input file format.` }); + parser.add_argument('output', { help: `Output path.` }); + parser.add_argument('--blockSizeInMB', { default: 96, help: `Maximum block size.`, metavar: 'SIZE' }); + parser.add_argument('--format', { default: 'ccp4', help: `Input file format.` }); } -const xrayParser = subparsers.addParser('xray', { addHelp: true }); -xrayParser.addArgument(['input2fofc'], { help: `Path to 2fofc file.`, metavar: '2FOFC' }); -xrayParser.addArgument(['inputFofc'], { help: `Path to fofc file.`, metavar: 'FOFC' }); +const xrayParser = subparsers.add_parser('xray', { add_help: true }); +xrayParser.add_argument('input2fofc', { help: `Path to 2fofc file.`, metavar: '2FOFC' }); +xrayParser.add_argument('inputFofc', { help: `Path to fofc file.`, metavar: 'FOFC' }); addGeneralArgs(xrayParser); -const emParser = subparsers.addParser('em', { addHelp: true }); -emParser.addArgument(['inputEm'], { help: `Path to EM density file.`, metavar: 'EM' }); +const emParser = subparsers.add_parser('em', { add_help: true }); +emParser.add_argument('inputEm', { help: `Path to EM density file.`, metavar: 'EM' }); addGeneralArgs(emParser); -const args: Args = parser.parseArgs(); +const args: Args = parser.parse_args(); const config = getConfig(args); pack(config.input, config.blockSizeInMB, config.isPeriodic, config.outputFilename, config.format);