datalab-api 0.2.4__tar.gz → 0.2.5__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datalab-api
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: A Python API for instances of the datalab data management platform (https://github.com/the-grey-group/datalab).
5
5
  Author-email: Matthew Evans <matthew@ml-evs.science>
6
6
  License: MIT
@@ -99,7 +99,7 @@ You can generate one for your account for a given *datalab* instance by visiting
99
99
 
100
100
  This API key can be set via the environment variable `DATALAB_API_KEY`.
101
101
  To suport the use case of needing to interact with multiple datalab instances, the client will also check prefixed environment variables that use the [`IDENTIFIER_PREFIX` of the chosen datalab instance](https://the-datalab.readthedocs.io/en/latest/config/#mandatory-settings), e.g., `GREY_DATALAB_API_KEY` or `PUBLIC_DATALAB_API_KEY`.
102
- Only keys that match will be read (e.g., other environment variables starting with `PUBLIC_` will be ignored, when connecting to the [public demo datalab](https://public.datalab.odbx.science)).
102
+ Only keys that match will be read (e.g., other environment variables starting with `PUBLIC_` will be ignored, when connecting to the [public demo datalab](https://demo.datalab-org.io)).
103
103
 
104
104
  ### Python API
105
105
 
@@ -108,7 +108,7 @@ This package implements basic functionality for displaying and manipulating entr
108
108
  ```python
109
109
  from datalab_api import DatalabClient
110
110
 
111
- with DatalabClient("https://public.api.odbx.science") as client:
111
+ with DatalabClient("https://demo-api.datalab-org.io") as client:
112
112
 
113
113
  # List all items of a given type
114
114
  items = client.get_items()
@@ -167,7 +167,7 @@ datalab > help get
167
167
  │ --help Show this message and exit. │
168
168
  ╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
169
169
 
170
- datalab > get samples api.odbx.science --page-limit 2
170
+ datalab > get samples demo-api.datalab-org.io --page-limit 2
171
171
  /samples/
172
172
  ┏━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
173
173
  ┃ type ┃ ID ┃ refcode ┃ name ┃ nblocks ┃ collections ┃ creators ┃
@@ -53,7 +53,7 @@ You can generate one for your account for a given *datalab* instance by visiting
53
53
 
54
54
  This API key can be set via the environment variable `DATALAB_API_KEY`.
55
55
  To suport the use case of needing to interact with multiple datalab instances, the client will also check prefixed environment variables that use the [`IDENTIFIER_PREFIX` of the chosen datalab instance](https://the-datalab.readthedocs.io/en/latest/config/#mandatory-settings), e.g., `GREY_DATALAB_API_KEY` or `PUBLIC_DATALAB_API_KEY`.
56
- Only keys that match will be read (e.g., other environment variables starting with `PUBLIC_` will be ignored, when connecting to the [public demo datalab](https://public.datalab.odbx.science)).
56
+ Only keys that match will be read (e.g., other environment variables starting with `PUBLIC_` will be ignored, when connecting to the [public demo datalab](https://demo.datalab-org.io)).
57
57
 
58
58
  ### Python API
59
59
 
@@ -62,7 +62,7 @@ This package implements basic functionality for displaying and manipulating entr
62
62
  ```python
63
63
  from datalab_api import DatalabClient
64
64
 
65
- with DatalabClient("https://public.api.odbx.science") as client:
65
+ with DatalabClient("https://demo-api.datalab-org.io") as client:
66
66
 
67
67
  # List all items of a given type
68
68
  items = client.get_items()
@@ -121,7 +121,7 @@ datalab > help get
121
121
  │ --help Show this message and exit. │
122
122
  ╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
123
123
 
124
- datalab > get samples api.odbx.science --page-limit 2
124
+ datalab > get samples demo-api.datalab-org.io --page-limit 2
125
125
  /samples/
126
126
  ┏━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
127
127
  ┃ type ┃ ID ┃ refcode ┃ name ┃ nblocks ┃ collections ┃ creators ┃
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import warnings
2
4
  from collections.abc import Iterable
3
5
  from pathlib import Path
@@ -19,7 +21,7 @@ class DatalabClient(BaseDatalabClient):
19
21
  amenable for use as a context manager, e.g.,
20
22
 
21
23
  ```python
22
- with DatalabClient("https://public.api.odbx.science") as client:
24
+ with DatalabClient("https://demo-api.datalab-org.io") as client:
23
25
  client.get_items()
24
26
  ```
25
27
 
@@ -46,7 +48,7 @@ class DatalabClient(BaseDatalabClient):
46
48
  )
47
49
  return user_resp.json()
48
50
 
49
- def get_items(self, item_type: Optional[str] = "samples") -> list[dict[str, Any]]:
51
+ def get_items(self, item_type: str | None = "samples") -> list[dict[str, Any]]:
50
52
  """List items of the given type available to the authenticated user.
51
53
 
52
54
  Parameters:
@@ -71,7 +73,7 @@ class DatalabClient(BaseDatalabClient):
71
73
  return items[item_type]
72
74
 
73
75
  def search_items(
74
- self, query: str, item_types: Union[Iterable[str], str] = ("samples", "cells")
76
+ self, query: str, item_types: Iterable[str] | str = ("samples", "cells")
75
77
  ) -> list[dict[str, Any]]:
76
78
  """Search for items of the given types that match the query.
77
79
 
@@ -102,15 +104,15 @@ class DatalabClient(BaseDatalabClient):
102
104
 
103
105
  def create_item(
104
106
  self,
105
- item_id: str,
106
- item_type: str,
107
- item_data: Optional[dict[str, Any]] = None,
108
- collection_id: Optional[str] = None,
107
+ item_id: str | None = None,
108
+ item_type: str = "samples",
109
+ item_data: dict[str, Any] | None = None,
110
+ collection_id: str | None = None,
109
111
  ) -> dict[str, Any]:
110
112
  """Create an item with a given ID and item data.
111
113
 
112
114
  Parameters:
113
- item_id: The ID of the item to create.
115
+ item_id: The ID of the item to create, if set to `None`, the server will generate one.
114
116
  item_type: The type of item to create, e.g., 'samples', 'cells'.
115
117
  item_data: The data for the item.
116
118
  collection_id: The ID of the collection to add the item to (optional).
@@ -133,7 +135,7 @@ class DatalabClient(BaseDatalabClient):
133
135
  create_item_url = f"{self.datalab_api_url}/new-sample/"
134
136
  create_item_resp = self.session.post(
135
137
  create_item_url,
136
- json=new_item,
138
+ json={"new_sample_data": new_item, "generate_id_automatically": item_id is None},
137
139
  follow_redirects=True,
138
140
  )
139
141
  try:
@@ -182,8 +184,8 @@ class DatalabClient(BaseDatalabClient):
182
184
 
183
185
  def get_item(
184
186
  self,
185
- item_id: Optional[str] = None,
186
- refcode: Optional[str] = None,
187
+ item_id: str | None = None,
188
+ refcode: str | None = None,
187
189
  load_blocks: bool = False,
188
190
  ) -> dict[str, Any]:
189
191
  """Get an item with a given ID or refcode.
@@ -287,7 +289,7 @@ class DatalabClient(BaseDatalabClient):
287
289
  raise RuntimeError(f"Failed to get block at {block_url}: {block['status']!r}.")
288
290
  return block["new_block_data"]
289
291
 
290
- def upload_file(self, item_id: str, file_path: Union[Path, str]) -> dict[str, Any]:
292
+ def upload_file(self, item_id: str, file_path: Path | str) -> dict[str, Any]:
291
293
  """Upload a file to an item with a given ID.
292
294
 
293
295
  Parameters:
@@ -327,8 +329,8 @@ class DatalabClient(BaseDatalabClient):
327
329
  self,
328
330
  item_id: str,
329
331
  block_type: str,
330
- file_ids: Optional[Union[str, list[str]]] = None,
331
- file_paths: Optional[Union[Path, list[Path]]] = None,
332
+ file_ids: str | list[str] | None = None,
333
+ file_paths: Path | list[Path] | None = None,
332
334
  ) -> dict[str, Any]:
333
335
  """Creates a data block for an item with the given block type and file ID.
334
336
 
@@ -385,7 +387,7 @@ class DatalabClient(BaseDatalabClient):
385
387
  return block_data
386
388
 
387
389
  def _update_data_block(
388
- self, block_type: str, block_data: dict, file_ids: Optional[Union[str, list[str]]] = None
390
+ self, block_type: str, block_data: dict, file_ids: str | list[str] | None = None
389
391
  ) -> dict[str, Any]:
390
392
  """Attaches files to blocks: should only be used via wrapper methods."""
391
393
  if file_ids and isinstance(file_ids, str):
@@ -436,7 +438,7 @@ class DatalabClient(BaseDatalabClient):
436
438
  return collection["data"]
437
439
 
438
440
  def create_collection(
439
- self, collection_id: str, collection_data: Optional[dict] = None
441
+ self, collection_id: str, collection_data: dict | None = None
440
442
  ) -> dict[str, Any]:
441
443
  """Create a collection with a given ID and collection data.
442
444
 
@@ -113,8 +113,8 @@ class BaseDatalabClient(metaclass=AutoPrettyPrint):
113
113
  Parameters:
114
114
  datalab_api_url: The URL of the Datalab API.
115
115
  TODO: If the URL of a datalab *UI* is provided, a request will be made to attempt
116
- to resolve the underlying API URL (e.g., `https://public.datalab.odbx.science`
117
- will 'redirect' to `https://public.api.odbx.science`).
116
+ to resolve the underlying API URL (e.g., `https://demo-api.datalab-org.io`
117
+ will 'redirect' to `https://demo-api.datalab-org.io`).
118
118
  log_level: The logging level to use for the client. Defaults to "WARNING".
119
119
 
120
120
 
@@ -31,13 +31,11 @@ def import_cheminventory(filename: Path, client: DatalabClient):
31
31
  inventory_df["item_id"] = inventory_df["Barcode"]
32
32
  # Fill missing barcodes
33
33
  inventory_df["item_id"] = inventory_df["item_id"].fillna(
34
- inventory_df["item_id"].apply(lambda _: _generate_random_startingmaterial_id())
34
+ inventory_df["item_id"].apply(lambda _: next(_generate_random_startingmaterial_id()))
35
35
  )
36
36
  inventory_df["Molecular Weight"] = inventory_df["Molecular Weight"].replace(" ", float("nan"))
37
37
 
38
- inventory_df = inventory_df.dropna()
39
-
40
- counts = {"success": 0, "duplicate": 0}
38
+ counts = {"success": 0, "duplicate": 0, "failed": 0}
41
39
 
42
40
  for item in inventory_df.to_dict(orient="records"):
43
41
  try:
@@ -47,5 +45,9 @@ def import_cheminventory(filename: Path, client: DatalabClient):
47
45
  counts["success"] += 1
48
46
  except DuplicateItemError:
49
47
  counts["duplicate"] += 1
48
+ except Exception as exc:
49
+ counts["failed"] += 1
50
+ print(f"Failed to import item: {item}. Error: {exc}")
51
+ continue
50
52
 
51
53
  print(f"Done: {counts=}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datalab-api
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: A Python API for instances of the datalab data management platform (https://github.com/the-grey-group/datalab).
5
5
  Author-email: Matthew Evans <matthew@ml-evs.science>
6
6
  License: MIT
@@ -99,7 +99,7 @@ You can generate one for your account for a given *datalab* instance by visiting
99
99
 
100
100
  This API key can be set via the environment variable `DATALAB_API_KEY`.
101
101
  To suport the use case of needing to interact with multiple datalab instances, the client will also check prefixed environment variables that use the [`IDENTIFIER_PREFIX` of the chosen datalab instance](https://the-datalab.readthedocs.io/en/latest/config/#mandatory-settings), e.g., `GREY_DATALAB_API_KEY` or `PUBLIC_DATALAB_API_KEY`.
102
- Only keys that match will be read (e.g., other environment variables starting with `PUBLIC_` will be ignored, when connecting to the [public demo datalab](https://public.datalab.odbx.science)).
102
+ Only keys that match will be read (e.g., other environment variables starting with `PUBLIC_` will be ignored, when connecting to the [public demo datalab](https://demo.datalab-org.io)).
103
103
 
104
104
  ### Python API
105
105
 
@@ -108,7 +108,7 @@ This package implements basic functionality for displaying and manipulating entr
108
108
  ```python
109
109
  from datalab_api import DatalabClient
110
110
 
111
- with DatalabClient("https://public.api.odbx.science") as client:
111
+ with DatalabClient("https://demo-api.datalab-org.io") as client:
112
112
 
113
113
  # List all items of a given type
114
114
  items = client.get_items()
@@ -167,7 +167,7 @@ datalab > help get
167
167
  │ --help Show this message and exit. │
168
168
  ╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
169
169
 
170
- datalab > get samples api.odbx.science --page-limit 2
170
+ datalab > get samples demo-api.datalab-org.io --page-limit 2
171
171
  /samples/
172
172
  ┏━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
173
173
  ┃ type ┃ ID ┃ refcode ┃ name ┃ nblocks ┃ collections ┃ creators ┃
File without changes
File without changes
File without changes