pybioos 0.0.16__py3-none-any.whl → 0.0.19__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.
bioos/__about__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # coding:utf-8
2
2
 
3
3
  # Package version
4
- __version__ = "0.0.16"
4
+ __version__ = "0.0.19"
bioos/bioos.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from pandas import DataFrame
2
2
  from volcengine.const.Const import REGION_CN_NORTH1
3
3
 
4
- from bioos.config import Config
4
+ from bioos.config import Config,DEFAULT_ENDPOINT
5
5
  from bioos.resource.utility import UtilityResource
6
6
  from bioos.resource.workspaces import Workspace
7
7
 
@@ -20,9 +20,9 @@ def status() -> Config.LoginInfo:
20
20
  return Config.login_info()
21
21
 
22
22
 
23
- def login(endpoint: str,
24
- access_key: str,
23
+ def login(access_key: str,
25
24
  secret_key: str,
25
+ endpoint: str = DEFAULT_ENDPOINT,
26
26
  region: str = REGION_CN_NORTH1) -> bool:
27
27
  """Login to the given endpoint using specified account and password.
28
28
 
@@ -35,14 +35,16 @@ def login(endpoint: str,
35
35
  *Example*:
36
36
  ::
37
37
 
38
- bioos.login(endpoint="https://cloud.xxxxx.xxx.cn",access_key="xxxxxxxx",secret_key="xxxxxxxx")
38
+ bioos.login(access_key="xxxxxxxx", secret_key="xxxxxxxx")
39
+ # or specify endpoint explicitly:
40
+ bioos.login(access_key="xxxxxxxx", secret_key="xxxxxxxx", endpoint="https://cloud.xxxxx.xxx.cn")
39
41
 
40
- :param endpoint: The environment to be logged in
41
- :type endpoint: str
42
42
  :param access_key: The specified account's access key
43
43
  :type access_key: str
44
44
  :param secret_key: Corresponding secret key of the access key
45
45
  :type secret_key: str
46
+ :param endpoint: The environment to be logged in (optional, defaults to Config._endpoint)
47
+ :type endpoint: str
46
48
  :param region: The region to be logged in
47
49
  :type region: str
48
50
  :return: Login result
@@ -50,7 +52,8 @@ def login(endpoint: str,
50
52
  """
51
53
  Config.set_access_key(access_key)
52
54
  Config.set_secret_key(secret_key)
53
- Config.set_endpoint(endpoint)
55
+ if endpoint is not None:
56
+ Config.set_endpoint(endpoint)
54
57
  Config.set_region(region)
55
58
  return Config.login_info().login_status == "Already logged in"
56
59
 
@@ -70,6 +73,28 @@ def list_workspaces() -> DataFrame:
70
73
  }).get("Items"))
71
74
 
72
75
 
76
+ def create_workspace(name: str, description: str) -> dict:
77
+ """Creates a new workspace in the login environment.
78
+
79
+ *Example*:
80
+ ::
81
+
82
+ bioos.create_workspace(name="My Workspace", description="This is my new workspace")
83
+
84
+ :param name: Name of the workspace to create
85
+ :type name: str
86
+ :param description: Description of the workspace
87
+ :type description: str
88
+ :return: Creation result containing workspace information
89
+ :rtype: dict
90
+ """
91
+ params = {
92
+ "Name": name,
93
+ "Description": description
94
+ }
95
+ return Config.service().create_workspace(params)
96
+
97
+
73
98
  def workspace(id_: str) -> Workspace: # 这里是workspace的入口
74
99
  """Returns the workspace for the given name .
75
100
 
bioos/bioos_workflow.py CHANGED
@@ -10,6 +10,7 @@ import pandas as pd
10
10
 
11
11
  from bioos import bioos
12
12
  from bioos.errors import NotFoundError, ParameterError
13
+ from bioos.config import DEFAULT_ENDPOINT
13
14
 
14
15
  def uniquify_columns(cols: list[str]) -> list[str]:
15
16
  seen, out = {}, []
@@ -23,6 +24,59 @@ def uniquify_columns(cols: list[str]) -> list[str]:
23
24
  out.append(f"{base}_{seen[base]}") # fastq → fastq_1 → fastq_2
24
25
  return out
25
26
 
27
+ def handle_null_values(input_dict):
28
+ """
29
+ 处理输入字典中的null值,避免在通过pybioos后台传输时引发错误。
30
+
31
+ Args:
32
+ input_dict: 输入的字典,可能包含null值
33
+
34
+ Returns:
35
+ 处理后的字典,null值已被适当处理
36
+ """
37
+ if not isinstance(input_dict, dict):
38
+ return input_dict
39
+
40
+ result = {}
41
+ for key, value in input_dict.items():
42
+ if value is None:
43
+
44
+ key_lower = key.lower()
45
+
46
+ # 明显的文件路径或字符串相关
47
+ if any(keyword in key_lower for keyword in ["file", "path", "dir", "name", "str", "text", "url", "uri"]):
48
+ result[key] = ""
49
+ # 明显的数字相关
50
+ elif any(keyword in key_lower for keyword in ["num", "count", "size", "int", "float", "length", "depth", "width", "height"]):
51
+ continue
52
+ # 布尔值相关
53
+ elif any(keyword in key_lower for keyword in ["flag", "bool", "enable", "disable", "is_", "has_"]):
54
+ continue
55
+ # 数组或列表相关
56
+ elif any(keyword in key_lower for keyword in ["list", "array", "items", "samples"]):
57
+ # 对于数组,null通常表示空数组
58
+ result[key] = []
59
+ else:
60
+ # 默认情况下,替换为空字符串,因为这是最安全的处理方式
61
+ result[key] = ""
62
+ elif isinstance(value, dict):
63
+ result[key] = handle_null_values(value)
64
+ elif isinstance(value, list):
65
+ processed_list = []
66
+ for item in value:
67
+ if isinstance(item, dict):
68
+ processed_list.append(handle_null_values(item))
69
+ elif item is None:
70
+ continue
71
+ else:
72
+ processed_list.append(item)
73
+ result[key] = processed_list
74
+ else:
75
+ result[key] = value
76
+
77
+ return result
78
+
79
+
26
80
  def recognize_files_from_input_json(workflow_input_json: dict) -> dict:
27
81
  putative_files = {}
28
82
 
@@ -133,6 +187,8 @@ class Bioos_workflow:
133
187
  # 处理provision,更新inputs_list
134
188
  inputs_list_update = []
135
189
  for input_dict in inputs_list:
190
+ # 处理null值
191
+ input_dict = handle_null_values(input_dict)
136
192
  input_dict_update = self.input_provision(input_dict,
137
193
  force_reupload)
138
194
  inputs_list_update.append(input_dict_update)
@@ -177,7 +233,8 @@ class Bioos_workflow:
177
233
  data_model_name: str = "dm",
178
234
  submission_desc: str = "Submit by pybioos",
179
235
  call_caching: bool = True,
180
- force_reupload: bool = False):
236
+ force_reupload: bool = False,
237
+ mount_tos: bool = False):
181
238
  if not os.path.isfile(input_json_file):
182
239
  raise ParameterError('Input_json_file is not found.')
183
240
  #给每一个data_model加一个uuid,保证不重复
@@ -186,6 +243,9 @@ class Bioos_workflow:
186
243
 
187
244
  input_json = json.load(open(input_json_file))
188
245
  self.logger.info("Load json input successfully.")
246
+
247
+ # 处理null值
248
+ input_json = handle_null_values(input_json)
189
249
 
190
250
  # putative files
191
251
  input_json_str = json.dumps(input_json)
@@ -228,6 +288,7 @@ class Bioos_workflow:
228
288
  "outputs": "{}",
229
289
  "submission_desc": submission_desc,
230
290
  "call_caching": call_caching,
291
+ "mount_tos": mount_tos,
231
292
  }
232
293
 
233
294
  # if the input json is a batch or singleton submission
@@ -323,7 +384,7 @@ def bioos_workflow():
323
384
  parser.add_argument("--endpoint",
324
385
  type=str,
325
386
  help="Bio-OS instance platform endpoint",
326
- default="https://bio-top.miracle.ac.cn")
387
+ default=DEFAULT_ENDPOINT)
327
388
  parser.add_argument(
328
389
  "--ak",
329
390
  type=str,
@@ -362,6 +423,12 @@ def bioos_workflow():
362
423
  action='store_true',
363
424
  help="Force reupolad tos existed files.")
364
425
 
426
+ parser.add_argument(
427
+ "--mount_tos",
428
+ action='store_true',
429
+ help="是否挂载tos",
430
+ default=False)
431
+
365
432
  parser.add_argument(
366
433
  "--monitor",
367
434
  action='store_true',
@@ -393,7 +460,8 @@ def bioos_workflow():
393
460
  data_model_name=parsed_args.data_model_name,
394
461
  submission_desc=parsed_args.submission_desc,
395
462
  call_caching=parsed_args.call_caching,
396
- force_reupload=parsed_args.force_reupload)
463
+ force_reupload=parsed_args.force_reupload,
464
+ mount_tos=parsed_args.mount_tos)
397
465
  bw.submit_workflow_bioosapi()
398
466
 
399
467
  # moniter
bioos/bw_import.py CHANGED
@@ -1,17 +1,13 @@
1
1
  #!/usr/bin/env python3
2
2
  # coding: utf-8
3
-
4
3
  import argparse
5
4
  import logging
6
5
  import os
7
6
  import sys
8
7
  import time
9
-
10
8
  from bioos import bioos
11
- from bioos.config import Config
9
+ from bioos.config import Config, DEFAULT_ENDPOINT
12
10
  from bioos.resource.workflows import WorkflowResource
13
-
14
-
15
11
  def get_logger():
16
12
  """Setup logger"""
17
13
  logger = logging.getLogger('bw_import')
@@ -23,14 +19,11 @@ def get_logger():
23
19
  logger.addHandler(handler)
24
20
  logger.setLevel(logging.INFO)
25
21
  return logger
26
-
27
-
28
22
  def bioos_workflow_import():
29
23
  """Command line entry point"""
30
24
  parser = argparse.ArgumentParser(
31
25
  description='Bio-OS Workflow Import Tool',
32
26
  formatter_class=argparse.RawDescriptionHelpFormatter)
33
-
34
27
  # 必需参数
35
28
  parser.add_argument(
36
29
  '--ak',
@@ -49,8 +42,10 @@ def bioos_workflow_import():
49
42
  parser.add_argument('--workflow_source',
50
43
  required=True,
51
44
  help='Local WDL file path or git repository URL')
52
-
53
45
  # 可选参数
46
+ parser.add_argument('--endpoint',
47
+ help='Bio-OS instance platform endpoint',
48
+ default=DEFAULT_ENDPOINT)
54
49
  parser.add_argument('--workflow_desc',
55
50
  help='Description for the workflow',
56
51
  default='')
@@ -67,16 +62,13 @@ def bioos_workflow_import():
67
62
  type=int,
68
63
  default=60,
69
64
  help='Time interval in seconds for checking workflow status')
70
-
71
65
  args = parser.parse_args()
72
66
  logger = get_logger()
73
-
74
67
  try:
75
68
  # 配置Bio-OS
76
69
  Config.set_access_key(args.ak)
77
70
  Config.set_secret_key(args.sk)
78
- Config.set_endpoint("https://bio-top.miracle.ac.cn")
79
-
71
+ Config.set_endpoint(args.endpoint)
80
72
  # 获取workspace ID
81
73
  workspaces = bioos.list_workspaces()
82
74
  workspace_info = workspaces.query(f"Name=='{args.workspace_name}'")
@@ -84,10 +76,8 @@ def bioos_workflow_import():
84
76
  logger.error(f"Workspace {args.workspace_name} not found")
85
77
  sys.exit(1)
86
78
  workspace_id = workspace_info["ID"].iloc[0]
87
-
88
79
  # 创建WorkflowResource实例
89
80
  workflow_resource = WorkflowResource(workspace_id)
90
-
91
81
  # 导入workflow
92
82
  try:
93
83
  result = workflow_resource.import_workflow(
@@ -99,19 +89,15 @@ def bioos_workflow_import():
99
89
  logger.info(
100
90
  f"Successfully uploaded workflow: {result}, validating..., please wait..."
101
91
  )
102
-
103
92
  # 如果设置了monitor参数,则监控工作流状态
104
93
  if args.monitor:
105
94
  max_retries = 10 # 最大重试次数
106
95
  retry_count = 0
107
-
108
96
  while retry_count < max_retries:
109
97
  df = workflow_resource.list()
110
98
  workflow_info = df[df.Name == args.workflow_name]
111
-
112
99
  if len(workflow_info) == 1:
113
100
  status = workflow_info.iloc[0]["Status"]["Phase"]
114
-
115
101
  if status == "Succeeded":
116
102
  logger.info(
117
103
  f"Workflow {args.workflow_name} validated successfully"
@@ -138,7 +124,6 @@ def bioos_workflow_import():
138
124
  f"Workflow {args.workflow_name} not found after import"
139
125
  )
140
126
  sys.exit(1)
141
-
142
127
  logger.error(
143
128
  f"Workflow validation timeout after {max_retries} retries")
144
129
  sys.exit(1)
@@ -148,15 +133,11 @@ def bioos_workflow_import():
148
133
  f"Workflow {args.workflow_name} is still validating, {result}, please wait and check the status later."
149
134
  )
150
135
  sys.exit(0)
151
-
152
136
  except Exception as e:
153
137
  logger.error(f"Failed to import workflow: {str(e)}")
154
138
  sys.exit(1)
155
-
156
139
  except Exception as e:
157
140
  logger.error(f"Error: {str(e)}")
158
141
  sys.exit(1)
159
-
160
-
161
142
  if __name__ == '__main__':
162
143
  bioos_workflow_import()
@@ -6,7 +6,7 @@ import logging
6
6
  import sys
7
7
 
8
8
  from bioos import bioos
9
- from bioos.config import Config
9
+ from bioos.config import Config, DEFAULT_ENDPOINT
10
10
  from bioos.resource.workflows import WorkflowResource
11
11
 
12
12
 
@@ -44,6 +44,11 @@ def bioos_workflow_status_check():
44
44
  parser.add_argument('--workflow_id',
45
45
  required=True,
46
46
  help='ID of the workflow to check')
47
+
48
+ # 可选参数
49
+ parser.add_argument('--endpoint',
50
+ help='Bio-OS instance platform endpoint',
51
+ default=DEFAULT_ENDPOINT)
47
52
 
48
53
  args = parser.parse_args()
49
54
  logger = get_logger()
@@ -52,7 +57,7 @@ def bioos_workflow_status_check():
52
57
  # 配置Bio-OS
53
58
  Config.set_access_key(args.ak)
54
59
  Config.set_secret_key(args.sk)
55
- Config.set_endpoint("https://bio-top.miracle.ac.cn")
60
+ Config.set_endpoint(args.endpoint)
56
61
 
57
62
  # 获取workspace ID
58
63
  workspaces = bioos.list_workspaces()
bioos/bw_status_check.py CHANGED
@@ -6,7 +6,7 @@ import logging
6
6
  import sys
7
7
 
8
8
  from bioos import bioos
9
- from bioos.config import Config
9
+ from bioos.config import Config, DEFAULT_ENDPOINT
10
10
  from bioos.resource.workflows import WorkflowResource
11
11
 
12
12
 
@@ -44,6 +44,11 @@ def bioos_workflow_status_check():
44
44
  parser.add_argument('--submission_id',
45
45
  required=True,
46
46
  help='ID of the submission to check')
47
+
48
+ # 可选参数
49
+ parser.add_argument('--endpoint',
50
+ help='Bio-OS instance platform endpoint',
51
+ default=DEFAULT_ENDPOINT)
47
52
 
48
53
  args = parser.parse_args()
49
54
  logger = get_logger()
@@ -52,7 +57,7 @@ def bioos_workflow_status_check():
52
57
  # 配置Bio-OS
53
58
  Config.set_access_key(args.ak)
54
59
  Config.set_secret_key(args.sk)
55
- Config.set_endpoint("https://bio-top.miracle.ac.cn")
60
+ Config.set_endpoint(args.endpoint)
56
61
 
57
62
  # 获取workspace ID
58
63
  workspaces = bioos.list_workspaces()
bioos/config.py CHANGED
@@ -7,6 +7,9 @@ from bioos.errors import ConfigurationError
7
7
  from bioos.log import PyLogger
8
8
  from bioos.service.BioOsService import BioOsService
9
9
 
10
+ # 默认的 Bio-OS endpoint
11
+ DEFAULT_ENDPOINT = "https://bio-top.miracle.ac.cn"
12
+
10
13
  LOGIN_STATUS = Literal['Already logged in', 'Not logged in']
11
14
 
12
15
 
@@ -14,7 +17,7 @@ class Config:
14
17
  _service: BioOsService = None
15
18
  _access_key: str = os.environ.get('VOLC_ACCESSKEY')
16
19
  _secret_key: str = os.environ.get('VOLC_SECRETKEY')
17
- _endpoint: str = os.environ.get('BIOOS_ENDPOINT')
20
+ _endpoint: str = os.environ.get('BIOOS_ENDPOINT', DEFAULT_ENDPOINT)
18
21
  _region: str = REGION_CN_NORTH1
19
22
  Logger = PyLogger() # 这里是把类赋给了Logger变量
20
23
 
@@ -7,7 +7,7 @@ import os
7
7
  import sys
8
8
 
9
9
  from bioos import bioos
10
- from bioos.config import Config
10
+ from bioos.config import Config, DEFAULT_ENDPOINT
11
11
 
12
12
 
13
13
  def get_logger():
@@ -48,6 +48,11 @@ def get_submission_logs():
48
48
  '--output_dir',
49
49
  default='.',
50
50
  help='Local directory to save the logs (default: current directory)')
51
+
52
+ # 可选参数
53
+ parser.add_argument('--endpoint',
54
+ help='Bio-OS instance platform endpoint',
55
+ default=DEFAULT_ENDPOINT)
51
56
 
52
57
  args = parser.parse_args()
53
58
  logger = get_logger()
@@ -56,7 +61,7 @@ def get_submission_logs():
56
61
  # 配置Bio-OS
57
62
  Config.set_access_key(args.ak)
58
63
  Config.set_secret_key(args.sk)
59
- Config.set_endpoint("https://bio-top.miracle.ac.cn")
64
+ Config.set_endpoint(args.endpoint)
60
65
 
61
66
  # 获取workspace ID
62
67
  workspaces = bioos.list_workspaces()
@@ -1 +1 @@
1
-
1
+ from .iesapp import WebInstanceApp, WebInstanceAppResource