tol-sdk 1.8.9__py3-none-any.whl → 1.8.11__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.
@@ -30,10 +30,13 @@ class DataSourceUtils:
30
30
  @classmethod
31
31
  def get_datasource_by_datasource_instance(
32
32
  cls,
33
- datasource_instance: DataObject
33
+ datasource_instance: DataObject,
34
+ **kwargs
34
35
  ) -> DataSource:
35
36
  datasource_config = datasource_instance.data_source_config
36
- kwargs = dict(datasource_instance.kwargs) if datasource_instance.kwargs else {}
37
+ new_kwargs = dict(datasource_instance.kwargs) if datasource_instance.kwargs else {}
38
+ if kwargs:
39
+ new_kwargs.update(kwargs)
37
40
  if datasource_config:
38
41
  relationship_config = cls.get_relationship_config_from_data_source_config(
39
42
  datasource_config
@@ -44,14 +47,14 @@ class DataSourceUtils:
44
47
  runtime_fields = cls.get_runtime_fields_from_data_source_config(
45
48
  datasource_config
46
49
  )
47
- kwargs.update({
50
+ new_kwargs.update({
48
51
  'relationship_cfg': relationship_config,
49
52
  'attribute_metadata': amd,
50
53
  'runtime_fields': runtime_fields
51
54
  })
52
55
  return DataSourceUtils.get_datasource_by_name(
53
56
  datasource_instance.builtin_name,
54
- **kwargs
57
+ **new_kwargs
55
58
  )
56
59
 
57
60
  @classmethod
@@ -83,7 +86,6 @@ class DataSourceUtils:
83
86
  cls,
84
87
  datasource_config: DataObject
85
88
  ) -> dict:
86
- from ..elastic.runtime_fields import RuntimeFields # Break circular import cycle
87
89
  runtime_fields = {}
88
90
  f = DataSourceFilter()
89
91
  f.and_ = {
@@ -95,6 +97,7 @@ class DataSourceUtils:
95
97
  if dsa.object_type not in runtime_fields:
96
98
  runtime_fields[dsa.object_type] = {}
97
99
  if 'function' in dsa.runtime_definition:
100
+ from ..elastic.runtime_fields import RuntimeFields # Break circular import cycle
98
101
  method = getattr(RuntimeFields, dsa.runtime_definition['function'])
99
102
  runtime_fields[dsa.object_type][dsa.name] = \
100
103
  method(**dsa.runtime_definition.get('function_kwargs', {}))
tol/goat/client.py CHANGED
@@ -57,7 +57,7 @@ class GoatApiClient:
57
57
  r.raise_for_status()
58
58
  return r.json()['results'] if 'results' in r.json() else [], r.json()['status']['hits']
59
59
 
60
- def __detail_url(self, object_type: str, object_ids: str) -> Tuple[str, Dict]:
60
+ def __detail_url(self, object_type: str, object_ids: list[str]) -> Tuple[str, Dict]:
61
61
  obj_ids_str = ','.join(object_ids)
62
62
  return self.__page_url(object_type, 1, len(object_ids), f'tax_name({obj_ids_str})')
63
63
 
@@ -8,8 +8,6 @@ import typing
8
8
  from functools import cache
9
9
  from typing import Callable, Iterable, List, Optional
10
10
 
11
- from more_itertools import seekable
12
-
13
11
  from .client import GoatApiClient
14
12
  from .converter import (
15
13
  GoatApiConverter
@@ -113,27 +111,20 @@ class GoatDataSource(
113
111
  def get_by_id(
114
112
  self,
115
113
  object_type: str,
116
- object_ids: Iterable[str],
114
+ object_ids: Iterable[str | int],
117
115
  **kwargs,
118
116
  ) -> Iterable[Optional[DataObject]]:
119
117
  if object_type not in self.supported_types:
120
118
  raise DataSourceError(f'{object_type} is not supported')
121
119
 
120
+ object_ids_str = [str(object_id) for object_id in object_ids]
122
121
  client = self.__client_factory()
123
- goat_response, _ = client.get_detail(object_type, object_ids)
122
+ goat_response, _ = client.get_detail(object_type, object_ids_str)
124
123
  goat_converter = self.__gc_factory()
125
124
 
126
125
  converted_objects, _ = goat_converter.convert_list(goat_response) \
127
126
  if goat_response is not None else ([], 0)
128
- seekable_objects = seekable(converted_objects)
129
- for id_ in object_ids:
130
- seekable_objects.seek(0)
131
- for obj in seekable_objects:
132
- if obj.id == id_:
133
- yield obj
134
- break
135
- else:
136
- yield None
127
+ return self.sort_by_id(converted_objects, object_ids_str)
137
128
 
138
129
  def get_list_page(
139
130
  self,
tol/sources/portaldb.py CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  import os
6
6
 
7
+ from .defaults import Defaults
7
8
  from ..api_client import (
8
9
  ApiDataSource,
9
10
  create_api_datasource
@@ -15,9 +16,10 @@ from ..core import (
15
16
 
16
17
  def portaldb(retries: int = 5, **kwargs) -> ApiDataSource:
17
18
  portaldb = create_api_datasource(
18
- api_url=os.getenv('PORTAL_URL') + os.getenv('PORTAL_API_PATH') + '/local',
19
+ api_url=os.getenv('PORTAL_URL', Defaults.PORTAL_URL)
20
+ + os.getenv('PORTAL_API_PATH', Defaults.PORTAL_API_PATH),
19
21
  token=os.getenv('PORTAL_API_KEY'),
20
- data_prefix='',
22
+ data_prefix='/local',
21
23
  retries=retries
22
24
  )
23
25
  core_data_object(portaldb)
tol/sources/sql.py ADDED
@@ -0,0 +1,25 @@
1
+ # SPDX-FileCopyrightText: 2023 Genome Research Ltd.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ from ..core import (
6
+ core_data_object
7
+ )
8
+ from ..sql import (
9
+ SqlDataSource,
10
+ create_sql_datasource
11
+ )
12
+
13
+
14
+ # Create a SQL datasource. This is also expecting the models to be passed in
15
+ # so would most likely be used within an app
16
+ def sql(models, db_uri, behind_api, database_factory, **kwargs) -> SqlDataSource:
17
+ sql_ds = create_sql_datasource(
18
+ models=models,
19
+ db_uri=db_uri,
20
+ behind_api=True,
21
+ database_factory=database_factory,
22
+ **kwargs
23
+ )
24
+ core_data_object(sql_ds)
25
+ return sql_ds
tol/sql/sql_datasource.py CHANGED
@@ -86,6 +86,7 @@ class SqlDataSource(
86
86
  sorter_factory: SorterFactory,
87
87
  user_id_getter: Optional[UserIdGetter] = None,
88
88
  attribute_metadata: AttributeMetadata = DefaultAttributeMetadata,
89
+ **kwargs
89
90
  ) -> None:
90
91
  self.__db = db
91
92
  self.__type_tablename_map = type_tablename_map
@@ -29,7 +29,7 @@ class TaxonMatchesGoatValidator(Validator):
29
29
  __goat_datasource: GoatDataSource
30
30
  _cached_taxa: dict[str, DataObject]
31
31
 
32
- def __init__(self, config: Config) -> None:
32
+ def __init__(self, config: Config, **kwargs) -> None:
33
33
  super().__init__()
34
34
  self.__config = config
35
35
  self.__goat_datasource = goat()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tol-sdk
3
- Version: 1.8.9
3
+ Version: 1.8.11
4
4
  Summary: SDK for interaction with ToL, Sanger and external services
5
5
  Author-email: ToL Platforms Team <tol-platforms@sanger.ac.uk>
6
6
  License: MIT
@@ -96,7 +96,7 @@ tol/core/data_source_dict.py,sha256=d-hSmoWTwG6IOc0cQTLap1EBslsxYIWGUd3ScSoeH_Q,
96
96
  tol/core/datasource.py,sha256=e9GaeDPfO_Gs7cgQhmNxCiSDlRNf64reegzFebcMNkA,6303
97
97
  tol/core/datasource_error.py,sha256=TqfqaPANG0gishadhA7myCmTO1Fg9u7hVZOvsY6BdAo,1660
98
98
  tol/core/datasource_filter.py,sha256=RY2S9kTx0XwdrFRSE2n2GohB9__fKGzFVsZrkN5hzQk,726
99
- tol/core/datasource_utils.py,sha256=18mwvFmtJL73_mxtFb56rKXZCGCtZFoEb8sWFKn3Yf0,6232
99
+ tol/core/datasource_utils.py,sha256=6J72RS49IO2quCaFUXBl4DnjZBlXx-aW3Zy9iuzyeQ8,6327
100
100
  tol/core/factory.py,sha256=qbLvp5mLTcHbxOjopqtnK-wbZrlskgXjRIREszZjSyE,9157
101
101
  tol/core/http_client.py,sha256=QyZarplEHVYIrqEfrySeHbawfbnBU4nN62TLt41x4tY,2242
102
102
  tol/core/relationship.py,sha256=etdyCjLbfi2tgkaqzE6cntpNtTzgT_jOPGeNKmPu5yc,4624
@@ -218,11 +218,11 @@ tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py,sha256
218
218
  tol/gap/__init__.py,sha256=aI9h4IEKAd_qCqJayj0fpUDgAYQxy0d8xyBtiABP0xY,134
219
219
  tol/gap/gap_datasource.py,sha256=SfBfJh1-2W5Kb5ABNRX7FBJVR8VuD096UQgZ2SKjI6A,3527
220
220
  tol/goat/__init__.py,sha256=6e_Wss7QPo5LY0YhlZz9iXsFAD5txMhSlhT5APWqr6Q,190
221
- tol/goat/client.py,sha256=_bjPkftZf6jMhJZErVOSbnf6ytIpSw9CbTEY21YM3Tg,3680
221
+ tol/goat/client.py,sha256=q8nqpqlkVplPqpN6EfnzkMXbOE_GJEZU4ImJKcrl6ko,3686
222
222
  tol/goat/converter.py,sha256=jHUWoJxZOHKp63S45FZA5DbU0rdvoKDkF0hUtedqnvE,1114
223
223
  tol/goat/factory.py,sha256=-SOz8VIb_Nljvx7VrLWAg-1CXel9w7wVKQnz9vyZSQo,2639
224
224
  tol/goat/filter.py,sha256=J-Fj8O7MSp1O1pIQGMhcMuIQycjYAEx_0ecXYZ9WSqI,3013
225
- tol/goat/goat_datasource.py,sha256=XEEjMwWxGV92vk1hkOEwYLhRjt2de77PZNMAT2scMdI,6107
225
+ tol/goat/goat_datasource.py,sha256=rADBYKiyteM8cW0RbG6s7vR5xnxF36NJ_Ogkou2VBZQ,5917
226
226
  tol/goat/parser.py,sha256=552e0p4rFXBnL7FpJ4AAf2kpnPYsh2PfzmZ95-YOSX8,4039
227
227
  tol/google_sheets/__init__.py,sha256=SDrDFfqkLFll0Y6MNFh2yuyyeIfDtFwK1XSnEpsLNgg,133
228
228
  tol/google_sheets/google_sheet_datasource.py,sha256=UPhcOZv5IJ2s91M_2wPcL00hl5Bou6qCLNWMjXdNNiQ,6501
@@ -290,9 +290,10 @@ tol/sources/labwhere.py,sha256=gbfpPNKEZEfvw9DXGshg1w4Kdo_tpjWoxndDza6Oa6E,541
290
290
  tol/sources/mlwh.py,sha256=wPs2yuU1A8v57jaDQbeIThraDqVtzzhm5DAa0qekApM,324
291
291
  tol/sources/portal.py,sha256=1mhX1c4fjbRoHJ86RuBgyXFbDJrVIV55pGwvnuOxVuA,761
292
292
  tol/sources/portal_attributes.py,sha256=j_ZIZ8RHpgbRzOdHSOnzhAM9xA0HcwiAxuVgybVtDrg,1926
293
- tol/sources/portaldb.py,sha256=A-eD_tpJ1cqyDEsnN_fEE67Zkl-WQnRcVlfodZzMcVw,545
293
+ tol/sources/portaldb.py,sha256=fZNIUk5mZ3RuQiknZQlPxOK6Vdz_pzqz1-w_dW0L2yE,626
294
294
  tol/sources/prefect.py,sha256=16PrC_KfvxrsDzAcq7UvEBo4c6_n38NC23vHQeiljck,1046
295
295
  tol/sources/sciops.py,sha256=qbdoNEo-BfWGw16sjANV7dxFRVMDJQlvaSZgofE8604,1129
296
+ tol/sources/sql.py,sha256=mP5hyNNoxi8yKY1Z-6G5EZ1VW24BW_3q5Hp-w5VpPmE,623
296
297
  tol/sources/sts.py,sha256=vd65QAYIM1lltHajqJPOrGg10ZCI7OUB2dbWNAlrAn8,749
297
298
  tol/sources/sts_legacy.py,sha256=jWDM1_Jicxhay9UEOGh4lzeO0TIxuH8sa34TCn-GDWQ,440
298
299
  tol/sources/tolid.py,sha256=ERSB5L_u7c4NtGYTzdGXWjiGiL58QJNC_0ij1MQMMEQ,663
@@ -314,7 +315,7 @@ tol/sql/relationship.py,sha256=EClMgVx_If5nZV9MV99TQk7Wr7uACWetwQdWAliM5XI,2891
314
315
  tol/sql/session.py,sha256=VmqTegr4L2X2zvaOJCpwSrkVRx8fc1RVL0drkL2MXu8,806
315
316
  tol/sql/sort.py,sha256=ENrjHGgj4fZtXKmkdlkv1HRi1X14SVlcl-tp8Pu7G0k,2553
316
317
  tol/sql/sql_converter.py,sha256=taD5FRwadvw2bBaUGrCIiUs0-ATAbBnRYI1M7xe3yEc,4618
317
- tol/sql/sql_datasource.py,sha256=RnPkfg4TSHaxfJG77eBrNgBAKexJaypc-fvfFzssdac,15598
318
+ tol/sql/sql_datasource.py,sha256=2FUwGTIN5Dw2cNAEb9fWGsZ0PVdjhdjn8WajA_9LT_Y,15615
318
319
  tol/sql/action/__init__.py,sha256=T1zAsCza_lvsNtXF1ecSLt9OFGup8tGnIs68YylBmXI,142
319
320
  tol/sql/action/factory.py,sha256=HkareJp_57ud0_Bdd9Kwz3_Rnq2l211sGJgftohFAHg,3589
320
321
  tol/sql/auth/__init__.py,sha256=e3JuwugXmXobklqZ1Mt1w03qPgb1WdUaJVM7oblzHyk,202
@@ -351,7 +352,7 @@ tol/validators/regex.py,sha256=dLAi_vQt9_DsT6wQZmbYC7X5-Wp15l0leUE6XkPaItg,2602
351
352
  tol/validators/regex_by_value.py,sha256=XM5EnT4vgD17rfpR3bUE9I56IemSw26BI9MZtMakd4E,2582
352
353
  tol/validators/specimens_have_same_taxon.py,sha256=BaJcZ38ZprPcuGTIorSxxC9uGN0_lj6HS6B54EObcuY,2183
353
354
  tol/validators/sts_fields.py,sha256=aYbzy15btEg4-ocDT1qrspe7-atoWRrOJ_KmuPU6J14,8936
354
- tol/validators/taxon_matches_goat.py,sha256=-5UJus3WZOc_ji5Kmat43nI6Auhr924BVi-igEnFP6Q,3482
355
+ tol/validators/taxon_matches_goat.py,sha256=lYZ0qwPver9wXJm2ekv_6KcC49MugVXD9t1IAxPGG2Q,3492
355
356
  tol/validators/tolid.py,sha256=VOb6lNFz11H_0KaWX8_nvsw8xJEa6KrjB0p-5lkcqog,3885
356
357
  tol/validators/types.py,sha256=jMVpckRp8RS93f7usf58YH_K-5rKWgZIYs7bO9dHhQc,2914
357
358
  tol/validators/unique_value_check.py,sha256=sFvDooYkKeORvULGEOTsgIcxlbe0AXDWxY3Gbr3j0KI,1282
@@ -360,9 +361,9 @@ tol/validators/unique_whole_organisms.py,sha256=RdqA1GzIf3LTdrmNGGdxv0aW2udDY2P9
360
361
  tol/validators/value_check.py,sha256=DdNx_B1gns01zgBg5N6Bwia46Aukw6MAteM-M37Kv1k,1122
361
362
  tol/validators/interfaces/__init__.py,sha256=jtOxnwnwqV_29xjmmMcS_kvlt-pQiWwQYJn2YRP07_w,172
362
363
  tol/validators/interfaces/condition_evaluator.py,sha256=nj8Cb8hi47OBy6OVNfeLhF-Pjwtr8MiOSymYL6hfVes,3766
363
- tol_sdk-1.8.9.dist-info/licenses/LICENSE,sha256=RF9Jacy-9BpUAQQ20INhTgtaNBkmdTolYCHtrrkM2-8,1077
364
- tol_sdk-1.8.9.dist-info/METADATA,sha256=MgDxVlsVbpKw9s2vFEdeeTUYpv9hdL48ETxeGTbGF-Y,3142
365
- tol_sdk-1.8.9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
366
- tol_sdk-1.8.9.dist-info/entry_points.txt,sha256=jH3HfTwxjzog7E3lq8CKpUWGIRY9FSXbyL6CpUmv6D0,36
367
- tol_sdk-1.8.9.dist-info/top_level.txt,sha256=PwKMQLphyZNvagBoriVbl8uwHXQl8IC1niawVG0iXMM,10
368
- tol_sdk-1.8.9.dist-info/RECORD,,
364
+ tol_sdk-1.8.11.dist-info/licenses/LICENSE,sha256=RF9Jacy-9BpUAQQ20INhTgtaNBkmdTolYCHtrrkM2-8,1077
365
+ tol_sdk-1.8.11.dist-info/METADATA,sha256=qwTqwgW3IHEgw2e6nNAwg6uXKrYh4Doo3ZkLVlWFaT8,3143
366
+ tol_sdk-1.8.11.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
367
+ tol_sdk-1.8.11.dist-info/entry_points.txt,sha256=jH3HfTwxjzog7E3lq8CKpUWGIRY9FSXbyL6CpUmv6D0,36
368
+ tol_sdk-1.8.11.dist-info/top_level.txt,sha256=PwKMQLphyZNvagBoriVbl8uwHXQl8IC1niawVG0iXMM,10
369
+ tol_sdk-1.8.11.dist-info/RECORD,,