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.
Files changed (58) hide show
  1. scout/__version__.py +1 -1
  2. scout/adapter/mongo/case.py +5 -1
  3. scout/adapter/mongo/cytoband.py +13 -0
  4. scout/adapter/mongo/hgnc.py +1 -1
  5. scout/adapter/mongo/variant.py +9 -0
  6. scout/adapter/mongo/variant_loader.py +73 -71
  7. scout/build/genes/hgnc_gene.py +5 -134
  8. scout/commands/download/ensembl.py +1 -0
  9. scout/commands/download/everything.py +1 -0
  10. scout/commands/download/exac.py +1 -0
  11. scout/commands/download/hgnc.py +1 -0
  12. scout/commands/download/hpo.py +1 -0
  13. scout/commands/download/omim.py +1 -0
  14. scout/commands/export/database.py +1 -0
  15. scout/commands/load/panel.py +1 -0
  16. scout/commands/load/report.py +1 -0
  17. scout/commands/update/genes.py +9 -13
  18. scout/commands/update/omim.py +1 -0
  19. scout/commands/update/panelapp.py +1 -0
  20. scout/constants/file_types.py +86 -17
  21. scout/export/exon.py +1 -0
  22. scout/load/all.py +5 -1
  23. scout/load/hgnc_gene.py +40 -7
  24. scout/models/hgnc_map.py +50 -87
  25. scout/models/phenotype_term.py +3 -3
  26. scout/parse/hgnc.py +1 -0
  27. scout/parse/orpha.py +1 -0
  28. scout/parse/variant/conservation.py +1 -0
  29. scout/parse/variant/transcript.py +1 -1
  30. scout/parse/variant/variant.py +10 -4
  31. scout/server/blueprints/cases/controllers.py +15 -1
  32. scout/server/blueprints/cases/templates/cases/case.html +96 -89
  33. scout/server/blueprints/cases/templates/cases/collapsible_actionbar.html +1 -1
  34. scout/server/blueprints/cases/templates/cases/gene_panel.html +27 -41
  35. scout/server/blueprints/cases/templates/cases/utils.html +1 -1
  36. scout/server/blueprints/panels/forms.py +1 -0
  37. scout/server/blueprints/variant/controllers.py +9 -14
  38. scout/server/blueprints/variants/controllers.py +11 -27
  39. scout/server/extensions/bionano_extension.py +1 -0
  40. scout/server/extensions/chanjo_extension.py +10 -9
  41. scout/server/extensions/gens_extension.py +1 -0
  42. scout/server/extensions/ldap_extension.py +5 -3
  43. scout/server/extensions/loqus_extension.py +16 -14
  44. scout/server/extensions/matchmaker_extension.py +1 -0
  45. scout/server/extensions/mongo_extension.py +1 -0
  46. scout/server/extensions/rerunner_extension.py +1 -0
  47. scout/server/links.py +4 -4
  48. scout/server/static/bs_styles.css +5 -5
  49. scout/server/templates/utils.html +1 -1
  50. scout/utils/ensembl_rest_clients.py +1 -0
  51. scout/utils/scout_requests.py +1 -0
  52. scout/utils/sort.py +21 -0
  53. {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/METADATA +3 -6
  54. {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/RECORD +58 -57
  55. {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/WHEEL +1 -1
  56. {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/entry_points.txt +0 -1
  57. {scout_browser-4.83.dist-info → scout_browser-4.85.dist-info}/LICENSE +0 -0
  58. {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 >Default <i class="fas fa-sort" data-bs-toggle="tooltip" title="Sort by default panel"></i></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="5">No panels linked to case</td>
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
- <div class="card-body">
45
- <form action="{{ url_for('cases.default_panels', institute_id=institute._id, case_name=case.display_name) }}" method="POST">
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 panel-default">
68
- <div class="panel-heading">Change default gene panels</div>
69
- <div class="card-body">
70
- <form action="{{ url_for('cases.default_panels', institute_id=institute._id, case_name=case.display_name) }}" method="POST">
71
- <div class="row">
72
- <div class="col-xs-4">
73
- <select name="panel_ids" class="form-control" multiple>
74
- {% for panel in case.panels %}
75
- <option value="{{ panel.panel_id }}" {% if panel.is_default %} selected {% endif %}>{{ panel.display_name }}</option>
76
- {% endfor %}
77
- </select>
78
- </div>
79
- <div class="col-xs-4">
80
- <button class="btn btn-secondary form-control">Save</button>
81
- </div>
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
- </form>
84
- </div>
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
 
@@ -676,7 +676,7 @@
676
676
  name="{{ button_name if button_name }}"
677
677
  value="{{ button_value if button_value }}"
678
678
  type="submit">
679
- <i class="fa fa-remove text-danger""></i>
679
+ <i class="fa fa-times text-danger"></i>
680
680
  </button>
681
681
  </div>
682
682
  </form>
@@ -1,4 +1,5 @@
1
1
  """Code for panel gene form"""
2
+
2
3
  from flask_wtf import FlaskForm
3
4
  from wtforms import BooleanField, SelectMultipleField, StringField
4
5
 
@@ -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
- obs_data[loqus_id] = {}
490
- loqus_settings = loqusdb.loqusdb_settings.get(loqus_id)
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 loqus_settings is None: # An instance might have been renamed or removed
492
+ if obs_data[loqus_id] is None:
493
493
  flash(
494
- f"Could not connect to the preselected loqusdb '{loqus_id}' instance",
494
+ f"Could not find a Loqus instance with id:{loqus_id}",
495
495
  "warning",
496
496
  )
497
- obs_data[loqus_id]["total"] = "N/A"
497
+ obs_data[loqus_id]["observations"] = "N/A"
498
498
  continue
499
- obs_data[loqus_id] = loqusdb.get_variant(
500
- loqus_query, loqusdb_id=loqus_id
501
- ) # collect observation on that loqus instance
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 nothin we can do
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
- if update and (compounds_have_changed or genes_have_changed):
902
- update_variant_store(store, variant_obj)
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."
@@ -2,6 +2,7 @@
2
2
 
3
3
  * Requires gens version 1.1.1 or greater
4
4
  """
5
+
5
6
  import logging
6
7
 
7
8
  LOG = logging.getLogger(__name__)
@@ -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=app.config["LDAP_REQUIRE_CERT"]
47
- if app.config.get("LDAP_CLIENT_CERT")
48
- else ssl.CERT_NONE,
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
- if search_resp.get("status_code") != 200:
234
- LOG.info(search_resp.get("detail"))
235
- return {}
236
- return search_resp.get("content")
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
@@ -1,6 +1,7 @@
1
1
  """Code for MatchMaker Exchange integration
2
2
  Tested with PatientMatcher: https://github.com/Clinical-Genomics/patientMatcher
3
3
  """
4
+
4
5
  import datetime
5
6
  import json
6
7
  import logging
@@ -1,4 +1,5 @@
1
1
  """Code for flask mongodb extension in scout"""
2
+
2
3
  import os
3
4
 
4
5
  from scout.adapter.client import get_connection
@@ -1,4 +1,5 @@
1
1
  """Code for Rerunner integration."""
2
+
2
3
  import logging
3
4
 
4
5
  LOG = logging.getLogger(__name__)
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/cgi-bin/gene_symbol_report?hgnc_id=HGNC:{}"
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
- ] = f"https://www.ncbi.nlm.nih.gov/clinvar/variation/{snp}" # ClinVar variation
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: " \f0d7";
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: " \f0da";
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: " \f0d7";
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
- /* Opened submenu icon - general case */
362
+ /* Open submenu icon - general case */
363
363
  .text-body[aria-expanded="true"] .collapse-icon::after {
364
- content: " \f0da";
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-remove"></i></button>
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>
@@ -1,4 +1,5 @@
1
1
  """Code for talking to ensembl rest API"""
2
+
2
3
  import logging
3
4
  from urllib.parse import urlencode
4
5
 
@@ -1,4 +1,5 @@
1
1
  """Code for performing requests"""
2
+
2
3
  import logging
3
4
  import urllib.request
4
5
  import zlib
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.83
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
- Requires-Dist: werkzeug <3
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
-