labkey 3.4.0__py3-none-any.whl → 4.0.0__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.
labkey/__init__.py CHANGED
@@ -14,6 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  __title__ = "labkey"
17
- __version__ = "3.4.0"
17
+ __version__ = "4.0.0"
18
18
  __author__ = "LabKey"
19
19
  __license__ = "Apache License 2.0"
labkey/domain.py CHANGED
@@ -48,6 +48,9 @@ class PropertyDescriptor:
48
48
  self.default_value_type = kwargs.pop(
49
49
  "default_value_type", kwargs.pop("defaultValueType", None)
50
50
  )
51
+ self.derivation_data_scope = kwargs.pop(
52
+ "derivation_data_scope", kwargs.pop("derivationDataScope", None)
53
+ )
51
54
  self.description = kwargs.pop("description", None)
52
55
  self.dimension = kwargs.pop("dimension", None)
53
56
  self.disable_editing = kwargs.pop("disable_editing", kwargs.pop("disableEditing", None))
@@ -120,6 +123,7 @@ class PropertyDescriptor:
120
123
  "defaultScale": self.default_scale,
121
124
  "defaultValue": self.default_value,
122
125
  "defaultValueType": self.default_value_type,
126
+ "derivationDataScope": self.derivation_data_scope,
123
127
  "description": self.description,
124
128
  "dimension": self.dimension,
125
129
  "disableEditing": self.disable_editing,
labkey/query.py CHANGED
@@ -15,15 +15,15 @@
15
15
  #
16
16
  """
17
17
  ############################################################################
18
- NAME:
19
- LabKey Query API
18
+ NAME:
19
+ LabKey Query API
20
20
 
21
- SUMMARY:
21
+ SUMMARY:
22
22
  This module provides functions for interacting with data on a LabKey Server.
23
23
 
24
24
  DESCRIPTION:
25
- This module is designed to simplify querying and manipulating data in LabKey Server.
26
- Its APIs are modeled after the LabKey Server JavaScript APIs of the same names.
25
+ This module is designed to simplify querying and manipulating data in LabKey Server.
26
+ Its APIs are modeled after the LabKey Server JavaScript APIs of the same names.
27
27
 
28
28
  Installation and Setup for the LabKey Python API:
29
29
  https://github.com/LabKey/labkey-api-python/blob/master/README.md
@@ -41,7 +41,7 @@ https://www.labkey.org/home/developer/forum/project-start.view
41
41
  ############################################################################
42
42
  """
43
43
  import functools
44
- from typing import List, TextIO
44
+ from typing import List, Literal, NotRequired, TextIO, TypedDict
45
45
 
46
46
  from .server_context import ServerContext
47
47
  from .utils import waf_encode
@@ -196,7 +196,7 @@ def delete_rows(
196
196
  :param transacted: whether all of the updates should be done in a single transaction
197
197
  :param audit_behavior: used to override the audit behavior for the update. See class query.AuditBehavior
198
198
  :param audit_user_comment: used to provide a comment that will be attached to certain detailed audit log records
199
- :param timeout: timeout of request in seconds (defaults to 30s)
199
+ :param timeout: timeout of request in seconds (defaults to 300s)
200
200
  :return:
201
201
  """
202
202
  url = server_context.build_url("query", "deleteRows.api", container_path=container_path)
@@ -232,7 +232,7 @@ def truncate_table(
232
232
  :param schema_name: schema of table
233
233
  :param query_name: table name to delete from
234
234
  :param container_path: labkey container path if not already set in context
235
- :param timeout: timeout of request in seconds (defaults to 30s)
235
+ :param timeout: timeout of request in seconds (defaults to 300s)
236
236
  :return:
237
237
  """
238
238
  url = server_context.build_url("query", "truncateTable.api", container_path=container_path)
@@ -275,7 +275,7 @@ def execute_sql(
275
275
  :param save_in_session: save query result as a named view to the session
276
276
  :param parameters: parameter values to pass through to a parameterized query
277
277
  :param required_version: Api version of response
278
- :param timeout: timeout of request in seconds (defaults to 30s)
278
+ :param timeout: timeout of request in seconds (defaults to 300s)
279
279
  :param waf_encode_sql: WAF encode sql in request (defaults to True)
280
280
  :return:
281
281
  """
@@ -331,7 +331,7 @@ def insert_rows(
331
331
  :param transacted: whether all of the updates should be done in a single transaction
332
332
  :param audit_behavior: used to override the audit behavior for the update. See class query.AuditBehavior
333
333
  :param audit_user_comment: used to provide a comment that will be attached to certain detailed audit log records
334
- :param timeout: timeout of request in seconds (defaults to 30s)
334
+ :param timeout: timeout of request in seconds (defaults to 300s)
335
335
  :return:
336
336
  """
337
337
  url = server_context.build_url("query", "insertRows.api", container_path=container_path)
@@ -407,6 +407,93 @@ def import_rows(
407
407
  return server_context.make_request(url, payload, method="POST", file_payload=file_payload)
408
408
 
409
409
 
410
+ class Command(TypedDict):
411
+ """
412
+ TypedDict representing a command for saveRows API.
413
+ """
414
+
415
+ audit_behavior: NotRequired[AuditBehavior]
416
+ audit_user_comment: NotRequired[str]
417
+ command: Literal["insert", "update", "delete"]
418
+ container_path: NotRequired[str]
419
+ extra_context: NotRequired[dict]
420
+ query_name: str
421
+ rows: List[any]
422
+ schema_name: str
423
+ skip_reselect_rows: NotRequired[bool]
424
+
425
+
426
+ def save_rows(
427
+ server_context: ServerContext,
428
+ commands: List[Command],
429
+ api_version: float = None,
430
+ container_path: str = None,
431
+ extra_context: dict = None,
432
+ timeout: int = _default_timeout,
433
+ transacted: bool = None,
434
+ validate_only: bool = None,
435
+ ):
436
+ """
437
+ Save inserts, updates, and/or deletes to potentially multiple tables with a single request.
438
+ :param server_context: A LabKey server context. See utils.create_server_context.
439
+ :param commands: A List of the update/insert/delete operations to be performed.
440
+ :param api_version: decimal value that indicates the response version of the api. If this is 13.2 or higher, a
441
+ request that fails validation will be returned as a successful response. Use the 'errorCount' and 'committed'
442
+ properties in the response to tell if it committed or not.
443
+ :param container_path: folder path if not already part of server_context
444
+ :param extra_context: Extra context object passed into the transformation/validation script environment.
445
+ :param timeout: Request timeout in seconds (defaults to 300s)
446
+ :param transacted: Whether all the commands should be done in a single transaction, so they all succeed or all
447
+ fail. Defaults to true.
448
+ :param validate_only: Whether the server should attempt to proceed through all the commands but not commit them to
449
+ the database. Useful for scenarios like giving incremental validation feedback as a user fills out a UI form but
450
+ does not save anything until they explicitly request a save.
451
+ """
452
+ url = server_context.build_url("query", "saveRows.api", container_path=container_path)
453
+
454
+ json_commands = []
455
+ for command in commands:
456
+ json_command = {
457
+ "command": command["command"],
458
+ "queryName": command["query_name"],
459
+ "schemaName": command["schema_name"],
460
+ "rows": command["rows"],
461
+ }
462
+
463
+ if command.get("audit_behavior") is not None:
464
+ json_command["auditBehavior"] = command["audit_behavior"]
465
+
466
+ if command.get("audit_user_comment") is not None:
467
+ json_command["auditUserComment"] = command["audit_user_comment"]
468
+
469
+ if command.get("container_path") is not None:
470
+ json_command["containerPath"] = command["container_path"]
471
+
472
+ if command.get("extra_context") is not None:
473
+ json_command["extraContext"] = command["extra_context"]
474
+
475
+ if command.get("skip_reselect_rows") is not None:
476
+ json_command["skipReselectRows"] = command["skip_reselect_rows"]
477
+
478
+ json_commands.append(json_command)
479
+
480
+ payload = {"commands": json_commands}
481
+
482
+ if api_version is not None:
483
+ payload["apiVersion"] = api_version
484
+
485
+ if extra_context is not None:
486
+ payload["extraContext"] = extra_context
487
+
488
+ if transacted is not None:
489
+ payload["transacted"] = transacted
490
+
491
+ if validate_only is not None:
492
+ payload["validateOnly"] = validate_only
493
+
494
+ return server_context.make_request(url, json=payload, timeout=timeout)
495
+
496
+
410
497
  def select_rows(
411
498
  server_context: ServerContext,
412
499
  schema_name: str,
@@ -450,7 +537,7 @@ def select_rows(
450
537
  :param include_update_column: Boolean value that indicates whether to include an Update link column in results
451
538
  :param selection_key:
452
539
  :param required_version: decimal value that indicates the response version of the api
453
- :param timeout: Request timeout in seconds (defaults to 30s)
540
+ :param timeout: Request timeout in seconds (defaults to 300s)
454
541
  :param ignore_filter: Boolean, if true, the command will ignore any filter that may be part of the chosen view.
455
542
  :return:
456
543
  """
@@ -534,7 +621,7 @@ def update_rows(
534
621
  :param transacted: whether all of the updates should be done in a single transaction
535
622
  :param audit_behavior: used to override the audit behavior for the update. See class query.AuditBehavior
536
623
  :param audit_user_comment: used to provide a comment that will be attached to certain detailed audit log records
537
- :param timeout: timeout of request in seconds (defaults to 30s)
624
+ :param timeout: timeout of request in seconds (defaults to 300s)
538
625
  :return:
539
626
  """
540
627
  url = server_context.build_url("query", "updateRows.api", container_path=container_path)
@@ -580,7 +667,7 @@ def move_rows(
580
667
  :param transacted: whether all of the updates should be done in a single transaction
581
668
  :param audit_behavior: used to override the audit behavior for the update. See class query.AuditBehavior
582
669
  :param audit_user_comment: used to provide a comment that will be attached to certain detailed audit log records
583
- :param timeout: timeout of request in seconds (defaults to 30s)
670
+ :param timeout: timeout of request in seconds (defaults to 300s)
584
671
  :return:
585
672
  """
586
673
  url = server_context.build_url("query", "moveRows.api", container_path=container_path)
@@ -726,6 +813,28 @@ class QueryWrapper:
726
813
  import_lookup_by_alternate_key,
727
814
  )
728
815
 
816
+ @functools.wraps(save_rows)
817
+ def save_rows(
818
+ self,
819
+ commands: List[Command],
820
+ api_version: float = None,
821
+ container_path: str = None,
822
+ extra_context: dict = None,
823
+ timeout: int = _default_timeout,
824
+ transacted: bool = None,
825
+ validate_only: bool = None,
826
+ ):
827
+ return save_rows(
828
+ self.server_context,
829
+ commands,
830
+ api_version,
831
+ container_path,
832
+ extra_context,
833
+ timeout,
834
+ transacted,
835
+ validate_only,
836
+ )
837
+
729
838
  @functools.wraps(select_rows)
730
839
  def select_rows(
731
840
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: labkey
3
- Version: 3.4.0
3
+ Version: 4.0.0
4
4
  Summary: Python client API for LabKey Server
5
5
  Home-page: https://github.com/LabKey/labkey-api-python
6
6
  Author: LabKey
@@ -19,6 +19,7 @@ Classifier: Operating System :: Microsoft
19
19
  Classifier: Operating System :: POSIX
20
20
  Classifier: Programming Language :: Python :: 3
21
21
  Classifier: Topic :: Scientific/Engineering
22
+ Requires-Python: >=3.10
22
23
  License-File: LICENSE.txt
23
24
  Requires-Dist: requests
24
25
  Provides-Extra: test
@@ -37,6 +38,7 @@ Requires-Dist: setuptools; extra == "build"
37
38
  Requires-Dist: build; extra == "build"
38
39
  Requires-Dist: twine; extra == "build"
39
40
  Requires-Dist: wheel; extra == "build"
41
+ Requires-Dist: packaging; extra == "build"
40
42
  Dynamic: author
41
43
  Dynamic: author-email
42
44
  Dynamic: classifier
@@ -49,6 +51,7 @@ Dynamic: maintainer
49
51
  Dynamic: maintainer-email
50
52
  Dynamic: provides-extra
51
53
  Dynamic: requires-dist
54
+ Dynamic: requires-python
52
55
  Dynamic: summary
53
56
 
54
57
  Python client API for LabKey Server. Supports query and experiment APIs.
@@ -1,16 +1,16 @@
1
- labkey/__init__.py,sha256=dM58BofELTYOYGq-HlslSKn1Vqqi2wIc_hH-L6Miu6s,695
1
+ labkey/__init__.py,sha256=T4v8wZcrOlithsBeKo-Bz0QDkEGNeKqYuz2cT2lhkRA,695
2
2
  labkey/api_wrapper.py,sha256=OxnV6_5jONWiwsi24TOXTKP5inXtAfABGqXAPua3eCM,1427
3
3
  labkey/container.py,sha256=DXmLhGsNnN_QLXa_tMCM0Xf_Kkz7B8KjRFhJT5I4FtY,5497
4
- labkey/domain.py,sha256=HpZ2zz1lqJcet4np_cCq06LfrCJsBClsPvSsCTKAj9M,22829
4
+ labkey/domain.py,sha256=WVkmtWNsQMe5wKV5cToc7ph1oLbrAOf5iiHtL9_qo8s,23028
5
5
  labkey/exceptions.py,sha256=00x-4oP_2d0SfZKxsGIs8QGvXiNq2y7C5hAzuzT3Gkk,3619
6
6
  labkey/experiment.py,sha256=6U4BXnYHNXCUF_mee0maK_CZDVm_lbMjC82ywx9YCTE,12062
7
- labkey/query.py,sha256=zQH7qO2UH8aSHLa8GhEklNvEb6fj2cjdB3AI4Q4m2n8,27133
7
+ labkey/query.py,sha256=dlVlmRZEDX5YZW7az4NOLIBpOyVn48M8EMe2IaXGIX0,31176
8
8
  labkey/security.py,sha256=wX_4qQkllh-y7U4cqYIxs89XHGUtbC5cCebBKbgl0Y8,15417
9
9
  labkey/server_context.py,sha256=pM8GtVu403mD8DQ3yz5mpC-DMUq-ZWPA-JzEHTRIJhA,7871
10
10
  labkey/storage.py,sha256=WpgpTWQzgig_qJXMGszFcFjtf8oMd2-6TBehSkpJPUg,6144
11
11
  labkey/utils.py,sha256=oL6qmHkpzLTm_9c7gSEzumv_MVh5s8fj6bOrbuslrV0,3233
12
- labkey-3.4.0.dist-info/licenses/LICENSE.txt,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
13
- labkey-3.4.0.dist-info/METADATA,sha256=ylw_5Z7GEKb-di9tDYJHO2aQEQ8mhajp2tpzEFN4hLQ,1733
14
- labkey-3.4.0.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
15
- labkey-3.4.0.dist-info/top_level.txt,sha256=DQIk1fQNg7NxxBsEt_K7k-aopiH87jmnU98zwDp0n04,7
16
- labkey-3.4.0.dist-info/RECORD,,
12
+ labkey-4.0.0.dist-info/licenses/LICENSE.txt,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
13
+ labkey-4.0.0.dist-info/METADATA,sha256=zM_7ByQficZ-sE_kmXjm8hR4hDS8YLGb4TWqPY9yxYo,1825
14
+ labkey-4.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
15
+ labkey-4.0.0.dist-info/top_level.txt,sha256=DQIk1fQNg7NxxBsEt_K7k-aopiH87jmnU98zwDp0n04,7
16
+ labkey-4.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5