onetick-py 1.177.0__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 (152) hide show
  1. locator_parser/__init__.py +0 -0
  2. locator_parser/acl.py +73 -0
  3. locator_parser/actions.py +262 -0
  4. locator_parser/common.py +368 -0
  5. locator_parser/io.py +43 -0
  6. locator_parser/locator.py +150 -0
  7. onetick/__init__.py +101 -0
  8. onetick/doc_utilities/__init__.py +3 -0
  9. onetick/doc_utilities/napoleon.py +40 -0
  10. onetick/doc_utilities/ot_doctest.py +140 -0
  11. onetick/doc_utilities/snippets.py +279 -0
  12. onetick/lib/__init__.py +4 -0
  13. onetick/lib/instance.py +141 -0
  14. onetick/py/__init__.py +293 -0
  15. onetick/py/_stack_info.py +89 -0
  16. onetick/py/_version.py +2 -0
  17. onetick/py/aggregations/__init__.py +11 -0
  18. onetick/py/aggregations/_base.py +648 -0
  19. onetick/py/aggregations/_docs.py +948 -0
  20. onetick/py/aggregations/compute.py +286 -0
  21. onetick/py/aggregations/functions.py +2216 -0
  22. onetick/py/aggregations/generic.py +104 -0
  23. onetick/py/aggregations/high_low.py +80 -0
  24. onetick/py/aggregations/num_distinct.py +83 -0
  25. onetick/py/aggregations/order_book.py +501 -0
  26. onetick/py/aggregations/other.py +1014 -0
  27. onetick/py/backports.py +26 -0
  28. onetick/py/cache.py +374 -0
  29. onetick/py/callback/__init__.py +5 -0
  30. onetick/py/callback/callback.py +276 -0
  31. onetick/py/callback/callbacks.py +131 -0
  32. onetick/py/compatibility.py +798 -0
  33. onetick/py/configuration.py +771 -0
  34. onetick/py/core/__init__.py +0 -0
  35. onetick/py/core/_csv_inspector.py +93 -0
  36. onetick/py/core/_internal/__init__.py +0 -0
  37. onetick/py/core/_internal/_manually_bound_value.py +6 -0
  38. onetick/py/core/_internal/_nodes_history.py +250 -0
  39. onetick/py/core/_internal/_op_utils/__init__.py +0 -0
  40. onetick/py/core/_internal/_op_utils/every_operand.py +9 -0
  41. onetick/py/core/_internal/_op_utils/is_const.py +10 -0
  42. onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +121 -0
  43. onetick/py/core/_internal/_proxy_node.py +140 -0
  44. onetick/py/core/_internal/_state_objects.py +2312 -0
  45. onetick/py/core/_internal/_state_vars.py +93 -0
  46. onetick/py/core/_source/__init__.py +0 -0
  47. onetick/py/core/_source/_symbol_param.py +95 -0
  48. onetick/py/core/_source/schema.py +97 -0
  49. onetick/py/core/_source/source_methods/__init__.py +0 -0
  50. onetick/py/core/_source/source_methods/aggregations.py +809 -0
  51. onetick/py/core/_source/source_methods/applyers.py +296 -0
  52. onetick/py/core/_source/source_methods/columns.py +141 -0
  53. onetick/py/core/_source/source_methods/data_quality.py +301 -0
  54. onetick/py/core/_source/source_methods/debugs.py +272 -0
  55. onetick/py/core/_source/source_methods/drops.py +120 -0
  56. onetick/py/core/_source/source_methods/fields.py +619 -0
  57. onetick/py/core/_source/source_methods/filters.py +1002 -0
  58. onetick/py/core/_source/source_methods/joins.py +1413 -0
  59. onetick/py/core/_source/source_methods/merges.py +605 -0
  60. onetick/py/core/_source/source_methods/misc.py +1455 -0
  61. onetick/py/core/_source/source_methods/pandases.py +155 -0
  62. onetick/py/core/_source/source_methods/renames.py +356 -0
  63. onetick/py/core/_source/source_methods/sorts.py +183 -0
  64. onetick/py/core/_source/source_methods/switches.py +142 -0
  65. onetick/py/core/_source/source_methods/symbols.py +117 -0
  66. onetick/py/core/_source/source_methods/times.py +627 -0
  67. onetick/py/core/_source/source_methods/writes.py +986 -0
  68. onetick/py/core/_source/symbol.py +205 -0
  69. onetick/py/core/_source/tmp_otq.py +222 -0
  70. onetick/py/core/column.py +209 -0
  71. onetick/py/core/column_operations/__init__.py +0 -0
  72. onetick/py/core/column_operations/_methods/__init__.py +4 -0
  73. onetick/py/core/column_operations/_methods/_internal.py +28 -0
  74. onetick/py/core/column_operations/_methods/conversions.py +216 -0
  75. onetick/py/core/column_operations/_methods/methods.py +292 -0
  76. onetick/py/core/column_operations/_methods/op_types.py +160 -0
  77. onetick/py/core/column_operations/accessors/__init__.py +0 -0
  78. onetick/py/core/column_operations/accessors/_accessor.py +28 -0
  79. onetick/py/core/column_operations/accessors/decimal_accessor.py +104 -0
  80. onetick/py/core/column_operations/accessors/dt_accessor.py +537 -0
  81. onetick/py/core/column_operations/accessors/float_accessor.py +184 -0
  82. onetick/py/core/column_operations/accessors/str_accessor.py +1367 -0
  83. onetick/py/core/column_operations/base.py +1121 -0
  84. onetick/py/core/cut_builder.py +150 -0
  85. onetick/py/core/db_constants.py +20 -0
  86. onetick/py/core/eval_query.py +245 -0
  87. onetick/py/core/lambda_object.py +441 -0
  88. onetick/py/core/multi_output_source.py +232 -0
  89. onetick/py/core/per_tick_script.py +2256 -0
  90. onetick/py/core/query_inspector.py +464 -0
  91. onetick/py/core/source.py +1744 -0
  92. onetick/py/db/__init__.py +2 -0
  93. onetick/py/db/_inspection.py +1128 -0
  94. onetick/py/db/db.py +1327 -0
  95. onetick/py/db/utils.py +64 -0
  96. onetick/py/docs/__init__.py +0 -0
  97. onetick/py/docs/docstring_parser.py +112 -0
  98. onetick/py/docs/utils.py +81 -0
  99. onetick/py/functions.py +2398 -0
  100. onetick/py/license.py +190 -0
  101. onetick/py/log.py +88 -0
  102. onetick/py/math.py +935 -0
  103. onetick/py/misc.py +470 -0
  104. onetick/py/oqd/__init__.py +22 -0
  105. onetick/py/oqd/eps.py +1195 -0
  106. onetick/py/oqd/sources.py +325 -0
  107. onetick/py/otq.py +216 -0
  108. onetick/py/pyomd_mock.py +47 -0
  109. onetick/py/run.py +916 -0
  110. onetick/py/servers.py +173 -0
  111. onetick/py/session.py +1347 -0
  112. onetick/py/sources/__init__.py +19 -0
  113. onetick/py/sources/cache.py +167 -0
  114. onetick/py/sources/common.py +128 -0
  115. onetick/py/sources/csv.py +642 -0
  116. onetick/py/sources/custom.py +85 -0
  117. onetick/py/sources/data_file.py +305 -0
  118. onetick/py/sources/data_source.py +1045 -0
  119. onetick/py/sources/empty.py +94 -0
  120. onetick/py/sources/odbc.py +337 -0
  121. onetick/py/sources/order_book.py +271 -0
  122. onetick/py/sources/parquet.py +168 -0
  123. onetick/py/sources/pit.py +191 -0
  124. onetick/py/sources/query.py +495 -0
  125. onetick/py/sources/snapshots.py +419 -0
  126. onetick/py/sources/split_query_output_by_symbol.py +198 -0
  127. onetick/py/sources/symbology_mapping.py +123 -0
  128. onetick/py/sources/symbols.py +374 -0
  129. onetick/py/sources/ticks.py +825 -0
  130. onetick/py/sql.py +70 -0
  131. onetick/py/state.py +251 -0
  132. onetick/py/types.py +2131 -0
  133. onetick/py/utils/__init__.py +70 -0
  134. onetick/py/utils/acl.py +93 -0
  135. onetick/py/utils/config.py +186 -0
  136. onetick/py/utils/default.py +49 -0
  137. onetick/py/utils/file.py +38 -0
  138. onetick/py/utils/helpers.py +76 -0
  139. onetick/py/utils/locator.py +94 -0
  140. onetick/py/utils/perf.py +498 -0
  141. onetick/py/utils/query.py +49 -0
  142. onetick/py/utils/render.py +1374 -0
  143. onetick/py/utils/script.py +244 -0
  144. onetick/py/utils/temp.py +471 -0
  145. onetick/py/utils/types.py +120 -0
  146. onetick/py/utils/tz.py +84 -0
  147. onetick_py-1.177.0.dist-info/METADATA +137 -0
  148. onetick_py-1.177.0.dist-info/RECORD +152 -0
  149. onetick_py-1.177.0.dist-info/WHEEL +5 -0
  150. onetick_py-1.177.0.dist-info/entry_points.txt +2 -0
  151. onetick_py-1.177.0.dist-info/licenses/LICENSE +21 -0
  152. onetick_py-1.177.0.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 isinstance(doc, 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):]
@@ -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'