scout-browser 4.83__py3-none-any.whl → 4.85__py3-none-any.whl
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.
- scout/__version__.py +1 -1
- scout/adapter/mongo/case.py +5 -1
- scout/adapter/mongo/cytoband.py +13 -0
- scout/adapter/mongo/hgnc.py +1 -1
- scout/adapter/mongo/variant.py +9 -0
- scout/adapter/mongo/variant_loader.py +73 -71
- scout/build/genes/hgnc_gene.py +5 -134
- scout/commands/download/ensembl.py +1 -0
- scout/commands/download/everything.py +1 -0
- scout/commands/download/exac.py +1 -0
- scout/commands/download/hgnc.py +1 -0
- scout/commands/download/hpo.py +1 -0
- scout/commands/download/omim.py +1 -0
- scout/commands/export/database.py +1 -0
- scout/commands/load/panel.py +1 -0
- scout/commands/load/report.py +1 -0
- scout/commands/update/genes.py +9 -13
- scout/commands/update/omim.py +1 -0
- scout/commands/update/panelapp.py +1 -0
- scout/constants/file_types.py +86 -17
- scout/export/exon.py +1 -0
- scout/load/all.py +5 -1
- scout/load/hgnc_gene.py +40 -7
- scout/models/hgnc_map.py +50 -87
- scout/models/phenotype_term.py +3 -3
- scout/parse/hgnc.py +1 -0
- scout/parse/orpha.py +1 -0
- scout/parse/variant/conservation.py +1 -0
- scout/parse/variant/transcript.py +1 -1
- scout/parse/variant/variant.py +10 -4
- scout/server/blueprints/cases/controllers.py +15 -1
- scout/server/blueprints/cases/templates/cases/case.html +96 -89
- scout/server/blueprints/cases/templates/cases/collapsible_actionbar.html +1 -1
- scout/server/blueprints/cases/templates/cases/gene_panel.html +27 -41
- scout/server/blueprints/cases/templates/cases/utils.html +1 -1
- scout/server/blueprints/panels/forms.py +1 -0
- scout/server/blueprints/variant/controllers.py +9 -14
- scout/server/blueprints/variants/controllers.py +11 -27
- scout/server/extensions/bionano_extension.py +1 -0
- scout/server/extensions/chanjo_extension.py +10 -9
- scout/server/extensions/gens_extension.py +1 -0
- scout/server/extensions/ldap_extension.py +5 -3
- scout/server/extensions/loqus_extension.py +16 -14
- scout/server/extensions/matchmaker_extension.py +1 -0
- scout/server/extensions/mongo_extension.py +1 -0
- scout/server/extensions/rerunner_extension.py +1 -0
- scout/server/links.py +4 -4
- scout/server/static/bs_styles.css +5 -5
- scout/server/templates/utils.html +1 -1
- scout/utils/ensembl_rest_clients.py +1 -0
- scout/utils/scout_requests.py +1 -0
- scout/utils/sort.py +21 -0
- {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/METADATA +3 -6
- {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/RECORD +58 -57
- {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/WHEEL +1 -1
- {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/entry_points.txt +0 -1
- {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/LICENSE +0 -0
- {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/top_level.txt +0 -0
@@ -9,7 +9,7 @@
|
|
9
9
|
<thead class="table-light thead">
|
10
10
|
<tr style="cursor: pointer; white-space: nowrap">
|
11
11
|
<th>Panel <i class="fas fa-sort" data-bs-toggle="tooltip" title="Sort by gene panel name"></i></th>
|
12
|
-
<th
|
12
|
+
<th>Default <i class="fas fa-sort" data-bs-toggle="tooltip" title="Sort by if panel is default"></i></th>
|
13
13
|
<th>Version <i class="fas fa-sort" data-bs-toggle="tooltip" title="Sort by panel version"></i></th>
|
14
14
|
<th>Genes <i class="fas fa-sort" data-bs-toggle="tooltip" title="Sort by number of genes"></i></th>
|
15
15
|
</tr>
|
@@ -20,10 +20,10 @@
|
|
20
20
|
<td>
|
21
21
|
<a {% if panel.is_default %} class="text-white" {% endif %} href="{{ url_for('panels.panel', panel_id=panel.panel_id, case_id=case._id, institute_id=institute._id) }}">
|
22
22
|
{{ panel.display_name|truncate(30, True) }}
|
23
|
-
{% if panel.removed %}
|
24
|
-
<span class="badge bg-danger">Removed</span>
|
25
|
-
{% endif %}
|
26
23
|
</a>
|
24
|
+
{% if panel.removed %}
|
25
|
+
<span class="badge bg-danger">Removed</span>
|
26
|
+
{% endif %}
|
27
27
|
</td>
|
28
28
|
<td >
|
29
29
|
{% if panel.is_default %}
|
@@ -35,53 +35,39 @@
|
|
35
35
|
</tr>
|
36
36
|
{% else %}
|
37
37
|
<tr>
|
38
|
-
<td colspan="
|
38
|
+
<td colspan="4">No panels linked to case</td>
|
39
39
|
</tr>
|
40
40
|
{% endfor %}
|
41
41
|
</tbody>
|
42
42
|
</table>
|
43
43
|
</div>
|
44
|
-
|
45
|
-
|
46
|
-
<div class="row">
|
47
|
-
<label>Change default gene panels</label>
|
48
|
-
</div>
|
49
|
-
<div class="row">
|
50
|
-
<div class="col-8">
|
51
|
-
<select name="panel_ids" class="selectpicker" multiple="multiple" data-style="btn-secondary">
|
52
|
-
{% for panel in case.panels %}
|
53
|
-
<option value="{{ panel.panel_id }}" {% if panel.is_default %} selected {% endif %}>{{ panel.display_name }}</option>
|
54
|
-
{% endfor %}
|
55
|
-
</select>
|
56
|
-
</div>
|
57
|
-
<div class="col-4">
|
58
|
-
<button class="btn btn-secondary form-control">Save</button>
|
59
|
-
</div>
|
60
|
-
</div>
|
61
|
-
</form>
|
62
|
-
</div>
|
44
|
+
{{ change_default_panels(case, institute) }}
|
45
|
+
|
63
46
|
</div>
|
64
47
|
{% endmacro %}
|
65
48
|
|
66
49
|
{% macro change_default_panels(case, institute) %}
|
67
|
-
<div class="card
|
68
|
-
<
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
</
|
50
|
+
<div class="card-body">
|
51
|
+
<form action="{{ url_for('cases.default_panels', institute_id=institute._id, case_name=case.display_name) }}" method="POST">
|
52
|
+
<div class="row">
|
53
|
+
<label>Change default gene panels</label>
|
54
|
+
</div>
|
55
|
+
|
56
|
+
<div class="row">
|
57
|
+
<div class="col-8">
|
58
|
+
<select name="panel_ids" class="selectpicker" multiple="multiple" data-style="btn-secondary">
|
59
|
+
{% for panel in case.panels|sort(attribute='display_name') %}
|
60
|
+
<option value="{{ panel.panel_id }}" {% if panel.is_default %} selected {% endif %}>
|
61
|
+
{{ panel.display_name }} {% if panel.removed %} (Removed) {% endif %}
|
62
|
+
</option>
|
63
|
+
{% endfor %}
|
64
|
+
</select>
|
82
65
|
</div>
|
83
|
-
|
84
|
-
|
66
|
+
<div class="col-4">
|
67
|
+
<button class="btn btn-secondary form-control">Save</button>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
</form>
|
85
71
|
</div>
|
86
72
|
{% endmacro %}
|
87
73
|
|
@@ -486,26 +486,21 @@ def observations(store: MongoAdapter, loqusdb: LoqusDB, variant_obj: dict) -> Di
|
|
486
486
|
loqus_query = loqusdb.get_loqus_query(variant_obj, category)
|
487
487
|
|
488
488
|
for loqus_id in inst_loqus_ids: # Loop over all loqusdb instances of an institute
|
489
|
-
|
490
|
-
|
489
|
+
# collect observation on that loqusdb instance
|
490
|
+
obs_data[loqus_id] = loqusdb.get_variant(loqus_query, loqusdb_id=loqus_id)
|
491
491
|
|
492
|
-
if
|
492
|
+
if obs_data[loqus_id] is None:
|
493
493
|
flash(
|
494
|
-
f"Could not
|
494
|
+
f"Could not find a Loqus instance with id:{loqus_id}",
|
495
495
|
"warning",
|
496
496
|
)
|
497
|
-
obs_data[loqus_id]["
|
497
|
+
obs_data[loqus_id]["observations"] = "N/A"
|
498
498
|
continue
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
if not obs_data[loqus_id]: # data is an empty dictionary
|
504
|
-
# Collect count of variants in variant's case
|
505
|
-
obs_data[loqus_id] = loqusdb.get_variant(loqus_query, loqusdb_id=loqus_id)
|
506
|
-
if obs_data[loqus_id].get("total"):
|
507
|
-
obs_data[loqus_id]["observations"] = 0
|
499
|
+
|
500
|
+
if obs_data[loqus_id] == {}: # Variant was not found
|
501
|
+
obs_data[loqus_id]["observations"] = 0
|
508
502
|
continue
|
503
|
+
|
509
504
|
# Check if the current case is represented in the loqusdb instance
|
510
505
|
obs_data[loqus_id]["case_match"] = variant_obj["case_id"] in obs_data[loqus_id].get(
|
511
506
|
"families", []
|
@@ -3,12 +3,10 @@ import logging
|
|
3
3
|
import re
|
4
4
|
from typing import Any, Dict, List, Optional
|
5
5
|
|
6
|
-
import bson
|
7
6
|
from flask import Response, flash, session, url_for
|
8
7
|
from flask_login import current_user
|
9
8
|
from markupsafe import Markup
|
10
9
|
from pymongo.cursor import CursorType
|
11
|
-
from pymongo.errors import DocumentTooLarge
|
12
10
|
from werkzeug.datastructures import Headers, ImmutableMultiDict, MultiDict
|
13
11
|
from wtforms import DecimalField
|
14
12
|
|
@@ -513,7 +511,7 @@ def update_variant_genes(store, variant_obj, genome_build):
|
|
513
511
|
|
514
512
|
if variant_genes is not None:
|
515
513
|
for gene_obj in variant_genes:
|
516
|
-
# If there is no hgnc id there is
|
514
|
+
# If there is no hgnc id there is nothing we can do
|
517
515
|
if not gene_obj["hgnc_id"]:
|
518
516
|
continue
|
519
517
|
# Else we collect the gene object and check the id
|
@@ -530,27 +528,6 @@ def update_variant_genes(store, variant_obj, genome_build):
|
|
530
528
|
return has_changed
|
531
529
|
|
532
530
|
|
533
|
-
def update_variant_store(store, variant_obj):
|
534
|
-
"""
|
535
|
-
Update variants in db store if anything changed.
|
536
|
-
Args:
|
537
|
-
store(scout.adapter.MongoAdapter)
|
538
|
-
variant_obj(scout.models.Variant)
|
539
|
-
|
540
|
-
update(boolean): upsert only if this is set true
|
541
|
-
|
542
|
-
get_compounds(bool): if compounds should be added to added to the returned variant object
|
543
|
-
|
544
|
-
"""
|
545
|
-
try:
|
546
|
-
variant_obj = store.update_variant(variant_obj)
|
547
|
-
except DocumentTooLarge:
|
548
|
-
flash(
|
549
|
-
f"An error occurred while updating info for variant: {variant_obj['_id']} (pymongo_errors.DocumentTooLarge: {len(bson.BSON.encode(variant_obj))})",
|
550
|
-
"warning",
|
551
|
-
)
|
552
|
-
|
553
|
-
|
554
531
|
def _compound_follow_filter_freq(compound, compound_var_obj, query_form):
|
555
532
|
"""When compound follow filter is selected, apply relevant settings from the query filter onto dismissing compounds.
|
556
533
|
|
@@ -895,11 +872,18 @@ def parse_variant(
|
|
895
872
|
compounds_have_changed = False
|
896
873
|
if get_compounds:
|
897
874
|
compounds_have_changed = update_compounds(store, variant_obj, case_dismissed_vars)
|
875
|
+
if update and compounds_have_changed:
|
876
|
+
store.variant_update_field(
|
877
|
+
variant_id=variant_obj["_id"],
|
878
|
+
field_name="compounds",
|
879
|
+
field_value=variant_obj["compounds"],
|
880
|
+
)
|
898
881
|
|
899
882
|
genes_have_changed = update_variant_genes(store, variant_obj, genome_build)
|
900
|
-
|
901
|
-
|
902
|
-
|
883
|
+
if update and genes_have_changed:
|
884
|
+
store.variant_update_field(
|
885
|
+
variant_id=variant_obj["_id"], field_name="genes", field_value=variant_obj["genes"]
|
886
|
+
)
|
903
887
|
|
904
888
|
variant_obj["comments"] = store.events(
|
905
889
|
institute_obj,
|
@@ -6,6 +6,7 @@
|
|
6
6
|
For further development, the server has a Swagger-like demo interface at https://bionano-access.scilifelab.se/Bnx/
|
7
7
|
which is useful for details, and for sniffing actual message content structure, required cookie variable names etc.
|
8
8
|
"""
|
9
|
+
|
9
10
|
import json
|
10
11
|
import logging
|
11
12
|
from typing import Dict, Iterable, List, Optional, Tuple
|
@@ -9,21 +9,22 @@ from flask_babel import Babel
|
|
9
9
|
from markupsafe import Markup
|
10
10
|
|
11
11
|
LOG = logging.getLogger(__name__)
|
12
|
-
try:
|
13
|
-
from chanjo_report.server.app import configure_template_filters
|
14
|
-
from chanjo_report.server.blueprints import report_bp
|
15
|
-
from chanjo_report.server.extensions import api as chanjo_api
|
16
|
-
except ImportError as error:
|
17
|
-
chanjo_api = None
|
18
|
-
report_bp = None
|
19
|
-
configure_template_filters = None
|
20
|
-
LOG.warning("chanjo-report is not properly installed! %s.", error)
|
21
12
|
|
22
13
|
|
23
14
|
class ChanjoReport:
|
24
15
|
"""Interfaces with chanjo-report. Creates the /reports endpoints in scout domain. Use Babel to set report language."""
|
25
16
|
|
26
17
|
def init_app(self, app):
|
18
|
+
try:
|
19
|
+
from chanjo_report.server.app import configure_template_filters
|
20
|
+
from chanjo_report.server.blueprints import report_bp
|
21
|
+
from chanjo_report.server.extensions import api as chanjo_api
|
22
|
+
except ImportError as error:
|
23
|
+
chanjo_api = None
|
24
|
+
report_bp = None
|
25
|
+
configure_template_filters = None
|
26
|
+
LOG.error(error)
|
27
|
+
|
27
28
|
if not chanjo_api:
|
28
29
|
raise ImportError(
|
29
30
|
"An SQL db path was given, but chanjo-report could not be registered."
|
@@ -43,9 +43,11 @@ class LdapManager(LDAPConn):
|
|
43
43
|
self.tls = Tls(
|
44
44
|
local_private_key_file=app.config["LDAP_CLIENT_PRIVATE_KEY"],
|
45
45
|
local_certificate_file=app.config["LDAP_CLIENT_CERT"],
|
46
|
-
validate=
|
47
|
-
|
48
|
-
|
46
|
+
validate=(
|
47
|
+
app.config["LDAP_REQUIRE_CERT"]
|
48
|
+
if app.config.get("LDAP_CLIENT_CERT")
|
49
|
+
else ssl.CERT_NONE
|
50
|
+
),
|
49
51
|
version=app.config["LDAP_TLS_VERSION"],
|
50
52
|
ca_certs_file=app.config["LDAP_CA_CERTS_FILE"],
|
51
53
|
valid_names=app.config["LDAP_VALID_NAMES"],
|
@@ -3,11 +3,15 @@
|
|
3
3
|
* Requires loqusdb version 2.5 or greater.
|
4
4
|
* If multiple instances are configured, version will be default's.
|
5
5
|
"""
|
6
|
+
|
6
7
|
import json
|
7
8
|
import logging
|
8
9
|
import subprocess
|
9
10
|
import traceback
|
10
11
|
from subprocess import CalledProcessError
|
12
|
+
from typing import Dict, Optional
|
13
|
+
|
14
|
+
from flask import flash
|
11
15
|
|
12
16
|
from scout.exceptions.config import ConfigError
|
13
17
|
from scout.utils.scout_requests import get_request_json as api_get
|
@@ -180,16 +184,9 @@ class LoqusDB:
|
|
180
184
|
}
|
181
185
|
return loqus_query
|
182
186
|
|
183
|
-
def get_variant(self, variant_info, loqusdb_id="default"):
|
184
|
-
"""Return information for a variant (SNV or SV) from loqusdb
|
185
|
-
|
186
|
-
Args:
|
187
|
-
variant_info(dict)
|
188
|
-
loqusdb_id(string)
|
187
|
+
def get_variant(self, variant_info: dict, loqusdb_id: str = "default") -> Optional[Dict]:
|
188
|
+
"""Return information for a variant (SNV or SV) from loqusdb"""
|
189
189
|
|
190
|
-
Returns:
|
191
|
-
loqus_variant(dict)
|
192
|
-
"""
|
193
190
|
loqus_instance = self.loqusdb_settings.get(loqusdb_id)
|
194
191
|
if loqus_instance is None:
|
195
192
|
LOG.error(f"Could not find a Loqus instance with id:{loqusdb_id}")
|
@@ -202,7 +199,7 @@ class LoqusDB:
|
|
202
199
|
return self.get_api_loqus_variant(loqus_instance.get(API_URL), variant_info)
|
203
200
|
|
204
201
|
@staticmethod
|
205
|
-
def get_api_loqus_variant(api_url, variant_info):
|
202
|
+
def get_api_loqus_variant(api_url, variant_info) -> dict:
|
206
203
|
"""get variant data using a Loqus instance available via REST API
|
207
204
|
|
208
205
|
SNV/INDELS can be queried in loqus by defining a simple id. For SVs we need to call them
|
@@ -230,10 +227,15 @@ class LoqusDB:
|
|
230
227
|
search_url = f"{search_url}/?chrom={chrom}&end_chrom={end_chrom}&pos={pos}&end={end}&sv_type={sv_type}"
|
231
228
|
|
232
229
|
search_resp = api_get(search_url)
|
233
|
-
|
234
|
-
|
235
|
-
return
|
236
|
-
|
230
|
+
|
231
|
+
if search_resp.get("status_code") == 200:
|
232
|
+
return search_resp.get("content")
|
233
|
+
if search_resp.get("message"): # An error occurred during the request
|
234
|
+
flash(
|
235
|
+
f"Connection to Loqusdb instance returned error: '{search_resp['message']}'",
|
236
|
+
"warning",
|
237
|
+
)
|
238
|
+
return {}
|
237
239
|
|
238
240
|
def get_exec_loqus_variant(self, loqus_instance, variant_info):
|
239
241
|
"""Get variant data using a local executable instance of Loqus
|
scout/server/links.py
CHANGED
@@ -159,7 +159,7 @@ def genemania(hgnc_symbol):
|
|
159
159
|
|
160
160
|
|
161
161
|
def genenames(hgnc_id):
|
162
|
-
link = "https://www.genenames.org/
|
162
|
+
link = "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/HGNC:{}"
|
163
163
|
if not hgnc_id:
|
164
164
|
return None
|
165
165
|
return link.format(hgnc_id)
|
@@ -679,9 +679,9 @@ def snp_links(variant_obj):
|
|
679
679
|
if "rs" in snp:
|
680
680
|
snp_links[snp] = f"https://www.ncbi.nlm.nih.gov/snp/{snp}" # dbSNP
|
681
681
|
elif snp.isnumeric():
|
682
|
-
snp_links[
|
683
|
-
snp
|
684
|
-
|
682
|
+
snp_links[snp] = (
|
683
|
+
f"https://www.ncbi.nlm.nih.gov/clinvar/variation/{snp}" # ClinVar variation
|
684
|
+
)
|
685
685
|
|
686
686
|
return snp_links
|
687
687
|
|
@@ -333,7 +333,7 @@ body {
|
|
333
333
|
|
334
334
|
/* Closed submenu icon */
|
335
335
|
#sidebar-container .list-group .list-group-item[aria-expanded="false"] .submenu-icon::after {
|
336
|
-
content: " \
|
336
|
+
content: " \f0da";
|
337
337
|
font-family: "Font Awesome 5 Free", ui-monospace;
|
338
338
|
font-weight: 900;
|
339
339
|
display: inline;
|
@@ -342,7 +342,7 @@ body {
|
|
342
342
|
}
|
343
343
|
/* Opened submenu icon */
|
344
344
|
#sidebar-container .list-group .list-group-item[aria-expanded="true"] .submenu-icon::after {
|
345
|
-
content: " \
|
345
|
+
content: " \f0d7";
|
346
346
|
font-family: "Font Awesome 5 Free", ui-monospace;
|
347
347
|
font-weight: 900;
|
348
348
|
display: inline;
|
@@ -353,15 +353,15 @@ body {
|
|
353
353
|
|
354
354
|
/* Closed submenu icon - general case */
|
355
355
|
.text-body[aria-expanded="false"] .collapse-icon::after {
|
356
|
-
content: " \
|
356
|
+
content: " \f0da";
|
357
357
|
font-family: "Font Awesome 5 Free", ui-monospace;
|
358
358
|
font-weight: 900;
|
359
359
|
display: inline;
|
360
360
|
text-align: left;
|
361
361
|
}
|
362
|
-
/*
|
362
|
+
/* Open submenu icon - general case */
|
363
363
|
.text-body[aria-expanded="true"] .collapse-icon::after {
|
364
|
-
content: " \
|
364
|
+
content: " \f0d7";
|
365
365
|
font-family: "Font Awesome 5 Free", ui-monospace;
|
366
366
|
font-weight: 900;
|
367
367
|
display: inline;
|
@@ -145,7 +145,7 @@
|
|
145
145
|
<span class='badge bg-secondary'>edited</span>
|
146
146
|
{% endif %}
|
147
147
|
{% if comment.user_id == current_user.email %}
|
148
|
-
<button class="btn btn-link btn-sm" type="submit" name="remove"><i class="fa fa-
|
148
|
+
<button class="btn btn-link btn-sm" type="submit" name="remove"><i class="fa fa-times"></i></button>
|
149
149
|
<button class="btn btn-link btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#editComment_{{index}}"><i class="fa fa-edit"></i></button>
|
150
150
|
{% endif %}
|
151
151
|
</small>
|
scout/utils/scout_requests.py
CHANGED
scout/utils/sort.py
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
from scout.constants import FILE_TYPE_MAP
|
2
|
+
|
3
|
+
|
4
|
+
def get_load_priority(category: str = None, variant_type: str = None, file_type: str = None) -> int:
|
5
|
+
"""
|
6
|
+
Returns most urgent, highest load priority (numerically the lowest prio number) for the given variables
|
7
|
+
from a FILE_TYPE_MAP dict of dicts. Helper useful in a sort function.
|
8
|
+
"""
|
9
|
+
ordered_file_type_map = sorted(FILE_TYPE_MAP.items(), key=lambda ftm: ftm[1]["load_priority"])
|
10
|
+
|
11
|
+
for ftm in ordered_file_type_map:
|
12
|
+
if file_type and file_type != ftm[0]:
|
13
|
+
continue
|
14
|
+
|
15
|
+
if category and category != ftm[1]["category"]:
|
16
|
+
continue
|
17
|
+
|
18
|
+
if variant_type and variant_type != ftm[1]["variant_type"]:
|
19
|
+
continue
|
20
|
+
|
21
|
+
return ftm[1]["load_priority"]
|
@@ -1,12 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: scout-browser
|
3
|
-
Version: 4.
|
3
|
+
Version: 4.85
|
4
4
|
Summary: Clinical DNA variant visualizer and browser.
|
5
5
|
Home-page: https://github.com/Clinical-Genomics/scout
|
6
6
|
Author: Måns Magnusson
|
7
7
|
Author-email: mans.magnusson@scilifelab.se
|
8
|
-
License: UNKNOWN
|
9
|
-
Platform: UNKNOWN
|
10
8
|
Classifier: Environment :: Web Environment
|
11
9
|
Classifier: Intended Audience :: Developers
|
12
10
|
Classifier: License :: OSI Approved :: BSD License
|
@@ -16,7 +14,8 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
16
14
|
Classifier: Topic :: Software Development :: Libraries
|
17
15
|
Classifier: Programming Language :: Python :: 3.6
|
18
16
|
Description-Content-Type: text/markdown
|
19
|
-
|
17
|
+
License-File: LICENSE
|
18
|
+
Requires-Dist: werkzeug
|
20
19
|
Requires-Dist: Flask >=2.0
|
21
20
|
Requires-Dist: Flask-Bootstrap
|
22
21
|
Requires-Dist: Flask-CORS
|
@@ -338,5 +337,3 @@ be found in [CONTRIBUTING](CONTRIBUTING.md).
|
|
338
337
|
[black-url]: https://github.com/psf/black
|
339
338
|
[woke-image]: https://github.com/Clinical-Genomics/scout/actions/workflows/woke.yml/badge.svg
|
340
339
|
[woke-url]: https://github.com/Clinical-Genomics/scout/actions/workflows/woke.yml
|
341
|
-
|
342
|
-
|