deepfos 1.1.78__tar.gz → 1.1.80__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.78 → deepfos-1.1.80}/CHANGELOG.md +15 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/PKG-INFO +1 -1
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/_version.py +3 -3
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deepconnector.py +1 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deepfos_task.py +1 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/financial_model.py +4 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/finmodel.py +19 -3
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/edb_lexer.py +2 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/k8s.py +7 -1
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/nacos.py +113 -22
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/options.py +2 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/PKG-INFO +1 -1
- {deepfos-1.1.78 → deepfos-1.1.80}/.gitattributes +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/.gitee/ISSUE_GUIDELINES.md +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/.gitee/ISSUE_TEMPLATE.md +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/.gitignore +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/MANIFEST.in +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/README.md +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/algo/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/algo/graph.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/business_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/models/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/models/business_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/models/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/models/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/models/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/account.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/accounting_engines.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/app.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/approval_process.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/base.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/business_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/consolidation.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/consolidation_process.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/datatable.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deep_pipeline.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deepmodel.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/financial_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/journal_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/journal_template.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/memory_financial_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/account.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/accounting_engines.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/app.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/approval_process.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/base.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/business_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/consolidation.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/consolidation_process.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/datatable_mysql.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deep_pipeline.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deepconnector.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deepfos_task.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deepmodel.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/journal_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/journal_template.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/memory_financial_model.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/platform.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/python.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/reconciliation_engine.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/reconciliation_report.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/role_strategy.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/smartlist.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/space.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/system.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/variable.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/workflow.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/platform.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/python.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/reconciliation_engine.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/reconciliation_report.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/role_strategy.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/smartlist.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/space.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/system.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/variable.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/workflow.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/jstream.c +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/jstream.pyx +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/pandas.c +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/pandas.pyx +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/py_jstream.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/py_pandas.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/cache.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/config.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/_base.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/constants.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/cube.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/formula.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/syscube.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/typing.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/utils.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/_base.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimcreator.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimexpr.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimmember.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/eledimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/filters.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/sysdimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/_cache.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/_operator.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/nodemixin.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/sqlcondition.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/tablemodel.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/cipher.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/clickhouse.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/connector.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/daclickhouse.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/dameng.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/damysql.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/dbkits.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/deepengine.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/deepmodel.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/deepmodel_kingbase.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/edb.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/gauss.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/kingbase.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/mysql.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/oracle.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/postgresql.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/sqlserver.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/utils.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/accounting.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/apvlprocess.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/base.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/bizmodel.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/datatable.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/deep_pipeline.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/deepconnector.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/deepmodel.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/dimension.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/fact_table.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/journal.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/journal_template.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/pyscript.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/reconciliation.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/rolestrategy.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/smartlist.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/variable.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/workflow.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/exceptions/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/exceptions/hook.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lazy.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/__init__.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/_javaobj.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/asynchronous.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/concurrency.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/constant.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/decorator.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/deepchart.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/deepux.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/discovery.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/eureka.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/filterparser.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/httpcli.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/jsonstreamer.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/msg.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/patch.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/redis.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/serutils.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/stopwatch.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/subtask.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/sysutils.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/utils.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/local.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/translation.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/SOURCES.txt +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/dependency_links.txt +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/not-zip-safe +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/requires.txt +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/top_level.txt +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/requirements.txt +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/setup.cfg +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/setup.py +0 -0
- {deepfos-1.1.78 → deepfos-1.1.80}/versioneer.py +0 -0
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
## [1.1.80] - 2026-01-14
|
|
2
|
+
|
|
3
|
+
### 更新
|
|
4
|
+
|
|
5
|
+
* 修复DeepConnectorAPI/TaskAPI在take_over=True情况下不可用的bug
|
|
6
|
+
|
|
7
|
+
## [1.1.79] - 2026-01-12
|
|
8
|
+
|
|
9
|
+
### 更新
|
|
10
|
+
|
|
11
|
+
* k8s客户端不校验证书有效性
|
|
12
|
+
* FinancialCube添加两个参数dataAuditSwitch和cmtSwitch
|
|
13
|
+
* DeepQL允许使用`__bk__` 作为查询字段
|
|
14
|
+
* nacos支持账号密码验证
|
|
15
|
+
|
|
1
16
|
## [1.1.78] - 2025-12-11
|
|
2
17
|
|
|
3
18
|
### 更新
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "
|
|
11
|
+
"date": "2026-01-14T10:28:13+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.1.
|
|
14
|
+
"full-revisionid": "1019f357203aa3e5a0453b8ef6ff017aea04d148",
|
|
15
|
+
"version": "1.1.80"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -122,6 +122,10 @@ class CopyCalculateDTO(BaseModel):
|
|
|
122
122
|
fixMembers: Optional[str] = None
|
|
123
123
|
#: formula表达式
|
|
124
124
|
formula: Optional[str] = None
|
|
125
|
+
#: 是否记录数据审计
|
|
126
|
+
dataAuditSwitch: Optional[bool] = None
|
|
127
|
+
#: 是否拷贝批注
|
|
128
|
+
cmtSwitch: Optional[bool] = None
|
|
125
129
|
|
|
126
130
|
|
|
127
131
|
class CubeDataLogForm(BaseModel):
|
|
@@ -1393,13 +1393,21 @@ class AsyncFinancialCube(ElementBase[FinancialModelAPI]):
|
|
|
1393
1393
|
processMap=process_map,
|
|
1394
1394
|
status=status))
|
|
1395
1395
|
|
|
1396
|
-
async def copy_calculate(
|
|
1396
|
+
async def copy_calculate(
|
|
1397
|
+
self,
|
|
1398
|
+
formula: str,
|
|
1399
|
+
fix_members: str,
|
|
1400
|
+
data_audit_switch: Optional[bool] = None,
|
|
1401
|
+
cmt_switch: Optional[bool] = None,
|
|
1402
|
+
):
|
|
1397
1403
|
"""
|
|
1398
1404
|
cube copy计算接口
|
|
1399
1405
|
|
|
1400
1406
|
Args:
|
|
1401
1407
|
formula: 维度成员来源和目的的表达式
|
|
1402
1408
|
fix_members: 维度成员的筛选表达式
|
|
1409
|
+
data_audit_switch: 是否记录数据审计
|
|
1410
|
+
cmt_switch: 是否拷贝批注
|
|
1403
1411
|
|
|
1404
1412
|
Returns:
|
|
1405
1413
|
更新结果
|
|
@@ -1422,7 +1430,9 @@ class AsyncFinancialCube(ElementBase[FinancialModelAPI]):
|
|
|
1422
1430
|
cubePath=self._path,
|
|
1423
1431
|
formula=formula,
|
|
1424
1432
|
fixMembers=fix_members,
|
|
1425
|
-
entryObject="python"
|
|
1433
|
+
entryObject="python",
|
|
1434
|
+
dataAuditSwitch=data_audit_switch,
|
|
1435
|
+
cmtSwitch=cmt_switch,
|
|
1426
1436
|
)
|
|
1427
1437
|
)
|
|
1428
1438
|
|
|
@@ -1861,7 +1871,13 @@ class FinancialCube(AsyncFinancialCube, metaclass=SyncMeta):
|
|
|
1861
1871
|
):
|
|
1862
1872
|
...
|
|
1863
1873
|
|
|
1864
|
-
def copy_calculate(
|
|
1874
|
+
def copy_calculate(
|
|
1875
|
+
self,
|
|
1876
|
+
formula: str,
|
|
1877
|
+
fix_members: str,
|
|
1878
|
+
data_audit_switch: Optional[bool] = None,
|
|
1879
|
+
cmt_switch: Optional[bool] = None,
|
|
1880
|
+
):
|
|
1865
1881
|
...
|
|
1866
1882
|
|
|
1867
1883
|
def mdx_execution(
|
|
@@ -16,7 +16,7 @@ from deepfos.lib.discovery import ServiceDiscovery
|
|
|
16
16
|
from deepfos import OPTION
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
class
|
|
19
|
+
class K8sCli(ServiceDiscovery):
|
|
20
20
|
def __init__(self):
|
|
21
21
|
super().__init__()
|
|
22
22
|
self._instance_lock: Dict[str, asyncio.Lock] = defaultdict(asyncio.Lock)
|
|
@@ -34,6 +34,9 @@ class K8s(ServiceDiscovery):
|
|
|
34
34
|
|
|
35
35
|
@cached_property
|
|
36
36
|
def _api(self):
|
|
37
|
+
c = client.Configuration.get_default_copy()
|
|
38
|
+
c.verify_ssl = False
|
|
39
|
+
client.Configuration.set_default(c)
|
|
37
40
|
return client.CoreV1Api()
|
|
38
41
|
|
|
39
42
|
async def on_interval(self):
|
|
@@ -99,3 +102,6 @@ class K8s(ServiceDiscovery):
|
|
|
99
102
|
logger.debug(f"{server_name} has no active endpoint, clear invalid...")
|
|
100
103
|
for item in list(cache):
|
|
101
104
|
cache.delete(item)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
K8s = K8sCli()
|
|
@@ -2,15 +2,16 @@ import asyncio
|
|
|
2
2
|
import functools
|
|
3
3
|
import json
|
|
4
4
|
from collections import defaultdict
|
|
5
|
-
from typing import TypedDict, Any, Tuple, Type, Dict
|
|
5
|
+
from typing import TypedDict, Any, Tuple, Type, Dict, Optional
|
|
6
6
|
|
|
7
7
|
from loguru import logger
|
|
8
|
+
from aiohttp import ClientError
|
|
8
9
|
|
|
9
10
|
from deepfos import OPTION
|
|
10
11
|
from deepfos.exceptions import APIResponseError
|
|
11
|
-
from deepfos.lib.discovery import ServiceDiscovery
|
|
12
|
+
from deepfos.lib.discovery import ServiceDiscovery, RankedCache
|
|
12
13
|
from deepfos.lib.httpcli import AioHttpCli
|
|
13
|
-
from deepfos.lib.utils import concat_url
|
|
14
|
+
from deepfos.lib.utils import concat_url, retry
|
|
14
15
|
|
|
15
16
|
__all__ = ['Nacos']
|
|
16
17
|
|
|
@@ -78,20 +79,46 @@ class Route: # pragma: no cover
|
|
|
78
79
|
is_get = method == 'GET'
|
|
79
80
|
|
|
80
81
|
@functools.wraps(func)
|
|
81
|
-
async def call(*args, **kwargs):
|
|
82
|
-
|
|
83
|
-
url = concat_url(ins.base_url, endpoint)
|
|
84
|
-
body = func(ins, *args[1::], **kwargs)
|
|
85
|
-
logger.opt(lazy=True).debug(
|
|
86
|
-
f"Sending request: {method} {url} "
|
|
87
|
-
f"body: {repr(body)}"
|
|
88
|
-
)
|
|
82
|
+
async def call(ins: "NacosAPI", *args, **kwargs):
|
|
83
|
+
body = func(ins, *args, **kwargs)
|
|
89
84
|
req_args = {
|
|
90
85
|
'headers': ins.header,
|
|
91
86
|
'params' if is_get else 'data': body
|
|
92
87
|
}
|
|
93
|
-
|
|
94
|
-
|
|
88
|
+
url_cache = ins.base_urls
|
|
89
|
+
for i, base_url in zip(reversed(range(len(url_cache))), url_cache.sort()):
|
|
90
|
+
is_last_url = i == 0
|
|
91
|
+
try:
|
|
92
|
+
url = concat_url(base_url, endpoint)
|
|
93
|
+
logger.opt(lazy=True).debug(
|
|
94
|
+
f"Sending request: {method} {url} "
|
|
95
|
+
f"body: {repr(body)}"
|
|
96
|
+
)
|
|
97
|
+
response = await request(url, **req_args)
|
|
98
|
+
if (
|
|
99
|
+
response.status == 403
|
|
100
|
+
and func.__qualname__ != 'NacosAPI.login'
|
|
101
|
+
):
|
|
102
|
+
# retry if token expired
|
|
103
|
+
if await ins.maybe_login(schedule_renewal=False):
|
|
104
|
+
body.update(func(ins, *args, **kwargs))
|
|
105
|
+
response = await request(url, **req_args)
|
|
106
|
+
|
|
107
|
+
if not (200 <= response.status < 300):
|
|
108
|
+
raise APIResponseError(
|
|
109
|
+
f"Call API: {endpoint} failed with http status: {response.status}"
|
|
110
|
+
)
|
|
111
|
+
url_cache.reward(base_url)
|
|
112
|
+
break
|
|
113
|
+
except ClientError as e:
|
|
114
|
+
url_cache.punish(base_url)
|
|
115
|
+
if is_last_url:
|
|
116
|
+
logger.warning(f"Request of all urls failed.")
|
|
117
|
+
raise
|
|
118
|
+
else:
|
|
119
|
+
logger.warning(f"Request failed with {e}, try next url...")
|
|
120
|
+
|
|
121
|
+
text = await response.text() # noqa
|
|
95
122
|
if response_checker is not None:
|
|
96
123
|
ok, result = response_checker.validate(text, endpoint)
|
|
97
124
|
if not ok:
|
|
@@ -109,28 +136,89 @@ class Route: # pragma: no cover
|
|
|
109
136
|
return execute
|
|
110
137
|
|
|
111
138
|
|
|
139
|
+
def auth(func):
|
|
140
|
+
@functools.wraps(func)
|
|
141
|
+
def wrapper(self, *args, **kwargs):
|
|
142
|
+
resp = func(self, *args, **kwargs)
|
|
143
|
+
if token := getattr(self, '_token', None):
|
|
144
|
+
resp['accessToken'] = token
|
|
145
|
+
return resp
|
|
146
|
+
|
|
147
|
+
return wrapper
|
|
148
|
+
|
|
149
|
+
|
|
112
150
|
get = Route(method='get')
|
|
151
|
+
post = Route(method='post')
|
|
113
152
|
|
|
114
153
|
|
|
115
154
|
class NacosAPI:
|
|
116
155
|
def __init__(self): # noqa
|
|
117
156
|
nacos_server: str = OPTION.nacos.server.lower()
|
|
118
|
-
|
|
119
|
-
base_url = nacos_server
|
|
120
|
-
else:
|
|
121
|
-
base_url = concat_url(nacos_server, 'nacos')
|
|
122
|
-
|
|
123
|
-
self.base_url = concat_url(base_url, 'v1')
|
|
157
|
+
self._base_urls = self._resolve_base_urls(nacos_server)
|
|
124
158
|
self.header = {"Content-Type": "application/x-www-form-urlencoded"}
|
|
159
|
+
self._token = None
|
|
160
|
+
self._user = OPTION.nacos.user
|
|
161
|
+
self._password = OPTION.nacos.password
|
|
162
|
+
|
|
163
|
+
@staticmethod
|
|
164
|
+
def _resolve_base_urls(url: str) -> RankedCache:
|
|
165
|
+
urls = RankedCache()
|
|
166
|
+
for nacos_server in url.split(','):
|
|
167
|
+
if nacos_server.rstrip('/').endswith('nacos'):
|
|
168
|
+
base_url = nacos_server
|
|
169
|
+
else:
|
|
170
|
+
base_url = concat_url(nacos_server, 'nacos')
|
|
171
|
+
urls.add(concat_url(base_url, 'v1'))
|
|
172
|
+
return urls
|
|
173
|
+
|
|
174
|
+
@property
|
|
175
|
+
def base_urls(self) -> RankedCache:
|
|
176
|
+
return self._base_urls
|
|
177
|
+
|
|
178
|
+
async def maybe_login(
|
|
179
|
+
self,
|
|
180
|
+
schedule_renewal: bool = True,
|
|
181
|
+
delay: Optional[float] = None,
|
|
182
|
+
) -> bool:
|
|
183
|
+
if self._user is not None and self._password is not None:
|
|
184
|
+
if delay:
|
|
185
|
+
await asyncio.sleep(delay)
|
|
186
|
+
|
|
187
|
+
resp = await retry(self.login, wait=1)(self._user, self._password)
|
|
188
|
+
self._token = resp['accessToken']
|
|
189
|
+
|
|
190
|
+
ttl = resp['tokenTtl']
|
|
191
|
+
if schedule_renewal:
|
|
192
|
+
_ = asyncio.create_task(self.maybe_login(
|
|
193
|
+
schedule_renewal=True,
|
|
194
|
+
delay=min((ttl * 2 / 3), ttl - 5)
|
|
195
|
+
))
|
|
196
|
+
return True
|
|
197
|
+
return False
|
|
198
|
+
|
|
199
|
+
@post('auth/login', JsonResponse)
|
|
200
|
+
def login(self, user: str, password: str):
|
|
201
|
+
return {
|
|
202
|
+
"username": user,
|
|
203
|
+
"password": password
|
|
204
|
+
}
|
|
125
205
|
|
|
126
206
|
@get('ns/service/list', JsonResponse)
|
|
127
|
-
|
|
207
|
+
@auth
|
|
208
|
+
def list_service(
|
|
209
|
+
self,
|
|
210
|
+
group: str = 'DEFAULT_GROUP',
|
|
211
|
+
namespace: str = 'public',
|
|
212
|
+
):
|
|
128
213
|
return {
|
|
129
214
|
'pageNo': 1,
|
|
130
215
|
'pageSize': 1000000,
|
|
216
|
+
'namespaceId': namespace,
|
|
217
|
+
'groupName': group,
|
|
131
218
|
}
|
|
132
219
|
|
|
133
220
|
@get('ns/instance/list', JsonResponse)
|
|
221
|
+
@auth
|
|
134
222
|
def list_instance(
|
|
135
223
|
self,
|
|
136
224
|
service_name: str,
|
|
@@ -163,7 +251,7 @@ class NacosCli(ServiceDiscovery):
|
|
|
163
251
|
self._instance_lock.clear()
|
|
164
252
|
|
|
165
253
|
async def on_startup(self):
|
|
166
|
-
|
|
254
|
+
await self._api.maybe_login()
|
|
167
255
|
|
|
168
256
|
async def on_interval(self):
|
|
169
257
|
await self._update_cache()
|
|
@@ -186,7 +274,10 @@ class NacosCli(ServiceDiscovery):
|
|
|
186
274
|
await self.update_instance_for_service(server_name)
|
|
187
275
|
|
|
188
276
|
async def update_services(self):
|
|
189
|
-
new_services = frozenset((await self._api.list_service(
|
|
277
|
+
new_services = frozenset((await self._api.list_service(
|
|
278
|
+
group=self._group,
|
|
279
|
+
namespace=self._ns,
|
|
280
|
+
))['doms'])
|
|
190
281
|
cur_services = frozenset(self.server_cache.keys())
|
|
191
282
|
|
|
192
283
|
if added := new_services - cur_services:
|
|
@@ -510,6 +510,8 @@ class _Nacos(_Category):
|
|
|
510
510
|
cluster = _Option('DEFAULT', val_type=str)
|
|
511
511
|
namespace = _Option('public', val_type=str)
|
|
512
512
|
group = _Option('DEFAULT_GROUP', val_type=str)
|
|
513
|
+
user = _Option(None, val_type=str)
|
|
514
|
+
password = _Option(None, val_type=str)
|
|
513
515
|
|
|
514
516
|
def __get__(self, instance, owner) -> '_Nacos':
|
|
515
517
|
"""defined to help ide"""
|
|
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
|