onetick-py 1.167.0__tar.gz → 1.169.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.167.0 → onetick_py-1.169.0}/PKG-INFO +1 -1
  2. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/lib/instance.py +1 -1
  3. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/__init__.py +3 -2
  4. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/_version.py +1 -1
  5. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/compatibility.py +16 -0
  6. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/configuration.py +8 -0
  7. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/joins.py +43 -28
  8. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/db/_inspection.py +48 -7
  9. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/run.py +14 -12
  10. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick_py.egg-info/PKG-INFO +1 -1
  11. {onetick_py-1.167.0 → onetick_py-1.169.0}/LICENSE +0 -0
  12. {onetick_py-1.167.0 → onetick_py-1.169.0}/README.md +0 -0
  13. {onetick_py-1.167.0 → onetick_py-1.169.0}/pyproject.toml +0 -0
  14. {onetick_py-1.167.0 → onetick_py-1.169.0}/requirements.strict.txt +0 -0
  15. {onetick_py-1.167.0 → onetick_py-1.169.0}/requirements.txt +0 -0
  16. {onetick_py-1.167.0 → onetick_py-1.169.0}/setup.cfg +0 -0
  17. {onetick_py-1.167.0 → onetick_py-1.169.0}/setup.py +0 -0
  18. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/locator_parser/__init__.py +0 -0
  19. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/locator_parser/acl.py +0 -0
  20. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/locator_parser/actions.py +0 -0
  21. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/locator_parser/common.py +0 -0
  22. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/locator_parser/io.py +0 -0
  23. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/locator_parser/locator.py +0 -0
  24. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/__init__.py +0 -0
  25. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/doc_utilities/__init__.py +0 -0
  26. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/doc_utilities/napoleon.py +0 -0
  27. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/doc_utilities/ot_doctest.py +0 -0
  28. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/doc_utilities/snippets.py +0 -0
  29. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/lib/__init__.py +0 -0
  30. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/_stack_info.py +0 -0
  31. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/__init__.py +0 -0
  32. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/_base.py +0 -0
  33. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/_docs.py +0 -0
  34. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/compute.py +0 -0
  35. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/functions.py +0 -0
  36. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/generic.py +0 -0
  37. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/high_low.py +0 -0
  38. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/num_distinct.py +0 -0
  39. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/order_book.py +0 -0
  40. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/aggregations/other.py +0 -0
  41. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/backports.py +0 -0
  42. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/cache.py +0 -0
  43. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/callback/__init__.py +0 -0
  44. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/callback/callback.py +0 -0
  45. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/callback/callbacks.py +0 -0
  46. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/__init__.py +0 -0
  47. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_csv_inspector.py +0 -0
  48. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/__init__.py +0 -0
  49. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_manually_bound_value.py +0 -0
  50. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_nodes_history.py +0 -0
  51. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_op_utils/__init__.py +0 -0
  52. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_op_utils/every_operand.py +0 -0
  53. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_op_utils/is_const.py +0 -0
  54. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +0 -0
  55. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_proxy_node.py +0 -0
  56. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_state_objects.py +0 -0
  57. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_internal/_state_vars.py +0 -0
  58. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/__init__.py +0 -0
  59. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/_symbol_param.py +0 -0
  60. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/schema.py +0 -0
  61. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/__init__.py +0 -0
  62. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/aggregations.py +0 -0
  63. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/applyers.py +0 -0
  64. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/columns.py +0 -0
  65. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/data_quality.py +0 -0
  66. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/debugs.py +0 -0
  67. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/drops.py +0 -0
  68. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/fields.py +0 -0
  69. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/filters.py +0 -0
  70. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/merges.py +0 -0
  71. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/misc.py +0 -0
  72. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/pandases.py +0 -0
  73. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/renames.py +0 -0
  74. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/sorts.py +0 -0
  75. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/switches.py +0 -0
  76. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/symbols.py +0 -0
  77. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/times.py +0 -0
  78. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/source_methods/writes.py +0 -0
  79. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/symbol.py +0 -0
  80. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/_source/tmp_otq.py +0 -0
  81. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column.py +0 -0
  82. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/__init__.py +0 -0
  83. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/_methods/__init__.py +0 -0
  84. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/_methods/_internal.py +0 -0
  85. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/_methods/conversions.py +0 -0
  86. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/_methods/methods.py +0 -0
  87. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/_methods/op_types.py +0 -0
  88. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/accessors/__init__.py +0 -0
  89. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/accessors/_accessor.py +0 -0
  90. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/accessors/decimal_accessor.py +0 -0
  91. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/accessors/dt_accessor.py +0 -0
  92. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/accessors/float_accessor.py +0 -0
  93. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/accessors/str_accessor.py +0 -0
  94. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/column_operations/base.py +0 -0
  95. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/cut_builder.py +0 -0
  96. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/db_constants.py +0 -0
  97. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/eval_query.py +0 -0
  98. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/lambda_object.py +0 -0
  99. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/multi_output_source.py +0 -0
  100. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/per_tick_script.py +0 -0
  101. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/query_inspector.py +0 -0
  102. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/core/source.py +0 -0
  103. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/db/__init__.py +0 -0
  104. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/db/db.py +0 -0
  105. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/db/utils.py +0 -0
  106. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/docs/__init__.py +0 -0
  107. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/docs/docstring_parser.py +0 -0
  108. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/docs/utils.py +0 -0
  109. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/functions.py +0 -0
  110. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/license.py +0 -0
  111. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/log.py +0 -0
  112. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/math.py +0 -0
  113. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/misc.py +0 -0
  114. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/oqd/__init__.py +0 -0
  115. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/oqd/eps.py +0 -0
  116. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/oqd/sources.py +0 -0
  117. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/otq.py +0 -0
  118. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/pyomd_mock.py +0 -0
  119. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/servers.py +0 -0
  120. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/session.py +0 -0
  121. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/__init__.py +0 -0
  122. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/cache.py +0 -0
  123. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/common.py +0 -0
  124. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/csv.py +0 -0
  125. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/custom.py +0 -0
  126. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/data_file.py +0 -0
  127. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/data_source.py +0 -0
  128. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/empty.py +0 -0
  129. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/odbc.py +0 -0
  130. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/order_book.py +0 -0
  131. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/parquet.py +0 -0
  132. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/pit.py +0 -0
  133. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/query.py +0 -0
  134. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/snapshots.py +0 -0
  135. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/split_query_output_by_symbol.py +0 -0
  136. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/symbology_mapping.py +0 -0
  137. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/symbols.py +0 -0
  138. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sources/ticks.py +0 -0
  139. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/sql.py +0 -0
  140. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/state.py +0 -0
  141. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/types.py +0 -0
  142. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/__init__.py +0 -0
  143. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/acl.py +0 -0
  144. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/config.py +0 -0
  145. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/default.py +0 -0
  146. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/file.py +0 -0
  147. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/helpers.py +0 -0
  148. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/locator.py +0 -0
  149. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/perf.py +0 -0
  150. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/query.py +0 -0
  151. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/render.py +0 -0
  152. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/script.py +0 -0
  153. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/temp.py +0 -0
  154. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/types.py +0 -0
  155. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick/py/utils/tz.py +0 -0
  156. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick_py.egg-info/SOURCES.txt +0 -0
  157. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick_py.egg-info/dependency_links.txt +0 -0
  158. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick_py.egg-info/entry_points.txt +0 -0
  159. {onetick_py-1.167.0 → onetick_py-1.169.0}/src/onetick_py.egg-info/requires.txt +0 -0
  160. {onetick_py-1.167.0 → onetick_py-1.169.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.167.0
3
+ Version: 1.169.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
@@ -5,7 +5,7 @@ import gc
5
5
  import inspect
6
6
  from enum import Enum
7
7
 
8
- if os.getenv("OTP_WEBAPI"):
8
+ if os.getenv('OTP_WEBAPI', default='').lower() not in ('0', 'false', 'no', ''):
9
9
  import onetick.query_webapi as otq
10
10
 
11
11
  class OneTickLibMock:
@@ -2,7 +2,7 @@
2
2
  import os
3
3
  from . import _version
4
4
  __version__ = _version.VERSION
5
- __webapi__: bool = bool(os.getenv("OTP_WEBAPI"))
5
+ __webapi__: bool = os.getenv('OTP_WEBAPI', default='').lower() not in ('0', 'false', 'no', '')
6
6
 
7
7
 
8
8
  def __validate_onetick_query_integration(): # noqa
@@ -77,7 +77,8 @@ def __validate_onetick_query_integration(): # noqa
77
77
  if _otq_import_ex is None:
78
78
  return
79
79
 
80
- # webapi is installed to pip and OTP_WEBAPI=1, we don't need to raise any exception
80
+ # PY-1033: if we can't import onetick.query, but can import onetick.query_webapi
81
+ # then we can just use it and don't need to raise any exception (even if OTP_WEBAPI is not set)
81
82
  try:
82
83
  import onetick.query_webapi
83
84
  __webapi__ = True
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.167.0'
2
+ VERSION = '1.169.0'
@@ -758,3 +758,19 @@ def is_include_market_order_ticks_supported(**kwargs):
758
758
  return _is_min_build_or_version(1.25, 20241229055942,
759
759
  20240812120000, min_update_number=2,
760
760
  **kwargs)
761
+
762
+
763
+ def is_join_with_query_symbol_time_otq_supported():
764
+ # 20241209: Fixed 0034770: hours/minutes/seconds part of otq parameter _SYMBOL_TIME, expressed in
765
+ # milliseconds since 1970/01/01 00:00:00 GMT, is ignored
766
+ # 20250219: Implemented 0035092: passing otq param _SYMBOL_TIME should be just like setting symbol_date
767
+ # to the equivalent value, except in YYYYMMDDhhmmss format
768
+ return _is_min_build_or_version(None, None,
769
+ 20250227120000)
770
+
771
+
772
+ def is_show_db_list_show_description_supported():
773
+ # 20240301: Implemented 0032320: 0032320: SHOW_DB_LIST should have a new EP parameter, SHOW_DESCRIPTION
774
+ # However on 20240330 builds it returns SHOW_DESCRIPTION column instead of DESCRIPTION
775
+ return _is_min_build_or_version(1.25, 20241229055942,
776
+ 20240501000000)
@@ -537,6 +537,14 @@ class Config:
537
537
  allowed_types=str,
538
538
  )
539
539
 
540
+ default_username = OtpProperty(
541
+ description='Default username to call queries. '
542
+ 'By default the name of the owner of the current process is used.',
543
+ base_default=None,
544
+ allowed_types=str,
545
+ env_var_name='OTP_DEFAULT_USERNAME',
546
+ )
547
+
540
548
  default_auth_username = OtpProperty(
541
549
  description='Default username used for authentication.',
542
550
  base_default=None,
@@ -14,6 +14,7 @@ from onetick.py.core.eval_query import prepare_params
14
14
  from onetick.py.otq import otq
15
15
  from onetick.py.compatibility import (
16
16
  is_supported_point_in_time,
17
+ is_join_with_query_symbol_time_otq_supported,
17
18
  is_join_with_snapshot_snapshot_fields_parameter_supported,
18
19
  )
19
20
 
@@ -72,6 +73,19 @@ def _columns_to_params_for_joins(columns, query_params=False):
72
73
  else:
73
74
  raise ValueError('Parameter symbol_time has to be a datetime value!')
74
75
 
76
+ elif key == '_SYMBOL_TIME' and query_params:
77
+ # hack to support passing _SYMBOL_TIME to called query as a parameter
78
+ if dtype is otp.nsectime:
79
+ convert_rule += get_msecs_expression(ott.value2str(value))
80
+ elif dtype is str:
81
+ ns = f'PARSE_NSECTIME("%Y%m%d%H%M%S", {ott.value2str(value)}, _TIMEZONE)'
82
+ convert_rule += get_msecs_expression(ns)
83
+ elif dtype is otp.msectime:
84
+ # for backward compatibility
85
+ convert_rule += get_msecs_expression(value)
86
+ else:
87
+ raise ValueError('Parameter symbol_time has to be a datetime value!')
88
+
75
89
  elif dtype is str:
76
90
  if are_strings(getattr(value, "dtype", None)):
77
91
  convert_rule += str(value)
@@ -80,17 +94,7 @@ def _columns_to_params_for_joins(columns, query_params=False):
80
94
  elif dtype is otp.msectime:
81
95
  convert_rule += get_msecs_expression(value)
82
96
  elif dtype is otp.nsectime:
83
- if key == '_SYMBOL_TIME' and query_params:
84
- # hack to support passing _SYMBOL_TIME to called query as a parameter
85
- warnings.warn(
86
- 'Query parameter _SYMBOL_TIME passed to join_with_query! '
87
- 'This is deprecated. Please use a dedicated `symbol_time` parameter of the '
88
- 'join_with_query function',
89
- FutureWarning,
90
- stacklevel=3,
91
- )
92
- convert_rule += get_msecs_expression(value)
93
- elif query_params:
97
+ if query_params:
94
98
  # this can be used for query params but cannot be used for symbol params
95
99
  # overall it's better
96
100
  convert_rule += "'NSECTIME('+tostring(NSECTIME_TO_LONG(" + str(value) + "))+')'"
@@ -672,10 +676,10 @@ def join_with_query(
672
676
  Function object as query is also supported (Note it will be executed only once in python's code):
673
677
 
674
678
  >>> def func(symbol):
675
- ... d = otp.Ticks(TYPE=["six"])
676
- ... d = d.update(dict(TYPE="three"), where=(symbol.name == "3")) # symbol is always converted to string
677
- ... d["TYPE"] = symbol['PREF'] + d["TYPE"] + symbol['POST']
678
- ... return d
679
+ ... d = otp.Ticks(TYPE=["six"])
680
+ ... d = d.update(dict(TYPE="three"), where=(symbol.name == "3")) # symbol is always converted to string
681
+ ... d["TYPE"] = symbol['PREF'] + d["TYPE"] + symbol['POST']
682
+ ... return d
679
683
  >>> # OTdirective: snippet-name: Special functions.join with query.with a function
680
684
  >>> data = otp.Ticks(A=[1, 2], B=[2, 4])
681
685
  >>> res = data.join_with_query(func, how='inner', symbol=(data['A'] + data['B'], dict(PREF="_", POST="$")))
@@ -689,9 +693,9 @@ def join_with_query(
689
693
  accessible through the "symbol" object:
690
694
 
691
695
  >>> def func(symbol):
692
- ... d = otp.Ticks(TYPE=["six"])
693
- ... d["TYPE"] = symbol['PREF'] + d["TYPE"] + symbol['POST']
694
- ... return d
696
+ ... d = otp.Ticks(TYPE=["six"])
697
+ ... d["TYPE"] = symbol['PREF'] + d["TYPE"] + symbol['POST']
698
+ ... return d
695
699
  >>> # OTdirective: snippet-name: 'Source' operations.join with query.source as symbol;
696
700
  >>> data = otp.Ticks(A=[1, 2], B=[2, 4], PREF=["_", "$"], POST=["$", "_"])
697
701
  >>> res = data.join_with_query(func, how='inner', symbol=data)
@@ -834,22 +838,20 @@ def join_with_query(
834
838
  'object (dict or Source), or a tuple containing both'
835
839
  )
836
840
 
837
- # adding symbol time
838
841
  if '_PARAM_SYMBOL_TIME' in converted_symbol_param_columns.keys():
839
842
  warnings.warn(
840
843
  '"_PARAM_SYMBOL_TIME" explicitly passed among join_with_query symbol parameters! '
841
- 'This is deprecated - please use symbol_time parameter instead. '
842
- 'If you specify symbol_time parameter, it will override the explicitly passed value',
844
+ 'This is deprecated - please use symbol_time parameter instead.',
845
+ FutureWarning,
846
+ stacklevel=2,
847
+ )
848
+ if '_SYMBOL_TIME' in params.keys():
849
+ warnings.warn(
850
+ 'Query parameter "_SYMBOL_TIME" passed to join_with_query! '
851
+ 'This is deprecated. Please use a dedicated `symbol_time` parameter.',
843
852
  FutureWarning,
844
853
  stacklevel=2,
845
854
  )
846
- if symbol_time is not None:
847
- if ott.get_object_type(symbol_time) is not otp.nsectime and ott.get_object_type(symbol_time) is not str:
848
- raise ValueError(
849
- f'Parameter of type {ott.get_object_type(symbol_time)} passed as symbol_time! '
850
- 'This parameter only supports datetime values or strings'
851
- )
852
- converted_symbol_param_columns['_PARAM_SYMBOL_TIME'] = symbol_time
853
855
 
854
856
  # prepare temporary file
855
857
  # ------------------------------------ #
@@ -875,6 +877,19 @@ def join_with_query(
875
877
  if not sub_source._is_unbound_required():
876
878
  sub_source += otp.Empty()
877
879
 
880
+ # adding symbol time
881
+ if symbol_time is not None:
882
+ if ott.get_object_type(symbol_time) is not otp.nsectime and ott.get_object_type(symbol_time) is not str:
883
+ raise ValueError(
884
+ f'Parameter of type {ott.get_object_type(symbol_time)} passed as symbol_time! '
885
+ 'This parameter only supports datetime values or strings'
886
+ )
887
+ if is_join_with_query_symbol_time_otq_supported():
888
+ params = params.copy()
889
+ params['_SYMBOL_TIME'] = symbol_time
890
+ else:
891
+ converted_symbol_param_columns['_PARAM_SYMBOL_TIME'] = symbol_time
892
+
878
893
  params_str = _columns_to_params_for_joins(params, query_params=True)
879
894
  symbol_params_str = _columns_to_params_for_joins(converted_symbol_param_columns)
880
895
 
@@ -7,7 +7,7 @@ from dateutil.tz import gettz
7
7
 
8
8
  import onetick.py as otp
9
9
  from onetick.py import configuration, utils
10
- from onetick.py.compatibility import is_native_plus_zstd_supported
10
+ from onetick.py.compatibility import is_native_plus_zstd_supported, is_show_db_list_show_description_supported
11
11
  from onetick.py.core import db_constants
12
12
  from onetick.py.otq import otq
13
13
 
@@ -25,8 +25,9 @@ class DB:
25
25
  dates with data, symbols, tick schema, etc.
26
26
  """
27
27
 
28
- def __init__(self, name, context=utils.default):
28
+ def __init__(self, name, description='', context=utils.default):
29
29
  self.name = name
30
+ self.description = description
30
31
  if context is utils.default or context is None:
31
32
  self.context = otp.config.context
32
33
  else:
@@ -907,7 +908,9 @@ class DB:
907
908
  return df
908
909
 
909
910
 
910
- def databases(context=utils.default, derived=False, readable_only: bool = True) -> dict[str, DB]:
911
+ def databases(
912
+ context=utils.default, derived: bool = False, readable_only: bool = True, fetch_description: bool = False,
913
+ ) -> dict[str, DB]:
911
914
  """
912
915
  Gets all available databases in the ``context``
913
916
 
@@ -925,6 +928,9 @@ def databases(context=utils.default, derived=False, readable_only: bool = True)
925
928
  readable_only: bool
926
929
  If set to True (default), then return only the databases with read-access for the current user.
927
930
  Otherwise return all databases visible from the current process.
931
+ fetch_description: bool
932
+ If set to True, retrieves descriptions for databases and puts them into ``description`` property of
933
+ :py:class:`~onetick.py.DB` objects in a returned dict.
928
934
 
929
935
  See also
930
936
  --------
@@ -938,17 +944,47 @@ def databases(context=utils.default, derived=False, readable_only: bool = True)
938
944
  Dict where keys are database names and values are :class:`DB <onetick.py.db._inspection.DB>` objects
939
945
  with ``context`` specified.
940
946
  """
947
+ if fetch_description and not is_show_db_list_show_description_supported():
948
+ fetch_description = False
949
+
941
950
  if readable_only:
942
951
  node = (
943
952
  otq.AccessInfo(info_type='DATABASES', show_for_all_users=False, deep_scan=True).tick_type('ANY')
944
953
  >> otq.Passthrough('DB_NAME,READ_ACCESS')
945
954
  >> otq.WhereClause(where='READ_ACCESS = 1')
946
955
  )
956
+
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
+ )
947
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')
979
+
948
980
  node = (
949
- otq.ShowDbList().tick_type('ANY')
950
- >> otq.Passthrough('DATABASE_NAME')
981
+ otq.ShowDbList(**db_list_kwargs).tick_type('ANY')
982
+ >> otq.Passthrough(','.join(output_fields))
951
983
  )
984
+
985
+ if not fetch_description:
986
+ node = node >> otq.AddField('DESCRIPTION', '""')
987
+
952
988
  dbs = otp.run(node,
953
989
  symbols='LOCAL::',
954
990
  # start and end times don't matter for this query, use some constants
@@ -961,9 +997,14 @@ def databases(context=utils.default, derived=False, readable_only: bool = True)
961
997
  return {}
962
998
 
963
999
  db_list = list(dbs['DB_NAME'] if readable_only else dbs['DATABASE_NAME'])
964
- db_dict = {db_name: DB(db_name, context=context) for db_name in db_list}
1000
+ merged_db_list = list(zip(db_list, dbs['DESCRIPTION']))
1001
+
1002
+ db_dict = {
1003
+ db_name: DB(db_name, description=db_description, context=context) for db_name, db_description in merged_db_list
1004
+ }
1005
+
965
1006
  if derived:
966
- kwargs = derived if isinstance(derived, dict) else {}
1007
+ kwargs: dict = derived if isinstance(derived, dict) else {}
967
1008
  kwargs.setdefault('context', context)
968
1009
  db_dict.update(
969
1010
  derived_databases(**kwargs)
@@ -84,14 +84,14 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
84
84
  start: :py:class:`datetime.datetime`, :py:class:`otp.datetime <onetick.py.datetime>`,\
85
85
  :py:class:`pyomd.timeval_t`, optional
86
86
  The start time of the query. Can be timezone-naive or timezone-aware. See also ``timezone`` argument.
87
- onetick.py uses :py:attr:`default_start_time<onetick.py.configuration.Config.default_start_time>`
87
+ onetick.py uses :py:attr:`otp.config.default_start_time<onetick.py.configuration.Config.default_start_time>`
88
88
  as default value, if you don't want to specify start time, e.g. to use saved time of the query,
89
89
  then you should specify None value.
90
90
  end: :py:class:`datetime.datetime`, :py:class:`otp.datetime <onetick.py.datetime>`,\
91
91
  :py:class:`pyomd.timeval_t`, optional
92
92
  The end time of the query (note that it's non-inclusive).
93
93
  Can be timezone-naive or timezone-aware. See also ``timezone`` argument.
94
- onetick.py uses :py:attr:`default_end_time<onetick.py.configuration.Config.default_end_time>`
94
+ onetick.py uses :py:attr:`otp.config.default_end_time<onetick.py.configuration.Config.default_end_time>`
95
95
  as default value, if you don't want to specify end time, e.g. to use saved time of the query,
96
96
  then you should specify None value.
97
97
  date: :py:class:`datetime.date`, :py:class:`otp.date <onetick.py.date>`, optional
@@ -109,28 +109,30 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
109
109
  The timezone of output timestamps.
110
110
  Also, when start and/or end arguments are timezone-naive, it will define their timezone.
111
111
  If parameter is omitted timestamps of ticks will be formatted
112
- with the default :py:attr:`tz<onetick.py.configuration.Config.tz>`.
112
+ with the default :py:attr:`otp.config.tz<onetick.py.configuration.Config.tz>`.
113
113
  context: str, optional
114
114
  Allows specification of different contexts from OneTick configuration to connect to.
115
- If not set then default :py:attr:`context<onetick.py.configuration.Config.context>` is used.
115
+ If not set then default :py:attr:`otp.config.context<onetick.py.configuration.Config.context>` is used.
116
116
  See :ref:`guide about switching contexts <switching contexts>` for examples.
117
117
  username
118
118
  The username to make the connection.
119
- By default the user which executed the process is used.
119
+ By default the user which executed the process is used or the value specified in
120
+ :py:attr:`otp.config.default_username<onetick.py.configuration.Config.default_username>`.
120
121
  alternative_username: str
121
122
  The username used for authentication.
122
123
  Needs to be set only when the tick server is configured to use password-based authentication.
123
- By default, :py:attr:`default_auth_username<onetick.py.configuration.Config.default_auth_username>` is used.
124
+ By default,
125
+ :py:attr:`otp.config.default_auth_username<onetick.py.configuration.Config.default_auth_username>` is used.
124
126
  Not supported for WebAPI mode.
125
127
  password: str, optional
126
128
  The password used for authentication.
127
129
  Needs to be set only when the tick server is configured to use password-based authentication.
128
130
  Note: not supported and ignored on older OneTick versions.
129
- By default, :py:attr:`default_password<onetick.py.configuration.Config.default_password>` is used.
131
+ By default, :py:attr:`otp.config.default_password<onetick.py.configuration.Config.default_password>` is used.
130
132
  batch_size: int
131
133
  number of symbols to run in one batch.
132
134
  By default, the value from
133
- :py:attr:`default_batch_size<onetick.py.configuration.Config.default_batch_size>` is used.
135
+ :py:attr:`otp.config.default_batch_size<onetick.py.configuration.Config.default_batch_size>` is used.
134
136
  Not supported for WebAPI mode.
135
137
  running: bool, optional
136
138
  Indicates whether a query is CEP or not. Default is `False`.
@@ -139,7 +141,7 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
139
141
  concurrency: int, optional
140
142
  The maximum number of CPU cores to use to process the query.
141
143
  By default, the value from
142
- :py:attr:`default_concurrency<onetick.py.configuration.Config.default_concurrency>` is used.
144
+ :py:attr:`otp.config.default_concurrency<onetick.py.configuration.Config.default_concurrency>` is used.
143
145
  apply_times_daily: bool
144
146
  Runs the query for every day in the ``start``-``end`` time range,
145
147
  using the time components of ``start`` and ``end`` datetimes.
@@ -195,9 +197,8 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
195
197
  If set to True, result will be forced to be a dictionary even if it's returned for a single symbol
196
198
  max_expected_ticks_per_symbol: int
197
199
  Expected maximum number of ticks per symbol (used for performance optimizations).
198
- By default,
199
- :py:attr:`max_expected_ticks_per_symbol<onetick.py.configuration.Config.max_expected_ticks_per_symbol>`
200
- is used.
200
+ By default, :py:attr:`otp.config.max_expected_ticks_per_symbol \
201
+ <onetick.py.configuration.Config.max_expected_ticks_per_symbol>` is used.
201
202
  Not supported for WebAPI mode.
202
203
  log_symbol: bool
203
204
  Log currently executed symbol.
@@ -547,6 +548,7 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
547
548
  start, end = _get_start_end(start, end, timezone)
548
549
 
549
550
  # authentication
551
+ username = username or otp.config.default_username
550
552
  alternative_username = alternative_username or otp.config.default_auth_username
551
553
  password = password or otp.config.default_password
552
554
  kwargs = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onetick-py
3
- Version: 1.167.0
3
+ Version: 1.169.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
File without changes
File without changes
File without changes
File without changes