onetick-py 1.162.2__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.
- locator_parser/__init__.py +0 -0
- locator_parser/acl.py +73 -0
- locator_parser/actions.py +266 -0
- locator_parser/common.py +365 -0
- locator_parser/io.py +41 -0
- locator_parser/locator.py +150 -0
- onetick/__init__.py +101 -0
- onetick/doc_utilities/__init__.py +3 -0
- onetick/doc_utilities/napoleon.py +40 -0
- onetick/doc_utilities/ot_doctest.py +140 -0
- onetick/doc_utilities/snippets.py +280 -0
- onetick/lib/__init__.py +4 -0
- onetick/lib/instance.py +138 -0
- onetick/py/__init__.py +290 -0
- onetick/py/_stack_info.py +89 -0
- onetick/py/_version.py +2 -0
- onetick/py/aggregations/__init__.py +11 -0
- onetick/py/aggregations/_base.py +645 -0
- onetick/py/aggregations/_docs.py +912 -0
- onetick/py/aggregations/compute.py +286 -0
- onetick/py/aggregations/functions.py +2216 -0
- onetick/py/aggregations/generic.py +104 -0
- onetick/py/aggregations/high_low.py +80 -0
- onetick/py/aggregations/num_distinct.py +83 -0
- onetick/py/aggregations/order_book.py +427 -0
- onetick/py/aggregations/other.py +1014 -0
- onetick/py/backports.py +26 -0
- onetick/py/cache.py +373 -0
- onetick/py/callback/__init__.py +5 -0
- onetick/py/callback/callback.py +275 -0
- onetick/py/callback/callbacks.py +131 -0
- onetick/py/compatibility.py +752 -0
- onetick/py/configuration.py +736 -0
- onetick/py/core/__init__.py +0 -0
- onetick/py/core/_csv_inspector.py +93 -0
- onetick/py/core/_internal/__init__.py +0 -0
- onetick/py/core/_internal/_manually_bound_value.py +6 -0
- onetick/py/core/_internal/_nodes_history.py +250 -0
- onetick/py/core/_internal/_op_utils/__init__.py +0 -0
- onetick/py/core/_internal/_op_utils/every_operand.py +9 -0
- onetick/py/core/_internal/_op_utils/is_const.py +10 -0
- onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +121 -0
- onetick/py/core/_internal/_proxy_node.py +140 -0
- onetick/py/core/_internal/_state_objects.py +2307 -0
- onetick/py/core/_internal/_state_vars.py +87 -0
- onetick/py/core/_source/__init__.py +0 -0
- onetick/py/core/_source/_symbol_param.py +95 -0
- onetick/py/core/_source/schema.py +97 -0
- onetick/py/core/_source/source_methods/__init__.py +0 -0
- onetick/py/core/_source/source_methods/aggregations.py +810 -0
- onetick/py/core/_source/source_methods/applyers.py +296 -0
- onetick/py/core/_source/source_methods/columns.py +141 -0
- onetick/py/core/_source/source_methods/data_quality.py +301 -0
- onetick/py/core/_source/source_methods/debugs.py +270 -0
- onetick/py/core/_source/source_methods/drops.py +120 -0
- onetick/py/core/_source/source_methods/fields.py +619 -0
- onetick/py/core/_source/source_methods/filters.py +1001 -0
- onetick/py/core/_source/source_methods/joins.py +1393 -0
- onetick/py/core/_source/source_methods/merges.py +566 -0
- onetick/py/core/_source/source_methods/misc.py +1325 -0
- onetick/py/core/_source/source_methods/pandases.py +155 -0
- onetick/py/core/_source/source_methods/renames.py +356 -0
- onetick/py/core/_source/source_methods/sorts.py +183 -0
- onetick/py/core/_source/source_methods/switches.py +142 -0
- onetick/py/core/_source/source_methods/symbols.py +117 -0
- onetick/py/core/_source/source_methods/times.py +627 -0
- onetick/py/core/_source/source_methods/writes.py +702 -0
- onetick/py/core/_source/symbol.py +202 -0
- onetick/py/core/_source/tmp_otq.py +222 -0
- onetick/py/core/column.py +209 -0
- onetick/py/core/column_operations/__init__.py +0 -0
- onetick/py/core/column_operations/_methods/__init__.py +4 -0
- onetick/py/core/column_operations/_methods/_internal.py +28 -0
- onetick/py/core/column_operations/_methods/conversions.py +215 -0
- onetick/py/core/column_operations/_methods/methods.py +294 -0
- onetick/py/core/column_operations/_methods/op_types.py +150 -0
- onetick/py/core/column_operations/accessors/__init__.py +0 -0
- onetick/py/core/column_operations/accessors/_accessor.py +30 -0
- onetick/py/core/column_operations/accessors/decimal_accessor.py +92 -0
- onetick/py/core/column_operations/accessors/dt_accessor.py +464 -0
- onetick/py/core/column_operations/accessors/float_accessor.py +160 -0
- onetick/py/core/column_operations/accessors/str_accessor.py +1374 -0
- onetick/py/core/column_operations/base.py +1061 -0
- onetick/py/core/cut_builder.py +149 -0
- onetick/py/core/db_constants.py +20 -0
- onetick/py/core/eval_query.py +244 -0
- onetick/py/core/lambda_object.py +442 -0
- onetick/py/core/multi_output_source.py +193 -0
- onetick/py/core/per_tick_script.py +2253 -0
- onetick/py/core/query_inspector.py +465 -0
- onetick/py/core/source.py +1663 -0
- onetick/py/db/__init__.py +2 -0
- onetick/py/db/_inspection.py +1042 -0
- onetick/py/db/db.py +1423 -0
- onetick/py/db/utils.py +64 -0
- onetick/py/docs/__init__.py +0 -0
- onetick/py/docs/docstring_parser.py +112 -0
- onetick/py/docs/utils.py +81 -0
- onetick/py/functions.py +2354 -0
- onetick/py/license.py +188 -0
- onetick/py/log.py +88 -0
- onetick/py/math.py +947 -0
- onetick/py/misc.py +437 -0
- onetick/py/oqd/__init__.py +22 -0
- onetick/py/oqd/eps.py +1195 -0
- onetick/py/oqd/sources.py +325 -0
- onetick/py/otq.py +211 -0
- onetick/py/pyomd_mock.py +47 -0
- onetick/py/run.py +841 -0
- onetick/py/servers.py +173 -0
- onetick/py/session.py +1342 -0
- onetick/py/sources/__init__.py +19 -0
- onetick/py/sources/cache.py +167 -0
- onetick/py/sources/common.py +126 -0
- onetick/py/sources/csv.py +642 -0
- onetick/py/sources/custom.py +85 -0
- onetick/py/sources/data_file.py +305 -0
- onetick/py/sources/data_source.py +1049 -0
- onetick/py/sources/empty.py +94 -0
- onetick/py/sources/odbc.py +337 -0
- onetick/py/sources/order_book.py +238 -0
- onetick/py/sources/parquet.py +168 -0
- onetick/py/sources/pit.py +191 -0
- onetick/py/sources/query.py +495 -0
- onetick/py/sources/snapshots.py +419 -0
- onetick/py/sources/split_query_output_by_symbol.py +198 -0
- onetick/py/sources/symbology_mapping.py +123 -0
- onetick/py/sources/symbols.py +357 -0
- onetick/py/sources/ticks.py +825 -0
- onetick/py/sql.py +70 -0
- onetick/py/state.py +256 -0
- onetick/py/types.py +2056 -0
- onetick/py/utils/__init__.py +70 -0
- onetick/py/utils/acl.py +93 -0
- onetick/py/utils/config.py +186 -0
- onetick/py/utils/default.py +49 -0
- onetick/py/utils/file.py +38 -0
- onetick/py/utils/helpers.py +76 -0
- onetick/py/utils/locator.py +94 -0
- onetick/py/utils/perf.py +499 -0
- onetick/py/utils/query.py +49 -0
- onetick/py/utils/render.py +1139 -0
- onetick/py/utils/script.py +244 -0
- onetick/py/utils/temp.py +471 -0
- onetick/py/utils/types.py +118 -0
- onetick/py/utils/tz.py +82 -0
- onetick_py-1.162.2.dist-info/METADATA +148 -0
- onetick_py-1.162.2.dist-info/RECORD +152 -0
- onetick_py-1.162.2.dist-info/WHEEL +5 -0
- onetick_py-1.162.2.dist-info/entry_points.txt +2 -0
- onetick_py-1.162.2.dist-info/licenses/LICENSE +21 -0
- onetick_py-1.162.2.dist-info/top_level.txt +2 -0
onetick/py/db/utils.py
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from onetick.py.otq import otli
|
|
4
|
+
from onetick.py.db import DB
|
|
5
|
+
from onetick.py.session import Session
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TmpSession:
|
|
9
|
+
def __init__(self):
|
|
10
|
+
if Session._instance is None:
|
|
11
|
+
if "ONE_TICK_CONFIG" in os.environ:
|
|
12
|
+
# use external session
|
|
13
|
+
otli.OneTickLib()
|
|
14
|
+
self.session = None
|
|
15
|
+
self.session_is_owned = False
|
|
16
|
+
else:
|
|
17
|
+
self.session_is_owned = True
|
|
18
|
+
self.session = Session()
|
|
19
|
+
|
|
20
|
+
else:
|
|
21
|
+
self.session_is_owned = False
|
|
22
|
+
self.session = Session._instance
|
|
23
|
+
self.temp_dbs = []
|
|
24
|
+
|
|
25
|
+
def __enter__(self):
|
|
26
|
+
return self
|
|
27
|
+
|
|
28
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
29
|
+
if self.session: # exclude case when session is set externally, ie using ONE_TICK_CONFIG
|
|
30
|
+
if self.session_is_owned:
|
|
31
|
+
self.session.close()
|
|
32
|
+
else:
|
|
33
|
+
for db in self.temp_dbs:
|
|
34
|
+
self.session.locator.remove(db)
|
|
35
|
+
|
|
36
|
+
def __db_is_registered(self, db):
|
|
37
|
+
base_db = str(db).split("//")[0] # noqa
|
|
38
|
+
return (base_db in self.session.databases) or (base_db in self.session.locator.databases)
|
|
39
|
+
|
|
40
|
+
def use(self, db):
|
|
41
|
+
if self.session is None and isinstance(db, str) and "ONE_TICK_CONFIG" in os.environ:
|
|
42
|
+
# we assume that database is already in the locator, that is
|
|
43
|
+
# managed externally by user, and we don't need to add it
|
|
44
|
+
# into the locator
|
|
45
|
+
return
|
|
46
|
+
|
|
47
|
+
if not isinstance(db, (str, DB)):
|
|
48
|
+
raise TypeError(
|
|
49
|
+
"Only a DB object or a string can be passed as db into get_"
|
|
50
|
+
f"functions working with databases. Instead, {db.__class__} was provided."
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if isinstance(db, str) and not self.__db_is_registered(db):
|
|
54
|
+
if self.session_is_owned:
|
|
55
|
+
raise TypeError(
|
|
56
|
+
"When there is no active session, db argument must be a DB object, not a database name."
|
|
57
|
+
)
|
|
58
|
+
else:
|
|
59
|
+
raise TypeError(f"We can not find passed database {db} in the session")
|
|
60
|
+
|
|
61
|
+
if not self.__db_is_registered(db):
|
|
62
|
+
self.session.locator.add(db)
|
|
63
|
+
if not self.session_is_owned:
|
|
64
|
+
self.temp_dbs.append(db)
|
|
File without changes
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
from collections import OrderedDict
|
|
4
|
+
from inspect import Parameter
|
|
5
|
+
from textwrap import dedent
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Docstring:
|
|
9
|
+
|
|
10
|
+
def __init__(self, doc: str):
|
|
11
|
+
if type(doc) is list:
|
|
12
|
+
doc = '\n'.join(doc)
|
|
13
|
+
self.doc = doc
|
|
14
|
+
self.indentation = ' ' * (len(doc.lstrip('\n')) - len(doc.lstrip()))
|
|
15
|
+
self.docstring = self._parse() # NOSONAR
|
|
16
|
+
|
|
17
|
+
self.order = ('Description',
|
|
18
|
+
'Parameters',
|
|
19
|
+
'Return',
|
|
20
|
+
'Returns',
|
|
21
|
+
'Note',
|
|
22
|
+
'Notes',
|
|
23
|
+
'Example',
|
|
24
|
+
'Examples',
|
|
25
|
+
'See Also')
|
|
26
|
+
|
|
27
|
+
def _parse(self):
|
|
28
|
+
def get_prev_name(s: str):
|
|
29
|
+
doc_, name_ = s.rstrip('\n').rsplit('\n', maxsplit=1)
|
|
30
|
+
prefix_ = name_
|
|
31
|
+
name_ = name_.strip()
|
|
32
|
+
prefix_ += '\n' + ' ' * (len(prefix_) - len(name_)) + '-' * len(name_)
|
|
33
|
+
return doc_, name_, prefix_
|
|
34
|
+
|
|
35
|
+
docstring = OrderedDict()
|
|
36
|
+
res = re.split(' *?-{4,}', self.doc) # NOSONAR
|
|
37
|
+
name = 'Description'
|
|
38
|
+
prefix = ''
|
|
39
|
+
|
|
40
|
+
# if there is no description part
|
|
41
|
+
if len(res[0].strip().splitlines()) == 1 and len(res) > 1:
|
|
42
|
+
name = res.pop(0).strip()
|
|
43
|
+
prefix = self.indentation + name + '\n' + self.indentation + '-' * len(name)
|
|
44
|
+
|
|
45
|
+
for i, part in enumerate(res):
|
|
46
|
+
if i == len(res) - 1:
|
|
47
|
+
docstring[name] = prefix + part
|
|
48
|
+
break
|
|
49
|
+
d, next_name, next_prefix = get_prev_name(part)
|
|
50
|
+
docstring[name] = prefix + d
|
|
51
|
+
name, prefix = next_name, next_prefix
|
|
52
|
+
return docstring
|
|
53
|
+
|
|
54
|
+
def get_sig(self, add_self=False):
|
|
55
|
+
"""
|
|
56
|
+
Get signature from existing documentation string.
|
|
57
|
+
"""
|
|
58
|
+
text = self.docstring.get('Parameters')
|
|
59
|
+
if not text:
|
|
60
|
+
return []
|
|
61
|
+
text = dedent(text)
|
|
62
|
+
text = re.split('-{4,}', text)[1]
|
|
63
|
+
parameters = []
|
|
64
|
+
for line in text.splitlines():
|
|
65
|
+
if not line or line[0] in (' ', '\t'):
|
|
66
|
+
continue
|
|
67
|
+
name, _, _ = line.partition(':')
|
|
68
|
+
if name == 'self' and not add_self:
|
|
69
|
+
continue
|
|
70
|
+
parameters.append(Parameter(name=name, kind=Parameter.POSITIONAL_OR_KEYWORD))
|
|
71
|
+
return parameters
|
|
72
|
+
|
|
73
|
+
def __setitem__(self, key, value):
|
|
74
|
+
if key not in self.docstring:
|
|
75
|
+
if key == 'Description':
|
|
76
|
+
self.docstring[key] = ''
|
|
77
|
+
else:
|
|
78
|
+
self.docstring[key] = self.indentation + key + '\n'
|
|
79
|
+
self.docstring[key] += self.indentation + '-' * len(key) + '\n'
|
|
80
|
+
for line in value.split('\n'):
|
|
81
|
+
self.docstring[key] += self.indentation + line + '\n'
|
|
82
|
+
|
|
83
|
+
def _apply_order(self):
|
|
84
|
+
key_map = dict((k.lower(), k) for k in self.docstring.keys())
|
|
85
|
+
for k in self.order[::-1]:
|
|
86
|
+
if k.lower() in key_map:
|
|
87
|
+
self.docstring.move_to_end(key_map[k.lower()], last=False)
|
|
88
|
+
|
|
89
|
+
def build(self):
|
|
90
|
+
self._apply_order()
|
|
91
|
+
res = ''
|
|
92
|
+
for k, value in self.docstring.items():
|
|
93
|
+
res += value + '\n'
|
|
94
|
+
|
|
95
|
+
return res
|
|
96
|
+
|
|
97
|
+
def update(self, other: 'Docstring'):
|
|
98
|
+
for key, value in other.docstring.items():
|
|
99
|
+
|
|
100
|
+
content = value.split('\n')
|
|
101
|
+
if key == 'Description':
|
|
102
|
+
content = content[1:]
|
|
103
|
+
if not '\n'.join(content).strip():
|
|
104
|
+
continue
|
|
105
|
+
else:
|
|
106
|
+
content = content[2:]
|
|
107
|
+
|
|
108
|
+
if key in self.docstring:
|
|
109
|
+
self.docstring.pop(key)
|
|
110
|
+
|
|
111
|
+
for line in content:
|
|
112
|
+
self[key] = line[len(self.indentation):]
|
onetick/py/docs/utils.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
from typing import Tuple, Optional, TYPE_CHECKING
|
|
4
|
+
from inspect import Parameter, formatannotation, Signature
|
|
5
|
+
from functools import wraps
|
|
6
|
+
|
|
7
|
+
from onetick.py.docs.docstring_parser import Docstring
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from onetick.py.core.source import Source
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def param_doc(name,
|
|
14
|
+
str_annotation=None,
|
|
15
|
+
str_default=None,
|
|
16
|
+
desc=None,
|
|
17
|
+
annotation=Parameter.empty,
|
|
18
|
+
default=Parameter.empty,
|
|
19
|
+
kind=Parameter.POSITIONAL_OR_KEYWORD) -> Tuple[str, Parameter]:
|
|
20
|
+
doc = f"""{name}"""
|
|
21
|
+
|
|
22
|
+
if str_annotation is None and annotation is not Parameter.empty:
|
|
23
|
+
str_annotation = formatannotation(annotation)
|
|
24
|
+
|
|
25
|
+
if str_annotation:
|
|
26
|
+
doc += f": {str_annotation}"
|
|
27
|
+
if str_default:
|
|
28
|
+
doc += f", default={str_default}"
|
|
29
|
+
elif default is not Parameter.empty:
|
|
30
|
+
doc += f", default={default}"
|
|
31
|
+
if desc:
|
|
32
|
+
doc += f" {desc}"
|
|
33
|
+
param = Parameter(name=name,
|
|
34
|
+
kind=kind,
|
|
35
|
+
default=default,
|
|
36
|
+
annotation=annotation)
|
|
37
|
+
return doc, param
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def docstring(parameters: Optional[list] = None, add_self=False):
|
|
41
|
+
parameters = parameters or []
|
|
42
|
+
|
|
43
|
+
def _decorator(fun):
|
|
44
|
+
@wraps(fun)
|
|
45
|
+
def _inner(*args, **kwargs):
|
|
46
|
+
return fun(*args, **kwargs)
|
|
47
|
+
doc = fun.__doc__ or ''
|
|
48
|
+
doc = Docstring(doc)
|
|
49
|
+
sig = []
|
|
50
|
+
if add_self:
|
|
51
|
+
sig.append(Parameter(name='self', kind=Parameter.POSITIONAL_OR_KEYWORD))
|
|
52
|
+
sig.extend(doc.get_sig())
|
|
53
|
+
for d, param in parameters:
|
|
54
|
+
doc['Parameters'] = d
|
|
55
|
+
sig.append(param)
|
|
56
|
+
_inner.__doc__ = doc.build()
|
|
57
|
+
_inner.__signature__ = Signature(sig)
|
|
58
|
+
return _inner
|
|
59
|
+
return _decorator
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def alias(aliased_fun, doc_replacer=None, skip_ot_directives=True):
|
|
63
|
+
"""
|
|
64
|
+
Returns new function with docstring and
|
|
65
|
+
signature copied from ``aliased_fun``.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
@wraps(aliased_fun)
|
|
69
|
+
def fun(*args, **kwargs):
|
|
70
|
+
return aliased_fun(*args, **kwargs)
|
|
71
|
+
|
|
72
|
+
if doc_replacer:
|
|
73
|
+
fun.__doc__ = doc_replacer(fun.__doc__)
|
|
74
|
+
if skip_ot_directives:
|
|
75
|
+
fun.__doc__ = re.sub('# OTdirective: .*', '', fun.__doc__)
|
|
76
|
+
return fun
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def is_windows():
|
|
80
|
+
# PY-866: needed to be used in :skipif: sphinx doctest directives
|
|
81
|
+
return os.name == 'nt'
|