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,181 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime
4
+ import decimal
5
+ import functools
6
+ import uuid
7
+ from dataclasses import dataclass
8
+ from typing import Any
9
+
10
+ import edgedb
11
+ from edgedb.introspect import introspect_object as intro
12
+ from edgedb.datatypes import datatypes
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class Context:
17
+ frame_desc: Any = None
18
+ query_df: bool = False
19
+
20
+
21
+ @functools.singledispatch
22
+ def serialize(o, ctx: Context = Context()):
23
+ raise TypeError(f'无法序列化类型: {type(o)}')
24
+
25
+
26
+ @functools.singledispatch
27
+ def deserialize(o):
28
+ raise TypeError(f'无法反序列化类型: {type(o)}')
29
+
30
+
31
+ @deserialize.register
32
+ def to_object(o: dict):
33
+ _id = o.pop('id', None)
34
+ ordered_attr = o.keys()
35
+ obj_cls = datatypes.create_object_factory(
36
+ id='property' if _id else 'implicit',
37
+ **{k: 'link' if isinstance(o[k], dict) else 'property' for k in ordered_attr}
38
+ )
39
+ actual_id = None
40
+ if _id:
41
+ if isinstance(_id, str):
42
+ actual_id = uuid.UUID(_id)
43
+ elif isinstance(_id, uuid.UUID):
44
+ actual_id = _id
45
+ return obj_cls(
46
+ actual_id,
47
+ *[deserialize(o[k]) for k in ordered_attr]
48
+ )
49
+
50
+
51
+ @deserialize.register
52
+ def to_set(o: list):
53
+ return [deserialize(ele) for ele in o]
54
+
55
+
56
+ @deserialize.register
57
+ def to_tuple(o: tuple):
58
+ return tuple(deserialize(ele) for ele in o)
59
+
60
+
61
+ @deserialize.register(int)
62
+ @deserialize.register(float)
63
+ @deserialize.register(str)
64
+ @deserialize.register(bytes)
65
+ @deserialize.register(bool)
66
+ @deserialize.register(type(None))
67
+ @deserialize.register(datetime.datetime)
68
+ def to_scalar(o):
69
+ return o
70
+
71
+
72
+ @serialize.register
73
+ def _tuple(o: edgedb.Tuple, ctx: Context = Context()):
74
+ if ctx.frame_desc is None:
75
+ return tuple(serialize(el) for el in o)
76
+ return tuple(
77
+ serialize(el, Context(frame_desc=ctx.frame_desc[idx]))
78
+ for idx, el in enumerate(o)
79
+ )
80
+
81
+
82
+ @serialize.register
83
+ def _namedtuple(o: edgedb.NamedTuple, ctx: Context = Context()):
84
+ if ctx.frame_desc is None:
85
+ return {attr: serialize(getattr(o, attr)) for attr in dir(o)}
86
+ return {
87
+ attr: serialize(getattr(o, attr), Context(frame_desc=ctx.frame_desc[attr]))
88
+ for attr in ctx.frame_desc
89
+ }
90
+
91
+
92
+ @serialize.register
93
+ def _linkset(o: edgedb.LinkSet, ctx: Context = Context()):
94
+ return [serialize(el, ctx) for el in o]
95
+
96
+
97
+ @serialize.register
98
+ def _link(o: edgedb.Link, ctx: Context = Context()):
99
+ ret = {}
100
+ if ctx.frame_desc is None:
101
+ for lprop in dir(o):
102
+ if lprop in {'source', 'target'}:
103
+ continue
104
+ ret[f'@{lprop}'] = serialize(getattr(o, lprop))
105
+
106
+ ret.update(_object(o.target))
107
+ return ret
108
+
109
+ lprops = list(map(lambda x: f'@{x}', (set(dir(o)) - {'source', 'target'})))
110
+ for field in ctx.frame_desc:
111
+ new_ctx = Context(frame_desc=ctx.frame_desc[field])
112
+ if field in lprops:
113
+ ret[field] = serialize(getattr(o, field[1:]), new_ctx)
114
+ else:
115
+ ret[field] = serialize(getattr(o.target, field), new_ctx)
116
+ return ret
117
+
118
+
119
+ def ignore_implicited_fields(o: edgedb.Object):
120
+ return set(dir(o)) - {desc.name for desc in intro(o).pointers if desc.implicit}
121
+
122
+
123
+ @serialize.register
124
+ def _object(o: edgedb.Object, ctx: Context = Context()):
125
+ ret = {}
126
+
127
+ if ctx.frame_desc is None:
128
+ if ctx.query_df:
129
+ attrs = dir(o)
130
+ else:
131
+ attrs = ignore_implicited_fields(o)
132
+ for attr in attrs:
133
+ try:
134
+ ret[attr] = serialize(o[attr])
135
+ except (KeyError, TypeError):
136
+ ret[attr] = serialize(getattr(o, attr))
137
+ return ret
138
+
139
+ ensure_one_field = ctx.query_df and len(ctx.frame_desc) == 1
140
+ for key, value in dict(ctx.frame_desc).items():
141
+ if isinstance(key, tuple):
142
+ # key: (field_name, not_implicit)
143
+ maybe_drop = ctx.frame_desc.pop(key)
144
+ if ensure_one_field or key[1]:
145
+ ctx.frame_desc[key[0]] = maybe_drop
146
+
147
+ for attr in ctx.frame_desc:
148
+ try:
149
+ ret[attr] = serialize(o[attr], Context(frame_desc=ctx.frame_desc[attr]))
150
+ except (KeyError, TypeError):
151
+ ret[attr] = serialize(getattr(o, attr), Context(frame_desc=ctx.frame_desc[attr]))
152
+
153
+ return ret
154
+
155
+
156
+ @serialize.register(edgedb.Set)
157
+ @serialize.register(edgedb.Array)
158
+ def _set(o, ctx: Context = Context()):
159
+ return [serialize(el, ctx) for el in o]
160
+
161
+
162
+ @serialize.register(int)
163
+ @serialize.register(float)
164
+ @serialize.register(str)
165
+ @serialize.register(bytes)
166
+ @serialize.register(bool)
167
+ @serialize.register(type(None))
168
+ @serialize.register(datetime.timedelta)
169
+ @serialize.register(datetime.date)
170
+ @serialize.register(datetime.datetime)
171
+ @serialize.register(datetime.time)
172
+ @serialize.register(edgedb.RelativeDuration)
173
+ @serialize.register(uuid.UUID)
174
+ @serialize.register(decimal.Decimal)
175
+ def _scalar(o, ctx: Context = Context()):
176
+ return o
177
+
178
+
179
+ @serialize.register
180
+ def _enum(o: edgedb.EnumValue, ctx: Context = Context()):
181
+ return str(o)
@@ -0,0 +1,99 @@
1
+ """计时器"""
2
+
3
+ import functools
4
+ import time
5
+ from collections import OrderedDict
6
+ from deepfos.lib.utils import CIEnum
7
+ from loguru import logger
8
+
9
+
10
+ class TimeUnit(CIEnum):
11
+ ns = 'ns'
12
+ us = 'us'
13
+ ms = 'ms'
14
+ s = 's'
15
+ m = 'm'
16
+ h = 'h'
17
+
18
+
19
+ TIME_MAP = {
20
+ 'ns': 1,
21
+ 'us': 1_000,
22
+ 'ms': 1_000_000,
23
+ 's': 1_000_000_000,
24
+ 'm': 60_000_000_000,
25
+ 'h': 3_600_000_000_000,
26
+ }
27
+
28
+
29
+ class Stopwatch(object):
30
+ """计时器
31
+
32
+ Args:
33
+ unit: 计时单位
34
+ sink: 耗时信息的输出函数,默认为 ``logger.info``
35
+
36
+ >>> watch = Stopwatch(unit='s', sink=print)
37
+ >>> import time
38
+ >>> with watch('[task - sleep]'):
39
+ ... time.sleep(0)
40
+ [task - sleep]:0.00s
41
+ """
42
+ __slots__ = (
43
+ 'runtimes', 'start_stack', 'rec_count', 'name',
44
+ '_unit_repr', '_unit', '_sink'
45
+ )
46
+
47
+ def __init__(self, unit: str = 'ns', sink=logger.info):
48
+ self.runtimes = OrderedDict()
49
+ self.start_stack = []
50
+ self.rec_count = 0
51
+ self.name = []
52
+ self._unit_repr = _unit = TimeUnit[unit]
53
+ self._unit = TIME_MAP[_unit]
54
+ self._sink = sink
55
+
56
+ def __call__(self, name=None):
57
+ self.name.append(name)
58
+ return self
59
+
60
+ def __enter__(self):
61
+ self.rec_count += 1
62
+ self.start_stack.append(time.perf_counter_ns())
63
+
64
+ def __exit__(self, exc_type, exc_val, exc_tb):
65
+ time_gap = time.perf_counter_ns() - self.start_stack.pop(-1)
66
+ if self.name and self.name[-1] is not None:
67
+ key = self.name.pop(-1)
68
+ else:
69
+ key = f"task{self.rec_count}"
70
+ self._sink(f"{key}:{time_gap / self._unit :.2f}{self._unit_repr}")
71
+ self.runtimes[key] = time_gap
72
+
73
+ def get_all_runtime(self):
74
+ return list(self.runtimes.values())
75
+
76
+ def clear(self):
77
+ self.runtimes.clear()
78
+ self.rec_count = 0
79
+
80
+ def __repr__(self):
81
+ return ', '.join(
82
+ f"{name}:{t / self._unit :.2f}{self._unit_repr}"
83
+ for name, t in self.runtimes.items()
84
+ )
85
+
86
+
87
+ def stopwatch(func=None, unit: str = 's'): # pragma: no cover
88
+ if func is None:
89
+ return functools.partial(stopwatch, unit=unit)
90
+
91
+ watch = Stopwatch(unit)
92
+
93
+ @functools.wraps(func)
94
+ def wrap(*args, **kwargs):
95
+ with watch(func.__qualname__):
96
+ rtn = func(*args, **kwargs)
97
+
98
+ return rtn
99
+ return wrap