deepfos 1.1.63__tar.gz → 1.1.65__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.63 → deepfos-1.1.65}/CHANGELOG.md +15 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/PKG-INFO +1 -1
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/_version.py +3 -3
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deepconnector.py +3 -3
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deepconnector.py +1 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/deepconnector.py +34 -1
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/deepmodel.py +70 -42
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/workflow.py +6 -4
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/sysutils.py +6 -7
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/PKG-INFO +1 -1
- {deepfos-1.1.63 → deepfos-1.1.65}/.gitattributes +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/.gitee/ISSUE_GUIDELINES.md +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/.gitee/ISSUE_TEMPLATE.md +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/.gitignore +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/MANIFEST.in +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/README.md +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/algo/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/algo/graph.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/business_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/models/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/models/business_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/models/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/models/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/models/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/account.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/accounting_engines.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/app.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/approval_process.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/base.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/business_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/consolidation.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/consolidation_process.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/datatable.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deep_pipeline.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deepfos_task.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deepmodel.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/financial_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/journal_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/journal_template.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/memory_financial_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/account.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/accounting_engines.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/app.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/approval_process.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/base.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/business_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/consolidation.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/consolidation_process.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/datatable_mysql.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deep_pipeline.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deepfos_task.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deepmodel.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/financial_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/journal_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/journal_template.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/memory_financial_model.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/platform.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/python.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/reconciliation_engine.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/reconciliation_report.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/role_strategy.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/smartlist.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/space.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/system.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/variable.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/workflow.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/platform.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/python.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/reconciliation_engine.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/reconciliation_report.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/role_strategy.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/smartlist.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/space.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/system.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/variable.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/workflow.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/jstream.c +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/jstream.pyx +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/pandas.c +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/pandas.pyx +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/py_jstream.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/py_pandas.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/cache.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/config.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/_base.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/constants.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/cube.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/formula.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/syscube.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/typing.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/utils.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/_base.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimcreator.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimexpr.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimmember.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/eledimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/filters.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/sysdimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/_cache.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/_operator.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/nodemixin.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/sqlcondition.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/tablemodel.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/cipher.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/clickhouse.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/connector.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/daclickhouse.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/dameng.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/damysql.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/dbkits.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/deepengine.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/deepmodel.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/deepmodel_kingbase.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/edb.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/gauss.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/kingbase.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/mysql.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/oracle.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/postgresql.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/sqlserver.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/utils.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/accounting.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/apvlprocess.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/base.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/bizmodel.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/datatable.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/deep_pipeline.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/dimension.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/fact_table.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/finmodel.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/journal.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/journal_template.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/pyscript.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/reconciliation.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/rolestrategy.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/smartlist.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/variable.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/exceptions/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/exceptions/hook.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lazy.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/__init__.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/_javaobj.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/asynchronous.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/concurrency.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/constant.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/decorator.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/deepchart.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/deepux.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/discovery.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/edb_lexer.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/eureka.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/filterparser.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/httpcli.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/jsonstreamer.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/msg.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/nacos.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/patch.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/redis.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/serutils.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/stopwatch.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/subtask.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/utils.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/local.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/options.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/translation.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/SOURCES.txt +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/dependency_links.txt +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/not-zip-safe +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/requires.txt +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/top_level.txt +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/requirements.txt +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/setup.cfg +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/setup.py +0 -0
- {deepfos-1.1.63 → deepfos-1.1.65}/versioneer.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-07-
|
|
11
|
+
"date": "2025-07-09T10:58:56+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.1.
|
|
14
|
+
"full-revisionid": "7891ba3eb0b577f318140d5ea3b613c82bda9e68",
|
|
15
|
+
"version": "1.1.65"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -3,7 +3,7 @@ from typing import Union, Awaitable
|
|
|
3
3
|
from deepfos.element.base import T_ElementInfoWithServer
|
|
4
4
|
from deepfos.lib.decorator import cached_property
|
|
5
5
|
|
|
6
|
-
from .base import ChildAPI,
|
|
6
|
+
from .base import ChildAPI, RootAPI, post
|
|
7
7
|
from .models.deepconnector import *
|
|
8
8
|
|
|
9
9
|
|
|
@@ -14,10 +14,10 @@ class DataSourceAPI(ChildAPI):
|
|
|
14
14
|
"""连接信息相关接口"""
|
|
15
15
|
endpoint = '/apis/v3/ds/spaces/{space}/apps/{app}'
|
|
16
16
|
|
|
17
|
-
@
|
|
17
|
+
@post('connection-info/query', data_wrapped=False)
|
|
18
18
|
def connection_info(self, element_info: T_ElementInfoWithServer) -> Union[ConnectionInfoVo, Awaitable[ConnectionInfoVo]]:
|
|
19
19
|
return {
|
|
20
|
-
'
|
|
20
|
+
'body': {
|
|
21
21
|
'elementName': element_info.elementName,
|
|
22
22
|
'folderId': element_info.folderId
|
|
23
23
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import base64
|
|
2
|
+
import binascii
|
|
3
|
+
import os
|
|
2
4
|
|
|
3
5
|
from deepfos.api.deepconnector import DeepConnectorAPI
|
|
4
6
|
from deepfos.api.models import BaseModel
|
|
7
|
+
from deepfos.db.cipher import AES
|
|
5
8
|
from deepfos.element.base import ElementBase, SyncMeta
|
|
6
9
|
from deepfos.lib.asynchronous import future_property
|
|
7
10
|
from deepfos.lib.decorator import cached_property
|
|
@@ -9,6 +12,20 @@ from deepfos.lib.decorator import cached_property
|
|
|
9
12
|
__all__ = ['AsyncDeepConnector', 'DeepConnector', 'ConnectionInfo']
|
|
10
13
|
|
|
11
14
|
|
|
15
|
+
def decrypt(secret, cipher_text, encoding='utf8'):
|
|
16
|
+
pwd_padded = AES(secret).decrypt(
|
|
17
|
+
base64.b16decode(cipher_text)
|
|
18
|
+
)
|
|
19
|
+
if pwd_padded[-1] in range(1, 17):
|
|
20
|
+
pad_length = pwd_padded[-1]
|
|
21
|
+
pad_char = chr(pwd_padded[-1])
|
|
22
|
+
guess_pad = pad_char * pwd_padded[-1]
|
|
23
|
+
|
|
24
|
+
if pwd_padded.decode(encoding).endswith(guess_pad):
|
|
25
|
+
return pwd_padded.decode(encoding)[:-pad_length:]
|
|
26
|
+
return pwd_padded.decode(encoding)
|
|
27
|
+
|
|
28
|
+
|
|
12
29
|
class ConnectionInfo(BaseModel):
|
|
13
30
|
host: str
|
|
14
31
|
port: int
|
|
@@ -45,12 +62,28 @@ class AsyncDeepConnector(ElementBase[DeepConnectorAPI]):
|
|
|
45
62
|
info = await api.datasource.connection_info(
|
|
46
63
|
element_info=ele_info,
|
|
47
64
|
)
|
|
65
|
+
if info.encryptType == 'AES':
|
|
66
|
+
try:
|
|
67
|
+
password = decrypt(
|
|
68
|
+
os.environ.get('EXPORT_DEEPFOS_AES_KEY', '!ABCD-EFGH-IJKL@').encode(),
|
|
69
|
+
info.password,
|
|
70
|
+
encoding='utf-8'
|
|
71
|
+
)
|
|
72
|
+
except ValueError:
|
|
73
|
+
raise ValueError(
|
|
74
|
+
'连接器连接信息解密失败,请检查公共环境变量:EXPORT_DEEPFOS_AES_KEY'
|
|
75
|
+
) from None
|
|
76
|
+
else:
|
|
77
|
+
try:
|
|
78
|
+
password = base64.decodebytes(info.password.encode()).decode()
|
|
79
|
+
except binascii.Error:
|
|
80
|
+
password = info.password
|
|
48
81
|
return ConnectionInfo(
|
|
49
82
|
host=info.connectionHost,
|
|
50
83
|
port=info.connectionPort,
|
|
51
84
|
db=info.dbName,
|
|
52
85
|
user=info.username,
|
|
53
|
-
password=
|
|
86
|
+
password=password,
|
|
54
87
|
dbtype=info.serviceName,
|
|
55
88
|
)
|
|
56
89
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
+
import threading
|
|
2
3
|
|
|
3
4
|
import numpy as np
|
|
4
5
|
from asyncpg.connection import connect as pg_conn
|
|
@@ -803,39 +804,53 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
803
804
|
logger.debug('当前DeepModel为非直连模式')
|
|
804
805
|
self.alias = AliasGenerator()
|
|
805
806
|
self.pg_dsn = pg_dsn
|
|
806
|
-
self._globals =
|
|
807
|
+
self._globals = None
|
|
807
808
|
self.before_chunk = before_chunk
|
|
808
809
|
self.after_chunk = after_chunk
|
|
810
|
+
self._clients = threading.local()
|
|
809
811
|
|
|
810
812
|
@future_property
|
|
811
|
-
async def
|
|
812
|
-
if self.direct_access:
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
dbname = None
|
|
826
|
-
client = create_async_client(
|
|
827
|
-
default_module=self.appmodule,
|
|
828
|
-
dbname=dbname
|
|
813
|
+
async def _internal_dbname(self):
|
|
814
|
+
if not self.direct_access:
|
|
815
|
+
# N.B: only retrieved when direct access is enabled
|
|
816
|
+
return
|
|
817
|
+
api = await self.wait_for('async_api')
|
|
818
|
+
ver = await api.extra.version()
|
|
819
|
+
if to_version_tuple(ver, 4) < (3, 0, 18, 8, 0):
|
|
820
|
+
return
|
|
821
|
+
db_info = await api.sharding.database()
|
|
822
|
+
space = OPTION.api.header['space']
|
|
823
|
+
if db_info.space != space:
|
|
824
|
+
raise ValueError(
|
|
825
|
+
f'Space id in sharding database info invalid. '
|
|
826
|
+
f'Expected space id: {space}, actual: {db_info.space}'
|
|
829
827
|
)
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
828
|
+
return db_info.edgedbName
|
|
829
|
+
|
|
830
|
+
@property
|
|
831
|
+
def client(self):
|
|
832
|
+
if not self.direct_access:
|
|
833
|
+
self._globals = {}
|
|
834
|
+
return
|
|
835
|
+
|
|
836
|
+
if (client := getattr(self._clients, 'value', None)) is not None:
|
|
837
837
|
return client
|
|
838
838
|
|
|
839
|
+
client = create_async_client(
|
|
840
|
+
default_module=self.appmodule,
|
|
841
|
+
dbname=self._internal_dbname
|
|
842
|
+
)
|
|
843
|
+
if user_id := OPTION.api.header.get('user'):
|
|
844
|
+
default_globals = {
|
|
845
|
+
f'{self.spacemodule}::current_user_id':
|
|
846
|
+
user_id
|
|
847
|
+
}
|
|
848
|
+
client = client.with_globals(**default_globals)
|
|
849
|
+
if self._globals is None:
|
|
850
|
+
self._globals = client._options.state._globals
|
|
851
|
+
self._clients.value = client
|
|
852
|
+
return client
|
|
853
|
+
|
|
839
854
|
@future_property
|
|
840
855
|
async def element_info(self):
|
|
841
856
|
"""元素信息"""
|
|
@@ -931,7 +946,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
931
946
|
logger.opt(lazy=True).debug(f"Query: [{ql}],\n"
|
|
932
947
|
f"kwargs: [{kwargs}],\n"
|
|
933
948
|
f"globals: [{self._globals}].")
|
|
934
|
-
|
|
949
|
+
client = self.client
|
|
950
|
+
client._options.state._globals = self._globals
|
|
951
|
+
_, result = await client.query(ql, **kwargs)
|
|
935
952
|
return result
|
|
936
953
|
|
|
937
954
|
result = await self._http_query(ql, **kwargs)
|
|
@@ -972,7 +989,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
972
989
|
logger.opt(lazy=True).debug(f"Query: [{ql}],\n"
|
|
973
990
|
f"kwargs: [{kwargs}],\n"
|
|
974
991
|
f"globals: [{self._globals}].")
|
|
975
|
-
|
|
992
|
+
client = self.client
|
|
993
|
+
client._options.state._globals = self._globals
|
|
994
|
+
frame_desc, result = await client.query(ql, **kwargs)
|
|
976
995
|
return serutils.serialize(
|
|
977
996
|
result, ctx=serutils.Context(frame_desc=frame_desc)
|
|
978
997
|
)
|
|
@@ -1019,7 +1038,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
1019
1038
|
|
|
1020
1039
|
"""
|
|
1021
1040
|
if self.direct_access:
|
|
1022
|
-
|
|
1041
|
+
client = self.client
|
|
1042
|
+
client._options.state._globals = self._globals
|
|
1043
|
+
frame_desc, data = await client.query(ql, **kwargs)
|
|
1023
1044
|
# set of unnamed tuple
|
|
1024
1045
|
if isinstance(frame_desc, list):
|
|
1025
1046
|
return pd.DataFrame(
|
|
@@ -1061,8 +1082,7 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
1061
1082
|
query_df.__doc__ = query_df.__doc__ + DOC_ARGS_KWARGS
|
|
1062
1083
|
|
|
1063
1084
|
def _ensure_client(self):
|
|
1064
|
-
|
|
1065
|
-
self.client # noqa
|
|
1085
|
+
self.client # noqa
|
|
1066
1086
|
|
|
1067
1087
|
@txn_support
|
|
1068
1088
|
async def execute(
|
|
@@ -1139,7 +1159,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
1139
1159
|
return affected
|
|
1140
1160
|
|
|
1141
1161
|
result = []
|
|
1142
|
-
|
|
1162
|
+
client = self.client
|
|
1163
|
+
client._options.state._globals = self._globals
|
|
1164
|
+
async for tx in client.transaction():
|
|
1143
1165
|
async with tx:
|
|
1144
1166
|
for ql in qls_with_args:
|
|
1145
1167
|
logger.opt(lazy=True).debug(
|
|
@@ -1815,14 +1837,17 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
1815
1837
|
finally:
|
|
1816
1838
|
raise NotImplemented('非直连模式不支持设置state信息')
|
|
1817
1839
|
else:
|
|
1818
|
-
|
|
1819
|
-
|
|
1840
|
+
if self._globals is None:
|
|
1841
|
+
bak_globals = self.client._options.state._globals
|
|
1842
|
+
else:
|
|
1843
|
+
bak_globals = self._globals
|
|
1820
1844
|
try:
|
|
1821
|
-
|
|
1822
|
-
|
|
1845
|
+
client = self.client
|
|
1846
|
+
client._options.state._globals = bak_globals
|
|
1847
|
+
client = client.with_globals(**globals_)
|
|
1848
|
+
self._globals = client._options.state._globals
|
|
1823
1849
|
yield
|
|
1824
1850
|
finally:
|
|
1825
|
-
self.client = bak_cli
|
|
1826
1851
|
self._globals = bak_globals
|
|
1827
1852
|
|
|
1828
1853
|
@contextmanager
|
|
@@ -1833,14 +1858,17 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
1833
1858
|
finally:
|
|
1834
1859
|
raise NotImplemented('非直连模式不支持设置state信息')
|
|
1835
1860
|
else:
|
|
1836
|
-
|
|
1837
|
-
|
|
1861
|
+
if self._globals is None:
|
|
1862
|
+
bak_globals = self.client._options.state._globals
|
|
1863
|
+
else:
|
|
1864
|
+
bak_globals = self._globals
|
|
1838
1865
|
try:
|
|
1839
|
-
|
|
1840
|
-
|
|
1866
|
+
client = self.client
|
|
1867
|
+
client._options.state._globals = bak_globals
|
|
1868
|
+
client = client.without_globals(*global_names)
|
|
1869
|
+
self._globals = client._options.state._globals
|
|
1841
1870
|
yield
|
|
1842
1871
|
finally:
|
|
1843
|
-
self.client = bak_cli
|
|
1844
1872
|
self._globals = bak_globals
|
|
1845
1873
|
|
|
1846
1874
|
|
|
@@ -311,9 +311,14 @@ class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
|
|
|
311
311
|
内容一般来自文件管理的/files/upload或/files/upload/content响应值
|
|
312
312
|
|
|
313
313
|
|
|
314
|
+
Returns:
|
|
315
|
+
True: 成功
|
|
316
|
+
False: 失败
|
|
317
|
+
|
|
314
318
|
.. admonition:: 示例
|
|
315
319
|
|
|
316
320
|
.. code-block:: python
|
|
321
|
+
|
|
317
322
|
from deepfos.api.platform import PlatformAPI
|
|
318
323
|
from deepfos.element.workflow import WorkFlow
|
|
319
324
|
|
|
@@ -321,6 +326,7 @@ class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
|
|
|
321
326
|
upload_resp = PlatformAPI().file.upload(
|
|
322
327
|
file_type='DL', file_name='t.txt', file='some text'
|
|
323
328
|
)
|
|
329
|
+
|
|
324
330
|
# 以动作approve,参数{"a": 1, "b": "42"}完成任务实例,
|
|
325
331
|
# 并提供附件信息为上传的't.txt'文件,备注为"Completed by SDK"
|
|
326
332
|
test_task = WorkFlow('test_task')
|
|
@@ -332,10 +338,6 @@ class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
|
|
|
332
338
|
attachments=[upload_resp]
|
|
333
339
|
)
|
|
334
340
|
|
|
335
|
-
Returns:
|
|
336
|
-
True: 成功
|
|
337
|
-
False: 失败
|
|
338
|
-
|
|
339
341
|
"""
|
|
340
342
|
action_id = None
|
|
341
343
|
if outcome is not None:
|
|
@@ -479,14 +479,14 @@ class TaskUtil:
|
|
|
479
479
|
py_info: 任务实例对应的python元素信息,如未提供,仍可在 `run_job_contents` 中提供
|
|
480
480
|
|
|
481
481
|
"""
|
|
482
|
-
api = TaskAPI(sync=True)
|
|
483
|
-
_chunksize = 200
|
|
484
482
|
|
|
485
483
|
def __init__(self, task_code, py_info: PyInfo = None):
|
|
486
484
|
self.task_code = task_code
|
|
485
|
+
self.api = TaskAPI(sync=True)
|
|
487
486
|
if self.meta is None:
|
|
488
487
|
raise ValueError(f"No config for task_code: [{self.task_code}].")
|
|
489
488
|
self.py_info = py_info
|
|
489
|
+
self._chunksize = 200
|
|
490
490
|
|
|
491
491
|
@cached_property
|
|
492
492
|
def meta(self):
|
|
@@ -579,18 +579,17 @@ class TaskUtil:
|
|
|
579
579
|
if not_found_col:
|
|
580
580
|
raise ValueError(f'Required columns:{sorted(not_found_col)} since they are compositeKeys.')
|
|
581
581
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
if job_contents.shape[0] <= cls._chunksize:
|
|
582
|
+
def _create_task_instance(self, call_api, job_contents, payload):
|
|
583
|
+
if job_contents.shape[0] <= self._chunksize:
|
|
585
584
|
payload.jobContent = job_contents.to_dict(orient='records')
|
|
586
585
|
payload.lastBatch = True
|
|
587
586
|
call_api(payload)
|
|
588
587
|
else:
|
|
589
|
-
payload.jobContent = job_contents.iloc[0:
|
|
588
|
+
payload.jobContent = job_contents.iloc[0:self._chunksize:].to_dict(orient='records')
|
|
590
589
|
payload.batchId = call_api(payload).batchId
|
|
591
590
|
payloads = []
|
|
592
591
|
|
|
593
|
-
for batch_contents in split_dataframe(job_contents.iloc[
|
|
592
|
+
for batch_contents in split_dataframe(job_contents.iloc[self._chunksize::], self._chunksize):
|
|
594
593
|
payload.jobContent = batch_contents.to_dict(orient='records')
|
|
595
594
|
payloads.append(payload)
|
|
596
595
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|