bge-python-sdk 1.0.0__py3-none-any.whl → 2.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.
- bge_python_sdk-2.0.0.data/data/share/bash-completion/completions/bge.bash +14 -0
- bge_python_sdk-2.0.0.data/data/share/zsh/site-functions/_bge +14 -0
- {bge_python_sdk-1.0.0.dist-info → bge_python_sdk-2.0.0.dist-info}/LICENSE +1 -1
- {bge_python_sdk-1.0.0.dist-info → bge_python_sdk-2.0.0.dist-info}/METADATA +21 -26
- bge_python_sdk-2.0.0.dist-info/RECORD +96 -0
- {bge_python_sdk-1.0.0.dist-info → bge_python_sdk-2.0.0.dist-info}/WHEEL +1 -1
- {bge_python_sdk-1.0.0.dist-info → bge_python_sdk-2.0.0.dist-info}/top_level.txt +1 -0
- bgesdk/__init__.py +4 -4
- bgesdk/__main__.py +30 -38
- bgesdk/api/__init__.py +5 -0
- bgesdk/api/api.py +29 -0
- bgesdk/api/base.py +210 -0
- bgesdk/api/file.py +420 -0
- bgesdk/api/microbiome.py +143 -0
- bgesdk/api/misc.py +224 -0
- bgesdk/api/model.py +312 -0
- bgesdk/api/samples.py +181 -0
- bgesdk/api/stream.py +243 -0
- bgesdk/api/variants.py +93 -0
- bgesdk/client.py +98 -1437
- bgesdk/constants.py +32 -34
- bgesdk/error.py +130 -11
- bgesdk/fs.py +7 -2
- bgesdk/http.py +90 -43
- bgesdk/management/command.py +91 -8
- bgesdk/management/commands/api/__init__.py +11 -39
- bgesdk/management/commands/api/commands/aggregate_omics_data.py +22 -34
- bgesdk/management/commands/api/commands/applet_url.py +10 -14
- bgesdk/management/commands/api/commands/download.py +17 -27
- bgesdk/management/commands/api/commands/ferry_to_oss.py +18 -34
- bgesdk/management/commands/api/commands/get_data_items.py +13 -28
- bgesdk/management/commands/api/commands/get_externals.py +9 -23
- bgesdk/management/commands/api/commands/get_func_abundance.py +22 -31
- bgesdk/management/commands/api/commands/get_gene_abundance.py +14 -28
- bgesdk/management/commands/api/commands/get_overview.py +13 -23
- bgesdk/management/commands/api/commands/get_range_stream.py +15 -40
- bgesdk/management/commands/api/commands/get_samples.py +19 -41
- bgesdk/management/commands/api/commands/get_taxon_abundance.py +12 -28
- bgesdk/management/commands/api/commands/get_user.py +7 -11
- bgesdk/management/commands/api/commands/get_variants.py +9 -19
- bgesdk/management/commands/api/commands/id_meta.py +10 -26
- bgesdk/management/commands/api/commands/task.py +8 -15
- bgesdk/management/commands/api/commands/upload.py +17 -27
- bgesdk/management/commands/api/commands/upload_dir.py +19 -30
- bgesdk/management/commands/config.py +63 -89
- bgesdk/management/commands/login.py +42 -39
- bgesdk/management/commands/model.py +717 -692
- bgesdk/management/commands/token.py +22 -21
- bgesdk/management/commands/workon.py +6 -9
- bgesdk/management/constants.py +16 -25
- bgesdk/management/model_runtime/__init__.py +13 -0
- bgesdk/management/model_runtime/model_runtime.py +591 -0
- bgesdk/management/model_runtime/server/bge_model_server/__init__.py +10 -0
- bgesdk/management/model_runtime/server/bge_model_server/app/__init__.py +8 -0
- bgesdk/management/model_runtime/server/bge_model_server/app/__main__.py +54 -0
- bgesdk/management/model_runtime/server/bge_model_server/app/app_fastapi.py +168 -0
- bgesdk/management/model_runtime/server/bge_model_server/app/app_tornado.py +182 -0
- bgesdk/management/model_runtime/server/bge_model_server/app/logging_conf.py +80 -0
- bgesdk/management/model_runtime/server/build/lib/bge_model_server/__init__.py +10 -0
- bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/__init__.py +8 -0
- bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/__main__.py +54 -0
- bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/app_fastapi.py +168 -0
- bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/app_tornado.py +182 -0
- bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/logging_conf.py +80 -0
- bgesdk/management/model_runtime/server/build/lib/model_license.py +20 -0
- bgesdk/management/model_runtime/server/build/lib/secure.py +99 -0
- bgesdk/management/model_runtime/server/model_license.py +20 -0
- bgesdk/management/model_runtime/server/secure.py +99 -0
- bgesdk/management/model_runtime/server/setup.py +29 -0
- bgesdk/management/model_runtime/server/wheels/bge_model_server-0.1.0-py3-none-any.whl +0 -0
- bgesdk/management/utils.py +130 -65
- bgesdk/models.py +134 -55
- bgesdk/py.typed +2 -0
- bgesdk/utils.py +10 -12
- bgesdk/version.py +1 -3
- tests/__init__.py +2 -1
- tests/conftest.py +61 -14
- tests/test_abundance.py +57 -40
- tests/test_api_offline.py +160 -0
- tests/test_api_structure.py +115 -0
- tests/test_error.py +178 -0
- tests/test_fs.py +2 -2
- tests/test_model.py +3 -1
- tests/test_models.py +2 -4
- tests/test_models_offline.py +47 -0
- tests/test_oauth2.py +5 -6
- tests/test_phenotype.py +47 -22
- tests/test_samples.py +9 -10
- tests/test_token.py +138 -0
- tests/test_user.py +3 -1
- tests/test_variants.py +31 -21
- tests/test_wgs.py +29 -17
- bge_python_sdk-1.0.0.dist-info/RECORD +0 -60
- bgesdk/management/commands/model_doc.py +0 -359
- bgesdk/management/validate.py +0 -50
- {bge_python_sdk-1.0.0.dist-info → bge_python_sdk-2.0.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Bash completion for the `bge` command (BGE 开放平台 Python SDK).
|
|
2
|
+
#
|
|
3
|
+
# This file is installed into the bash-completion completions directory
|
|
4
|
+
# (share/bash-completion/completions) so it is sourced automatically by
|
|
5
|
+
# bash-completion. After `pip install bge-python-sdk`, tab completion for `bge`
|
|
6
|
+
# works out of the box — no manual `eval "$(register-python-argcomplete bge)"`
|
|
7
|
+
# is required.
|
|
8
|
+
#
|
|
9
|
+
# Zsh users: enable bash completion bridge once in ~/.zshrc:
|
|
10
|
+
# autoload -Uz bashcompinit && bashcompinit
|
|
11
|
+
|
|
12
|
+
if command -v register-python-argcomplete >/dev/null 2>&1; then
|
|
13
|
+
eval "$(register-python-argcomplete bge)"
|
|
14
|
+
fi
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Zsh completion for the `bge` command (BGE 开放平台 Python SDK).
|
|
2
|
+
#
|
|
3
|
+
# Installed into the zsh site-functions directory (share/zsh/site-functions) so
|
|
4
|
+
# zsh's completion system autoloads it automatically. The actual completion
|
|
5
|
+
# logic is delegated to argcomplete via `register-python-argcomplete`, which
|
|
6
|
+
# emits a shell-agnostic script (bash `complete` for bash, `compdef` for zsh).
|
|
7
|
+
#
|
|
8
|
+
# Bash users: this same logic is provided by completions/bge.bash, which is
|
|
9
|
+
# installed into share/bash-completion/completions and sourced automatically by
|
|
10
|
+
# bash-completion.
|
|
11
|
+
|
|
12
|
+
if command -v register-python-argcomplete >/dev/null 2>&1; then
|
|
13
|
+
eval "$(register-python-argcomplete bge)"
|
|
14
|
+
fi
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: bge-python-sdk
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: 可用于调用 BGE 开放平台的相关接口。
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Author-email: leafcoder@gmail.com,xiangji1204@genomics.cn
|
|
8
|
-
Maintainer: leafcoder
|
|
9
|
-
Maintainer-email: leafcoder@gmail.com
|
|
5
|
+
Author-email: leafcoder <leafcoder@gmail.com>, xiangji1204 <xiangji1204@genomics.cn>
|
|
6
|
+
Maintainer-email: leafcoder <leafcoder@gmail.com>
|
|
10
7
|
License: MIT
|
|
11
|
-
|
|
8
|
+
Project-URL: Homepage, https://github.com/teambge/bge-python-sdk
|
|
9
|
+
Keywords: bge-python-sdk,bge,bgesdk,sdk
|
|
12
10
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
11
|
Classifier: Intended Audience :: Developers
|
|
14
12
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -18,8 +16,6 @@ Classifier: Operating System :: Microsoft :: Windows :: Windows 10
|
|
|
18
16
|
Classifier: Operating System :: POSIX :: Linux
|
|
19
17
|
Classifier: Programming Language :: Python
|
|
20
18
|
Classifier: Programming Language :: Python :: 3
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.6
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
23
19
|
Classifier: Programming Language :: Python :: 3.8
|
|
24
20
|
Classifier: Programming Language :: Python :: 3.9
|
|
25
21
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -29,24 +25,23 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
29
25
|
Classifier: Topic :: Software Development :: Libraries
|
|
30
26
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
31
27
|
Classifier: Topic :: Utilities
|
|
32
|
-
Requires-Python: >=3.
|
|
28
|
+
Requires-Python: >=3.8
|
|
33
29
|
Description-Content-Type: text/markdown
|
|
34
30
|
License-File: LICENSE
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist:
|
|
37
|
-
Requires-Dist:
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist:
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist:
|
|
42
|
-
Requires-Dist:
|
|
43
|
-
Requires-Dist:
|
|
44
|
-
Requires-Dist:
|
|
45
|
-
|
|
46
|
-
Requires-Dist:
|
|
47
|
-
Requires-Dist:
|
|
48
|
-
Requires-Dist:
|
|
49
|
-
Requires-Dist: rich
|
|
31
|
+
Requires-Dist: requests>=2.25.0
|
|
32
|
+
Requires-Dist: oss2>=2.15.0
|
|
33
|
+
Requires-Dist: requests-toolbelt>=1.0.0
|
|
34
|
+
Requires-Dist: aliyun-python-sdk-core>=2.13.0
|
|
35
|
+
Requires-Dist: rich>=10.0.0
|
|
36
|
+
Requires-Dist: rich-argparse>=1.4.0
|
|
37
|
+
Requires-Dist: argcomplete>=2.0.0
|
|
38
|
+
Requires-Dist: python-minifier>=2.4.0
|
|
39
|
+
Requires-Dist: qprompt>=0.16.0
|
|
40
|
+
Requires-Dist: cython>=0.29.0
|
|
41
|
+
Provides-Extra: test
|
|
42
|
+
Requires-Dist: pytest>=7.0; extra == "test"
|
|
43
|
+
Requires-Dist: pytest-cov>=4.0; extra == "test"
|
|
44
|
+
Requires-Dist: requests-mock>=1.9.0; extra == "test"
|
|
50
45
|
|
|
51
46
|
|
|
52
47
|
<div align="center">
|
|
@@ -115,7 +110,7 @@ $ make install
|
|
|
115
110
|
再或者
|
|
116
111
|
|
|
117
112
|
```shell
|
|
118
|
-
$
|
|
113
|
+
$ pip install .
|
|
119
114
|
```
|
|
120
115
|
|
|
121
116
|
# SDK 文档
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
bge_python_sdk-2.0.0.data/data/share/bash-completion/completions/bge.bash,sha256=PlZTqWg2H3p-VzNqdrVn5Mb2jtMiMmcDuRTIvsHip7U,616
|
|
2
|
+
bge_python_sdk-2.0.0.data/data/share/zsh/site-functions/_bge,sha256=ZdIPbAfbfE8d2I7p4nCPOmGt5JHrn1oPakrDJn1QLAw,675
|
|
3
|
+
bgesdk/__init__.py,sha256=OdbWizZDIomghmTF4TNlS_Ol723_hNLWI0OWcFcYLfk,170
|
|
4
|
+
bgesdk/__main__.py,sha256=rD1iwLErz1a9b-GJVEwpFoqm6r6lOtekxvV0MuHXt9Q,1920
|
|
5
|
+
bgesdk/client.py,sha256=b-RGx2mxBDLoMuvjJ5tEr7jMbei0Rn9xf8ZF_qFpCZ4,8732
|
|
6
|
+
bgesdk/constants.py,sha256=rfXKIgAIzwMiZ2leAGpgaJutr8m822o0SCor2xeeH1o,1400
|
|
7
|
+
bgesdk/error.py,sha256=SHUub26MxMYe4xkEvX0IwmOuDV4aQE8yJR7f8YOgrUs,4194
|
|
8
|
+
bgesdk/fs.py,sha256=h8Sf1XamY9ZzckqQyxSRtRE9BA3QVXoAGfFU18r3Km0,327
|
|
9
|
+
bgesdk/http.py,sha256=XPiueVGdE4boGGxmkkkHEAPohF3-1V1VftW6VXthE3U,5949
|
|
10
|
+
bgesdk/models.py,sha256=6bf8YltYmeb8MUgjTHyv9zKfRWPFrdK3nlBU9TCZSXs,9022
|
|
11
|
+
bgesdk/py.typed,sha256=vo7IAzCszo-iTLqwrT4KlzuNcY-SuuRvwcacC7tXWx0,124
|
|
12
|
+
bgesdk/utils.py,sha256=TosA0dbviNINanPoHsG9HgG_v7WDIxSLLN04LD2y6sY,1461
|
|
13
|
+
bgesdk/version.py,sha256=hwOJuFUEKtsgiOt4l6op9s-hviovM6TK1uCdtRNWY4E,22
|
|
14
|
+
bgesdk/api/__init__.py,sha256=0F7v-9fcwx1VSaeSzxpyNvbjLdytheW4XgMf29v-EeU,83
|
|
15
|
+
bgesdk/api/api.py,sha256=pLFj-3NYXWU2ufDtFBIG2wMiIBgeCdMMqwcJy76FOLQ,847
|
|
16
|
+
bgesdk/api/base.py,sha256=lFLyG_RikpXHnEjYcIzREoCTyfldg22AsWccjw5n7sk,7358
|
|
17
|
+
bgesdk/api/file.py,sha256=DSKaI1779FNqMiRORW26w1T6xC2smr-BBzbWJpl84Dg,15602
|
|
18
|
+
bgesdk/api/microbiome.py,sha256=KkMv7FsHKRC_eTCzw5Od029sihb4M-HEEB564VZsi2c,4655
|
|
19
|
+
bgesdk/api/misc.py,sha256=EBFc0ytrmVJi9oPmeIf1scRPJccikQZnarWvlsHOl9A,7294
|
|
20
|
+
bgesdk/api/model.py,sha256=WHnQLszAmiPrirPwfElCLUMDgk02G64tNAEveGG5_3I,9439
|
|
21
|
+
bgesdk/api/samples.py,sha256=5FQvEkwGQB9rVeIy8cT-ZlrIkKZ9uaXn5n5R5ng9L60,6050
|
|
22
|
+
bgesdk/api/stream.py,sha256=06Wx1W_WqWdHmDo_cxTIRpwVDxmOm1NUSZS-KeOqTW4,9118
|
|
23
|
+
bgesdk/api/variants.py,sha256=FTQUU_yHgsyAqDGyN3Cs5o-e5rCIk1n8CQhLXNRMrsc,3226
|
|
24
|
+
bgesdk/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
+
bgesdk/management/command.py,sha256=7NrZF7imCGtvwaoj95BZ6P1VNtjpMJig7ijQHmX6ep8,3690
|
|
26
|
+
bgesdk/management/constants.py,sha256=JdF2ZmiJgpnGk9CFVG0kvNxNHuTj4r2cBxwcB2baD0s,1489
|
|
27
|
+
bgesdk/management/utils.py,sha256=2aHX89iRD3cNw0FfkrNq_zZyp4eOS2FcpzmqgYo9HXI,7909
|
|
28
|
+
bgesdk/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
+
bgesdk/management/commands/config.py,sha256=-oKlTMafIdFVFj_IlaW47IWIWDrjunqyhJG0WUlUK14,6344
|
|
30
|
+
bgesdk/management/commands/login.py,sha256=HwE5-0y-n-ic1uOYVvKkXVpxgYxJ9p7snBDg3zvPxQM,3975
|
|
31
|
+
bgesdk/management/commands/model.py,sha256=F449veJmCyeoGIyWPkzEA_uB2EXV1Wt0hg8DA3zxMjA,68897
|
|
32
|
+
bgesdk/management/commands/token.py,sha256=TtQjyFp-el9ktyzUyVRSIDALe8Eo_2aUORQPQjAMtFU,2560
|
|
33
|
+
bgesdk/management/commands/workon.py,sha256=yz7ByEmfVAuZfD2CsCzOqT0Av0UPtEV22uOe3LjzLhY,1184
|
|
34
|
+
bgesdk/management/commands/api/__init__.py,sha256=Bx9NBZZDOG404y2ySH7JllOyTG5pZOYveuf_uw4oe1A,868
|
|
35
|
+
bgesdk/management/commands/api/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
|
+
bgesdk/management/commands/api/commands/aggregate_omics_data.py,sha256=8CoPMW6ymqHvCJ36hr5PqN8gqR4GVKQ9ZZRB9R3fJGA,3061
|
|
37
|
+
bgesdk/management/commands/api/commands/applet_url.py,sha256=kflNBInZ_O9nm3n1PA0GipMAx28wVcmV2K0mURR_Tjw,2464
|
|
38
|
+
bgesdk/management/commands/api/commands/download.py,sha256=q7Us1-47P2dYjn6zM5QiHvZEFL8NcrNZv5zK6ns2dgQ,3350
|
|
39
|
+
bgesdk/management/commands/api/commands/ferry_to_oss.py,sha256=YblVUIHXPEugk00lPvds9mXUQ05j61xeDDOuMzpB_-4,3945
|
|
40
|
+
bgesdk/management/commands/api/commands/get_data_items.py,sha256=IVqdJnydp2LA4ThGmBrQDOkoaIc0FZh0WSwJE7foZE0,2373
|
|
41
|
+
bgesdk/management/commands/api/commands/get_externals.py,sha256=YJmn5ThUKgwYL2UKCexzPyeL6HwOoZ4ybqsFBpLSmxA,1731
|
|
42
|
+
bgesdk/management/commands/api/commands/get_func_abundance.py,sha256=SFGvbSswvr2phQyyEuVyuOt8aFn1UoKeJzW3Y-N6OT0,2597
|
|
43
|
+
bgesdk/management/commands/api/commands/get_gene_abundance.py,sha256=nkUFCzmhlPnEyGvgDC__slFZfyaW8_oJHxDCV8Md-eQ,2730
|
|
44
|
+
bgesdk/management/commands/api/commands/get_overview.py,sha256=P6Wb36btM86DJzsffyDmFZ45xDNEXEfYX293vPyHPJE,2924
|
|
45
|
+
bgesdk/management/commands/api/commands/get_range_stream.py,sha256=3wlmLfftHyNFJakDwEXL82D7OsWMWOfKvvbV5yCTcCE,2625
|
|
46
|
+
bgesdk/management/commands/api/commands/get_samples.py,sha256=x3ylkfoAWsF8DzYvoSFQZ_gIfmBNaQQ14w0wVyehq6k,3261
|
|
47
|
+
bgesdk/management/commands/api/commands/get_taxon_abundance.py,sha256=D2vo0iZeM2ZXjWR49ewaPpfPn9WrjCk_OzjSTADxpG0,2155
|
|
48
|
+
bgesdk/management/commands/api/commands/get_user.py,sha256=kM5YuFVO8PiTTjBXhxx7l6kx0E7niB1MXPOSFij9E7s,1486
|
|
49
|
+
bgesdk/management/commands/api/commands/get_variants.py,sha256=Xx_uRMnvJ5a5U5IICslQk_q_Kw3a88D5vSFqasA0-vY,1787
|
|
50
|
+
bgesdk/management/commands/api/commands/id_meta.py,sha256=qIN9JUufkElaWx5H9z6BDBjqsAZKOMYCKNrMcFSwIaY,1817
|
|
51
|
+
bgesdk/management/commands/api/commands/task.py,sha256=2aPWwahTIBCAgxzXuq1bKS5Ie6tr_95RXIjef5RNX8g,1575
|
|
52
|
+
bgesdk/management/commands/api/commands/upload.py,sha256=VF9nD_dWkPdJm7LrfVKvwTzO_nNhLEGI7KDKb0sQp24,3741
|
|
53
|
+
bgesdk/management/commands/api/commands/upload_dir.py,sha256=mtaYhVbZ_FzFrH_yEzV9fTqOzL5BdSdJ7EzwF7QFylM,4145
|
|
54
|
+
bgesdk/management/model_runtime/__init__.py,sha256=e8fi6ANGq_HB1O7RdTQIE9FBTV_bhjV8dyYjOTfncgc,782
|
|
55
|
+
bgesdk/management/model_runtime/model_runtime.py,sha256=3fMWuIXacadVuJS69AOhzW5DP5u4edwvdNmzob4lyk8,24064
|
|
56
|
+
bgesdk/management/model_runtime/server/model_license.py,sha256=B0v34mbAOK6KYh-zhNpPNu3CVyYclpJ1YgGonOjS7Kw,663
|
|
57
|
+
bgesdk/management/model_runtime/server/secure.py,sha256=Yb7w3sJXqnKSzJ-OjLgGrtoi8z7Zbf0KF1guCgopHtA,3034
|
|
58
|
+
bgesdk/management/model_runtime/server/setup.py,sha256=-z_IdaIp6y7gKyUJLupj-ZhAXbZG9D8dCoXzNtz1_-I,1050
|
|
59
|
+
bgesdk/management/model_runtime/server/bge_model_server/__init__.py,sha256=5vTjaeWdfgLskCVllmGJ90H7Pj-ahmlwv20DDsZiPKA,456
|
|
60
|
+
bgesdk/management/model_runtime/server/bge_model_server/app/__init__.py,sha256=XWKY22HpwNVvQS9Y3K01CdIB2CFz1_PKzxyK1hiWK5U,360
|
|
61
|
+
bgesdk/management/model_runtime/server/bge_model_server/app/__main__.py,sha256=6INveqPg-MOZfLOca1tsl4rf9HOqbGh_HUMUaXOy4vE,1858
|
|
62
|
+
bgesdk/management/model_runtime/server/bge_model_server/app/app_fastapi.py,sha256=2yk7JERY9q5nikY5FjD_EOJdztSYYskmsvk3Gsq9Gyg,5257
|
|
63
|
+
bgesdk/management/model_runtime/server/bge_model_server/app/app_tornado.py,sha256=zCUVIrew3bTKlJZ-wtwNL5BB-P9gE6eENfmVhEcYjHY,6146
|
|
64
|
+
bgesdk/management/model_runtime/server/bge_model_server/app/logging_conf.py,sha256=7tbT93F-4nI-nV4elIMO2qH6wjSjxv0wJqMq29LguHg,2136
|
|
65
|
+
bgesdk/management/model_runtime/server/build/lib/model_license.py,sha256=B0v34mbAOK6KYh-zhNpPNu3CVyYclpJ1YgGonOjS7Kw,663
|
|
66
|
+
bgesdk/management/model_runtime/server/build/lib/secure.py,sha256=Yb7w3sJXqnKSzJ-OjLgGrtoi8z7Zbf0KF1guCgopHtA,3034
|
|
67
|
+
bgesdk/management/model_runtime/server/build/lib/bge_model_server/__init__.py,sha256=5vTjaeWdfgLskCVllmGJ90H7Pj-ahmlwv20DDsZiPKA,456
|
|
68
|
+
bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/__init__.py,sha256=XWKY22HpwNVvQS9Y3K01CdIB2CFz1_PKzxyK1hiWK5U,360
|
|
69
|
+
bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/__main__.py,sha256=0tbM6GJ29yEad89HJRz21rfIV5ucIfW4BWAa8AUcIws,1858
|
|
70
|
+
bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/app_fastapi.py,sha256=2yk7JERY9q5nikY5FjD_EOJdztSYYskmsvk3Gsq9Gyg,5257
|
|
71
|
+
bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/app_tornado.py,sha256=zCUVIrew3bTKlJZ-wtwNL5BB-P9gE6eENfmVhEcYjHY,6146
|
|
72
|
+
bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/logging_conf.py,sha256=7tbT93F-4nI-nV4elIMO2qH6wjSjxv0wJqMq29LguHg,2136
|
|
73
|
+
bgesdk/management/model_runtime/server/wheels/bge_model_server-0.1.0-py3-none-any.whl,sha256=19tYhZDirz4TFIkdlqCSYFTYa8BLTHtwgTgiW_nLWak,10833
|
|
74
|
+
tests/__init__.py,sha256=j8Fx8bTZqzgLNvUqMha2M2uIijQ8RVB_JyL6I0t_Kjk,37
|
|
75
|
+
tests/conftest.py,sha256=Qs2XagiteN7lIzLnvVb__NOzhc3ANswZNZ0SAm58RPA,4891
|
|
76
|
+
tests/test_abundance.py,sha256=iW5KKo6o1Ipjcab6FlVi7y1_64i7uReKlekNC65srm0,3981
|
|
77
|
+
tests/test_api_offline.py,sha256=z0PzieLS8AoFD4Ce-DjUSw3lIUtAf_Qi1I-MuWIWEPw,5455
|
|
78
|
+
tests/test_api_structure.py,sha256=fH_DjncnIMFlXKGKLzrvdWYkYkaIue-oipu8uFErJxM,3218
|
|
79
|
+
tests/test_error.py,sha256=x7Z7sFr0U80Dy4WcJe5ZrG8QYRdhZRlSMnMSml52Q_Y,6392
|
|
80
|
+
tests/test_fs.py,sha256=0UaMp0fxMpHOZ7--AsPY4AkOAU7yEsf0J42wYIDWz70,212
|
|
81
|
+
tests/test_model.py,sha256=bh6fB2wBc1QI3C_znPzl39dPsFPmHSkxkQBui-Lz3NQ,468
|
|
82
|
+
tests/test_models.py,sha256=5a01_XnPG5OjeM0AXM1_CCr_KKTUA9uymIjYjAMmy40,740
|
|
83
|
+
tests/test_models_offline.py,sha256=wLZTHcfAKQKBZ9srUUJVoCtY1suXqNxTGoNjK4IEoAs,1431
|
|
84
|
+
tests/test_oauth2.py,sha256=xBAPkcKFqSHWDESjgGK7iwyNPTa7N4k4rr4edE_GjAo,1081
|
|
85
|
+
tests/test_phenotype.py,sha256=dUUi-RFTlYoEccAIhZvNyU4YVWcyLHSTc9SRKC0KYZU,2358
|
|
86
|
+
tests/test_samples.py,sha256=lEZVmHcLMob2G3m_M98rLv_l97wsrnsGEYpLkM6XOBw,3263
|
|
87
|
+
tests/test_token.py,sha256=ITovDYGl4wF_0OhdmxPmGaeDJHfcvF7weYEgBwf0fbc,4452
|
|
88
|
+
tests/test_user.py,sha256=niSpc6VAKgZvYJwdLoh1A6qCnx-LHJ4pwnxnF82RVQk,456
|
|
89
|
+
tests/test_variants.py,sha256=xeX3mG0pvAG3ISwijy25X_0W4rnSTzSR-HP6UNgN6L8,3003
|
|
90
|
+
tests/test_wgs.py,sha256=qTTsKsKW_9tjJeq9X6LEoY8rH1EvtEve-sbI5qHjUZA,2385
|
|
91
|
+
bge_python_sdk-2.0.0.dist-info/LICENSE,sha256=zi-c1gi0KJQqPnxQdodJIL4vCjr3B3-bHHsh4YP-MYk,1063
|
|
92
|
+
bge_python_sdk-2.0.0.dist-info/METADATA,sha256=3NsJn14s-GLoVgbexfC6iLNKjkAN8-cR98_JRLvqqUw,7689
|
|
93
|
+
bge_python_sdk-2.0.0.dist-info/WHEEL,sha256=BNRMDyzLkkcmlv0J8ppDQkk2VED33SesJDynr9ED1gc,91
|
|
94
|
+
bge_python_sdk-2.0.0.dist-info/entry_points.txt,sha256=M09ziNXA78fUAvagzThOuXmri8mVRpQLMyG9uLm34P4,45
|
|
95
|
+
bge_python_sdk-2.0.0.dist-info/top_level.txt,sha256=NnKIxOYEPdm7xMZn2Ls2ceRmJhFzDMqyH5EEJlhyeGQ,25
|
|
96
|
+
bge_python_sdk-2.0.0.dist-info/RECORD,,
|
bgesdk/__init__.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
from .client import OAuth2, API, endpoints
|
|
1
|
+
from .client import API, OAuth2, endpoints
|
|
4
2
|
from .fs import FileItem
|
|
5
|
-
from .version import __version__
|
|
3
|
+
from .version import __version__
|
|
4
|
+
|
|
5
|
+
__all__ = ['API', 'OAuth2', 'endpoints', 'FileItem', '__version__']
|
bgesdk/__main__.py
CHANGED
|
@@ -1,64 +1,51 @@
|
|
|
1
|
+
from . import version
|
|
2
|
+
from .management import commands as commands_package
|
|
3
|
+
from .management.command import CommandError, GroupedRichHelpFormatter
|
|
4
|
+
from .management.utils import discover_commands, output
|
|
5
|
+
|
|
6
|
+
from typing import Any
|
|
1
7
|
|
|
2
8
|
import argparse
|
|
3
9
|
import sys
|
|
4
10
|
|
|
5
|
-
|
|
6
|
-
|
|
11
|
+
argcomplete: Any = None # 提供 shell 自动补全(可选依赖),未安装时为 None
|
|
7
12
|
try:
|
|
8
|
-
import
|
|
13
|
+
import argcomplete # type: ignore[no-redef]
|
|
9
14
|
except ImportError:
|
|
10
15
|
pass
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
try:
|
|
18
|
+
import readline # noqa: F401 # 启用交互式历史/补全等副作用
|
|
19
|
+
except ImportError:
|
|
20
|
+
pass
|
|
15
21
|
|
|
16
22
|
|
|
17
23
|
def init_parser():
|
|
18
24
|
parser = argparse.ArgumentParser(
|
|
19
|
-
description=(
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
description=(
|
|
26
|
+
'BGE 开放平台 SDK 命令行工具提供了初始化模型脚手架、部署模型、'
|
|
27
|
+
'初始化模型文档配置文件、上传图片、部署模型文档等命令。'
|
|
28
|
+
),
|
|
29
|
+
formatter_class=GroupedRichHelpFormatter,
|
|
22
30
|
)
|
|
23
31
|
parser.add_argument(
|
|
24
32
|
'-V',
|
|
25
33
|
'--version',
|
|
26
34
|
action='version',
|
|
27
35
|
help='显示当前 BGE 开放平台 Python SDK 版本号。',
|
|
28
|
-
version='version {
|
|
36
|
+
version=f'version {version.__version__}',
|
|
29
37
|
)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
)
|
|
35
|
-
except TypeError:
|
|
36
|
-
# required: Whether or not a subcommand must be provided,
|
|
37
|
-
# by default False (added in 3.7)
|
|
38
|
-
subparsers = parser.add_subparsers(
|
|
39
|
-
dest='command',
|
|
40
|
-
help='SDK 命令行工具可选子命令。',
|
|
41
|
-
required=False
|
|
42
|
-
)
|
|
43
|
-
command_names = get_commands()
|
|
44
|
-
sort_items = []
|
|
45
|
-
for sub_command_name in command_names:
|
|
46
|
-
module = import_module(
|
|
47
|
-
'bgesdk.management.commands.{}'.format(sub_command_name)
|
|
48
|
-
)
|
|
49
|
-
command_klass = getattr(module, 'Command', None)
|
|
50
|
-
if command_klass and not issubclass(command_klass, BaseCommand):
|
|
51
|
-
continue
|
|
52
|
-
order = int(getattr(command_klass, 'order', 1))
|
|
53
|
-
sort_items.append((order, sub_command_name, command_klass))
|
|
54
|
-
sort_items.sort()
|
|
55
|
-
for _, sub_command_name, command_klass in sort_items:
|
|
56
|
-
command_klass(subparsers, sub_command_name)
|
|
38
|
+
subparsers = parser.add_subparsers(
|
|
39
|
+
dest='command', help='SDK 命令行工具可选子命令。', required=False
|
|
40
|
+
)
|
|
41
|
+
discover_commands(commands_package, subparsers)
|
|
57
42
|
return parser
|
|
58
43
|
|
|
59
44
|
|
|
60
45
|
def main():
|
|
61
46
|
parser = init_parser()
|
|
47
|
+
if argcomplete is not None:
|
|
48
|
+
argcomplete.autocomplete(parser)
|
|
62
49
|
if len(sys.argv) < 2:
|
|
63
50
|
parser.print_help(sys.stderr)
|
|
64
51
|
sys.exit(1)
|
|
@@ -68,7 +55,12 @@ def main():
|
|
|
68
55
|
args.method(args)
|
|
69
56
|
except KeyboardInterrupt:
|
|
70
57
|
sys.exit(1)
|
|
58
|
+
except CommandError as exc:
|
|
59
|
+
sys.exit(exc.code)
|
|
60
|
+
except Exception as exc: # noqa: BLE001 统一兜底,避免原始堆栈泄露
|
|
61
|
+
output(f'[red]命令执行出错:{exc}[/red]')
|
|
62
|
+
sys.exit(2)
|
|
71
63
|
|
|
72
64
|
|
|
73
|
-
if '__main__'
|
|
65
|
+
if __name__ == '__main__':
|
|
74
66
|
main()
|
bgesdk/api/__init__.py
ADDED
bgesdk/api/api.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""API 客户端聚合层。
|
|
2
|
+
|
|
3
|
+
按域将能力拆分为多个 Mixin(Samples / Variants / Microbiome / File / Model /
|
|
4
|
+
Stream / Misc),由本模块聚合为 ``API`` 类。对外公开接口与历史 ``client.API``
|
|
5
|
+
保持一致,调用方无需变更(``api.get_samples(...)`` 等照常可用)。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .file import FileMixin
|
|
9
|
+
from .microbiome import MicrobiomeMixin
|
|
10
|
+
from .misc import MiscMixin
|
|
11
|
+
from .model import ModelMixin
|
|
12
|
+
from .samples import SamplesMixin
|
|
13
|
+
from .stream import StreamMixin
|
|
14
|
+
from .variants import VariantsMixin
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class API(
|
|
18
|
+
SamplesMixin,
|
|
19
|
+
VariantsMixin,
|
|
20
|
+
MicrobiomeMixin,
|
|
21
|
+
FileMixin,
|
|
22
|
+
ModelMixin,
|
|
23
|
+
StreamMixin,
|
|
24
|
+
MiscMixin,
|
|
25
|
+
):
|
|
26
|
+
"""BGE 开放平台接口调用客户端。
|
|
27
|
+
|
|
28
|
+
基础设施与账户域由 ``APIBase`` 经各 Mixin 间接继承提供,其余按业务域分散于各 Mixin。
|
|
29
|
+
"""
|
bgesdk/api/base.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""API 基础设施与账户域方法(基类)。
|
|
2
|
+
|
|
3
|
+
本模块承载:
|
|
4
|
+
* 服务可用性检查 ``alive`` 与上传进度回调 ``progress_callback``(模块级函数);
|
|
5
|
+
* ``APIBase``:鉴权、请求创建与账户域(introspect / get_user / get_overview)方法。
|
|
6
|
+
其余按域方法拆分到同级 Mixin 模块,最终由 ``bgesdk.api.api.API`` 聚合。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from .. import constants, models
|
|
12
|
+
from ..error import BGEError
|
|
13
|
+
from ..http import HTTPRequest
|
|
14
|
+
from ..utils import human_byte, new_logger
|
|
15
|
+
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
import sys
|
|
19
|
+
import threading
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def progress_callback(bytes_consumed: int, total_bytes: int) -> None:
|
|
23
|
+
sys.stdout.write(
|
|
24
|
+
'\r文件大小: {}, 上传进度: {}%, 已上传 {}'.format(
|
|
25
|
+
human_byte(total_bytes, 2),
|
|
26
|
+
'%.2f' % ((bytes_consumed / total_bytes) * 100),
|
|
27
|
+
human_byte(bytes_consumed, 2),
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
sys.stdout.flush()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def alive(self) -> bool:
|
|
34
|
+
"""检查服务可用性
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
布尔型: True 代表可用, False 代表不可用
|
|
38
|
+
"""
|
|
39
|
+
timeout = self.timeout
|
|
40
|
+
verbose = self.verbose
|
|
41
|
+
max_retries = self.max_retries
|
|
42
|
+
request = HTTPRequest(
|
|
43
|
+
self.endpoint, max_retries=max_retries, verbose=verbose
|
|
44
|
+
)
|
|
45
|
+
try:
|
|
46
|
+
request.get('/ping', timeout=timeout)
|
|
47
|
+
except Exception:
|
|
48
|
+
return False
|
|
49
|
+
return True
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class APIBase:
|
|
53
|
+
"""BGE 开放平台接口调用客户端基类(基础设施 + 账户域)。"""
|
|
54
|
+
|
|
55
|
+
token_type = 'Bearer'
|
|
56
|
+
alive = alive
|
|
57
|
+
|
|
58
|
+
_token: Any | None
|
|
59
|
+
_token_leeway: int
|
|
60
|
+
_token_lock: Any
|
|
61
|
+
|
|
62
|
+
def _ensure_access_token(self) -> None:
|
|
63
|
+
"""调用前确保 access_token 有效:自定义 provider 或内置刷新。"""
|
|
64
|
+
with self._token_lock:
|
|
65
|
+
if self.token_provider is not None:
|
|
66
|
+
token = self.token_provider()
|
|
67
|
+
if token:
|
|
68
|
+
self.access_token = token
|
|
69
|
+
return
|
|
70
|
+
if self._token is not None and self._token.is_expired(
|
|
71
|
+
self._token_leeway
|
|
72
|
+
):
|
|
73
|
+
self._token = self._token.refresh()
|
|
74
|
+
self.access_token = self._token['access_token']
|
|
75
|
+
|
|
76
|
+
def __init__(
|
|
77
|
+
self,
|
|
78
|
+
access_token: str | models.Model,
|
|
79
|
+
endpoint: str | None = None,
|
|
80
|
+
max_retries: int | None = None,
|
|
81
|
+
timeout: int | None = 18,
|
|
82
|
+
verbose: bool = False,
|
|
83
|
+
token_provider: Any | None = None,
|
|
84
|
+
) -> None:
|
|
85
|
+
self.token_provider = token_provider
|
|
86
|
+
self._token = None
|
|
87
|
+
self._token_leeway = 60
|
|
88
|
+
self._token_lock = threading.RLock()
|
|
89
|
+
if token_provider is None and hasattr(access_token, 'is_expired'):
|
|
90
|
+
# 传入的是带刷新能力的 token 对象,启用内置自动续期
|
|
91
|
+
self._token = access_token
|
|
92
|
+
assert isinstance(access_token, models.Model)
|
|
93
|
+
access_token = access_token['access_token']
|
|
94
|
+
self.access_token = access_token
|
|
95
|
+
if endpoint is None:
|
|
96
|
+
endpoint = constants.DEFAULT_ENDPOINT
|
|
97
|
+
self.endpoint = endpoint
|
|
98
|
+
if max_retries is not None:
|
|
99
|
+
max_retries = int(max_retries)
|
|
100
|
+
self.max_retries = max_retries
|
|
101
|
+
if timeout is not None:
|
|
102
|
+
timeout = int(timeout)
|
|
103
|
+
self.timeout = timeout
|
|
104
|
+
self.verbose = verbose
|
|
105
|
+
self.logger = new_logger(self.__class__.__name__, verbose=verbose)
|
|
106
|
+
|
|
107
|
+
def _create_request(self) -> HTTPRequest:
|
|
108
|
+
"""创建预配置的HTTP请求对象
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
HTTPRequest: 请求对象;
|
|
112
|
+
"""
|
|
113
|
+
self._ensure_access_token()
|
|
114
|
+
verbose = self.verbose
|
|
115
|
+
max_retries = self.max_retries
|
|
116
|
+
request = HTTPRequest(
|
|
117
|
+
self.endpoint, max_retries=max_retries, verbose=verbose
|
|
118
|
+
)
|
|
119
|
+
request.set_authorization(self.token_type, self.access_token)
|
|
120
|
+
return request
|
|
121
|
+
|
|
122
|
+
def introspect(self) -> models.Model:
|
|
123
|
+
"""验证当前使用的 access_token 有效性
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Model: Token 元数据;
|
|
127
|
+
"""
|
|
128
|
+
timeout = self.timeout
|
|
129
|
+
request = self._create_request()
|
|
130
|
+
result = request.get(
|
|
131
|
+
'/oauth2/introspect',
|
|
132
|
+
params={'token': self.access_token},
|
|
133
|
+
timeout=timeout,
|
|
134
|
+
)
|
|
135
|
+
return models.Model(result)
|
|
136
|
+
|
|
137
|
+
def get_user(self, **params: Any) -> models.Model:
|
|
138
|
+
"""获取用户信息
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
Model: 用户数据;
|
|
142
|
+
"""
|
|
143
|
+
timeout = self.timeout
|
|
144
|
+
request = self._create_request()
|
|
145
|
+
result = request.get('/profile', params=params, timeout=timeout)
|
|
146
|
+
return models.Model(result)
|
|
147
|
+
|
|
148
|
+
def get_overview(
|
|
149
|
+
self,
|
|
150
|
+
idcard: str | None = None,
|
|
151
|
+
phone: str | None = None,
|
|
152
|
+
biosample_id: str | None = None,
|
|
153
|
+
project_id: str | None = None,
|
|
154
|
+
external_sample_id: str | None = None,
|
|
155
|
+
**kwargs: Any,
|
|
156
|
+
) -> models.Model:
|
|
157
|
+
"""获取用户数据概览
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
idcard (str, 非必填): 身份证;
|
|
161
|
+
phone (str, 非必填): 手机号;提供了参数 phone,禁止再提供 biosample_id、
|
|
162
|
+
project_id、external_sample_id;
|
|
163
|
+
biosample_id (str, 非必填): BGE 样本编号;提供了参数 biosample_id,禁
|
|
164
|
+
止再提供 phone、project_id、external_sample_id;
|
|
165
|
+
project_id (str, 非必填): BGE 项目编号;提供了参数 project_id 必须提
|
|
166
|
+
供 external_sample_id,且 phone 和 biosample_id 必须为空;
|
|
167
|
+
external_sample_id (str, 非必填): 外部样本编号;提供了参数
|
|
168
|
+
external_sample_id 必须提供 project_id,且 phone 和
|
|
169
|
+
biosample_id 必须为空;
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
Model: 用户数据概览;
|
|
173
|
+
"""
|
|
174
|
+
data: dict = {}
|
|
175
|
+
data.update(kwargs)
|
|
176
|
+
if phone and (biosample_id or project_id or external_sample_id):
|
|
177
|
+
raise BGEError(
|
|
178
|
+
'若提供了 phone 参数,则禁止同时提供 biosample_id、'
|
|
179
|
+
'project_id 和 external_sample_id。'
|
|
180
|
+
)
|
|
181
|
+
elif biosample_id and (phone or project_id or external_sample_id):
|
|
182
|
+
raise BGEError(
|
|
183
|
+
'若提供了 biosample_id 参数,则禁止同时提供 phone、'
|
|
184
|
+
'project_id 和 external_sample_id。'
|
|
185
|
+
)
|
|
186
|
+
else:
|
|
187
|
+
if (not project_id and external_sample_id) or (
|
|
188
|
+
project_id and not external_sample_id
|
|
189
|
+
):
|
|
190
|
+
raise BGEError(
|
|
191
|
+
'project_id 与 external_sample_id 必须同时提供。'
|
|
192
|
+
)
|
|
193
|
+
if project_id and external_sample_id and (phone or biosample_id):
|
|
194
|
+
raise BGEError(
|
|
195
|
+
'提供 external_sample_id 时必须同时提供 project_id,'
|
|
196
|
+
'且 phone 与 biosample_id 必须为空。'
|
|
197
|
+
)
|
|
198
|
+
data.update(
|
|
199
|
+
{
|
|
200
|
+
'idcard': idcard,
|
|
201
|
+
'phone': phone,
|
|
202
|
+
'biosample_id': biosample_id,
|
|
203
|
+
'project_id': project_id,
|
|
204
|
+
'external_sample_id': external_sample_id,
|
|
205
|
+
}
|
|
206
|
+
)
|
|
207
|
+
timeout = self.timeout
|
|
208
|
+
request = self._create_request()
|
|
209
|
+
result = request.post('/user/overview', data=data, timeout=timeout)
|
|
210
|
+
return models.Model(result)
|