onetick-py 1.170.0__tar.gz → 1.171.0__tar.gz

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 (160) hide show
  1. {onetick_py-1.170.0 → onetick_py-1.171.0}/PKG-INFO +1 -1
  2. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/__init__.py +8 -2
  3. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/_version.py +1 -1
  4. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/cache.py +3 -3
  5. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/callback/callbacks.py +1 -1
  6. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/configuration.py +35 -9
  7. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/misc.py +1 -1
  8. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/per_tick_script.py +2 -0
  9. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/db/_inspection.py +82 -49
  10. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/math.py +265 -386
  11. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/misc.py +70 -38
  12. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/otq.py +18 -12
  13. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/run.py +75 -5
  14. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/ticks.py +1 -1
  15. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick_py.egg-info/PKG-INFO +1 -1
  16. {onetick_py-1.170.0 → onetick_py-1.171.0}/LICENSE +0 -0
  17. {onetick_py-1.170.0 → onetick_py-1.171.0}/README.md +0 -0
  18. {onetick_py-1.170.0 → onetick_py-1.171.0}/pyproject.toml +0 -0
  19. {onetick_py-1.170.0 → onetick_py-1.171.0}/requirements.strict.txt +0 -0
  20. {onetick_py-1.170.0 → onetick_py-1.171.0}/requirements.txt +0 -0
  21. {onetick_py-1.170.0 → onetick_py-1.171.0}/setup.cfg +0 -0
  22. {onetick_py-1.170.0 → onetick_py-1.171.0}/setup.py +0 -0
  23. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/locator_parser/__init__.py +0 -0
  24. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/locator_parser/acl.py +0 -0
  25. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/locator_parser/actions.py +0 -0
  26. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/locator_parser/common.py +0 -0
  27. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/locator_parser/io.py +0 -0
  28. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/locator_parser/locator.py +0 -0
  29. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/__init__.py +0 -0
  30. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/doc_utilities/__init__.py +0 -0
  31. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/doc_utilities/napoleon.py +0 -0
  32. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/doc_utilities/ot_doctest.py +0 -0
  33. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/doc_utilities/snippets.py +0 -0
  34. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/lib/__init__.py +0 -0
  35. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/lib/instance.py +0 -0
  36. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/_stack_info.py +0 -0
  37. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/__init__.py +0 -0
  38. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/_base.py +0 -0
  39. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/_docs.py +0 -0
  40. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/compute.py +0 -0
  41. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/functions.py +0 -0
  42. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/generic.py +0 -0
  43. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/high_low.py +0 -0
  44. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/num_distinct.py +0 -0
  45. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/order_book.py +0 -0
  46. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/aggregations/other.py +0 -0
  47. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/backports.py +0 -0
  48. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/callback/__init__.py +0 -0
  49. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/callback/callback.py +0 -0
  50. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/compatibility.py +0 -0
  51. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/__init__.py +0 -0
  52. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_csv_inspector.py +0 -0
  53. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/__init__.py +0 -0
  54. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_manually_bound_value.py +0 -0
  55. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_nodes_history.py +0 -0
  56. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_op_utils/__init__.py +0 -0
  57. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_op_utils/every_operand.py +0 -0
  58. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_op_utils/is_const.py +0 -0
  59. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +0 -0
  60. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_proxy_node.py +0 -0
  61. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_state_objects.py +0 -0
  62. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_internal/_state_vars.py +0 -0
  63. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/__init__.py +0 -0
  64. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/_symbol_param.py +0 -0
  65. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/schema.py +0 -0
  66. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/__init__.py +0 -0
  67. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/aggregations.py +0 -0
  68. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/applyers.py +0 -0
  69. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/columns.py +0 -0
  70. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/data_quality.py +0 -0
  71. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/debugs.py +0 -0
  72. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/drops.py +0 -0
  73. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/fields.py +0 -0
  74. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/filters.py +0 -0
  75. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/joins.py +0 -0
  76. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/merges.py +0 -0
  77. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/pandases.py +0 -0
  78. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/renames.py +0 -0
  79. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/sorts.py +0 -0
  80. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/switches.py +0 -0
  81. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/symbols.py +0 -0
  82. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/times.py +0 -0
  83. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/source_methods/writes.py +0 -0
  84. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/symbol.py +0 -0
  85. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/_source/tmp_otq.py +0 -0
  86. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column.py +0 -0
  87. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/__init__.py +0 -0
  88. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/_methods/__init__.py +0 -0
  89. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/_methods/_internal.py +0 -0
  90. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/_methods/conversions.py +0 -0
  91. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/_methods/methods.py +0 -0
  92. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/_methods/op_types.py +0 -0
  93. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/accessors/__init__.py +0 -0
  94. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/accessors/_accessor.py +0 -0
  95. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/accessors/decimal_accessor.py +0 -0
  96. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/accessors/dt_accessor.py +0 -0
  97. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/accessors/float_accessor.py +0 -0
  98. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/accessors/str_accessor.py +0 -0
  99. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/column_operations/base.py +0 -0
  100. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/cut_builder.py +0 -0
  101. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/db_constants.py +0 -0
  102. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/eval_query.py +0 -0
  103. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/lambda_object.py +0 -0
  104. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/multi_output_source.py +0 -0
  105. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/query_inspector.py +0 -0
  106. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/core/source.py +0 -0
  107. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/db/__init__.py +0 -0
  108. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/db/db.py +0 -0
  109. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/db/utils.py +0 -0
  110. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/docs/__init__.py +0 -0
  111. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/docs/docstring_parser.py +0 -0
  112. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/docs/utils.py +0 -0
  113. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/functions.py +0 -0
  114. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/license.py +0 -0
  115. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/log.py +0 -0
  116. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/oqd/__init__.py +0 -0
  117. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/oqd/eps.py +0 -0
  118. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/oqd/sources.py +0 -0
  119. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/pyomd_mock.py +0 -0
  120. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/servers.py +0 -0
  121. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/session.py +0 -0
  122. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/__init__.py +0 -0
  123. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/cache.py +0 -0
  124. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/common.py +0 -0
  125. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/csv.py +0 -0
  126. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/custom.py +0 -0
  127. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/data_file.py +0 -0
  128. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/data_source.py +0 -0
  129. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/empty.py +0 -0
  130. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/odbc.py +0 -0
  131. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/order_book.py +0 -0
  132. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/parquet.py +0 -0
  133. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/pit.py +0 -0
  134. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/query.py +0 -0
  135. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/snapshots.py +0 -0
  136. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/split_query_output_by_symbol.py +0 -0
  137. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/symbology_mapping.py +0 -0
  138. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sources/symbols.py +0 -0
  139. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/sql.py +0 -0
  140. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/state.py +0 -0
  141. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/types.py +0 -0
  142. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/__init__.py +0 -0
  143. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/acl.py +0 -0
  144. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/config.py +0 -0
  145. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/default.py +0 -0
  146. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/file.py +0 -0
  147. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/helpers.py +0 -0
  148. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/locator.py +0 -0
  149. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/perf.py +0 -0
  150. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/query.py +0 -0
  151. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/render.py +0 -0
  152. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/script.py +0 -0
  153. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/temp.py +0 -0
  154. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/types.py +0 -0
  155. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick/py/utils/tz.py +0 -0
  156. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick_py.egg-info/SOURCES.txt +0 -0
  157. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick_py.egg-info/dependency_links.txt +0 -0
  158. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick_py.egg-info/entry_points.txt +0 -0
  159. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick_py.egg-info/requires.txt +0 -0
  160. {onetick_py-1.170.0 → onetick_py-1.171.0}/src/onetick_py.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onetick-py
3
- Version: 1.170.0
3
+ Version: 1.171.0
4
4
  Summary: Python package that allows you to work with OneTick
5
5
  Author-email: solutions <solutions@onetick.com>
6
6
  License-Expression: MIT
@@ -214,9 +214,15 @@ from onetick.py.core.per_tick_script import (
214
214
  )
215
215
  from onetick.py.callback import CallbackBase
216
216
  from onetick.py.sql import SqlQuery
217
- from onetick.py.run import run
217
+ from onetick.py.run import run, run_async
218
218
  from onetick.py.math import rand, now
219
- from onetick.py.misc import bit_and, bit_or, bit_at, bit_xor, bit_not, hash_code, get_symbology_mapping
219
+ from onetick.py.misc import (
220
+ bit_and, bit_or, bit_at, bit_xor, bit_not,
221
+ hash_code,
222
+ get_symbology_mapping,
223
+ get_onetick_version,
224
+ get_username,
225
+ )
220
226
  from onetick.py.core.column import Column
221
227
  from onetick.py.core.column_operations.base import Operation, Expr as expr, Raw as raw, OnetickParameter as param
222
228
  from onetick.py.core.per_tick_script import remote, Once, once, logf, throw_exception
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.170.0'
2
+ VERSION = '1.171.0'
@@ -113,7 +113,7 @@ def create_cache(
113
113
  The cache will be cleared every X seconds, triggering new query executions when data is requested.
114
114
  tick_type: str
115
115
  Tick type.
116
- symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, pd.DataFrame, optional
116
+ symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, :pandas:`pandas.DataFrame`, optional
117
117
  ``symbols`` parameter of ``otp.run()``.
118
118
  db: str
119
119
  Database.
@@ -259,7 +259,7 @@ def delete_cache(
259
259
  :func:`<onetick.py.create_cache>`.
260
260
  tick_type: str
261
261
  Tick type.
262
- symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, pd.DataFrame, optional
262
+ symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, :pandas:`pandas.DataFrame`, optional
263
263
  ``symbols`` parameter of ``otp.run()``.
264
264
  db: str
265
265
  Database.
@@ -329,7 +329,7 @@ def modify_cache_config(
329
329
  New value of configuration parameter. Will be converted to string.
330
330
  tick_type: str
331
331
  Tick type.
332
- symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, pd.DataFrame, optional
332
+ symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, :pandas:`pandas.DataFrame`, optional
333
333
  ``symbols`` parameter of ``otp.run()``.
334
334
  db: str
335
335
  Database.
@@ -18,7 +18,7 @@ class LogCallback(CallbackBase):
18
18
 
19
19
  class ManualDataframeCallback(CallbackBase):
20
20
  """
21
- This callback class can be used to generate the same pandas.DataFrame result as in otp.run.
21
+ This callback class can be used to generate the same :pandas:`pandas.DataFrame` result as in otp.run.
22
22
  Unlike otp.run, here result is constructed manually, one tick at a time.
23
23
  This may lead to lower memory usage in some cases.
24
24
  See task PY-863 for details.
@@ -32,6 +32,28 @@ def parse_datetime(s):
32
32
  )
33
33
 
34
34
 
35
+ def parse_bool(value) -> Optional[bool]:
36
+ str_value = str(value).lower()
37
+ if str_value in ('1', 'true', 'yes'):
38
+ return True
39
+ elif str_value in ('0', 'false', 'no'):
40
+ return False
41
+ else:
42
+ return None
43
+
44
+
45
+ def parse_true(value) -> bool:
46
+ return parse_bool(value) is True
47
+
48
+
49
+ def parse_bool_or_string(value) -> Union[bool, str]:
50
+ parsed_value = parse_bool(value)
51
+ if parsed_value is not None:
52
+ return parsed_value
53
+ else:
54
+ return str(value)
55
+
56
+
35
57
  def _env_func_concurrency(value: str) -> Optional[int]:
36
58
  if not value:
37
59
  return None
@@ -197,7 +219,7 @@ class OtpShowStackInfoProperty(OtpProperty):
197
219
  """
198
220
  @staticmethod
199
221
  def parser(value):
200
- return str(value).lower() in ('1', 'true', 'yes')
222
+ return parse_true(value)
201
223
 
202
224
  def __init__(self, *args, **kwargs):
203
225
  super().__init__(*args, **kwargs)
@@ -492,7 +514,7 @@ class Config:
492
514
  base_default=False,
493
515
  allowed_types=[bool],
494
516
  env_var_name='OTP_PRESORT_FORCE_DEFAULT_CONCURRENCY',
495
- env_var_func=OtpShowStackInfoProperty.parser,
517
+ env_var_func=parse_true,
496
518
  )
497
519
 
498
520
  # default batch size is set to 0, so the number of symbols in batch is not limited
@@ -623,10 +645,14 @@ class Config:
623
645
  )
624
646
 
625
647
  trusted_certificates_file = OtpProperty(
626
- description='Path to the file with list of trusted Certificate Authority certificates for WebAPI requests.',
648
+ description='Either a boolean, in which case it controls whether we verify the server TLS certificate '
649
+ 'or a string with the path to the file with list of '
650
+ 'trusted Certificate Authority certificates for WebAPI requests. '
651
+ 'Default behaviour implies verification is enabled.',
627
652
  base_default=None,
628
- allowed_types=str,
653
+ allowed_types=(bool, str),
629
654
  env_var_name='OTP_SSL_CERT_FILE',
655
+ env_var_func=parse_bool_or_string,
630
656
  )
631
657
 
632
658
  max_expected_ticks_per_symbol = OtpProperty(
@@ -641,7 +667,7 @@ class Config:
641
667
  base_default=False,
642
668
  allowed_types=(str, bool, int),
643
669
  env_var_name='OTP_SHOW_STACK_INFO',
644
- env_var_func=OtpShowStackInfoProperty.parser,
670
+ env_var_func=parse_true,
645
671
  )
646
672
 
647
673
  log_symbol = OtpProperty(
@@ -651,7 +677,7 @@ class Config:
651
677
  base_default=False,
652
678
  allowed_types=(str, bool, int),
653
679
  env_var_name='OTP_LOG_SYMBOL',
654
- env_var_func=OtpShowStackInfoProperty.parser,
680
+ env_var_func=parse_true,
655
681
  )
656
682
 
657
683
  ignore_ticks_in_unentitled_time_range = OtpProperty(
@@ -659,7 +685,7 @@ class Config:
659
685
  base_default=False,
660
686
  env_var_name='OTP_IGNORE_TICKS_IN_UNENTITLED_TIME_RANGE',
661
687
  allowed_types=(str, bool, int),
662
- env_var_func=OtpShowStackInfoProperty.parser,
688
+ env_var_func=parse_true,
663
689
  )
664
690
 
665
691
  main_query_generated_filename = OtpProperty(
@@ -685,7 +711,7 @@ class Config:
685
711
  base_default=False,
686
712
  env_var_name='OTP_OTQ_DEBUG_MODE',
687
713
  allowed_types=(str, bool, int),
688
- env_var_func=OtpShowStackInfoProperty.parser,
714
+ env_var_func=parse_true,
689
715
  )
690
716
 
691
717
  allow_lowercase_in_saved_fields = OtpProperty(
@@ -702,7 +728,7 @@ class Config:
702
728
  base_default=True,
703
729
  env_var_name='OTP_CLEAN_UP_TMP_FILES',
704
730
  allowed_types=(str, bool, int),
705
- env_var_func=OtpShowStackInfoProperty.parser,
731
+ env_var_func=parse_true,
706
732
  )
707
733
 
708
734
  default_schema_policy = OtpProperty(
@@ -514,7 +514,7 @@ def cache(
514
514
  the result data not found in the cache. Otherwise, the cache remains unchanged.
515
515
  tick_type: str
516
516
  Tick type.
517
- symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, pd.DataFrame, optional
517
+ symbol: str, list of str, list of otq.Symbol, :py:class:`onetick.py.Source`, :pandas:`pandas.DataFrame`, optional
518
518
  ``symbols`` parameter of ``otp.run()``.
519
519
  db: str
520
520
  Database.
@@ -1095,6 +1095,8 @@ class CaseExpressionParser(ExpressionParser):
1095
1095
  try:
1096
1096
  return super().call(expr)
1097
1097
  except Exception:
1098
+ if orig_err is not None:
1099
+ raise err from orig_err
1098
1100
  raise ValueError(
1099
1101
  f"Can't convert function '{astunparse(expr)}' to CASE() expression."
1100
1102
  ) from err
@@ -1,3 +1,4 @@
1
+ import itertools
1
2
  import warnings
2
3
  from typing import Union, Iterable, Tuple, Optional, Any, Literal
3
4
  from datetime import date as dt_date, datetime, timedelta
@@ -7,6 +8,7 @@ from dateutil.tz import gettz
7
8
 
8
9
  import onetick.py as otp
9
10
  from onetick.py import configuration, utils
11
+ from onetick.py import types as ott
10
12
  from onetick.py.compatibility import is_native_plus_zstd_supported, is_show_db_list_show_description_supported
11
13
  from onetick.py.core import db_constants
12
14
  from onetick.py.otq import otq
@@ -909,10 +911,12 @@ class DB:
909
911
 
910
912
 
911
913
  def databases(
912
- context=utils.default, derived: bool = False, readable_only: bool = True, fetch_description: bool = False,
913
- ) -> dict[str, DB]:
914
+ context=utils.default, derived: bool = False, readable_only: bool = True,
915
+ fetch_description: Optional[bool] = None,
916
+ as_table: bool = False,
917
+ ) -> Union[dict[str, DB], pd.DataFrame]:
914
918
  """
915
- Gets all available databases in the ``context``
919
+ Gets all available databases in the ``context``.
916
920
 
917
921
  Parameters
918
922
  ----------
@@ -931,6 +935,9 @@ def databases(
931
935
  fetch_description: bool
932
936
  If set to True, retrieves descriptions for databases and puts them into ``description`` property of
933
937
  :py:class:`~onetick.py.DB` objects in a returned dict.
938
+ as_table: bool
939
+ If False (default), this function returns a dictionary of database names and database objects.
940
+ If True, returns a :pandas:`pandas.DataFrame` table where each row contains the info for each database.
934
941
 
935
942
  See also
936
943
  --------
@@ -940,50 +947,66 @@ def databases(
940
947
 
941
948
  Returns
942
949
  -------
943
- dict
944
- Dict where keys are database names and values are :class:`DB <onetick.py.db._inspection.DB>` objects
945
- with ``context`` specified.
946
- """
947
- if fetch_description and not is_show_db_list_show_description_supported():
948
- fetch_description = False
950
+ Dict where keys are database names and values are :class:`DB <onetick.py.db._inspection.DB>` objects
951
+ or :pandas:`pandas.DataFrame` object depending on ``as_table`` parameter.
949
952
 
950
- if readable_only:
951
- node = (
952
- otq.AccessInfo(info_type='DATABASES', show_for_all_users=False, deep_scan=True).tick_type('ANY')
953
- >> otq.Passthrough('DB_NAME,READ_ACCESS')
954
- >> otq.WhereClause(where='READ_ACCESS = 1')
955
- )
953
+ Examples
954
+ --------
956
955
 
957
- if fetch_description:
958
- join = otq.Join(
959
- left_source='LEFT', join_type='LEFT_OUTER', join_criteria='LEFT.DB_NAME = RIGHT.DATABASE_NAME'
960
- )
961
-
962
- _ = node.set_node_name('LEFT') >> join
963
- _ = (
964
- otq.ShowDbList(show_description=fetch_description).tick_type('ANY')
965
- >> otq.Passthrough('DATABASE_NAME,DESCRIPTION').set_node_name('RIGHT')
966
- >> join
967
- )
968
-
969
- node = (
970
- join >> otq.Passthrough('LEFT.DB_NAME,RIGHT.DESCRIPTION')
971
- >> otq.RenameFields("LEFT.DB_NAME=DB_NAME,RIGHT.DESCRIPTION=DESCRIPTION")
972
- )
973
- else:
974
- db_list_kwargs = {}
975
- output_fields = ['DATABASE_NAME']
976
- if fetch_description:
977
- db_list_kwargs['show_description'] = fetch_description
978
- output_fields.append('DESCRIPTION')
956
+ Get the dictionary of database names and objects:
979
957
 
980
- node = (
981
- otq.ShowDbList(**db_list_kwargs).tick_type('ANY')
982
- >> otq.Passthrough(','.join(output_fields))
983
- )
958
+ >>> otp.databases() # doctest: +SKIP
959
+ {'ABU_DHABI': <onetick.py.db._inspection.DB at 0x7f9413a5e8e0>,
960
+ 'ABU_DHABI_BARS': <onetick.py.db._inspection.DB at 0x7f9413a5ef40>,
961
+ 'ABU_DHABI_DAILY': <onetick.py.db._inspection.DB at 0x7f9413a5eac0>,
962
+ 'ALPHA': <onetick.py.db._inspection.DB at 0x7f9413a5e940>,
963
+ 'ALPHA_X': <onetick.py.db._inspection.DB at 0x7f9413a5e490>,
964
+ ...
965
+ }
966
+
967
+ Get a table with database info:
984
968
 
985
- if not fetch_description:
986
- node = node >> otq.AddField('DESCRIPTION', '""')
969
+ >>> otp.databases(as_table=True) # doctest: +SKIP
970
+ Time DB_NAME READ_ACCESS WRITE_ACCESS ...
971
+ 0 2003-01-01 ABU_DHABI 1 0 ...
972
+ 1 2003-01-01 ABU_DHABI_BARS 1 1 ...
973
+ 2 2003-01-01 ABU_DHABI_DAILY 1 1 ...
974
+ 3 2003-01-01 ALPHA 1 1 ...
975
+ 4 2003-01-01 ALPHA_X 1 1 ...
976
+ ... ... ... ... ... ...
977
+ """
978
+ show_db_list_kwargs = {}
979
+ if fetch_description is not None and is_show_db_list_show_description_supported() and (
980
+ 'show_description' in otq.ShowDbList.Parameters.list_parameters()
981
+ ):
982
+ show_db_list_kwargs['show_description'] = fetch_description
983
+
984
+ node = otq.AccessInfo(info_type='DATABASES', show_for_all_users=False, deep_scan=True).tick_type('ANY')
985
+ # for some reason ACCESS_INFO sometimes return several ticks
986
+ # for the same database with different SERVER_ADDRESS values
987
+ # so we get only the first tick
988
+ node = (
989
+ node >> otq.NumTicks(is_running_aggr=True, group_by='DB_NAME',
990
+ all_fields_for_sliding=False, output_field_name='NUM_TICKS')
991
+ >> otq.WhereClause(where='NUM_TICKS = 1')
992
+ >> otq.Passthrough('NUM_TICKS', drop_fields=True)
993
+ )
994
+ if readable_only:
995
+ node = node >> otq.WhereClause(where='READ_ACCESS = 1')
996
+
997
+ left = node.set_node_name('LEFT')
998
+ right = otq.ShowDbList(**show_db_list_kwargs).tick_type('ANY').set_node_name('RIGHT')
999
+ join = otq.Join(
1000
+ left_source='LEFT', join_type='INNER', join_criteria='LEFT.DB_NAME = RIGHT.DATABASE_NAME',
1001
+ add_source_prefix=False,
1002
+ )
1003
+ left >> join << right # pylint: disable=pointless-statement
1004
+ node = join >> otq.Passthrough('LEFT.TIMESTAMP,RIGHT.TIMESTAMP,DATABASE_NAME', drop_fields=True)
1005
+
1006
+ # times bigger than datetime.max are not representable in python
1007
+ max_dt = ott.value2str(datetime.max)
1008
+ node = node >> otq.UpdateFields(set=f'INTERVAL_START={max_dt}', where=f'INTERVAL_START > {max_dt}')
1009
+ node = node >> otq.UpdateFields(set=f'INTERVAL_END={max_dt}', where=f'INTERVAL_END > {max_dt}')
987
1010
 
988
1011
  dbs = otp.run(node,
989
1012
  symbols='LOCAL::',
@@ -992,15 +1015,20 @@ def databases(
992
1015
  end=db_constants.DEFAULT_END_DATE,
993
1016
  context=context)
994
1017
 
1018
+ if as_table:
1019
+ return dbs
1020
+
995
1021
  # WebAPI returns empty DataFrame (no columns) if there are no databases
996
1022
  if len(dbs) == 0:
997
1023
  return {}
998
1024
 
999
- db_list = list(dbs['DB_NAME'] if readable_only else dbs['DATABASE_NAME'])
1000
- merged_db_list = list(zip(db_list, dbs['DESCRIPTION']))
1025
+ db_list = list(dbs['DB_NAME'])
1026
+ db_description_list = dbs['DESCRIPTION'] if 'DESCRIPTION' in dbs else itertools.repeat('')
1027
+ merged_db_list = list(zip(db_list, db_description_list))
1001
1028
 
1002
1029
  db_dict = {
1003
- db_name: DB(db_name, description=db_description, context=context) for db_name, db_description in merged_db_list
1030
+ db_name: DB(db_name, description=db_description, context=context)
1031
+ for db_name, db_description in merged_db_list
1004
1032
  }
1005
1033
 
1006
1034
  if derived:
@@ -1018,6 +1046,7 @@ def derived_databases(
1018
1046
  selection_criteria='all',
1019
1047
  db=None,
1020
1048
  db_discovery_scope='query_host_only',
1049
+ as_table: bool = False,
1021
1050
  ) -> dict[str, DB]:
1022
1051
  """
1023
1052
  Gets available derived databases.
@@ -1052,6 +1081,9 @@ def derived_databases(
1052
1081
  an attempt will be performed to get derived databases from all reachable hosts.
1053
1082
  When *query_host_only* is specified,
1054
1083
  only derived databases from the host on which the query is performed will be returned.
1084
+ as_table: bool
1085
+ If False (default), this function returns a dictionary of database names and database objects.
1086
+ If True, returns a :pandas:`pandas.DataFrame` table where each row contains the info for each database.
1055
1087
 
1056
1088
  See also
1057
1089
  --------
@@ -1059,9 +1091,8 @@ def derived_databases(
1059
1091
 
1060
1092
  Returns
1061
1093
  -------
1062
- dict
1063
- Dict where keys are database names and values are :class:`DB <onetick.py.db._inspection.DB>` objects
1064
- with ``context`` specified.
1094
+ Dict where keys are database names and values are :class:`DB <onetick.py.db._inspection.DB>` objects
1095
+ or :pandas:`pandas.DataFrame` object depending on ``as_table`` parameter.
1065
1096
  """
1066
1097
  if start and end:
1067
1098
  time_range = otq.ShowDerivedDbList.TimeRange.QUERY_TIME_INTERVAL
@@ -1089,6 +1120,8 @@ def derived_databases(
1089
1120
  ep = ep.tick_type('ANY')
1090
1121
  db = db or 'LOCAL'
1091
1122
  dbs = otp.run(ep, symbols=f'{db}::', start=start, end=end, context=context)
1123
+ if as_table:
1124
+ return dbs
1092
1125
  if len(dbs) == 0:
1093
1126
  return {}
1094
1127
  db_list = list(dbs['DERIVED_DB_NAME'])