onetick-py 1.164.0__tar.gz → 1.166.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.164.0 → onetick_py-1.166.0}/PKG-INFO +3 -3
  2. {onetick_py-1.164.0 → onetick_py-1.166.0}/pyproject.toml +2 -2
  3. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/_version.py +1 -1
  4. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/_docs.py +11 -0
  5. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/order_book.py +38 -5
  6. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/compatibility.py +8 -0
  7. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/source.py +71 -1
  8. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/db/_inspection.py +28 -12
  9. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/misc.py +7 -6
  10. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/session.py +5 -2
  11. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/render.py +51 -29
  12. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick_py.egg-info/PKG-INFO +3 -3
  13. {onetick_py-1.164.0 → onetick_py-1.166.0}/LICENSE +0 -0
  14. {onetick_py-1.164.0 → onetick_py-1.166.0}/README.md +0 -0
  15. {onetick_py-1.164.0 → onetick_py-1.166.0}/requirements.strict.txt +0 -0
  16. {onetick_py-1.164.0 → onetick_py-1.166.0}/requirements.txt +0 -0
  17. {onetick_py-1.164.0 → onetick_py-1.166.0}/setup.cfg +0 -0
  18. {onetick_py-1.164.0 → onetick_py-1.166.0}/setup.py +0 -0
  19. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/locator_parser/__init__.py +0 -0
  20. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/locator_parser/acl.py +0 -0
  21. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/locator_parser/actions.py +0 -0
  22. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/locator_parser/common.py +0 -0
  23. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/locator_parser/io.py +0 -0
  24. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/locator_parser/locator.py +0 -0
  25. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/__init__.py +0 -0
  26. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/doc_utilities/__init__.py +0 -0
  27. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/doc_utilities/napoleon.py +0 -0
  28. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/doc_utilities/ot_doctest.py +0 -0
  29. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/doc_utilities/snippets.py +0 -0
  30. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/lib/__init__.py +0 -0
  31. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/lib/instance.py +0 -0
  32. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/__init__.py +0 -0
  33. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/_stack_info.py +0 -0
  34. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/__init__.py +0 -0
  35. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/_base.py +0 -0
  36. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/compute.py +0 -0
  37. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/functions.py +0 -0
  38. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/generic.py +0 -0
  39. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/high_low.py +0 -0
  40. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/num_distinct.py +0 -0
  41. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/aggregations/other.py +0 -0
  42. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/backports.py +0 -0
  43. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/cache.py +0 -0
  44. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/callback/__init__.py +0 -0
  45. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/callback/callback.py +0 -0
  46. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/callback/callbacks.py +0 -0
  47. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/configuration.py +0 -0
  48. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/__init__.py +0 -0
  49. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_csv_inspector.py +0 -0
  50. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/__init__.py +0 -0
  51. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_manually_bound_value.py +0 -0
  52. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_nodes_history.py +0 -0
  53. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_op_utils/__init__.py +0 -0
  54. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_op_utils/every_operand.py +0 -0
  55. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_op_utils/is_const.py +0 -0
  56. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +0 -0
  57. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_proxy_node.py +0 -0
  58. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_state_objects.py +0 -0
  59. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_internal/_state_vars.py +0 -0
  60. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/__init__.py +0 -0
  61. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/_symbol_param.py +0 -0
  62. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/schema.py +0 -0
  63. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/__init__.py +0 -0
  64. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/aggregations.py +0 -0
  65. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/applyers.py +0 -0
  66. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/columns.py +0 -0
  67. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/data_quality.py +0 -0
  68. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/debugs.py +0 -0
  69. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/drops.py +0 -0
  70. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/fields.py +0 -0
  71. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/filters.py +0 -0
  72. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/joins.py +0 -0
  73. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/merges.py +0 -0
  74. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/misc.py +0 -0
  75. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/pandases.py +0 -0
  76. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/renames.py +0 -0
  77. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/sorts.py +0 -0
  78. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/switches.py +0 -0
  79. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/symbols.py +0 -0
  80. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/times.py +0 -0
  81. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/source_methods/writes.py +0 -0
  82. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/symbol.py +0 -0
  83. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/_source/tmp_otq.py +0 -0
  84. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column.py +0 -0
  85. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/__init__.py +0 -0
  86. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/_methods/__init__.py +0 -0
  87. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/_methods/_internal.py +0 -0
  88. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/_methods/conversions.py +0 -0
  89. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/_methods/methods.py +0 -0
  90. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/_methods/op_types.py +0 -0
  91. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/accessors/__init__.py +0 -0
  92. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/accessors/_accessor.py +0 -0
  93. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/accessors/decimal_accessor.py +0 -0
  94. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/accessors/dt_accessor.py +0 -0
  95. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/accessors/float_accessor.py +0 -0
  96. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/accessors/str_accessor.py +0 -0
  97. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/column_operations/base.py +0 -0
  98. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/cut_builder.py +0 -0
  99. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/db_constants.py +0 -0
  100. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/eval_query.py +0 -0
  101. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/lambda_object.py +0 -0
  102. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/multi_output_source.py +0 -0
  103. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/per_tick_script.py +0 -0
  104. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/core/query_inspector.py +0 -0
  105. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/db/__init__.py +0 -0
  106. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/db/db.py +0 -0
  107. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/db/utils.py +0 -0
  108. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/docs/__init__.py +0 -0
  109. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/docs/docstring_parser.py +0 -0
  110. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/docs/utils.py +0 -0
  111. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/functions.py +0 -0
  112. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/license.py +0 -0
  113. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/log.py +0 -0
  114. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/math.py +0 -0
  115. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/oqd/__init__.py +0 -0
  116. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/oqd/eps.py +0 -0
  117. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/oqd/sources.py +0 -0
  118. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/otq.py +0 -0
  119. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/pyomd_mock.py +0 -0
  120. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/run.py +0 -0
  121. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/servers.py +0 -0
  122. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/__init__.py +0 -0
  123. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/cache.py +0 -0
  124. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/common.py +0 -0
  125. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/csv.py +0 -0
  126. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/custom.py +0 -0
  127. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/data_file.py +0 -0
  128. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/data_source.py +0 -0
  129. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/empty.py +0 -0
  130. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/odbc.py +0 -0
  131. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/order_book.py +0 -0
  132. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/parquet.py +0 -0
  133. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/pit.py +0 -0
  134. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/query.py +0 -0
  135. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/snapshots.py +0 -0
  136. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/split_query_output_by_symbol.py +0 -0
  137. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/symbology_mapping.py +0 -0
  138. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/symbols.py +0 -0
  139. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sources/ticks.py +0 -0
  140. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/sql.py +0 -0
  141. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/state.py +0 -0
  142. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/types.py +0 -0
  143. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/__init__.py +0 -0
  144. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/acl.py +0 -0
  145. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/config.py +0 -0
  146. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/default.py +0 -0
  147. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/file.py +0 -0
  148. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/helpers.py +0 -0
  149. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/locator.py +0 -0
  150. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/perf.py +0 -0
  151. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/query.py +0 -0
  152. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/script.py +0 -0
  153. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/temp.py +0 -0
  154. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/types.py +0 -0
  155. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick/py/utils/tz.py +0 -0
  156. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick_py.egg-info/SOURCES.txt +0 -0
  157. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick_py.egg-info/dependency_links.txt +0 -0
  158. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick_py.egg-info/entry_points.txt +0 -0
  159. {onetick_py-1.164.0 → onetick_py-1.166.0}/src/onetick_py.egg-info/requires.txt +0 -0
  160. {onetick_py-1.164.0 → onetick_py-1.166.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.164.0
3
+ Version: 1.166.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
@@ -8,14 +8,14 @@ Project-URL: Documentation, https://docs.pip.distribution.sol.onetick.com
8
8
  Project-URL: OneTick, https://onetick.com/
9
9
  Classifier: Topic :: Database :: Front-Ends
10
10
  Classifier: Topic :: Scientific/Engineering
11
- Classifier: Programming Language :: Python :: 3.8
12
11
  Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Operating System :: OS Independent
17
17
  Classifier: Environment :: Console
18
- Requires-Python: >=3.8
18
+ Requires-Python: >=3.9
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE
21
21
  Requires-Dist: pandas==1.1.5; python_version == "3.6"
@@ -19,15 +19,15 @@ dynamic = [
19
19
  ]
20
20
  license = "MIT"
21
21
  license-files = ["LICENSE"]
22
- requires-python = ">= 3.8"
22
+ requires-python = ">= 3.9"
23
23
  classifiers = [
24
24
  "Topic :: Database :: Front-Ends",
25
25
  "Topic :: Scientific/Engineering",
26
- "Programming Language :: Python :: 3.8",
27
26
  "Programming Language :: Python :: 3.9",
28
27
  "Programming Language :: Python :: 3.10",
29
28
  "Programming Language :: Python :: 3.11",
30
29
  "Programming Language :: Python :: 3.12",
30
+ "Programming Language :: Python :: 3.13",
31
31
  "Operating System :: OS Independent",
32
32
  "Environment :: Console",
33
33
  ]
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.164.0'
2
+ VERSION = '1.166.0'
@@ -522,6 +522,17 @@ _size_max_fractional_digits_doc = param_doc(
522
522
  annotation=int,
523
523
  default=0,
524
524
  )
525
+ _include_market_order_ticks_doc = param_doc(
526
+ name='include_market_order_ticks',
527
+ desc="""
528
+ If set, market order ticks (they have price NaN) are included into the order book,
529
+ and are at the order book's top level.
530
+
531
+ Default is False.
532
+ """,
533
+ annotation=bool,
534
+ default=None,
535
+ )
525
536
  _query_fun_doc = param_doc(
526
537
  name='query_fun',
527
538
  desc="""
@@ -36,7 +36,8 @@ from ._docs import (_running_doc,
36
36
  _book_delimiters_doc,
37
37
  _max_initialization_days_doc,
38
38
  _state_key_max_inactivity_sec_doc,
39
- _size_max_fractional_digits_doc)
39
+ _size_max_fractional_digits_doc,
40
+ _include_market_order_ticks_doc)
40
41
 
41
42
 
42
43
  OB_SNAPSHOT_DOC_PARAMS = [
@@ -47,7 +48,8 @@ OB_SNAPSHOT_DOC_PARAMS = [
47
48
  _book_uncross_method_doc, _dq_events_that_clear_book_doc, _identify_source_doc,
48
49
  _show_full_detail_doc, _show_only_changes_doc, _book_delimiters_doc,
49
50
  _max_initialization_days_doc, _state_key_max_inactivity_sec_doc,
50
- _size_max_fractional_digits_doc
51
+ _size_max_fractional_digits_doc,
52
+ _include_market_order_ticks_doc,
51
53
  ]
52
54
  OB_SNAPSHOT_WIDE_DOC_PARAMS = [
53
55
  _running_doc,
@@ -57,7 +59,8 @@ OB_SNAPSHOT_WIDE_DOC_PARAMS = [
57
59
  _book_uncross_method_doc, _dq_events_that_clear_book_doc,
58
60
  _book_delimiters_doc,
59
61
  _max_initialization_days_doc, _state_key_max_inactivity_sec_doc,
60
- _size_max_fractional_digits_doc
62
+ _size_max_fractional_digits_doc,
63
+ _include_market_order_ticks_doc,
61
64
  ]
62
65
  OB_SNAPSHOT_FLAT_DOC_PARAMS = [
63
66
  _running_doc,
@@ -67,7 +70,8 @@ OB_SNAPSHOT_FLAT_DOC_PARAMS = [
67
70
  _book_uncross_method_doc, _dq_events_that_clear_book_doc,
68
71
  _show_full_detail_doc,
69
72
  _max_initialization_days_doc, _state_key_max_inactivity_sec_doc,
70
- _size_max_fractional_digits_doc
73
+ _size_max_fractional_digits_doc,
74
+ _include_market_order_ticks_doc,
71
75
  ]
72
76
  OB_SUMMARY_DOC_PARAMS = [
73
77
  _running_doc,
@@ -75,7 +79,8 @@ OB_SUMMARY_DOC_PARAMS = [
75
79
  _bucket_end_condition_doc, _end_condition_per_group_doc, _group_by_doc, _groups_to_display_doc,
76
80
  _side_doc, _max_levels_doc, _min_levels_doc, _max_depth_shares_doc, _max_depth_for_price_doc,
77
81
  _book_uncross_method_doc, _dq_events_that_clear_book_doc, _max_initialization_days_doc,
78
- _state_key_max_inactivity_sec_doc, _size_max_fractional_digits_doc
82
+ _state_key_max_inactivity_sec_doc, _size_max_fractional_digits_doc,
83
+ _include_market_order_ticks_doc,
79
84
  ]
80
85
 
81
86
  OB_SIZE_DOC_PARAMS = [
@@ -177,6 +182,7 @@ class ObSnapshot(_OrderBookAggregation):
177
182
  'book_delimiters': 'BOOK_DELIMITERS',
178
183
  'state_key_max_inactivity_sec': 'STATE_KEY_MAX_INACTIVITY_SEC',
179
184
  'size_max_fractional_digits': 'SIZE_MAX_FRACTIONAL_DIGITS',
185
+ 'include_market_order_ticks': 'INCLUDE_MARKET_ORDER_TICKS',
180
186
  })
181
187
  FIELDS_DEFAULT = dict(_OrderBookAggregation.FIELDS_DEFAULT, **{
182
188
  'identify_source': False,
@@ -185,6 +191,7 @@ class ObSnapshot(_OrderBookAggregation):
185
191
  'book_delimiters': None,
186
192
  'state_key_max_inactivity_sec': None,
187
193
  'size_max_fractional_digits': 0,
194
+ 'include_market_order_ticks': None,
188
195
  })
189
196
 
190
197
  def __init__(self,
@@ -195,6 +202,7 @@ class ObSnapshot(_OrderBookAggregation):
195
202
  book_delimiters: Optional[Literal['D']] = None,
196
203
  state_key_max_inactivity_sec: Optional[int] = None,
197
204
  size_max_fractional_digits: int = 0,
205
+ include_market_order_ticks: Optional[bool] = None,
198
206
  **kwargs):
199
207
  self.identify_source = identify_source
200
208
  self.show_full_detail = show_full_detail
@@ -202,11 +210,22 @@ class ObSnapshot(_OrderBookAggregation):
202
210
  self.book_delimiters = book_delimiters
203
211
  self.state_key_max_inactivity_sec = state_key_max_inactivity_sec
204
212
  self.size_max_fractional_digits = size_max_fractional_digits
213
+ self.include_market_order_ticks = include_market_order_ticks
205
214
  # we don't want to set hard limit on the output of order book aggregations
206
215
  if self.show_full_detail:
207
216
  kwargs['all_fields'] = True
208
217
  super().__init__(*args, **kwargs)
209
218
 
219
+ def _param_validation(self):
220
+ super()._param_validation()
221
+ if self.include_market_order_ticks is not None:
222
+ if 'include_market_order_ticks' not in self.EP.Parameters.list_parameters():
223
+ raise ValueError("Parameter 'include_market_order_ticks' is not supported on this OneTick API version")
224
+ otp.compatibility.is_include_market_order_ticks_supported(
225
+ throw_warning=True,
226
+ feature_name="parameter 'include_market_order_ticks'",
227
+ )
228
+
210
229
  def _get_output_schema(self, src: 'Source', name: Optional[str] = None) -> dict:
211
230
  schema = {
212
231
  'PRICE': float,
@@ -284,11 +303,13 @@ class ObSummary(_OrderBookAggregation):
284
303
  'min_levels': 'MIN_LEVELS',
285
304
  'state_key_max_inactivity_sec': 'STATE_KEY_MAX_INACTIVITY_SEC',
286
305
  'size_max_fractional_digits': 'SIZE_MAX_FRACTIONAL_DIGITS',
306
+ 'include_market_order_ticks': 'INCLUDE_MARKET_ORDER_TICKS',
287
307
  })
288
308
  FIELDS_DEFAULT = dict(_OrderBookAggregation.FIELDS_DEFAULT, **{
289
309
  'min_levels': None,
290
310
  'state_key_max_inactivity_sec': None,
291
311
  'size_max_fractional_digits': 0,
312
+ 'include_market_order_ticks': None,
292
313
  })
293
314
 
294
315
  def __init__(self,
@@ -296,6 +317,7 @@ class ObSummary(_OrderBookAggregation):
296
317
  min_levels: Optional[int] = None,
297
318
  state_key_max_inactivity_sec: Optional[int] = None,
298
319
  size_max_fractional_digits: int = 0,
320
+ include_market_order_ticks: Optional[bool] = None,
299
321
  **kwargs):
300
322
  if is_supported_otq_ob_summary():
301
323
  self.EP = otq.ObSummary
@@ -305,8 +327,19 @@ class ObSummary(_OrderBookAggregation):
305
327
  self.min_levels = min_levels
306
328
  self.state_key_max_inactivity_sec = state_key_max_inactivity_sec
307
329
  self.size_max_fractional_digits = size_max_fractional_digits
330
+ self.include_market_order_ticks = include_market_order_ticks
308
331
  super().__init__(*args, **kwargs)
309
332
 
333
+ def _param_validation(self):
334
+ super()._param_validation()
335
+ if self.include_market_order_ticks is not None:
336
+ if 'include_market_order_ticks' not in self.EP.Parameters.list_parameters():
337
+ raise ValueError("Parameter 'include_market_order_ticks' is not supported on this OneTick API version")
338
+ otp.compatibility.is_include_market_order_ticks_supported(
339
+ throw_warning=True,
340
+ feature_name="parameter 'include_market_order_ticks'",
341
+ )
342
+
310
343
  def _get_output_schema(self, src: 'Source', name: Optional[str] = None) -> dict:
311
344
  schema = {
312
345
  'BID_SIZE': int,
@@ -750,3 +750,11 @@ def is_ilike_supported():
750
750
  # 20250423: Implemented 0035413: Add support of ILIKE in SQL
751
751
  return _is_min_build_or_version(None, None,
752
752
  20250510120000)
753
+
754
+
755
+ def is_include_market_order_ticks_supported(**kwargs):
756
+ # Implemented 0031478: OB_SNAPSHOT... and OB_SUMMARY EPs
757
+ # should support parameter INCLUDE_MARKET_ORDER_TICKS (false by default)
758
+ return _is_min_build_or_version(1.25, 20241229055942,
759
+ 20240812120000, min_update_number=2,
760
+ **kwargs)
@@ -24,7 +24,7 @@ from onetick.py.core._source.tmp_otq import TmpOtq
24
24
  from onetick.py.core.column import _Column
25
25
  from onetick.py.core.column_operations.base import _Operation, OnetickParameter
26
26
  from onetick.py.core.query_inspector import get_query_parameter_list
27
- from onetick.py.utils import adaptive, adaptive_to_default, default
27
+ from onetick.py.utils import adaptive, adaptive_to_default, default, render_otq
28
28
 
29
29
 
30
30
  def _is_dict_required(symbols):
@@ -939,6 +939,76 @@ class Source:
939
939
  kwargs.setdefault('verbose', True)
940
940
  self.to_graph().render(**kwargs)
941
941
 
942
+ def render_otq(
943
+ self,
944
+ image_path: Optional[str] = None,
945
+ output_format: Optional[str] = None,
946
+ load_external_otqs: bool = True,
947
+ view: bool = False,
948
+ line_limit: Optional[Tuple[int, int]] = (10, 30),
949
+ parse_eval_from_params: bool = False,
950
+ debug: bool = False,
951
+ **kwargs,
952
+ ):
953
+ """
954
+ Render current :py:class:`~onetick.py.Source` graph.
955
+
956
+ Parameters
957
+ ----------
958
+ image_path: str, None
959
+ Path for generated image. If omitted, image will be saved in a temp dir
960
+ output_format: str, None
961
+ `Graphviz` rendering format. Default: `png`.
962
+ If `image_path` contains one of next extensions, `output_format` will be set automatically:
963
+ `png`, `svg`, `dot`.
964
+ load_external_otqs: bool
965
+ If set to `True` (default) dependencies from external .otq files (not listed in ``path`` param)
966
+ will be loaded automatically.
967
+ view: bool
968
+ Defines should generated image be shown after render.
969
+ line_limit: Tuple[int, int], None
970
+ Limit for maximum number of lines and length of some EP parameters strings.
971
+ First param is limit of lines, second - limit of characters in each line.
972
+ If set to None limit disabled.
973
+ If one of tuple values set to zero the corresponding limit disabled.
974
+ parse_eval_from_params: bool
975
+ Enable parsing and printing `eval` sub-queries from EP parameters.
976
+ debug: bool
977
+ Allow to print stdout or stderr from `Graphviz` render.
978
+ kwargs:
979
+ Additional arguments to be passed to :py:meth:`onetick.py.Source.to_otq` method (except
980
+ ``file_name``, ``file_suffix`` and ``query_name`` parameters)
981
+
982
+ Returns
983
+ -------
984
+ Path to rendered image
985
+
986
+ See also
987
+ --------
988
+ :py:func:`render_otq <onetick.py.utils.render_otq>`
989
+
990
+ Examples
991
+ --------
992
+
993
+ >>> data = otp.DataSource(db='US_COMP', tick_type='TRD', symbols='AAA') # doctest: +SKIP
994
+ >>> data1, data2 = data[(data['PRICE'] > 50)] # doctest: +SKIP
995
+ >>> data = otp.merge([data1, data2]) # doctest: +SKIP
996
+ >>> data.render_otq('./path/to/image.png') # doctest: +SKIP
997
+
998
+ .. image:: ../../static/testing/images/render_otq_3.png
999
+ """
1000
+
1001
+ if {'file_name', 'file_suffix', 'query_name'} & kwargs.keys():
1002
+ raise ValueError(
1003
+ 'It\'s not allowed to pass parameters `file_name`, `file_suffix` and `query_name` as `kwargs` '
1004
+ 'in `render_otq` method.'
1005
+ )
1006
+
1007
+ otq_path = self.to_otq(**kwargs)
1008
+ return render_otq(
1009
+ otq_path, image_path, output_format, load_external_otqs, view, line_limit, parse_eval_from_params, debug,
1010
+ )
1011
+
942
1012
  def copy(self, ep=None, columns=None, deep=False) -> 'Source':
943
1013
  """
944
1014
  Build an object with copied calculation graph.
@@ -1,5 +1,5 @@
1
1
  import warnings
2
- from typing import Dict, List, Union, Iterable, Tuple, Optional, Any, Literal
2
+ from typing import Union, Iterable, Tuple, Optional, Any, Literal
3
3
  from datetime import date as dt_date, datetime, timedelta
4
4
 
5
5
  import pandas as pd
@@ -502,7 +502,7 @@ class DB:
502
502
  return last_date
503
503
  return date
504
504
 
505
- def tick_types(self, date=None, timezone=None) -> List[str]:
505
+ def tick_types(self, date=None, timezone=None) -> list[str]:
506
506
  """
507
507
  Returns list of tick types for the ``date``.
508
508
 
@@ -527,7 +527,7 @@ class DB:
527
527
  date = self.last_date if date is None else date
528
528
  if timezone is None:
529
529
  timezone = configuration.config.tz
530
- time_params: Dict[str, Any] = {}
530
+ time_params: dict[str, Any] = {}
531
531
 
532
532
  if date is not None:
533
533
  time_params['start'], time_params['end'] = self._fit_date_in_acl(date, timezone=timezone)
@@ -551,7 +551,7 @@ class DB:
551
551
  min_date = min(obj[0] for obj in self._locator_date_ranges)
552
552
  return _datetime2date(min_date)
553
553
 
554
- def schema(self, date=None, tick_type=None, timezone=None, check_index_file=utils.adaptive) -> Dict[str, type]:
554
+ def schema(self, date=None, tick_type=None, timezone=None, check_index_file=utils.adaptive) -> dict[str, type]:
555
555
  """
556
556
  Gets the schema of the database.
557
557
 
@@ -696,7 +696,7 @@ class DB:
696
696
 
697
697
  return schema
698
698
 
699
- def symbols(self, date=None, timezone=None, tick_type=None, pattern='.*') -> List[str]:
699
+ def symbols(self, date=None, timezone=None, tick_type=None, pattern='.*') -> list[str]:
700
700
  """
701
701
  Finds a list of available symbols in the database
702
702
 
@@ -907,7 +907,7 @@ class DB:
907
907
  return df
908
908
 
909
909
 
910
- def databases(context=utils.default, derived=False) -> Dict[str, DB]:
910
+ def databases(context=utils.default, derived=False, readable_only: bool = True) -> dict[str, DB]:
911
911
  """
912
912
  Gets all available databases in the ``context``
913
913
 
@@ -918,13 +918,18 @@ def databases(context=utils.default, derived=False) -> Dict[str, DB]:
918
918
  If not set then default :py:attr:`context<onetick.py.configuration.Config.context>` is used.
919
919
  See :ref:`guide about switching contexts <switching contexts>` for examples.
920
920
  derived: bool, dict
921
- If False then derived databases are not returned.
922
- If dict then its items used as parameters to :py:func:`~onetick.py.derived_databases`
923
- If True then default parameters for :py:func:`~onetick.py.derived_databases` are used.
921
+ If False (default) then derived databases are not returned.
922
+ Otherwise derived databases names are added to the result after the non-derived databases.
923
+ If set to dict then its items used as parameters to :py:func:`~onetick.py.derived_databases`.
924
+ If set to True then default parameters for :py:func:`~onetick.py.derived_databases` are used.
925
+ readable_only: bool
926
+ If set to True (default), then return only the databases with read-access for the current user.
927
+ Otherwise return all databases visible from the current process.
924
928
 
925
929
  See also
926
930
  --------
927
931
  | **SHOW_DB_LIST** OneTick event processor
932
+ | **ACCESS_INFO** OneTick event processor
928
933
  | :py:func:`derived_databases`
929
934
 
930
935
  Returns
@@ -933,7 +938,18 @@ def databases(context=utils.default, derived=False) -> Dict[str, DB]:
933
938
  Dict where keys are database names and values are :class:`DB <onetick.py.db._inspection.DB>` objects
934
939
  with ``context`` specified.
935
940
  """
936
- dbs = otp.run(otq.ShowDbList().tick_type("ANY"),
941
+ if readable_only:
942
+ node = (
943
+ otq.AccessInfo(info_type='DATABASES', show_for_all_users=False, deep_scan=True).tick_type('ANY')
944
+ >> otq.Passthrough('DB_NAME,READ_ACCESS')
945
+ >> otq.WhereClause(where='READ_ACCESS = 1')
946
+ )
947
+ else:
948
+ node = (
949
+ otq.ShowDbList().tick_type('ANY')
950
+ >> otq.Passthrough('DATABASE_NAME')
951
+ )
952
+ dbs = otp.run(node,
937
953
  symbols='LOCAL::',
938
954
  # start and end times don't matter for this query, use some constants
939
955
  start=db_constants.DEFAULT_START_DATE,
@@ -944,7 +960,7 @@ def databases(context=utils.default, derived=False) -> Dict[str, DB]:
944
960
  if len(dbs) == 0:
945
961
  return {}
946
962
 
947
- db_list = list(dbs['DATABASE_NAME'])
963
+ db_list = list(dbs['DB_NAME'] if readable_only else dbs['DATABASE_NAME'])
948
964
  db_dict = {db_name: DB(db_name, context=context) for db_name in db_list}
949
965
  if derived:
950
966
  kwargs = derived if isinstance(derived, dict) else {}
@@ -961,7 +977,7 @@ def derived_databases(
961
977
  selection_criteria='all',
962
978
  db=None,
963
979
  db_discovery_scope='query_host_only',
964
- ) -> Dict[str, DB]:
980
+ ) -> dict[str, DB]:
965
981
  """
966
982
  Gets available derived databases.
967
983
 
@@ -404,19 +404,20 @@ def get_symbology_mapping(dest_symbology, src_symbology=None, symbol=None, times
404
404
  Time A SYMBOLOGY_MAPPING
405
405
  0 2022-01-03 1 9706
406
406
 
407
- Override source symbology, symbol and symbol date:
407
+ Override source symbology, symbol and symbol date
408
+ (Also note that parameters can be set from columns):
408
409
 
409
- >>> data = otp.Tick(A=1, db=None)
410
- >>> data['SYMBOLOGY_MAPPING'] = otp.get_symbology_mapping('OID', 'TDEQ', 'MSFT', otp.dt(2022, 1, 3))
410
+ >>> data = otp.Tick(A=1, db=None, SYMBOL='MSFT')
411
+ >>> data['SYMBOLOGY_MAPPING'] = otp.get_symbology_mapping('OID', 'TDEQ', data['SYMBOL'], otp.dt(2022, 1, 3))
411
412
  >>> otp.run(data, symbols='US_COMP::AAPL', # doctest: +SKIP
412
413
  ... date=otp.dt(2022, 1, 3))
413
414
  Time A SYMBOLOGY_MAPPING
414
415
  0 2022-01-03 1 109037
415
416
  """
416
417
  params_correct = (
417
- all([src_symbology, symbol, timestamp])
418
- or all([src_symbology, symbol])
419
- or not any([src_symbology, symbol, timestamp])
418
+ all(v is not None for v in [src_symbology, symbol, timestamp])
419
+ or all(v is not None for v in [src_symbology, symbol])
420
+ or not any(v is not None for v in [src_symbology, symbol, timestamp])
420
421
  )
421
422
  if not params_correct:
422
423
  raise ValueError("Parameters 'src_symbology' and 'symbol' or"
@@ -1115,8 +1115,6 @@ class Session:
1115
1115
  # TODO: rollback, but need to wait BDS-91
1116
1116
  raise
1117
1117
 
1118
- Session._instance = self
1119
-
1120
1118
  # force reload cfg/locator/acl, because it is not reloaded after each time session if re-created
1121
1119
  if os.getenv('OTP_WEBAPI_TEST_MODE'):
1122
1120
  utils.reload_config(None, config_type='MAIN_CONFIG')
@@ -1125,6 +1123,11 @@ class Session:
1125
1123
 
1126
1124
  self._ts_dbs = {}
1127
1125
 
1126
+ # PY-1352: this line must be the last
1127
+ # in case we get exception anywhere before, we shouldn't set Session class variable,
1128
+ # because it will affect the creation of all the future Session objects
1129
+ Session._instance = self
1130
+
1128
1131
  def use(self, *items):
1129
1132
  """
1130
1133
  Makes DB or TS available inside the session.
@@ -20,6 +20,7 @@ EPS_WITH_QUERIES = {
20
20
  "modify_state_var_from_query": (1, "otq_query"),
21
21
  "create_cache": (1, "otq_file_path"),
22
22
  "read_cache": (4, "create_cache_query"),
23
+ "generic_aggregation": (0, "query_name"),
23
24
  }
24
25
 
25
26
  IF_ELSE_EPS = {
@@ -341,7 +342,10 @@ def _parse_function_params(func_params: str) -> Tuple[list, dict]:
341
342
 
342
343
 
343
344
  def _parse_function(expression: str) -> Tuple[Optional[str], list, dict]:
344
- m = re.search(r"^(\w*)\s*\(([\s\S]*)\)\s*$", expression)
345
+ # EP_NAME(PARAM_NAME=PARAM_VALUE,...)
346
+ # [a-zA-Z_:] is EP_NAME, can contain letters, underscore and colon
347
+ # [\s\S] is any symbol including newline (because . doesn't include newline by default)
348
+ m = re.search(r"^([a-zA-Z_:]*)\s*\(([\s\S]*)\)\s*$", expression)
345
349
 
346
350
  if not m:
347
351
  return None, [], {}
@@ -500,20 +504,24 @@ def _build_query_tree(query: Query):
500
504
  node.labels["OUT"] = node.config["NESTED_OUTPUT"]
501
505
 
502
506
  if "SOURCE_DESCRIPTION" in node.config:
503
- description = node.config["SOURCE_DESCRIPTION"].strip().split(" ")
504
- if len(description) > 1:
505
- desc_node = description[0].split(".")[0]
506
- labels = description[1].split(".")
507
-
508
- if labels and desc_node in query.nodes:
509
- if labels[0]:
510
- query.nodes[desc_node].labels["IN"] = labels[0]
511
-
512
- if labels[1]:
513
- query.nodes[desc_node].labels["OUT"] = labels[1]
507
+ descriptions = node.config["SOURCE_DESCRIPTION"]
508
+ if isinstance(descriptions, str):
509
+ descriptions = [descriptions]
510
+ for description in descriptions:
511
+ description = description.strip().split(" ")
512
+ if len(description) > 1:
513
+ desc_node = description[0].split(".")[0]
514
+ labels = description[1].split(".")
515
+
516
+ if labels and desc_node in query.nodes:
517
+ if labels[0]:
518
+ query.nodes[desc_node].labels["IN"] = labels[0]
519
+
520
+ if labels[1]:
521
+ query.nodes[desc_node].labels["OUT"] = labels[1]
514
522
 
515
523
  if "SINK_DESCRIPTION" in node.config:
516
- description_path = node.config["SOURCE_DESCRIPTION"].strip().split(".")
524
+ description_path = node.config["SINK_DESCRIPTION"].strip().split(".")
517
525
  if len(description_path) > 1:
518
526
  desc_node = description_path[0]
519
527
  label = description_path[-1]
@@ -526,7 +534,7 @@ def _build_query_tree(query: Query):
526
534
  if "SINK" in node.config:
527
535
  sink_nodes = [(sink, True) for sink in node.config["SINK"].strip().split()]
528
536
  if sink_nodes:
529
- leaves.remove(node_id)
537
+ leaves.discard(node_id)
530
538
 
531
539
  nodes += sink_nodes
532
540
  del node.config["SINK"]
@@ -534,7 +542,7 @@ def _build_query_tree(query: Query):
534
542
  if "SOURCE" in node.config:
535
543
  source_nodes = [(sink, False) for sink in node.config["SOURCE"].strip().split()]
536
544
  if source_nodes:
537
- roots.remove(node_id)
545
+ roots.discard(node_id)
538
546
 
539
547
  nodes += source_nodes
540
548
  del node.config["SOURCE"]
@@ -545,10 +553,10 @@ def _build_query_tree(query: Query):
545
553
  source_node_id = source_node_path[0]
546
554
 
547
555
  if not is_sink_node and source_node_id in leaves:
548
- leaves.remove(source_node_id)
556
+ leaves.discard(source_node_id)
549
557
 
550
558
  if is_sink_node and source_node_id in roots:
551
- roots.remove(source_node_id)
559
+ roots.discard(source_node_id)
552
560
 
553
561
  if source_node_id not in query.nodes:
554
562
  raise RuntimeError(f"Malformed otq file passed: node {source_node_id} not found in {query.name}")
@@ -689,21 +697,25 @@ def read_otq(path: str, parse_eval_from_params: bool = False) -> Optional[Graph]
689
697
  return graph
690
698
 
691
699
 
692
- def filter_nodes(ep: Any, param, value, line_limit: Optional[Tuple[int, int]] = None):
693
- if line_limit is not None and (line_limit[0] < 0 or line_limit[1] < 0):
700
+ def truncate_param_value(ep: Any, param, value, line_limit: Optional[Tuple[int, int]] = None):
701
+ if line_limit is None:
702
+ return value
703
+
704
+ height, width = line_limit
705
+ if height < 0 or width < 0:
694
706
  raise ValueError("line_limit values should not be negative")
695
707
 
696
- if isinstance(ep, EP) and line_limit is not None and (
708
+ if isinstance(ep, EP) and (
697
709
  ep.name == "PER_TICK_SCRIPT" and param.lower() == "script" or
698
710
  ep.name == "CSV_FILE_LISTING" and param.lower() == "file_contents"
699
711
  ):
700
712
  lines = [
701
- line if len(line) <= line_limit[1] or not line_limit[1] else line[:line_limit[1]] + "..."
713
+ line if len(line) <= width or not width else line[:width] + "..."
702
714
  for line in value.split("\n")
703
715
  ]
704
716
 
705
- if line_limit[0] and len(lines) > line_limit[0]:
706
- lines = lines[:line_limit[0]] + ["..."]
717
+ if height and len(lines) > height:
718
+ lines = lines[:height] + ["..."]
707
719
 
708
720
  return "\n".join(lines)
709
721
 
@@ -790,11 +802,13 @@ def build_node(graphs: GraphStorage, node: Node, line_limit: Optional[Tuple[int,
790
802
  attrs["sides"] = "LR"
791
803
 
792
804
  if isinstance(v, NestedQuery):
793
- param_value = html.escape(v.raw_string)
805
+ param_value = v.raw_string
794
806
  else:
795
- param_value = html.escape(v).replace("\t", "&nbsp;" * 4)
807
+ param_value = v
796
808
 
797
- param_lines = filter_nodes(node.ep, k, param_value, line_limit).split("\n")
809
+ param_value = truncate_param_value(node.ep, k, param_value, line_limit)
810
+ param_value = html.escape(param_value).replace("\t", "&nbsp;" * 4)
811
+ param_lines = param_value.split("\n")
798
812
 
799
813
  if k:
800
814
  if len(param_lines) == 1:
@@ -1018,10 +1032,10 @@ def render_otq(
1018
1032
  `Graphviz` rendering format. Default: `png`.
1019
1033
  If `image_path` contains one of next extensions, `output_format` will be set automatically: `png`, `svg`, `dot`.
1020
1034
  load_external_otqs: bool
1021
- If set to `True` (default) dependencies from external .otq files (not listed in `path` param)
1035
+ If set to `True` (default) dependencies from external .otq files (not listed in ``path`` param)
1022
1036
  will be loaded automatically.
1023
1037
  view: bool
1024
- Defines should generated image be showed after render.
1038
+ Defines should generated image be shown after render.
1025
1039
  line_limit: Tuple[int, int], None
1026
1040
  Limit for maximum number of lines and length of some EP parameters strings.
1027
1041
  First param is limit of lines, second - limit of characters in each line.
@@ -1030,7 +1044,11 @@ def render_otq(
1030
1044
  parse_eval_from_params: bool
1031
1045
  Enable parsing and printing `eval` sub-queries from EP parameters.
1032
1046
  debug: bool
1033
- Allow to print stdout or stderr from `Grapthviz` render.
1047
+ Allow to print stdout or stderr from `Graphviz` render.
1048
+
1049
+ Returns
1050
+ -------
1051
+ Path to rendered image
1034
1052
 
1035
1053
  Examples
1036
1054
  --------
@@ -1039,10 +1057,14 @@ def render_otq(
1039
1057
 
1040
1058
  >>> otp.utils.render_otq("./test.otq") # doctest: +SKIP
1041
1059
 
1060
+ .. image:: ../../static/testing/images/render_otq_1.png
1061
+
1042
1062
  Render multiple files:
1043
1063
 
1044
1064
  >>> otp.utils.render_otq(["./first.otq", "./second.otq"]) # doctest: +SKIP
1045
1065
 
1066
+ .. image:: ../../static/testing/images/render_otq_2.png
1067
+
1046
1068
  Render specific queries from multiple files:
1047
1069
 
1048
1070
  >>> otp.utils.render_otq(["./first.otq", "./second.otq::some_query"]) # doctest: +SKIP
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onetick-py
3
- Version: 1.164.0
3
+ Version: 1.166.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
@@ -8,14 +8,14 @@ Project-URL: Documentation, https://docs.pip.distribution.sol.onetick.com
8
8
  Project-URL: OneTick, https://onetick.com/
9
9
  Classifier: Topic :: Database :: Front-Ends
10
10
  Classifier: Topic :: Scientific/Engineering
11
- Classifier: Programming Language :: Python :: 3.8
12
11
  Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Operating System :: OS Independent
17
17
  Classifier: Environment :: Console
18
- Requires-Python: >=3.8
18
+ Requires-Python: >=3.9
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE
21
21
  Requires-Dist: pandas==1.1.5; python_version == "3.6"
File without changes
File without changes