deepfos 1.1.52__tar.gz → 1.1.54__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.
- {deepfos-1.1.52 → deepfos-1.1.54}/CHANGELOG.md +17 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/PKG-INFO +12 -10
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/_version.py +3 -3
- deepfos-1.1.54/deepfos/api/deep_pipeline.py +61 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/deepconnector.py +6 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/deepmodel.py +17 -0
- deepfos-1.1.54/deepfos/api/models/deep_pipeline.py +55 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/deepmodel.py +1 -1
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/python.py +9 -3
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/logictable/sqlcondition.py +22 -8
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/logictable/tablemodel.py +6 -5
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/__init__.py +2 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/bizmodel.py +2 -2
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/datatable.py +1 -1
- deepfos-1.1.54/deepfos/element/deep_pipeline.py +186 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/dimension.py +2 -2
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/pyscript.py +16 -8
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/exceptions/__init__.py +36 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/deepchart.py +7 -7
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/redis.py +2 -1
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/subtask.py +2 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos.egg-info/PKG-INFO +12 -10
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos.egg-info/SOURCES.txt +6 -0
- deepfos-1.1.54/deepfos.egg-info/requires.txt +18 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/setup.cfg +11 -9
- {deepfos-1.1.52 → deepfos-1.1.54}/setup.py +6 -6
- deepfos-1.1.52/deepfos.egg-info/requires.txt +0 -16
- {deepfos-1.1.52 → deepfos-1.1.54}/.gitattributes +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/.gitee/ISSUE_GUIDELINES.md +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/.gitee/ISSUE_TEMPLATE.md +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/.gitignore +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/MANIFEST.in +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/README.md +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/algo/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/algo/graph.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_1/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_1/business_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_1/dimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_1/models/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_1/models/business_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_1/models/dimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_2/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_2/dimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_2/models/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/V1_2/models/dimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/account.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/accounting_engines.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/app.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/approval_process.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/base.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/business_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/consolidation.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/consolidation_process.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/datatable.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/deepfos_task.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/dimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/financial_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/journal_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/journal_template.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/memory_financial_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/account.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/accounting_engines.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/app.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/approval_process.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/base.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/business_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/consolidation.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/consolidation_process.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/datatable_mysql.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/deepconnector.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/deepfos_task.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/dimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/financial_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/journal_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/journal_template.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/memory_financial_model.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/platform.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/python.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/reconciliation_engine.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/reconciliation_report.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/role_strategy.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/smartlist.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/space.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/system.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/variable.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/models/workflow.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/platform.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/reconciliation_engine.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/reconciliation_report.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/role_strategy.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/smartlist.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/space.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/system.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/variable.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/api/workflow.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/boost/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/boost/jstream.c +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/boost/jstream.pyx +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/boost/pandas.c +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/boost/pandas.pyx +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/boost/py_jstream.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/boost/py_pandas.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/cache.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/config.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/_base.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/constants.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/cube.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/formula.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/syscube.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/typing.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/cube/utils.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/_base.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/dimcreator.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/dimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/dimexpr.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/dimmember.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/eledimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/filters.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/dimension/sysdimension.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/logictable/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/logictable/_cache.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/logictable/_operator.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/core/logictable/nodemixin.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/cipher.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/clickhouse.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/connector.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/daclickhouse.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/dameng.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/damysql.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/dbkits.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/deepengine.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/deepmodel.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/deepmodel_kingbase.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/edb.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/gauss.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/kingbase.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/mysql.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/oracle.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/postgresql.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/sqlserver.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/db/utils.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/accounting.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/apvlprocess.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/base.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/deepconnector.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/deepmodel.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/fact_table.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/finmodel.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/journal.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/journal_template.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/reconciliation.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/rolestrategy.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/smartlist.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/variable.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/element/workflow.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/exceptions/hook.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lazy.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/__init__.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/_javaobj.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/asynchronous.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/concurrency.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/constant.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/decorator.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/deepux.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/discovery.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/edb_lexer.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/eureka.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/filterparser.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/httpcli.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/jsonstreamer.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/msg.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/nacos.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/patch.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/serutils.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/stopwatch.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/sysutils.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/lib/utils.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/local.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/options.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos/translation.py +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos.egg-info/dependency_links.txt +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos.egg-info/not-zip-safe +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/deepfos.egg-info/top_level.txt +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/requirements.txt +0 -0
- {deepfos-1.1.52 → deepfos-1.1.54}/versioneer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: deepfos
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.54
|
|
4
4
|
Summary: Collecions of useful and handy tools for deepfos platform
|
|
5
5
|
Home-page: http://py.deepfos.com
|
|
6
6
|
Author: deepfos-python-team
|
|
@@ -12,19 +12,21 @@ Classifier: Programming Language :: Python :: 3.8
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.9
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
14
14
|
Requires-Python: >=3.8.3
|
|
15
|
-
Requires-Dist: pandas
|
|
16
|
-
Requires-Dist: requests
|
|
15
|
+
Requires-Dist: pandas
|
|
16
|
+
Requires-Dist: requests~=2.26
|
|
17
17
|
Requires-Dist: pymysql==1.1.1
|
|
18
|
-
Requires-Dist: aiohttp
|
|
19
|
-
Requires-Dist: pydantic
|
|
20
|
-
Requires-Dist: cachetools
|
|
18
|
+
Requires-Dist: aiohttp~=3.9.5
|
|
19
|
+
Requires-Dist: pydantic<2.0.0,>=1.10.0
|
|
20
|
+
Requires-Dist: cachetools<6,>=5.0.0
|
|
21
21
|
Requires-Dist: loguru==0.5.3
|
|
22
22
|
Requires-Dist: PyPika==0.48.8
|
|
23
|
-
Requires-Dist: aiomysql
|
|
24
|
-
Requires-Dist: clickhouse-driver
|
|
23
|
+
Requires-Dist: aiomysql~=0.2.0
|
|
24
|
+
Requires-Dist: clickhouse-driver~=0.2.9
|
|
25
25
|
Requires-Dist: aioredis==2.0.1
|
|
26
26
|
Requires-Dist: redis==4.5.3
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
27
|
+
Requires-Dist: nest-asyncio==1.5.4
|
|
28
|
+
Requires-Dist: deepfos-ipc~=1.3.1
|
|
29
|
+
Requires-Dist: typing-extensions>=4.8.0
|
|
29
30
|
Requires-Dist: edgedb~=1.4.0
|
|
30
31
|
Requires-Dist: asyncpg~=0.29.0
|
|
32
|
+
Requires-Dist: numpy<2.0.0
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-03-27T07:28:11+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.1.
|
|
14
|
+
"full-revisionid": "a250b021576a02a0e056f950eba25b16a16e9172",
|
|
15
|
+
"version": "1.1.54"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from typing import Union, Any, Awaitable
|
|
2
|
+
|
|
3
|
+
from deepfos.lib.decorator import cached_property
|
|
4
|
+
from .base import DynamicRootAPI, ChildAPI, get, post
|
|
5
|
+
from .models.deep_pipeline import *
|
|
6
|
+
|
|
7
|
+
__all__ = ['DeepPipelineAPI']
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RunAPI(ChildAPI):
|
|
11
|
+
"""数据流的执行、获取执行信息等逻辑"""
|
|
12
|
+
endpoint = '/'
|
|
13
|
+
|
|
14
|
+
@post('run')
|
|
15
|
+
def run_async(self, run_info: RunInfo) -> Union[str, Awaitable[str]]:
|
|
16
|
+
"""
|
|
17
|
+
异步执行数据流
|
|
18
|
+
异步执行数据流,返回任务id
|
|
19
|
+
"""
|
|
20
|
+
return {'body': run_info}
|
|
21
|
+
|
|
22
|
+
@get('run')
|
|
23
|
+
def result(self, task_id: str, timeout: int = None) -> Union[Any, Awaitable[Any]]:
|
|
24
|
+
"""获取执行结果"""
|
|
25
|
+
return {'param': {'timeout': timeout}, 'path': f'{task_id}/result'}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class FlowAPI(ChildAPI):
|
|
29
|
+
"""数据流定义相关接口"""
|
|
30
|
+
endpoint = '/flow'
|
|
31
|
+
|
|
32
|
+
@get('')
|
|
33
|
+
def open(self, element_name: str, folder_id: str, version: str) -> Union[FlowInfo, Awaitable[FlowInfo]]:
|
|
34
|
+
"""查看数据流"""
|
|
35
|
+
return {
|
|
36
|
+
'param': {
|
|
37
|
+
'elementName': element_name,
|
|
38
|
+
'folderId': folder_id,
|
|
39
|
+
'version': version
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class DeepPipelineAPI(DynamicRootAPI, builtin=True):
|
|
45
|
+
"""DeepPipeline组件接口"""
|
|
46
|
+
module_type = 'DPL'
|
|
47
|
+
default_version = (3, 0)
|
|
48
|
+
multi_version = False
|
|
49
|
+
cls_name = 'DeepPipelineAPI'
|
|
50
|
+
module_name = 'deepfos.api.deep_pipeline'
|
|
51
|
+
api_version = (3, 0)
|
|
52
|
+
|
|
53
|
+
@cached_property
|
|
54
|
+
def run(self) -> RunAPI:
|
|
55
|
+
"""数据流的执行、获取执行信息等逻辑"""
|
|
56
|
+
return RunAPI(self)
|
|
57
|
+
|
|
58
|
+
@cached_property
|
|
59
|
+
def flow(self) -> FlowAPI:
|
|
60
|
+
"""数据流定义相关接口"""
|
|
61
|
+
return FlowAPI(self)
|
|
@@ -7,7 +7,11 @@ from .base import ChildAPI, get, RootAPI
|
|
|
7
7
|
from .models.deepconnector import *
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
__all__ = ['DeepConnectorAPI']
|
|
11
|
+
|
|
12
|
+
|
|
10
13
|
class DataSourceAPI(ChildAPI):
|
|
14
|
+
"""连接信息相关接口"""
|
|
11
15
|
endpoint = '/apis/v3/ds/spaces/{space}/apps/{app}'
|
|
12
16
|
|
|
13
17
|
@get('connection-info', data_wrapped=False)
|
|
@@ -21,10 +25,12 @@ class DataSourceAPI(ChildAPI):
|
|
|
21
25
|
|
|
22
26
|
|
|
23
27
|
class DeepConnectorAPI(RootAPI):
|
|
28
|
+
"""连接器组件接口"""
|
|
24
29
|
prefix = lambda: 'http://deep-connector-server'
|
|
25
30
|
url_need_format = True
|
|
26
31
|
module_type = 'CONN'
|
|
27
32
|
|
|
28
33
|
@cached_property
|
|
29
34
|
def datasource(self) -> DataSourceAPI:
|
|
35
|
+
"""连接信息相关接口"""
|
|
30
36
|
return DataSourceAPI(self)
|
|
@@ -4,8 +4,11 @@ from deepfos.lib.decorator import cached_property
|
|
|
4
4
|
from .base import DynamicRootAPI, ChildAPI, get, post
|
|
5
5
|
from .models.deepmodel import *
|
|
6
6
|
|
|
7
|
+
__all__ = ['DeepModelAPI']
|
|
8
|
+
|
|
7
9
|
|
|
8
10
|
class ObjectAPI(ChildAPI):
|
|
11
|
+
"""模型对象相关"""
|
|
9
12
|
endpoint = '/object'
|
|
10
13
|
|
|
11
14
|
@get('all/get')
|
|
@@ -22,6 +25,7 @@ class ObjectAPI(ChildAPI):
|
|
|
22
25
|
|
|
23
26
|
|
|
24
27
|
class RuleAPI(ChildAPI):
|
|
28
|
+
"""规则清单相关"""
|
|
25
29
|
endpoint = '/rules'
|
|
26
30
|
|
|
27
31
|
@get('/')
|
|
@@ -38,6 +42,7 @@ class RuleAPI(ChildAPI):
|
|
|
38
42
|
|
|
39
43
|
|
|
40
44
|
class SeqAPI(ChildAPI):
|
|
45
|
+
"""序列生成相关"""
|
|
41
46
|
endpoint = '/sequence'
|
|
42
47
|
|
|
43
48
|
@post('/instance/edit')
|
|
@@ -79,6 +84,7 @@ class SeqAPI(ChildAPI):
|
|
|
79
84
|
|
|
80
85
|
|
|
81
86
|
class ShardingAPI(ChildAPI):
|
|
87
|
+
"""分库信息"""
|
|
82
88
|
endpoint = '/sharding'
|
|
83
89
|
|
|
84
90
|
@get('database')
|
|
@@ -87,6 +93,7 @@ class ShardingAPI(ChildAPI):
|
|
|
87
93
|
|
|
88
94
|
|
|
89
95
|
class DeepQLAPI(ChildAPI):
|
|
96
|
+
"""查询器"""
|
|
90
97
|
endpoint = '/public/deepql/actions'
|
|
91
98
|
|
|
92
99
|
@post('query')
|
|
@@ -99,6 +106,7 @@ class DeepQLAPI(ChildAPI):
|
|
|
99
106
|
|
|
100
107
|
|
|
101
108
|
class PresentationAPI(ChildAPI):
|
|
109
|
+
"""展示层"""
|
|
102
110
|
endpoint = '/presentation-layer'
|
|
103
111
|
|
|
104
112
|
@get('ql-selector/ql-record-info')
|
|
@@ -127,6 +135,7 @@ class PresentationAPI(ChildAPI):
|
|
|
127
135
|
|
|
128
136
|
|
|
129
137
|
class ExtraAPI(ChildAPI):
|
|
138
|
+
"""其他接口"""
|
|
130
139
|
endpoint = '/'
|
|
131
140
|
|
|
132
141
|
@get('git-version')
|
|
@@ -135,6 +144,7 @@ class ExtraAPI(ChildAPI):
|
|
|
135
144
|
|
|
136
145
|
|
|
137
146
|
class DeepModelAPI(DynamicRootAPI, builtin=True):
|
|
147
|
+
"""DeepModel组件接口"""
|
|
138
148
|
module_type = 'DM'
|
|
139
149
|
default_version = (1, 0)
|
|
140
150
|
multi_version = False
|
|
@@ -144,28 +154,35 @@ class DeepModelAPI(DynamicRootAPI, builtin=True):
|
|
|
144
154
|
|
|
145
155
|
@cached_property
|
|
146
156
|
def object(self) -> ObjectAPI:
|
|
157
|
+
"""模型对象相关"""
|
|
147
158
|
return ObjectAPI(self)
|
|
148
159
|
|
|
149
160
|
@cached_property
|
|
150
161
|
def deepql(self) -> DeepQLAPI:
|
|
162
|
+
"""查询器"""
|
|
151
163
|
return DeepQLAPI(self)
|
|
152
164
|
|
|
153
165
|
@cached_property
|
|
154
166
|
def rule(self) -> RuleAPI:
|
|
167
|
+
"""规则清单相关"""
|
|
155
168
|
return RuleAPI(self)
|
|
156
169
|
|
|
157
170
|
@cached_property
|
|
158
171
|
def seq(self) -> SeqAPI:
|
|
172
|
+
"""序列生成相关"""
|
|
159
173
|
return SeqAPI(self)
|
|
160
174
|
|
|
161
175
|
@cached_property
|
|
162
176
|
def sharding(self) -> ShardingAPI:
|
|
177
|
+
"""分库信息"""
|
|
163
178
|
return ShardingAPI(self)
|
|
164
179
|
|
|
165
180
|
@cached_property
|
|
166
181
|
def presentation(self) -> PresentationAPI:
|
|
182
|
+
"""展示层"""
|
|
167
183
|
return PresentationAPI(self)
|
|
168
184
|
|
|
169
185
|
@cached_property
|
|
170
186
|
def extra(self) -> ExtraAPI:
|
|
187
|
+
"""其他接口"""
|
|
171
188
|
return ExtraAPI(self)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from typing import Any, Optional
|
|
2
|
+
|
|
3
|
+
from .base import BaseModel
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"RunInfo", "FlowInfo",
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RunInfo(BaseModel):
|
|
11
|
+
#: 元素名/编码
|
|
12
|
+
elementName: str
|
|
13
|
+
#: 元素类型
|
|
14
|
+
elementType: str = "DPL"
|
|
15
|
+
#: 执行参数
|
|
16
|
+
parameter: Any
|
|
17
|
+
#: 文件路径
|
|
18
|
+
path: str = None
|
|
19
|
+
#: 文件夹id
|
|
20
|
+
folderId: str = None
|
|
21
|
+
# 是否在同一个进程执行
|
|
22
|
+
inProcess: bool = False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Revision(BaseModel):
|
|
26
|
+
#: 版本号
|
|
27
|
+
version: str
|
|
28
|
+
#: 版本名
|
|
29
|
+
name: str
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Configure(BaseModel):
|
|
33
|
+
#: 超时时间(秒)
|
|
34
|
+
timeout: int
|
|
35
|
+
#: 公共脚本
|
|
36
|
+
prelude: str = None
|
|
37
|
+
#: 实例名称
|
|
38
|
+
runNameTemplate: str = None
|
|
39
|
+
#: 版本
|
|
40
|
+
revision: Revision
|
|
41
|
+
#: 状态
|
|
42
|
+
status: str
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class FlowInfo(BaseModel):
|
|
46
|
+
#: 元素名/编码
|
|
47
|
+
elementName: str
|
|
48
|
+
#: 元素类型
|
|
49
|
+
elementType: str
|
|
50
|
+
#: 文件夹id
|
|
51
|
+
folderId: str = None
|
|
52
|
+
#: 元素id
|
|
53
|
+
elementId: str = None
|
|
54
|
+
#: 数据流配置
|
|
55
|
+
configure: Configure
|
|
@@ -3,8 +3,11 @@ from .models.python import *
|
|
|
3
3
|
from deepfos.lib.decorator import cached_property
|
|
4
4
|
from typing import List, Dict, Union, Any, Awaitable
|
|
5
5
|
|
|
6
|
+
__all__ = ['PythonAPI']
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
class WorkerAPI(ChildAPI):
|
|
10
|
+
"""python工作进程相关接口"""
|
|
8
11
|
endpoint = '/worker'
|
|
9
12
|
|
|
10
13
|
@post('register')
|
|
@@ -17,6 +20,7 @@ class WorkerAPI(ChildAPI):
|
|
|
17
20
|
|
|
18
21
|
|
|
19
22
|
class ScriptAPI(ChildAPI):
|
|
23
|
+
"""python脚本的运行,关闭,进度查询等逻辑"""
|
|
20
24
|
endpoint = '/script'
|
|
21
25
|
|
|
22
26
|
@post('run')
|
|
@@ -33,6 +37,7 @@ class ScriptAPI(ChildAPI):
|
|
|
33
37
|
|
|
34
38
|
|
|
35
39
|
class FileAPI(ChildAPI):
|
|
40
|
+
"""python文件的新建,上传,更新逻辑"""
|
|
36
41
|
endpoint = '/file'
|
|
37
42
|
|
|
38
43
|
@post('add')
|
|
@@ -61,6 +66,7 @@ class FileAPI(ChildAPI):
|
|
|
61
66
|
|
|
62
67
|
|
|
63
68
|
class PythonAPI(DynamicRootAPI, builtin=True):
|
|
69
|
+
"""Python组件"""
|
|
64
70
|
module_type = 'PY'
|
|
65
71
|
default_version = (2, 0)
|
|
66
72
|
multi_version = False
|
|
@@ -70,15 +76,15 @@ class PythonAPI(DynamicRootAPI, builtin=True):
|
|
|
70
76
|
|
|
71
77
|
@cached_property
|
|
72
78
|
def worker(self) -> WorkerAPI:
|
|
79
|
+
"""python工作进程相关接口"""
|
|
73
80
|
return WorkerAPI(self)
|
|
74
81
|
|
|
75
82
|
@cached_property
|
|
76
83
|
def script(self) -> ScriptAPI:
|
|
84
|
+
"""python脚本的运行,关闭,进度查询等逻辑"""
|
|
77
85
|
return ScriptAPI(self)
|
|
78
86
|
|
|
79
87
|
@cached_property
|
|
80
88
|
def file(self) -> FileAPI:
|
|
81
|
-
"""
|
|
82
|
-
python文件管理相关接口
|
|
83
|
-
"""
|
|
89
|
+
"""python文件的新建,上传,更新逻辑"""
|
|
84
90
|
return FileAPI(self)
|
|
@@ -410,12 +410,20 @@ class SQLCondition:
|
|
|
410
410
|
val_list = self.val_list.copy()
|
|
411
411
|
elif 1 == len(fd_me) == len(fd_other):
|
|
412
412
|
val_list = pd.DataFrame()
|
|
413
|
-
self.__static_cond =
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
413
|
+
self.__static_cond = pd.concat([
|
|
414
|
+
self.__static_cond,
|
|
415
|
+
pd.DataFrame(data={
|
|
416
|
+
'field': self.fields[0],
|
|
417
|
+
'op': [OpFactory(IN, self.val_list.iloc[:, 0])]
|
|
418
|
+
})
|
|
419
|
+
])
|
|
420
|
+
other.__static_cond = pd.concat([
|
|
421
|
+
other.__static_cond,
|
|
422
|
+
pd.DataFrame(data={
|
|
423
|
+
'field': other.fields[0],
|
|
424
|
+
'op': [OpFactory(IN, other.val_list.iloc[:, 0])]
|
|
425
|
+
})
|
|
426
|
+
])
|
|
419
427
|
else:
|
|
420
428
|
# 字段越多,限制条件越多,一般数据量越小,定义为sub
|
|
421
429
|
if fd_me.issubset(fd_other):
|
|
@@ -465,8 +473,14 @@ class SQLCondition:
|
|
|
465
473
|
|
|
466
474
|
if len(fields) == 1:
|
|
467
475
|
# 将条件归类至sta_cond
|
|
468
|
-
static_cond =
|
|
469
|
-
|
|
476
|
+
static_cond = pd.concat(
|
|
477
|
+
[
|
|
478
|
+
self.__static_cond,
|
|
479
|
+
pd.DataFrame(data={
|
|
480
|
+
'field': fields,
|
|
481
|
+
'op': [OpFactory(IN, val_list.iloc[:, 0])]
|
|
482
|
+
})
|
|
483
|
+
]
|
|
470
484
|
).sort_values('field').reset_index(drop=True)
|
|
471
485
|
val_list = pd.DataFrame()
|
|
472
486
|
else:
|
|
@@ -339,11 +339,12 @@ class MetaTable(MetaNodeMixin):
|
|
|
339
339
|
|
|
340
340
|
df = pd.DataFrame()
|
|
341
341
|
for cd in cond.to_sql():
|
|
342
|
-
df =
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
342
|
+
df = pd.concat(
|
|
343
|
+
[
|
|
344
|
+
df,
|
|
345
|
+
cls.datatable.select(columns=fields, where=cd, distinct=unique)
|
|
346
|
+
]
|
|
347
|
+
)
|
|
347
348
|
|
|
348
349
|
logger.debug(f"Got DATA:\n {df}")
|
|
349
350
|
|
|
@@ -35,6 +35,7 @@ if TYPE_CHECKING: # pragma: no cover
|
|
|
35
35
|
from .journal import AsyncJournalModel, JournalModel
|
|
36
36
|
from .deepmodel import AsyncDeepModel, DeepModel
|
|
37
37
|
from .deepconnector import AsyncDeepConnector, DeepConnector
|
|
38
|
+
from .deep_pipeline import AsyncDeepPipeline, DeepPipeline
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
lazify(
|
|
@@ -82,6 +83,7 @@ lazify(
|
|
|
82
83
|
'deepfos.element.journal': ('AsyncJournalModel', 'JournalModel'),
|
|
83
84
|
'deepfos.element.deepmodel': ('AsyncDeepModel', 'DeepModel'),
|
|
84
85
|
'deepfos.element.deepconnector': ('AsyncDeepConnector', 'DeepConnector'),
|
|
86
|
+
'deepfos.element.deep_pipeline': ('AsyncDeepPipeline', 'DeepPipeline'),
|
|
85
87
|
},
|
|
86
88
|
globals()
|
|
87
89
|
)
|
|
@@ -646,7 +646,7 @@ class AsyncBusinessModel(ElementBase[BusinessModelAPI]):
|
|
|
646
646
|
df_row = pd.DataFrame([{'process_operation_id': operation_info.id,
|
|
647
647
|
'origin_status': operation_info.originStatusList,
|
|
648
648
|
'target_status': operation_info.targetStatus}])
|
|
649
|
-
df_operation =
|
|
649
|
+
df_operation = pd.concat([df_operation, df_row])
|
|
650
650
|
df_operation.reset_index(drop=True, inplace=True)
|
|
651
651
|
if len(df_operation) > 1:
|
|
652
652
|
df_operation['target_status_shift'] = df_operation['target_status'].shift(1)
|
|
@@ -699,7 +699,7 @@ class AsyncBusinessModel(ElementBase[BusinessModelAPI]):
|
|
|
699
699
|
df_success['line_no'] += 1
|
|
700
700
|
df_success['result_status'] = row['target_status']
|
|
701
701
|
df_success['process_operation_id'] = row['process_operation_id']
|
|
702
|
-
df_insert =
|
|
702
|
+
df_insert = pd.concat([df_insert, df_success])
|
|
703
703
|
|
|
704
704
|
tbl_main = self.logic_tables[main_tbl_name].async_datatable
|
|
705
705
|
if not df_failure.empty:
|
|
@@ -1690,7 +1690,7 @@ class AsyncDirectAccessDataTableMySQL(AsyncDataTableMySQL):
|
|
|
1690
1690
|
limit=limit,
|
|
1691
1691
|
offset=offset
|
|
1692
1692
|
)
|
|
1693
|
-
return raw_data.to_dict(orient='
|
|
1693
|
+
return raw_data.to_dict(orient='records')
|
|
1694
1694
|
|
|
1695
1695
|
@txn_support
|
|
1696
1696
|
async def run_sql(self, sql: str):
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import time
|
|
3
|
+
from math import ceil
|
|
4
|
+
from typing import Any, TYPE_CHECKING, List
|
|
5
|
+
|
|
6
|
+
from deepfos import OPTION
|
|
7
|
+
from deepfos.api.deep_pipeline import DeepPipelineAPI
|
|
8
|
+
from deepfos.api.models.deep_pipeline import RunInfo, FlowInfo
|
|
9
|
+
from deepfos.element.base import ElementBase, SyncMeta
|
|
10
|
+
from deepfos.exceptions import (
|
|
11
|
+
APIResponseError, RunIdInvalid, RunTerminated,
|
|
12
|
+
ReleaseFlowTimeout, RunFailedError, ReleaseFlowNotExists,
|
|
13
|
+
)
|
|
14
|
+
from deepfos.lib.asynchronous import future_property
|
|
15
|
+
from deepfos.lib.decorator import cached_property
|
|
16
|
+
|
|
17
|
+
errcode_map = {
|
|
18
|
+
42030002: ReleaseFlowTimeout,
|
|
19
|
+
42030003: RunIdInvalid,
|
|
20
|
+
42030009: RunFailedError,
|
|
21
|
+
42030010: RunTerminated,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# -----------------------------------------------------------------------------
|
|
26
|
+
# core
|
|
27
|
+
class AsyncDeepPipeline(ElementBase[DeepPipelineAPI]):
|
|
28
|
+
"""数据流3.0"""
|
|
29
|
+
|
|
30
|
+
@future_property
|
|
31
|
+
async def release(self) -> FlowInfo:
|
|
32
|
+
"""发布版信息"""
|
|
33
|
+
api = await self.wait_for('async_api')
|
|
34
|
+
ele_info = await self.wait_for('element_info')
|
|
35
|
+
return await api.flow.open(
|
|
36
|
+
folder_id=ele_info.folderId,
|
|
37
|
+
element_name=ele_info.elementName,
|
|
38
|
+
version='release'
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
@cached_property
|
|
42
|
+
def has_approved_release(self) -> bool:
|
|
43
|
+
return (
|
|
44
|
+
self.release is not None
|
|
45
|
+
and self.release.configure.status == 'APPROVED'
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
async def run(
|
|
49
|
+
self,
|
|
50
|
+
parameter: Any = None,
|
|
51
|
+
timeout: int = None,
|
|
52
|
+
in_process: bool = True,
|
|
53
|
+
) -> Any:
|
|
54
|
+
"""
|
|
55
|
+
同步启动数据流
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
parameter: 执行参数
|
|
59
|
+
timeout: 超时时间(秒)
|
|
60
|
+
in_process: 是否在同一个进程执行
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
执行结果
|
|
64
|
+
"""
|
|
65
|
+
run_id = await self.run_async(parameter, in_process)
|
|
66
|
+
return await self.result(run_id, timeout)
|
|
67
|
+
|
|
68
|
+
async def run_async(
|
|
69
|
+
self,
|
|
70
|
+
parameter: Any = None,
|
|
71
|
+
in_process: bool = True,
|
|
72
|
+
) -> str:
|
|
73
|
+
"""
|
|
74
|
+
异步启动数据流
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
parameter: 执行参数
|
|
78
|
+
in_process: 是否在同一个进程执行
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
执行ID
|
|
82
|
+
"""
|
|
83
|
+
if not self.has_approved_release:
|
|
84
|
+
raise ReleaseFlowNotExists('暂无启用中状态的数据流版本')
|
|
85
|
+
|
|
86
|
+
return await self.async_api.run.run_async(
|
|
87
|
+
RunInfo(
|
|
88
|
+
elementName=self.element_name,
|
|
89
|
+
parameter=parameter,
|
|
90
|
+
folderId=self.element_info.folderId,
|
|
91
|
+
inProcess=in_process
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
async def result(self, run_id: str, timeout: int = None) -> Any:
|
|
96
|
+
"""
|
|
97
|
+
获取异步执行结果
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
run_id: 执行ID
|
|
101
|
+
timeout: 超时时间(秒)
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
执行结果
|
|
105
|
+
|
|
106
|
+
"""
|
|
107
|
+
start_time = time.time()
|
|
108
|
+
remaining_time = interval = min(max(OPTION.api.timeout - 1, 1), 5)
|
|
109
|
+
if timeout is not None:
|
|
110
|
+
remaining_time = min(interval, timeout)
|
|
111
|
+
|
|
112
|
+
while timeout is None or remaining_time > 0:
|
|
113
|
+
try:
|
|
114
|
+
return await self.async_api.run.result(
|
|
115
|
+
run_id,
|
|
116
|
+
timeout=remaining_time
|
|
117
|
+
)
|
|
118
|
+
except APIResponseError as e:
|
|
119
|
+
if e.code not in errcode_map:
|
|
120
|
+
raise
|
|
121
|
+
|
|
122
|
+
err_cls = errcode_map[e.code]
|
|
123
|
+
if err_cls is not ReleaseFlowTimeout:
|
|
124
|
+
raise errcode_map[e.code](str(e)) from None
|
|
125
|
+
|
|
126
|
+
delta_time = time.time() - start_time
|
|
127
|
+
remaining_time = (
|
|
128
|
+
ceil(min(interval, timeout - delta_time))
|
|
129
|
+
if timeout is not None else interval
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
raise ReleaseFlowTimeout() from None
|
|
133
|
+
|
|
134
|
+
async def run_batch(
|
|
135
|
+
self,
|
|
136
|
+
parameters: List[Any],
|
|
137
|
+
in_process: bool = True,
|
|
138
|
+
) -> List[str]:
|
|
139
|
+
"""
|
|
140
|
+
批量异步启动数据流
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
parameters: 执行参数列表
|
|
144
|
+
in_process: 是否在同一个进程执行
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
执行ID列表
|
|
148
|
+
"""
|
|
149
|
+
if not self.has_approved_release:
|
|
150
|
+
raise ReleaseFlowNotExists('暂无启用中状态的数据流版本')
|
|
151
|
+
|
|
152
|
+
result = await asyncio.gather(*(
|
|
153
|
+
self.run_async(parameter, in_process)
|
|
154
|
+
for parameter in parameters
|
|
155
|
+
))
|
|
156
|
+
return list(result)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class DeepPipeline(AsyncDeepPipeline, metaclass=SyncMeta):
|
|
160
|
+
synchronize = ('run', 'run_async', 'result', 'run_batch')
|
|
161
|
+
|
|
162
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
163
|
+
def run(
|
|
164
|
+
self,
|
|
165
|
+
parameter: Any = None,
|
|
166
|
+
timeout: int = None,
|
|
167
|
+
in_process: bool = True,
|
|
168
|
+
) -> Any:
|
|
169
|
+
...
|
|
170
|
+
|
|
171
|
+
def run_async(
|
|
172
|
+
self,
|
|
173
|
+
parameter: Any = None,
|
|
174
|
+
in_process: bool = True,
|
|
175
|
+
) -> str:
|
|
176
|
+
...
|
|
177
|
+
|
|
178
|
+
def result(self, run_id: str, timeout: int = None) -> Any:
|
|
179
|
+
...
|
|
180
|
+
|
|
181
|
+
def run_batch(
|
|
182
|
+
self,
|
|
183
|
+
parameters: List[Any],
|
|
184
|
+
in_process: bool = True,
|
|
185
|
+
):
|
|
186
|
+
...
|