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.
- locator_parser/__init__.py +0 -0
- locator_parser/acl.py +73 -0
- locator_parser/actions.py +262 -0
- locator_parser/common.py +368 -0
- locator_parser/io.py +43 -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 +279 -0
- onetick/lib/__init__.py +4 -0
- onetick/lib/instance.py +141 -0
- onetick/py/__init__.py +293 -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 +648 -0
- onetick/py/aggregations/_docs.py +948 -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 +501 -0
- onetick/py/aggregations/other.py +1014 -0
- onetick/py/backports.py +26 -0
- onetick/py/cache.py +374 -0
- onetick/py/callback/__init__.py +5 -0
- onetick/py/callback/callback.py +276 -0
- onetick/py/callback/callbacks.py +131 -0
- onetick/py/compatibility.py +798 -0
- onetick/py/configuration.py +771 -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 +2312 -0
- onetick/py/core/_internal/_state_vars.py +93 -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 +809 -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 +272 -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 +1002 -0
- onetick/py/core/_source/source_methods/joins.py +1413 -0
- onetick/py/core/_source/source_methods/merges.py +605 -0
- onetick/py/core/_source/source_methods/misc.py +1455 -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 +986 -0
- onetick/py/core/_source/symbol.py +205 -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 +216 -0
- onetick/py/core/column_operations/_methods/methods.py +292 -0
- onetick/py/core/column_operations/_methods/op_types.py +160 -0
- onetick/py/core/column_operations/accessors/__init__.py +0 -0
- onetick/py/core/column_operations/accessors/_accessor.py +28 -0
- onetick/py/core/column_operations/accessors/decimal_accessor.py +104 -0
- onetick/py/core/column_operations/accessors/dt_accessor.py +537 -0
- onetick/py/core/column_operations/accessors/float_accessor.py +184 -0
- onetick/py/core/column_operations/accessors/str_accessor.py +1367 -0
- onetick/py/core/column_operations/base.py +1121 -0
- onetick/py/core/cut_builder.py +150 -0
- onetick/py/core/db_constants.py +20 -0
- onetick/py/core/eval_query.py +245 -0
- onetick/py/core/lambda_object.py +441 -0
- onetick/py/core/multi_output_source.py +232 -0
- onetick/py/core/per_tick_script.py +2256 -0
- onetick/py/core/query_inspector.py +464 -0
- onetick/py/core/source.py +1744 -0
- onetick/py/db/__init__.py +2 -0
- onetick/py/db/_inspection.py +1128 -0
- onetick/py/db/db.py +1327 -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 +2398 -0
- onetick/py/license.py +190 -0
- onetick/py/log.py +88 -0
- onetick/py/math.py +935 -0
- onetick/py/misc.py +470 -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 +216 -0
- onetick/py/pyomd_mock.py +47 -0
- onetick/py/run.py +916 -0
- onetick/py/servers.py +173 -0
- onetick/py/session.py +1347 -0
- onetick/py/sources/__init__.py +19 -0
- onetick/py/sources/cache.py +167 -0
- onetick/py/sources/common.py +128 -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 +1045 -0
- onetick/py/sources/empty.py +94 -0
- onetick/py/sources/odbc.py +337 -0
- onetick/py/sources/order_book.py +271 -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 +374 -0
- onetick/py/sources/ticks.py +825 -0
- onetick/py/sql.py +70 -0
- onetick/py/state.py +251 -0
- onetick/py/types.py +2131 -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 +498 -0
- onetick/py/utils/query.py +49 -0
- onetick/py/utils/render.py +1374 -0
- onetick/py/utils/script.py +244 -0
- onetick/py/utils/temp.py +471 -0
- onetick/py/utils/types.py +120 -0
- onetick/py/utils/tz.py +84 -0
- onetick_py-1.177.0.dist-info/METADATA +137 -0
- onetick_py-1.177.0.dist-info/RECORD +152 -0
- onetick_py-1.177.0.dist-info/WHEEL +5 -0
- onetick_py-1.177.0.dist-info/entry_points.txt +2 -0
- onetick_py-1.177.0.dist-info/licenses/LICENSE +21 -0
- onetick_py-1.177.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import argparse
|
|
3
|
+
import doctest
|
|
4
|
+
import pkgutil
|
|
5
|
+
import json
|
|
6
|
+
from collections import defaultdict
|
|
7
|
+
from typing import List, Optional
|
|
8
|
+
from jupyter_core.paths import jupyter_data_dir, jupyter_config_dir
|
|
9
|
+
import onetick.py as otp
|
|
10
|
+
from onetick.doc_utilities.ot_doctest import OTDoctestParser
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def parse_args():
|
|
14
|
+
parser = argparse.ArgumentParser(description='Adding snippets configuration from onetick-py package')
|
|
15
|
+
parser.add_argument('extension',
|
|
16
|
+
choices=['snippets', 'snippets_menu', 'jupyterlab_snippets'],
|
|
17
|
+
default='snippets', nargs='?',
|
|
18
|
+
help='adding configuration to selected extension')
|
|
19
|
+
parser.add_argument('-i', '--names-info', action='store_true',
|
|
20
|
+
help='show snippet names as yaml "tree"')
|
|
21
|
+
args = parser.parse_args()
|
|
22
|
+
return args
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def collect_examples_from_obj(obj: doctest.DocTest) -> List:
|
|
26
|
+
"""groups examples for one object (docstring)"""
|
|
27
|
+
snippets = []
|
|
28
|
+
id_ = 1
|
|
29
|
+
snippet = Snippet(obj_ref=f'{obj.name} {id_}')
|
|
30
|
+
|
|
31
|
+
for example in obj.examples:
|
|
32
|
+
snippet.append(example)
|
|
33
|
+
if example.want:
|
|
34
|
+
snippets.append(snippet)
|
|
35
|
+
id_ += 1
|
|
36
|
+
snippet = Snippet(obj_ref=f'{obj.name} {id_}')
|
|
37
|
+
return snippets
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def parse_string(string: str, caller: Optional[str] = None) -> str:
|
|
41
|
+
parser = OTDoctestParser(caller=caller)
|
|
42
|
+
lines = parser.parse(string)
|
|
43
|
+
res: List = []
|
|
44
|
+
snippet = Snippet()
|
|
45
|
+
for item in lines:
|
|
46
|
+
if isinstance(item, doctest.Example):
|
|
47
|
+
snippet.append(item)
|
|
48
|
+
else:
|
|
49
|
+
if snippet.code:
|
|
50
|
+
res.append(snippet)
|
|
51
|
+
snippet = Snippet()
|
|
52
|
+
res.append(item)
|
|
53
|
+
return ''.join(map(str, res))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class SnippetInspectionError(Exception):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def inspect_modules():
|
|
61
|
+
|
|
62
|
+
"""Inspect onetick.py modules and collect snippets"""
|
|
63
|
+
|
|
64
|
+
finder = doctest.DocTestFinder(parser=OTDoctestParser(caller='snippet'))
|
|
65
|
+
snippets = Snippets()
|
|
66
|
+
|
|
67
|
+
error_messages = []
|
|
68
|
+
|
|
69
|
+
for _, modname, _ in pkgutil.walk_packages(otp.__path__, prefix=otp.__name__ + '.'):
|
|
70
|
+
module = __import__(modname, fromlist=['__any__'])
|
|
71
|
+
for doc in finder.find(module):
|
|
72
|
+
for snippet in collect_examples_from_obj(doc):
|
|
73
|
+
try:
|
|
74
|
+
snippets.append(snippet)
|
|
75
|
+
except Exception as e:
|
|
76
|
+
error_messages.append(str(e))
|
|
77
|
+
if error_messages:
|
|
78
|
+
error_messages = '\t\n'.join(error_messages)
|
|
79
|
+
message = f"During collection of snippets following exception were raised:\n{error_messages}"
|
|
80
|
+
raise SnippetInspectionError(message)
|
|
81
|
+
|
|
82
|
+
return snippets
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def set_snippets(content):
|
|
86
|
+
"""Set nbextension-contrib-snippets with content"""
|
|
87
|
+
snippets = {'snippets': content}
|
|
88
|
+
path = jupyter_data_dir()
|
|
89
|
+
path = os.path.join(path, 'nbextensions', 'snippets', 'snippets.json')
|
|
90
|
+
if not os.path.exists(path):
|
|
91
|
+
raise FileNotFoundError('Not able to set onetick snippets. Make sure nbextension snippets was installed.'
|
|
92
|
+
f'File {path} not found')
|
|
93
|
+
with open(path, 'w') as f:
|
|
94
|
+
json.dump(snippets, f, indent=4, sort_keys=True)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def set_snippets_menu(content):
|
|
98
|
+
"""Set nbextension-contrib-snippets_menu with content"""
|
|
99
|
+
custom_js = f'''require(["nbextensions/snippets_menu/main"], function (snippets_menu) {{
|
|
100
|
+
console.log('Loading `snippets_menu` customizations from `custom.js`');
|
|
101
|
+
var horizontal_line = '---';
|
|
102
|
+
var snippets = {{
|
|
103
|
+
'name' : 'OneTick snippets',
|
|
104
|
+
'sub-menu' : {json.dumps(content, indent=4, sort_keys=True)}
|
|
105
|
+
}};
|
|
106
|
+
snippets_menu.options['menus'].push(snippets);
|
|
107
|
+
console.log('Loaded `snippets_menu` customizations from `custom.js`');
|
|
108
|
+
}});'''
|
|
109
|
+
path = os.path.join(jupyter_config_dir(), 'custom', 'custom.js')
|
|
110
|
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
111
|
+
with open(path, 'w') as f:
|
|
112
|
+
f.write(custom_js)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def set_jupyterlab_snippets(content):
|
|
116
|
+
"""Set jupyterlab-snippets with content"""
|
|
117
|
+
|
|
118
|
+
def traverse_snippets(path, node_list):
|
|
119
|
+
for node in node_list:
|
|
120
|
+
if "sub-menu" in node:
|
|
121
|
+
folder_path = os.path.join(path, node["name"])
|
|
122
|
+
os.makedirs(folder_path, exist_ok=True)
|
|
123
|
+
traverse_snippets(folder_path, node["sub-menu"])
|
|
124
|
+
elif "snippet" in node:
|
|
125
|
+
filename = os.path.join(path, node["name"].replace("|", " ").replace("/", " ")) + ".py"
|
|
126
|
+
print(filename)
|
|
127
|
+
with open(filename, 'w') as f:
|
|
128
|
+
f.write("\n".join(node["snippet"]))
|
|
129
|
+
|
|
130
|
+
snippet_path = os.path.join(jupyter_data_dir(), "snippets", "OneTick snippets")
|
|
131
|
+
os.makedirs(snippet_path, exist_ok=True)
|
|
132
|
+
traverse_snippets(snippet_path, content)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class Snippet:
|
|
136
|
+
|
|
137
|
+
"""
|
|
138
|
+
Snippet container.
|
|
139
|
+
Contain code from doctest.Examples, add ability to set name.
|
|
140
|
+
Validate names get from doctest.Examples
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
def __init__(self,
|
|
144
|
+
name: Optional[str] = None,
|
|
145
|
+
examples: Optional[List[doctest.Example]] = None,
|
|
146
|
+
obj_ref: Optional[str] = None):
|
|
147
|
+
self._name = name
|
|
148
|
+
self._examples = examples or []
|
|
149
|
+
self._obj_ref = obj_ref
|
|
150
|
+
self.skip_snippet = False
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def name(self):
|
|
154
|
+
return self._name
|
|
155
|
+
|
|
156
|
+
@name.setter
|
|
157
|
+
def name(self, value):
|
|
158
|
+
if self._name:
|
|
159
|
+
raise ValueError(f'Two names set for one snippet in "{self._obj_ref}": {self._name}, {value}')
|
|
160
|
+
self._name = value
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def code(self) -> List[str]:
|
|
164
|
+
res = []
|
|
165
|
+
for ex in self._examples:
|
|
166
|
+
res.extend(ex.source.strip().split('\n'))
|
|
167
|
+
return res
|
|
168
|
+
|
|
169
|
+
@property
|
|
170
|
+
def code_raw(self) -> str:
|
|
171
|
+
res = []
|
|
172
|
+
for ex in self._examples:
|
|
173
|
+
for i, line in enumerate(ex.source.strip().split('\n')):
|
|
174
|
+
if i == 0:
|
|
175
|
+
res.append('>>> ' + line)
|
|
176
|
+
else:
|
|
177
|
+
res.append('... ' + line)
|
|
178
|
+
res.append(ex.want)
|
|
179
|
+
return '\n'.join(res)
|
|
180
|
+
|
|
181
|
+
def append(self, item: doctest.Example):
|
|
182
|
+
for attr in ['name', 'skip_snippet']:
|
|
183
|
+
if hasattr(item, attr):
|
|
184
|
+
setattr(self, attr, getattr(item, attr))
|
|
185
|
+
skip_example = False
|
|
186
|
+
if hasattr(item, 'skip'):
|
|
187
|
+
skip_example = getattr(item, 'skip')
|
|
188
|
+
if not skip_example and item.source.strip():
|
|
189
|
+
self._examples.append(item)
|
|
190
|
+
|
|
191
|
+
def __str__(self):
|
|
192
|
+
return self.code_raw
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class Snippets:
|
|
196
|
+
|
|
197
|
+
"""Container for Snippet's"""
|
|
198
|
+
|
|
199
|
+
def __init__(self):
|
|
200
|
+
self._snippets = {}
|
|
201
|
+
|
|
202
|
+
def append(self, item: Snippet):
|
|
203
|
+
"""
|
|
204
|
+
Validate Snippet name;
|
|
205
|
+
Add Snippet to container
|
|
206
|
+
"""
|
|
207
|
+
if item.skip_snippet or not item.code:
|
|
208
|
+
return
|
|
209
|
+
if not item.name:
|
|
210
|
+
return # skipping nameless snippets
|
|
211
|
+
if item.name in self._snippets:
|
|
212
|
+
raise ValueError('Snippet name is not unique. '
|
|
213
|
+
f'Objects "{self._snippets[item.name]._obj_ref}", "{item._obj_ref}"')
|
|
214
|
+
self._snippets[item.name] = item
|
|
215
|
+
|
|
216
|
+
def extend(self, items: List):
|
|
217
|
+
for item in items:
|
|
218
|
+
self.append(item)
|
|
219
|
+
|
|
220
|
+
def __iter__(self):
|
|
221
|
+
yield from self._snippets.values()
|
|
222
|
+
|
|
223
|
+
def dict_view(self):
|
|
224
|
+
"""Format snippets for nbextension-contrib-snippets"""
|
|
225
|
+
return {"snippets": [{"name": s.name, "code": s.code} for s in self]}
|
|
226
|
+
|
|
227
|
+
def menu_view(self):
|
|
228
|
+
"""Format snippets for nbextension-contrib-snippets_menu"""
|
|
229
|
+
|
|
230
|
+
def tree():
|
|
231
|
+
return defaultdict(tree)
|
|
232
|
+
|
|
233
|
+
def set(t, keys: List, value):
|
|
234
|
+
tmp = t
|
|
235
|
+
for key in keys[:-1]:
|
|
236
|
+
tmp = tmp[key]
|
|
237
|
+
tmp[keys[-1]] = value
|
|
238
|
+
|
|
239
|
+
def walk(t):
|
|
240
|
+
res = []
|
|
241
|
+
names = []
|
|
242
|
+
for key in t.keys():
|
|
243
|
+
if not isinstance(t[key], defaultdict):
|
|
244
|
+
res.append({"name": key, "snippet": t[key].code})
|
|
245
|
+
names.append(key)
|
|
246
|
+
else:
|
|
247
|
+
code, name = walk(t[key])
|
|
248
|
+
res.append({"name": key, "sub-menu": code})
|
|
249
|
+
names.append({key: name})
|
|
250
|
+
return res, names
|
|
251
|
+
|
|
252
|
+
res = tree()
|
|
253
|
+
|
|
254
|
+
for v in self:
|
|
255
|
+
names = v.name.split('.')
|
|
256
|
+
set(res, names, v)
|
|
257
|
+
return walk(res)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def main():
|
|
261
|
+
args = parse_args()
|
|
262
|
+
snippets = inspect_modules()
|
|
263
|
+
if args.names_info:
|
|
264
|
+
import yaml
|
|
265
|
+
_, menu = snippets.menu_view()
|
|
266
|
+
print(yaml.dump(menu))
|
|
267
|
+
else:
|
|
268
|
+
if args.extension == 'snippets':
|
|
269
|
+
set_snippets(snippets.dict_view())
|
|
270
|
+
elif args.extension == 'snippets_menu':
|
|
271
|
+
s, _ = snippets.menu_view()
|
|
272
|
+
set_snippets_menu(s)
|
|
273
|
+
elif args.extension == 'jupyterlab_snippets':
|
|
274
|
+
s, _ = snippets.menu_view()
|
|
275
|
+
set_jupyterlab_snippets(s)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
if __name__ == '__main__':
|
|
279
|
+
main()
|
onetick/lib/__init__.py
ADDED
onetick/lib/instance.py
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# mypy: disable-error-code="attr-defined"
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import gc
|
|
5
|
+
import inspect
|
|
6
|
+
from enum import Enum
|
|
7
|
+
|
|
8
|
+
if os.getenv('OTP_WEBAPI', default='').lower() not in ('0', 'false', 'no', ''):
|
|
9
|
+
import onetick.query_webapi as otq
|
|
10
|
+
|
|
11
|
+
class OneTickLibMock:
|
|
12
|
+
LOGGING_LEVEL_MIN = 0
|
|
13
|
+
LOGGING_LEVEL_LOW = 1
|
|
14
|
+
LOGGING_LEVEL_MEDIUM = 2
|
|
15
|
+
LOGGING_LEVEL_MAX = 3
|
|
16
|
+
|
|
17
|
+
def __init__(self, *args, **kwargs):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
def set_log_file(self, log_file):
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
otq.OneTickLib = OneTickLibMock
|
|
24
|
+
|
|
25
|
+
else:
|
|
26
|
+
import onetick.query as otq
|
|
27
|
+
import pyomd
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class LoggingLevel(Enum):
|
|
31
|
+
MIN = otq.OneTickLib.LOGGING_LEVEL_MIN
|
|
32
|
+
LOW = otq.OneTickLib.LOGGING_LEVEL_LOW
|
|
33
|
+
MEDIUM = otq.OneTickLib.LOGGING_LEVEL_MEDIUM
|
|
34
|
+
MAX = otq.OneTickLib.LOGGING_LEVEL_MAX
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class OneTickLib:
|
|
38
|
+
"""
|
|
39
|
+
Singleton class for ``otq.OneTickLib`` to initialize it once.
|
|
40
|
+
|
|
41
|
+
Returns the same object if it was already initialized.
|
|
42
|
+
"""
|
|
43
|
+
__otl_instance = None
|
|
44
|
+
__instance = None
|
|
45
|
+
__args = None
|
|
46
|
+
|
|
47
|
+
def __new__(cls, *args, **kwargs):
|
|
48
|
+
if cls.__otl_instance is None:
|
|
49
|
+
cls.__otl_instance = super(OneTickLib, cls).__new__(cls)
|
|
50
|
+
|
|
51
|
+
def proxy_wrap(attr, static=False):
|
|
52
|
+
|
|
53
|
+
if static:
|
|
54
|
+
def f(*args, **kwargs): # type: ignore
|
|
55
|
+
return getattr(OneTickLib.__instance, attr)(*args, **kwargs)
|
|
56
|
+
return staticmethod(f)
|
|
57
|
+
else:
|
|
58
|
+
def f(self, *args, **kwargs): # type: ignore
|
|
59
|
+
return getattr(OneTickLib.__instance, attr)(*args, **kwargs)
|
|
60
|
+
return f
|
|
61
|
+
|
|
62
|
+
for attr, value in inspect.getmembers(otq.OneTickLib, callable):
|
|
63
|
+
if not attr.startswith('_') and not hasattr(OneTickLib, attr):
|
|
64
|
+
fun = inspect.getattr_static(otq.OneTickLib, attr)
|
|
65
|
+
static = isinstance(fun, staticmethod)
|
|
66
|
+
setattr(OneTickLib, attr, proxy_wrap(attr, static=static))
|
|
67
|
+
|
|
68
|
+
return cls.__otl_instance
|
|
69
|
+
|
|
70
|
+
def __init__(self, *args, log_file=None):
|
|
71
|
+
if OneTickLib.__instance is None:
|
|
72
|
+
if not args:
|
|
73
|
+
args = (None,)
|
|
74
|
+
OneTickLib.__args = args
|
|
75
|
+
OneTickLib.__instance = otq.OneTickLib(*args)
|
|
76
|
+
if log_file:
|
|
77
|
+
self.set_log_file(log_file)
|
|
78
|
+
elif args != OneTickLib.__args and args:
|
|
79
|
+
raise ValueError("OneTickLib was already initialized with different "
|
|
80
|
+
"parameters: Was: {} Now: {}".format(OneTickLib.__args, args))
|
|
81
|
+
|
|
82
|
+
def __eq__(self, otl):
|
|
83
|
+
return self.__dict__ == otl.__dict__
|
|
84
|
+
|
|
85
|
+
def __ne__(self, otl):
|
|
86
|
+
return self.__dict__ != otl.__dict__
|
|
87
|
+
|
|
88
|
+
def __str__(self):
|
|
89
|
+
return "Instance: {}".format(self.__instance.get_one_tick_lib())
|
|
90
|
+
|
|
91
|
+
def cleanup(self):
|
|
92
|
+
"""
|
|
93
|
+
Destroy otq.OneTickLib instance and reset singleton class
|
|
94
|
+
"""
|
|
95
|
+
del OneTickLib.__instance
|
|
96
|
+
gc.collect()
|
|
97
|
+
OneTickLib.__instance = None
|
|
98
|
+
OneTickLib.__args = None
|
|
99
|
+
|
|
100
|
+
def set_log_file(self, log_file):
|
|
101
|
+
"""
|
|
102
|
+
Set log file for given instance of OneTickLib
|
|
103
|
+
|
|
104
|
+
:param log_file: path to log file
|
|
105
|
+
"""
|
|
106
|
+
OneTickLib.__instance.set_log_file(str(log_file))
|
|
107
|
+
if hasattr(OneTickLib.__instance, 'close_log_file_in_destructor'):
|
|
108
|
+
# we need to check it to prevent failing CI on the builds that do not have this feature
|
|
109
|
+
OneTickLib.__instance.close_log_file_in_destructor()
|
|
110
|
+
|
|
111
|
+
def set_logging_level(self, lvl: LoggingLevel):
|
|
112
|
+
"""
|
|
113
|
+
Logging level can be specified by using LoggingLevel Enum class
|
|
114
|
+
|
|
115
|
+
:param lvl: available values are LoggingLevel.MIN, LoggingLevel.LOW, LoggingLevel.MEDIUM or LoggingLevel.MAX
|
|
116
|
+
:return:
|
|
117
|
+
"""
|
|
118
|
+
OneTickLib.__instance.set_logging_level(lvl)
|
|
119
|
+
|
|
120
|
+
def set_authentication_token(self, auth_token: str):
|
|
121
|
+
"""
|
|
122
|
+
Set authentication token for given instance of OneTickLib
|
|
123
|
+
|
|
124
|
+
:param auth_token: authentication token
|
|
125
|
+
"""
|
|
126
|
+
OneTickLib.__instance.set_authentication_token(auth_token)
|
|
127
|
+
|
|
128
|
+
@staticmethod
|
|
129
|
+
def override_config_value(config_parameter_name: str, config_parameter_value):
|
|
130
|
+
"""
|
|
131
|
+
Override config value of OneTickConfig
|
|
132
|
+
|
|
133
|
+
:param config_parameter_name: param to override (could be both set or not set in OneTickConfig)
|
|
134
|
+
:param config_parameter_value: new value of the param
|
|
135
|
+
"""
|
|
136
|
+
if OneTickLib.__instance:
|
|
137
|
+
raise RuntimeError('This method should be called before OneTickLib object is constructed to have effect.')
|
|
138
|
+
try:
|
|
139
|
+
pyomd.OneTickLib.override_config_value(config_parameter_name, config_parameter_value) # noqa
|
|
140
|
+
except NameError:
|
|
141
|
+
raise RuntimeError('This method is not available in WebAPI mode')
|