bge-python-sdk 0.7.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.
Files changed (96) hide show
  1. bge_python_sdk-2.0.0.data/data/share/bash-completion/completions/bge.bash +14 -0
  2. bge_python_sdk-2.0.0.data/data/share/zsh/site-functions/_bge +14 -0
  3. {bge_python_sdk-0.7.0.dist-info → bge_python_sdk-2.0.0.dist-info}/LICENSE +1 -1
  4. {bge_python_sdk-0.7.0.dist-info → bge_python_sdk-2.0.0.dist-info}/METADATA +22 -29
  5. bge_python_sdk-2.0.0.dist-info/RECORD +96 -0
  6. {bge_python_sdk-0.7.0.dist-info → bge_python_sdk-2.0.0.dist-info}/WHEEL +1 -1
  7. {bge_python_sdk-0.7.0.dist-info → bge_python_sdk-2.0.0.dist-info}/entry_points.txt +0 -1
  8. {bge_python_sdk-0.7.0.dist-info → bge_python_sdk-2.0.0.dist-info}/top_level.txt +1 -0
  9. bgesdk/__init__.py +4 -4
  10. bgesdk/__main__.py +30 -38
  11. bgesdk/api/__init__.py +5 -0
  12. bgesdk/api/api.py +29 -0
  13. bgesdk/api/base.py +210 -0
  14. bgesdk/api/file.py +420 -0
  15. bgesdk/api/microbiome.py +143 -0
  16. bgesdk/api/misc.py +224 -0
  17. bgesdk/api/model.py +312 -0
  18. bgesdk/api/samples.py +181 -0
  19. bgesdk/api/stream.py +243 -0
  20. bgesdk/api/variants.py +93 -0
  21. bgesdk/client.py +126 -1443
  22. bgesdk/constants.py +34 -16
  23. bgesdk/error.py +133 -10
  24. bgesdk/fs.py +7 -2
  25. bgesdk/http.py +90 -43
  26. bgesdk/management/command.py +91 -8
  27. bgesdk/management/commands/api/__init__.py +11 -39
  28. bgesdk/management/commands/api/commands/aggregate_omics_data.py +22 -34
  29. bgesdk/management/commands/api/commands/applet_url.py +10 -14
  30. bgesdk/management/commands/api/commands/download.py +17 -27
  31. bgesdk/management/commands/api/commands/ferry_to_oss.py +18 -34
  32. bgesdk/management/commands/api/commands/get_data_items.py +13 -28
  33. bgesdk/management/commands/api/commands/get_externals.py +9 -23
  34. bgesdk/management/commands/api/commands/get_func_abundance.py +22 -31
  35. bgesdk/management/commands/api/commands/get_gene_abundance.py +14 -28
  36. bgesdk/management/commands/api/commands/get_overview.py +13 -23
  37. bgesdk/management/commands/api/commands/get_range_stream.py +15 -40
  38. bgesdk/management/commands/api/commands/get_samples.py +19 -41
  39. bgesdk/management/commands/api/commands/get_taxon_abundance.py +12 -28
  40. bgesdk/management/commands/api/commands/get_user.py +7 -11
  41. bgesdk/management/commands/api/commands/get_variants.py +9 -19
  42. bgesdk/management/commands/api/commands/id_meta.py +10 -26
  43. bgesdk/management/commands/api/commands/task.py +8 -15
  44. bgesdk/management/commands/api/commands/upload.py +17 -27
  45. bgesdk/management/commands/api/commands/upload_dir.py +19 -30
  46. bgesdk/management/commands/config.py +63 -89
  47. bgesdk/management/commands/login.py +42 -39
  48. bgesdk/management/commands/model.py +717 -692
  49. bgesdk/management/commands/token.py +22 -21
  50. bgesdk/management/commands/workon.py +6 -9
  51. bgesdk/management/constants.py +16 -25
  52. bgesdk/management/model_runtime/__init__.py +13 -0
  53. bgesdk/management/model_runtime/model_runtime.py +591 -0
  54. bgesdk/management/model_runtime/server/bge_model_server/__init__.py +10 -0
  55. bgesdk/management/model_runtime/server/bge_model_server/app/__init__.py +8 -0
  56. bgesdk/management/model_runtime/server/bge_model_server/app/__main__.py +54 -0
  57. bgesdk/management/model_runtime/server/bge_model_server/app/app_fastapi.py +168 -0
  58. bgesdk/management/model_runtime/server/bge_model_server/app/app_tornado.py +182 -0
  59. bgesdk/management/model_runtime/server/bge_model_server/app/logging_conf.py +80 -0
  60. bgesdk/management/model_runtime/server/build/lib/bge_model_server/__init__.py +10 -0
  61. bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/__init__.py +8 -0
  62. bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/__main__.py +54 -0
  63. bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/app_fastapi.py +168 -0
  64. bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/app_tornado.py +182 -0
  65. bgesdk/management/model_runtime/server/build/lib/bge_model_server/app/logging_conf.py +80 -0
  66. bgesdk/management/model_runtime/server/build/lib/model_license.py +20 -0
  67. bgesdk/management/model_runtime/server/build/lib/secure.py +99 -0
  68. bgesdk/management/model_runtime/server/model_license.py +20 -0
  69. bgesdk/management/model_runtime/server/secure.py +99 -0
  70. bgesdk/management/model_runtime/server/setup.py +29 -0
  71. bgesdk/management/model_runtime/server/wheels/bge_model_server-0.1.0-py3-none-any.whl +0 -0
  72. bgesdk/management/utils.py +130 -65
  73. bgesdk/models.py +192 -49
  74. bgesdk/py.typed +2 -0
  75. bgesdk/utils.py +25 -8
  76. bgesdk/version.py +1 -3
  77. tests/__init__.py +2 -1
  78. tests/conftest.py +61 -14
  79. tests/test_abundance.py +58 -41
  80. tests/test_api_offline.py +160 -0
  81. tests/test_api_structure.py +115 -0
  82. tests/test_error.py +178 -0
  83. tests/test_fs.py +2 -2
  84. tests/test_model.py +3 -1
  85. tests/test_models.py +2 -4
  86. tests/test_models_offline.py +47 -0
  87. tests/test_oauth2.py +5 -6
  88. tests/test_phenotype.py +47 -22
  89. tests/test_samples.py +9 -10
  90. tests/test_token.py +138 -0
  91. tests/test_user.py +3 -1
  92. tests/test_variants.py +31 -21
  93. tests/test_wgs.py +72 -0
  94. bge_python_sdk-0.7.0.dist-info/RECORD +0 -59
  95. bgesdk/management/commands/model_doc.py +0 -359
  96. bgesdk/management/validate.py +0 -50
@@ -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,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 teambge
3
+ Copyright (c) 2026 teambge
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,15 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bge-python-sdk
3
- Version: 0.7.0
3
+ Version: 2.0.0
4
4
  Summary: 可用于调用 BGE 开放平台的相关接口。
5
- Home-page: https://github.com/teambge/bge-python-sdk
6
- Author: leafcoder,xiangji1204
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
- Keywords: bge-python-sdk bge bgesdk sdk
12
- Platform: UNKNOWN
8
+ Project-URL: Homepage, https://github.com/teambge/bge-python-sdk
9
+ Keywords: bge-python-sdk,bge,bgesdk,sdk
13
10
  Classifier: Development Status :: 5 - Production/Stable
14
11
  Classifier: Intended Audience :: Developers
15
12
  Classifier: License :: OSI Approved :: MIT License
@@ -19,8 +16,6 @@ Classifier: Operating System :: Microsoft :: Windows :: Windows 10
19
16
  Classifier: Operating System :: POSIX :: Linux
20
17
  Classifier: Programming Language :: Python
21
18
  Classifier: Programming Language :: Python :: 3
22
- Classifier: Programming Language :: Python :: 3.6
23
- Classifier: Programming Language :: Python :: 3.7
24
19
  Classifier: Programming Language :: Python :: 3.8
25
20
  Classifier: Programming Language :: Python :: 3.9
26
21
  Classifier: Programming Language :: Python :: 3.10
@@ -30,23 +25,23 @@ Classifier: Programming Language :: Python :: 3.13
30
25
  Classifier: Topic :: Software Development :: Libraries
31
26
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
32
27
  Classifier: Topic :: Utilities
33
- Requires-Python: >=3.6.3
28
+ Requires-Python: >=3.8
34
29
  Description-Content-Type: text/markdown
35
- Requires-Dist: aliyun-python-sdk-core
36
- Requires-Dist: six
37
- Requires-Dist: certifi
38
- Requires-Dist: chardet
39
- Requires-Dist: idna
40
- Requires-Dist: requests
41
- Requires-Dist: urllib3
42
- Requires-Dist: oss2
43
- Requires-Dist: docker
44
- Requires-Dist: pimento
45
- Requires-Dist: qprompt
46
- Requires-Dist: requests-toolbelt
47
- Requires-Dist: validator.py
48
- Requires-Dist: python-minifier
49
- Requires-Dist: rich
30
+ License-File: LICENSE
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
- $ python setup.py install
113
+ $ pip install .
119
114
  ```
120
115
 
121
116
  # SDK 文档
@@ -183,5 +178,3 @@ print(api.get_variants('E-B1243433', 'rs333'))
183
178
 
184
179
  * xiangji1204's [github](https://github.com/xiangji1204)
185
180
  * leafcoder(leafcoder@gmail.com)'s [github](https://github.com/leafcoder)
186
-
187
-
@@ -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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.37.1)
2
+ Generator: setuptools (75.3.4)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +1,2 @@
1
1
  [console_scripts]
2
2
  bge = bgesdk.__main__:main
3
-
@@ -1,2 +1,3 @@
1
1
  bgesdk
2
+ completions
2
3
  tests
bgesdk/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
- #-*- coding: utf-8 -*-
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
- from importlib import import_module
6
-
11
+ argcomplete: Any = None # 提供 shell 自动补全(可选依赖),未安装时为 None
7
12
  try:
8
- import readline
13
+ import argcomplete # type: ignore[no-redef]
9
14
  except ImportError:
10
15
  pass
11
16
 
12
- from . import version
13
- from .management.command import BaseCommand
14
- from .management.utils import get_commands
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=('BGE 开放平台 SDK 命令行工具提供了初始化模型脚手架、部署模型、'
20
- '初始化模型文档配置文件、上传图片、部署模型文档等命令。'),
21
- formatter_class=argparse.ArgumentDefaultsHelpFormatter
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 {}'.format(version.__version__)
36
+ version=f'version {version.__version__}',
29
37
  )
30
- try:
31
- subparsers = parser.add_subparsers(
32
- dest='command',
33
- help='SDK 命令行工具可选子命令。'
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__' == __name__:
65
+ if __name__ == '__main__':
74
66
  main()
bgesdk/api/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ """按域拆分的 API 子模块包。"""
2
+
3
+ from .api import API
4
+
5
+ __all__ = ['API']
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)