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.
- deepfos/__init__.py +6 -0
- deepfos/_version.py +21 -0
- deepfos/algo/__init__.py +0 -0
- deepfos/algo/graph.py +171 -0
- deepfos/algo/segtree.py +31 -0
- deepfos/api/V1_1/__init__.py +0 -0
- deepfos/api/V1_1/business_model.py +119 -0
- deepfos/api/V1_1/dimension.py +599 -0
- deepfos/api/V1_1/models/__init__.py +0 -0
- deepfos/api/V1_1/models/business_model.py +1033 -0
- deepfos/api/V1_1/models/dimension.py +2768 -0
- deepfos/api/V1_2/__init__.py +0 -0
- deepfos/api/V1_2/dimension.py +285 -0
- deepfos/api/V1_2/models/__init__.py +0 -0
- deepfos/api/V1_2/models/dimension.py +2923 -0
- deepfos/api/__init__.py +0 -0
- deepfos/api/account.py +167 -0
- deepfos/api/accounting_engines.py +147 -0
- deepfos/api/app.py +626 -0
- deepfos/api/approval_process.py +198 -0
- deepfos/api/base.py +983 -0
- deepfos/api/business_model.py +160 -0
- deepfos/api/consolidation.py +129 -0
- deepfos/api/consolidation_process.py +106 -0
- deepfos/api/datatable.py +341 -0
- deepfos/api/deep_pipeline.py +61 -0
- deepfos/api/deepconnector.py +36 -0
- deepfos/api/deepfos_task.py +92 -0
- deepfos/api/deepmodel.py +188 -0
- deepfos/api/dimension.py +486 -0
- deepfos/api/financial_model.py +319 -0
- deepfos/api/journal_model.py +119 -0
- deepfos/api/journal_template.py +132 -0
- deepfos/api/memory_financial_model.py +98 -0
- deepfos/api/models/__init__.py +3 -0
- deepfos/api/models/account.py +483 -0
- deepfos/api/models/accounting_engines.py +756 -0
- deepfos/api/models/app.py +1338 -0
- deepfos/api/models/approval_process.py +1043 -0
- deepfos/api/models/base.py +234 -0
- deepfos/api/models/business_model.py +805 -0
- deepfos/api/models/consolidation.py +711 -0
- deepfos/api/models/consolidation_process.py +248 -0
- deepfos/api/models/datatable_mysql.py +427 -0
- deepfos/api/models/deep_pipeline.py +55 -0
- deepfos/api/models/deepconnector.py +28 -0
- deepfos/api/models/deepfos_task.py +386 -0
- deepfos/api/models/deepmodel.py +308 -0
- deepfos/api/models/dimension.py +1576 -0
- deepfos/api/models/financial_model.py +1796 -0
- deepfos/api/models/journal_model.py +341 -0
- deepfos/api/models/journal_template.py +854 -0
- deepfos/api/models/memory_financial_model.py +478 -0
- deepfos/api/models/platform.py +178 -0
- deepfos/api/models/python.py +221 -0
- deepfos/api/models/reconciliation_engine.py +411 -0
- deepfos/api/models/reconciliation_report.py +161 -0
- deepfos/api/models/role_strategy.py +884 -0
- deepfos/api/models/smartlist.py +237 -0
- deepfos/api/models/space.py +1137 -0
- deepfos/api/models/system.py +1065 -0
- deepfos/api/models/variable.py +463 -0
- deepfos/api/models/workflow.py +946 -0
- deepfos/api/platform.py +199 -0
- deepfos/api/python.py +90 -0
- deepfos/api/reconciliation_engine.py +181 -0
- deepfos/api/reconciliation_report.py +64 -0
- deepfos/api/role_strategy.py +234 -0
- deepfos/api/smartlist.py +69 -0
- deepfos/api/space.py +582 -0
- deepfos/api/system.py +372 -0
- deepfos/api/variable.py +154 -0
- deepfos/api/workflow.py +264 -0
- deepfos/boost/__init__.py +6 -0
- deepfos/boost/py_jstream.py +89 -0
- deepfos/boost/py_pandas.py +20 -0
- deepfos/cache.py +121 -0
- deepfos/config.py +6 -0
- deepfos/core/__init__.py +27 -0
- deepfos/core/cube/__init__.py +10 -0
- deepfos/core/cube/_base.py +462 -0
- deepfos/core/cube/constants.py +21 -0
- deepfos/core/cube/cube.py +408 -0
- deepfos/core/cube/formula.py +707 -0
- deepfos/core/cube/syscube.py +532 -0
- deepfos/core/cube/typing.py +7 -0
- deepfos/core/cube/utils.py +238 -0
- deepfos/core/dimension/__init__.py +11 -0
- deepfos/core/dimension/_base.py +506 -0
- deepfos/core/dimension/dimcreator.py +184 -0
- deepfos/core/dimension/dimension.py +472 -0
- deepfos/core/dimension/dimexpr.py +271 -0
- deepfos/core/dimension/dimmember.py +155 -0
- deepfos/core/dimension/eledimension.py +22 -0
- deepfos/core/dimension/filters.py +99 -0
- deepfos/core/dimension/sysdimension.py +168 -0
- deepfos/core/logictable/__init__.py +5 -0
- deepfos/core/logictable/_cache.py +141 -0
- deepfos/core/logictable/_operator.py +663 -0
- deepfos/core/logictable/nodemixin.py +673 -0
- deepfos/core/logictable/sqlcondition.py +609 -0
- deepfos/core/logictable/tablemodel.py +497 -0
- deepfos/db/__init__.py +36 -0
- deepfos/db/cipher.py +660 -0
- deepfos/db/clickhouse.py +191 -0
- deepfos/db/connector.py +195 -0
- deepfos/db/daclickhouse.py +171 -0
- deepfos/db/dameng.py +101 -0
- deepfos/db/damysql.py +189 -0
- deepfos/db/dbkits.py +358 -0
- deepfos/db/deepengine.py +99 -0
- deepfos/db/deepmodel.py +82 -0
- deepfos/db/deepmodel_kingbase.py +83 -0
- deepfos/db/edb.py +214 -0
- deepfos/db/gauss.py +83 -0
- deepfos/db/kingbase.py +83 -0
- deepfos/db/mysql.py +184 -0
- deepfos/db/oracle.py +131 -0
- deepfos/db/postgresql.py +192 -0
- deepfos/db/sqlserver.py +99 -0
- deepfos/db/utils.py +135 -0
- deepfos/element/__init__.py +89 -0
- deepfos/element/accounting.py +348 -0
- deepfos/element/apvlprocess.py +215 -0
- deepfos/element/base.py +398 -0
- deepfos/element/bizmodel.py +1269 -0
- deepfos/element/datatable.py +2467 -0
- deepfos/element/deep_pipeline.py +186 -0
- deepfos/element/deepconnector.py +59 -0
- deepfos/element/deepmodel.py +1806 -0
- deepfos/element/dimension.py +1254 -0
- deepfos/element/fact_table.py +427 -0
- deepfos/element/finmodel.py +1485 -0
- deepfos/element/journal.py +840 -0
- deepfos/element/journal_template.py +943 -0
- deepfos/element/pyscript.py +412 -0
- deepfos/element/reconciliation.py +553 -0
- deepfos/element/rolestrategy.py +243 -0
- deepfos/element/smartlist.py +457 -0
- deepfos/element/variable.py +756 -0
- deepfos/element/workflow.py +560 -0
- deepfos/exceptions/__init__.py +239 -0
- deepfos/exceptions/hook.py +86 -0
- deepfos/lazy.py +104 -0
- deepfos/lazy_import.py +84 -0
- deepfos/lib/__init__.py +0 -0
- deepfos/lib/_javaobj.py +366 -0
- deepfos/lib/asynchronous.py +879 -0
- deepfos/lib/concurrency.py +107 -0
- deepfos/lib/constant.py +39 -0
- deepfos/lib/decorator.py +310 -0
- deepfos/lib/deepchart.py +778 -0
- deepfos/lib/deepux.py +477 -0
- deepfos/lib/discovery.py +273 -0
- deepfos/lib/edb_lexer.py +789 -0
- deepfos/lib/eureka.py +156 -0
- deepfos/lib/filterparser.py +751 -0
- deepfos/lib/httpcli.py +106 -0
- deepfos/lib/jsonstreamer.py +80 -0
- deepfos/lib/msg.py +394 -0
- deepfos/lib/nacos.py +225 -0
- deepfos/lib/patch.py +92 -0
- deepfos/lib/redis.py +241 -0
- deepfos/lib/serutils.py +181 -0
- deepfos/lib/stopwatch.py +99 -0
- deepfos/lib/subtask.py +572 -0
- deepfos/lib/sysutils.py +703 -0
- deepfos/lib/utils.py +1003 -0
- deepfos/local.py +160 -0
- deepfos/options.py +670 -0
- deepfos/translation.py +237 -0
- deepfos-1.1.60.dist-info/METADATA +33 -0
- deepfos-1.1.60.dist-info/RECORD +175 -0
- deepfos-1.1.60.dist-info/WHEEL +5 -0
- deepfos-1.1.60.dist-info/top_level.txt +1 -0
deepfos/lib/serutils.py
ADDED
|
@@ -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)
|
deepfos/lib/stopwatch.py
ADDED
|
@@ -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
|