deepfos 1.1.60__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. deepfos/__init__.py +6 -0
  2. deepfos/_version.py +21 -0
  3. deepfos/algo/__init__.py +0 -0
  4. deepfos/algo/graph.py +171 -0
  5. deepfos/algo/segtree.py +31 -0
  6. deepfos/api/V1_1/__init__.py +0 -0
  7. deepfos/api/V1_1/business_model.py +119 -0
  8. deepfos/api/V1_1/dimension.py +599 -0
  9. deepfos/api/V1_1/models/__init__.py +0 -0
  10. deepfos/api/V1_1/models/business_model.py +1033 -0
  11. deepfos/api/V1_1/models/dimension.py +2768 -0
  12. deepfos/api/V1_2/__init__.py +0 -0
  13. deepfos/api/V1_2/dimension.py +285 -0
  14. deepfos/api/V1_2/models/__init__.py +0 -0
  15. deepfos/api/V1_2/models/dimension.py +2923 -0
  16. deepfos/api/__init__.py +0 -0
  17. deepfos/api/account.py +167 -0
  18. deepfos/api/accounting_engines.py +147 -0
  19. deepfos/api/app.py +626 -0
  20. deepfos/api/approval_process.py +198 -0
  21. deepfos/api/base.py +983 -0
  22. deepfos/api/business_model.py +160 -0
  23. deepfos/api/consolidation.py +129 -0
  24. deepfos/api/consolidation_process.py +106 -0
  25. deepfos/api/datatable.py +341 -0
  26. deepfos/api/deep_pipeline.py +61 -0
  27. deepfos/api/deepconnector.py +36 -0
  28. deepfos/api/deepfos_task.py +92 -0
  29. deepfos/api/deepmodel.py +188 -0
  30. deepfos/api/dimension.py +486 -0
  31. deepfos/api/financial_model.py +319 -0
  32. deepfos/api/journal_model.py +119 -0
  33. deepfos/api/journal_template.py +132 -0
  34. deepfos/api/memory_financial_model.py +98 -0
  35. deepfos/api/models/__init__.py +3 -0
  36. deepfos/api/models/account.py +483 -0
  37. deepfos/api/models/accounting_engines.py +756 -0
  38. deepfos/api/models/app.py +1338 -0
  39. deepfos/api/models/approval_process.py +1043 -0
  40. deepfos/api/models/base.py +234 -0
  41. deepfos/api/models/business_model.py +805 -0
  42. deepfos/api/models/consolidation.py +711 -0
  43. deepfos/api/models/consolidation_process.py +248 -0
  44. deepfos/api/models/datatable_mysql.py +427 -0
  45. deepfos/api/models/deep_pipeline.py +55 -0
  46. deepfos/api/models/deepconnector.py +28 -0
  47. deepfos/api/models/deepfos_task.py +386 -0
  48. deepfos/api/models/deepmodel.py +308 -0
  49. deepfos/api/models/dimension.py +1576 -0
  50. deepfos/api/models/financial_model.py +1796 -0
  51. deepfos/api/models/journal_model.py +341 -0
  52. deepfos/api/models/journal_template.py +854 -0
  53. deepfos/api/models/memory_financial_model.py +478 -0
  54. deepfos/api/models/platform.py +178 -0
  55. deepfos/api/models/python.py +221 -0
  56. deepfos/api/models/reconciliation_engine.py +411 -0
  57. deepfos/api/models/reconciliation_report.py +161 -0
  58. deepfos/api/models/role_strategy.py +884 -0
  59. deepfos/api/models/smartlist.py +237 -0
  60. deepfos/api/models/space.py +1137 -0
  61. deepfos/api/models/system.py +1065 -0
  62. deepfos/api/models/variable.py +463 -0
  63. deepfos/api/models/workflow.py +946 -0
  64. deepfos/api/platform.py +199 -0
  65. deepfos/api/python.py +90 -0
  66. deepfos/api/reconciliation_engine.py +181 -0
  67. deepfos/api/reconciliation_report.py +64 -0
  68. deepfos/api/role_strategy.py +234 -0
  69. deepfos/api/smartlist.py +69 -0
  70. deepfos/api/space.py +582 -0
  71. deepfos/api/system.py +372 -0
  72. deepfos/api/variable.py +154 -0
  73. deepfos/api/workflow.py +264 -0
  74. deepfos/boost/__init__.py +6 -0
  75. deepfos/boost/py_jstream.py +89 -0
  76. deepfos/boost/py_pandas.py +20 -0
  77. deepfos/cache.py +121 -0
  78. deepfos/config.py +6 -0
  79. deepfos/core/__init__.py +27 -0
  80. deepfos/core/cube/__init__.py +10 -0
  81. deepfos/core/cube/_base.py +462 -0
  82. deepfos/core/cube/constants.py +21 -0
  83. deepfos/core/cube/cube.py +408 -0
  84. deepfos/core/cube/formula.py +707 -0
  85. deepfos/core/cube/syscube.py +532 -0
  86. deepfos/core/cube/typing.py +7 -0
  87. deepfos/core/cube/utils.py +238 -0
  88. deepfos/core/dimension/__init__.py +11 -0
  89. deepfos/core/dimension/_base.py +506 -0
  90. deepfos/core/dimension/dimcreator.py +184 -0
  91. deepfos/core/dimension/dimension.py +472 -0
  92. deepfos/core/dimension/dimexpr.py +271 -0
  93. deepfos/core/dimension/dimmember.py +155 -0
  94. deepfos/core/dimension/eledimension.py +22 -0
  95. deepfos/core/dimension/filters.py +99 -0
  96. deepfos/core/dimension/sysdimension.py +168 -0
  97. deepfos/core/logictable/__init__.py +5 -0
  98. deepfos/core/logictable/_cache.py +141 -0
  99. deepfos/core/logictable/_operator.py +663 -0
  100. deepfos/core/logictable/nodemixin.py +673 -0
  101. deepfos/core/logictable/sqlcondition.py +609 -0
  102. deepfos/core/logictable/tablemodel.py +497 -0
  103. deepfos/db/__init__.py +36 -0
  104. deepfos/db/cipher.py +660 -0
  105. deepfos/db/clickhouse.py +191 -0
  106. deepfos/db/connector.py +195 -0
  107. deepfos/db/daclickhouse.py +171 -0
  108. deepfos/db/dameng.py +101 -0
  109. deepfos/db/damysql.py +189 -0
  110. deepfos/db/dbkits.py +358 -0
  111. deepfos/db/deepengine.py +99 -0
  112. deepfos/db/deepmodel.py +82 -0
  113. deepfos/db/deepmodel_kingbase.py +83 -0
  114. deepfos/db/edb.py +214 -0
  115. deepfos/db/gauss.py +83 -0
  116. deepfos/db/kingbase.py +83 -0
  117. deepfos/db/mysql.py +184 -0
  118. deepfos/db/oracle.py +131 -0
  119. deepfos/db/postgresql.py +192 -0
  120. deepfos/db/sqlserver.py +99 -0
  121. deepfos/db/utils.py +135 -0
  122. deepfos/element/__init__.py +89 -0
  123. deepfos/element/accounting.py +348 -0
  124. deepfos/element/apvlprocess.py +215 -0
  125. deepfos/element/base.py +398 -0
  126. deepfos/element/bizmodel.py +1269 -0
  127. deepfos/element/datatable.py +2467 -0
  128. deepfos/element/deep_pipeline.py +186 -0
  129. deepfos/element/deepconnector.py +59 -0
  130. deepfos/element/deepmodel.py +1806 -0
  131. deepfos/element/dimension.py +1254 -0
  132. deepfos/element/fact_table.py +427 -0
  133. deepfos/element/finmodel.py +1485 -0
  134. deepfos/element/journal.py +840 -0
  135. deepfos/element/journal_template.py +943 -0
  136. deepfos/element/pyscript.py +412 -0
  137. deepfos/element/reconciliation.py +553 -0
  138. deepfos/element/rolestrategy.py +243 -0
  139. deepfos/element/smartlist.py +457 -0
  140. deepfos/element/variable.py +756 -0
  141. deepfos/element/workflow.py +560 -0
  142. deepfos/exceptions/__init__.py +239 -0
  143. deepfos/exceptions/hook.py +86 -0
  144. deepfos/lazy.py +104 -0
  145. deepfos/lazy_import.py +84 -0
  146. deepfos/lib/__init__.py +0 -0
  147. deepfos/lib/_javaobj.py +366 -0
  148. deepfos/lib/asynchronous.py +879 -0
  149. deepfos/lib/concurrency.py +107 -0
  150. deepfos/lib/constant.py +39 -0
  151. deepfos/lib/decorator.py +310 -0
  152. deepfos/lib/deepchart.py +778 -0
  153. deepfos/lib/deepux.py +477 -0
  154. deepfos/lib/discovery.py +273 -0
  155. deepfos/lib/edb_lexer.py +789 -0
  156. deepfos/lib/eureka.py +156 -0
  157. deepfos/lib/filterparser.py +751 -0
  158. deepfos/lib/httpcli.py +106 -0
  159. deepfos/lib/jsonstreamer.py +80 -0
  160. deepfos/lib/msg.py +394 -0
  161. deepfos/lib/nacos.py +225 -0
  162. deepfos/lib/patch.py +92 -0
  163. deepfos/lib/redis.py +241 -0
  164. deepfos/lib/serutils.py +181 -0
  165. deepfos/lib/stopwatch.py +99 -0
  166. deepfos/lib/subtask.py +572 -0
  167. deepfos/lib/sysutils.py +703 -0
  168. deepfos/lib/utils.py +1003 -0
  169. deepfos/local.py +160 -0
  170. deepfos/options.py +670 -0
  171. deepfos/translation.py +237 -0
  172. deepfos-1.1.60.dist-info/METADATA +33 -0
  173. deepfos-1.1.60.dist-info/RECORD +175 -0
  174. deepfos-1.1.60.dist-info/WHEEL +5 -0
  175. deepfos-1.1.60.dist-info/top_level.txt +1 -0
@@ -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
+ ...
@@ -0,0 +1,59 @@
1
+ import base64
2
+
3
+ from deepfos.api.deepconnector import DeepConnectorAPI
4
+ from deepfos.api.models import BaseModel
5
+ from deepfos.element.base import ElementBase, SyncMeta
6
+ from deepfos.lib.asynchronous import future_property
7
+ from deepfos.lib.decorator import cached_property
8
+
9
+ __all__ = ['AsyncDeepConnector', 'DeepConnector', 'ConnectionInfo']
10
+
11
+
12
+ class ConnectionInfo(BaseModel):
13
+ host: str
14
+ port: int
15
+ db: str
16
+ user: str
17
+ password: str
18
+ dbtype: str
19
+
20
+
21
+ # -----------------------------------------------------------------------------
22
+ # core
23
+ class AsyncDeepConnector(ElementBase[DeepConnectorAPI]):
24
+ """连接器"""
25
+
26
+ @cached_property
27
+ def api(self):
28
+ """同步API对象"""
29
+ api = self.api_class(sync=True)
30
+ return api
31
+
32
+ @future_property
33
+ async def async_api(self):
34
+ """异步API对象"""
35
+ return await self._init_api()
36
+
37
+ async def _init_api(self):
38
+ return self.api_class(sync=False)
39
+
40
+ @future_property
41
+ async def connection_info(self) -> ConnectionInfo:
42
+ """当前连接器元素的连接信息"""
43
+ api = await self.wait_for('async_api')
44
+ ele_info = await self.wait_for('element_info')
45
+ info = await api.datasource.connection_info(
46
+ element_info=ele_info,
47
+ )
48
+ return ConnectionInfo(
49
+ host=info.connectionHost,
50
+ port=info.connectionPort,
51
+ db=info.dbName,
52
+ user=info.username,
53
+ password=base64.decodebytes(info.password.encode()).decode(),
54
+ dbtype=info.serviceName,
55
+ )
56
+
57
+
58
+ class DeepConnector(AsyncDeepConnector, metaclass=SyncMeta):
59
+ pass