onetick-py 1.163.0__tar.gz → 1.165.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.163.0 → onetick_py-1.165.0}/PKG-INFO +3 -3
  2. {onetick_py-1.163.0 → onetick_py-1.165.0}/pyproject.toml +3 -2
  3. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/locator_parser/actions.py +10 -14
  4. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/locator_parser/common.py +13 -10
  5. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/locator_parser/io.py +6 -4
  6. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/locator_parser/locator.py +1 -1
  7. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/doc_utilities/ot_doctest.py +1 -1
  8. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/doc_utilities/snippets.py +1 -2
  9. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/lib/instance.py +7 -4
  10. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/__init__.py +5 -9
  11. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/_version.py +1 -1
  12. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/_base.py +7 -4
  13. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/_docs.py +1 -1
  14. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/other.py +1 -1
  15. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/cache.py +1 -0
  16. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/callback/callback.py +1 -0
  17. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_proxy_node.py +1 -1
  18. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_state_objects.py +2 -2
  19. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/aggregations.py +8 -9
  20. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/applyers.py +2 -2
  21. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/debugs.py +16 -14
  22. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/drops.py +1 -1
  23. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/fields.py +5 -5
  24. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/filters.py +4 -3
  25. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/joins.py +6 -6
  26. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/misc.py +84 -0
  27. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/renames.py +3 -3
  28. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/switches.py +3 -3
  29. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/writes.py +279 -10
  30. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/tmp_otq.py +1 -1
  31. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/_methods/_internal.py +1 -1
  32. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/_methods/methods.py +8 -7
  33. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/_methods/op_types.py +1 -0
  34. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/accessors/dt_accessor.py +4 -0
  35. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/base.py +5 -5
  36. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/cut_builder.py +1 -0
  37. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/eval_query.py +1 -0
  38. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/lambda_object.py +2 -3
  39. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/per_tick_script.py +6 -5
  40. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/query_inspector.py +6 -7
  41. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/source.py +82 -9
  42. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/db/_inspection.py +4 -8
  43. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/db/db.py +4 -100
  44. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/docs/docstring_parser.py +1 -1
  45. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/functions.py +1 -0
  46. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/license.py +2 -0
  47. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/math.py +2 -2
  48. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/otq.py +1 -2
  49. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/run.py +8 -7
  50. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/servers.py +2 -2
  51. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/session.py +8 -6
  52. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/common.py +6 -4
  53. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/data_source.py +25 -35
  54. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/query.py +7 -7
  55. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/symbols.py +1 -1
  56. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/ticks.py +3 -3
  57. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/state.py +1 -0
  58. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/types.py +27 -25
  59. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/config.py +2 -2
  60. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/perf.py +2 -3
  61. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/render.py +12 -3
  62. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/temp.py +2 -2
  63. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick_py.egg-info/PKG-INFO +3 -3
  64. {onetick_py-1.163.0 → onetick_py-1.165.0}/LICENSE +0 -0
  65. {onetick_py-1.163.0 → onetick_py-1.165.0}/README.md +0 -0
  66. {onetick_py-1.163.0 → onetick_py-1.165.0}/requirements.strict.txt +0 -0
  67. {onetick_py-1.163.0 → onetick_py-1.165.0}/requirements.txt +0 -0
  68. {onetick_py-1.163.0 → onetick_py-1.165.0}/setup.cfg +0 -0
  69. {onetick_py-1.163.0 → onetick_py-1.165.0}/setup.py +0 -0
  70. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/locator_parser/__init__.py +0 -0
  71. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/locator_parser/acl.py +0 -0
  72. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/__init__.py +0 -0
  73. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/doc_utilities/__init__.py +0 -0
  74. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/doc_utilities/napoleon.py +0 -0
  75. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/lib/__init__.py +0 -0
  76. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/_stack_info.py +0 -0
  77. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/__init__.py +0 -0
  78. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/compute.py +0 -0
  79. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/functions.py +0 -0
  80. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/generic.py +0 -0
  81. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/high_low.py +0 -0
  82. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/num_distinct.py +0 -0
  83. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/aggregations/order_book.py +0 -0
  84. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/backports.py +0 -0
  85. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/callback/__init__.py +0 -0
  86. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/callback/callbacks.py +0 -0
  87. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/compatibility.py +0 -0
  88. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/configuration.py +0 -0
  89. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/__init__.py +0 -0
  90. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_csv_inspector.py +0 -0
  91. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/__init__.py +0 -0
  92. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_manually_bound_value.py +0 -0
  93. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_nodes_history.py +0 -0
  94. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_op_utils/__init__.py +0 -0
  95. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_op_utils/every_operand.py +0 -0
  96. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_op_utils/is_const.py +0 -0
  97. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +0 -0
  98. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_internal/_state_vars.py +0 -0
  99. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/__init__.py +0 -0
  100. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/_symbol_param.py +0 -0
  101. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/schema.py +0 -0
  102. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/__init__.py +0 -0
  103. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/columns.py +0 -0
  104. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/data_quality.py +0 -0
  105. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/merges.py +0 -0
  106. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/pandases.py +0 -0
  107. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/sorts.py +0 -0
  108. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/symbols.py +0 -0
  109. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/source_methods/times.py +0 -0
  110. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/_source/symbol.py +0 -0
  111. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column.py +0 -0
  112. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/__init__.py +0 -0
  113. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/_methods/__init__.py +0 -0
  114. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/_methods/conversions.py +0 -0
  115. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/accessors/__init__.py +0 -0
  116. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/accessors/_accessor.py +0 -0
  117. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/accessors/decimal_accessor.py +0 -0
  118. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/accessors/float_accessor.py +0 -0
  119. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/column_operations/accessors/str_accessor.py +0 -0
  120. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/db_constants.py +0 -0
  121. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/core/multi_output_source.py +0 -0
  122. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/db/__init__.py +0 -0
  123. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/db/utils.py +0 -0
  124. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/docs/__init__.py +0 -0
  125. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/docs/utils.py +0 -0
  126. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/log.py +0 -0
  127. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/misc.py +0 -0
  128. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/oqd/__init__.py +0 -0
  129. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/oqd/eps.py +0 -0
  130. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/oqd/sources.py +0 -0
  131. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/pyomd_mock.py +0 -0
  132. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/__init__.py +0 -0
  133. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/cache.py +0 -0
  134. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/csv.py +0 -0
  135. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/custom.py +0 -0
  136. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/data_file.py +0 -0
  137. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/empty.py +0 -0
  138. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/odbc.py +0 -0
  139. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/order_book.py +0 -0
  140. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/parquet.py +0 -0
  141. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/pit.py +0 -0
  142. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/snapshots.py +0 -0
  143. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/split_query_output_by_symbol.py +0 -0
  144. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sources/symbology_mapping.py +0 -0
  145. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/sql.py +0 -0
  146. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/__init__.py +0 -0
  147. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/acl.py +0 -0
  148. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/default.py +0 -0
  149. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/file.py +0 -0
  150. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/helpers.py +0 -0
  151. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/locator.py +0 -0
  152. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/query.py +0 -0
  153. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/script.py +0 -0
  154. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/types.py +0 -0
  155. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick/py/utils/tz.py +0 -0
  156. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick_py.egg-info/SOURCES.txt +0 -0
  157. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick_py.egg-info/dependency_links.txt +0 -0
  158. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick_py.egg-info/entry_points.txt +0 -0
  159. {onetick_py-1.163.0 → onetick_py-1.165.0}/src/onetick_py.egg-info/requires.txt +0 -0
  160. {onetick_py-1.163.0 → onetick_py-1.165.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.163.0
3
+ Version: 1.165.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
  ]
@@ -44,3 +44,4 @@ where = ["src"]
44
44
 
45
45
  [tool.black]
46
46
  line-length = 120
47
+ skip-string-normalization = true
@@ -14,7 +14,7 @@ class Add(Action):
14
14
  def __init__(self, obj):
15
15
  self.what_to_add = obj.to_lines()
16
16
 
17
- super(Add, self).__init__()
17
+ super().__init__()
18
18
 
19
19
  if obj.__class__.PARENT is not Entity:
20
20
  self._add_conditions[(obj.__class__.PARENT.TAG.lower(), None, None)] = False
@@ -36,7 +36,7 @@ class Modify(Action):
36
36
 
37
37
  def __init__(self, **kwargs):
38
38
  if len(kwargs) > 1:
39
- raise Exception("It is not supported to set multiple keys yet!")
39
+ raise ValueError("It is not supported to set multiple keys yet!")
40
40
 
41
41
  field, value = "", ""
42
42
  delete = False
@@ -49,7 +49,7 @@ class Modify(Action):
49
49
 
50
50
  self.init(field, value, delete)
51
51
 
52
- super(Modify, self).__init__()
52
+ super().__init__()
53
53
 
54
54
  def init(self, field, value, delete):
55
55
  self.field = field.lower()
@@ -58,7 +58,7 @@ class Modify(Action):
58
58
 
59
59
  def do(self, obj, all_lines, properties_lines, writer):
60
60
  if not obj.__class__.HAS_PROPERTIES:
61
- raise Exception("Entity with tag '" + obj.__class__.TAG + "' does not expect to have properties!")
61
+ raise AttributeError("Entity with tag '" + obj.__class__.TAG + "' does not expect to have properties!")
62
62
 
63
63
  new_properties = list(properties_lines)
64
64
 
@@ -69,12 +69,10 @@ class Modify(Action):
69
69
  if end_pos != -1:
70
70
  if line.find("/>") != -1 and line.find("/>") < end_pos:
71
71
  end_pos = line.find("/>")
72
- # if
73
72
 
74
73
  line = line[:end_pos] + " %s=%s" % (self.field, self.value) + line[end_pos:]
74
+ new_properties[-1] = line
75
75
  break
76
-
77
- new_properties[-1] = line
78
76
  else:
79
77
  for inx, line in enumerate(new_properties):
80
78
  pos = line.lower().find(self.field + "=")
@@ -90,11 +88,9 @@ class Modify(Action):
90
88
  line[pos: pos + len(self.field) + 1] + t_line,
91
89
  line[pos: pos + len(self.field) + 1] + self.value,
92
90
  )
93
-
91
+ new_properties[inx] = line
94
92
  break
95
93
 
96
- new_properties[inx] = line
97
-
98
94
  writer.modify(len(all_lines), properties_lines, new_properties)
99
95
 
100
96
 
@@ -134,7 +130,7 @@ class Get(Action):
134
130
  double_quotes_count = 0
135
131
  single_quotes_count = 0
136
132
 
137
- for token in filter(lambda x: x != "" and x != "<" and x != "/>" and x != ">", properties_lines.split()[1:]):
133
+ for token in filter(lambda x: x not in ("", "<", "/>", ">"), properties_lines.split()[1:]):
138
134
  # ---------------------
139
135
  # Logic to combine values in quotes are separated
140
136
  # by space
@@ -165,10 +161,10 @@ class Get(Action):
165
161
 
166
162
  key, value = t_list[0], t_list[1]
167
163
 
168
- if value[-2:] == "/>":
164
+ if value.endswith("/>"):
169
165
  value = value[:-2]
170
166
 
171
- if value[-1:] == ">" or value[-1:] == "/":
167
+ if value.endswith(">") or value.endswith("/"):
172
168
  value = value[:-1]
173
169
 
174
170
  properties_dict[key.lower()] = value.replace('"', "")
@@ -183,7 +179,7 @@ class Get(Action):
183
179
  class GetAll(Action):
184
180
 
185
181
  def __init__(self):
186
- super(GetAll, self).__init__()
182
+ super().__init__()
187
183
  self.result = []
188
184
 
189
185
  def do(self, obj, all_lines, properties_lines, writer):
@@ -23,7 +23,7 @@ def get_properties(declaration):
23
23
  return properties
24
24
 
25
25
 
26
- class Generator(object):
26
+ class Generator:
27
27
 
28
28
  def __iter__(self):
29
29
  return self
@@ -105,14 +105,12 @@ class Action(ABC):
105
105
  return True
106
106
 
107
107
  def add_where(self, tag, **kwargs):
108
- if type(tag) is str:
109
- tag = tag
110
- else:
108
+ if not isinstance(tag, str):
111
109
  # for case when it's class name
112
110
  tag = tag.TAG
113
111
 
114
112
  if len(kwargs) > 1:
115
- raise Exception("It is not support to set multiple keys yet!")
113
+ raise ValueError("It is not support to set multiple keys yet!")
116
114
 
117
115
  if len(kwargs) == 0:
118
116
  self.conditions[(tag.lower(), None, None)] = False
@@ -120,10 +118,13 @@ class Action(ABC):
120
118
  self.conditions[(tag.lower(), list(kwargs.keys())[0].lower(), list(kwargs.values())[0])] = False
121
119
 
122
120
 
123
- def apply_actions(func, reader, writer, actions=[], flush=False):
121
+ def apply_actions(func, reader, writer, actions=None, flush=False):
124
122
  from locator_parser.io import LinesReader
125
123
  from locator_parser.actions import DoNothing
126
124
 
125
+ if actions is None:
126
+ actions = []
127
+
127
128
  if len(actions) == 0:
128
129
  actions.append(DoNothing())
129
130
 
@@ -173,7 +174,7 @@ class Writer(ABC):
173
174
  elif msg_type == Writer.NEW_MSG:
174
175
  lines = yield
175
176
 
176
- assert type(lines) is list
177
+ assert isinstance(lines, list)
177
178
 
178
179
  self.lines = self.lines[:-1] + lines + self.lines[-1:]
179
180
  elif msg_type == Writer.MODIFY_MSG:
@@ -316,9 +317,11 @@ class Entity(Generator, ABC):
316
317
  self.finish(writer, action)
317
318
  return
318
319
 
319
- line = next(reader)
320
-
321
- yield line
320
+ try:
321
+ line = next(reader)
322
+ yield line
323
+ except StopIteration:
324
+ return
322
325
 
323
326
  def finish(self, writer, action):
324
327
  if self.__do:
@@ -7,12 +7,12 @@ class FileWriter(Writer):
7
7
  def __init__(self, file_path):
8
8
  self.__path = file_path
9
9
 
10
- super(FileWriter, self).__init__()
10
+ super().__init__()
11
11
 
12
12
  def flush(self):
13
13
  with open(self.__path, "w") as fout:
14
14
  for line in self.lines:
15
- if line[-1:] != "\n":
15
+ if not line.endswith("\n"):
16
16
  line += "\n"
17
17
 
18
18
  fout.write(line)
@@ -27,10 +27,12 @@ class PrintWriter(Writer):
27
27
  class FileReader(Reader):
28
28
 
29
29
  def __init__(self, file_path):
30
+ # pylint: disable-next=consider-using-with
30
31
  self.iterable_object = open(file_path.replace('"', ""), "r")
32
+ # pylint: disable-next=unused-private-member
31
33
  self.__finalizer = weakref.finalize(self, lambda x: x.close(), self.iterable_object)
32
34
 
33
- super(FileReader, self).__init__()
35
+ super().__init__()
34
36
 
35
37
 
36
38
  class LinesReader(Reader):
@@ -38,4 +40,4 @@ class LinesReader(Reader):
38
40
  def __init__(self, lines):
39
41
  self.iterable_object = lines.split("\n")
40
42
 
41
- super(LinesReader, self).__init__()
43
+ super().__init__()
@@ -18,7 +18,7 @@ class Include(Entity):
18
18
  # env variable found in the path
19
19
  if matched:
20
20
  if matched.group(0)[2:-1] not in os.environ:
21
- raise Exception("Includes use not defined environment variable: % s" % matched.group(0))
21
+ raise RuntimeError("Includes use not defined environment variable: % s" % matched.group(0))
22
22
 
23
23
  path = path.replace(matched.group(0), os.environ[matched.group(0)[2:-1]])
24
24
 
@@ -3,7 +3,6 @@ import re
3
3
  import inspect
4
4
 
5
5
  from typing import Union, Optional
6
- from onetick.py.backports import Literal
7
6
 
8
7
 
9
8
  def snippet_name(example: Union[doctest.Example, str], value):
@@ -24,6 +23,7 @@ def skip_example(example, value, caller=None):
24
23
  if isinstance(example, doctest.Example):
25
24
  example.skip = True
26
25
  return example
26
+ return None
27
27
 
28
28
 
29
29
  OT_DIRECTIVES = {'skip-example': skip_example,
@@ -218,8 +218,7 @@ class Snippets:
218
218
  self.append(item)
219
219
 
220
220
  def __iter__(self):
221
- for s in self._snippets.values():
222
- yield s
221
+ yield from self._snippets.values()
223
222
 
224
223
  def dict_view(self):
225
224
  """Format snippets for nbextension-contrib-snippets"""
@@ -76,8 +76,8 @@ class OneTickLib:
76
76
  if log_file:
77
77
  self.set_log_file(log_file)
78
78
  elif args != OneTickLib.__args and args:
79
- raise Exception("OneTickLib was already initialized with different "
80
- "parameters: Was: {} Now: {}".format(OneTickLib.__args, args))
79
+ raise ValueError("OneTickLib was already initialized with different "
80
+ "parameters: Was: {} Now: {}".format(OneTickLib.__args, args))
81
81
 
82
82
  def __eq__(self, otl):
83
83
  return self.__dict__ == otl.__dict__
@@ -134,5 +134,8 @@ class OneTickLib:
134
134
  :param config_parameter_value: new value of the param
135
135
  """
136
136
  if OneTickLib.__instance:
137
- raise Exception('This method should be called before OneTickLib object is constructed to have effect.')
138
- pyomd.OneTickLib.override_config_value(config_parameter_name, config_parameter_value)
137
+ raise RuntimeError('This method should be called before OneTickLib object is constructed to have effect.')
138
+ try:
139
+ pyomd.OneTickLib.override_config_value(config_parameter_name, config_parameter_value) # noqa
140
+ except NameError:
141
+ raise RuntimeError('This method is not available in WebAPI mode')
@@ -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", False))
5
+ __webapi__: bool = bool(os.getenv("OTP_WEBAPI"))
6
6
 
7
7
 
8
8
  def __validate_onetick_query_integration(): # noqa
@@ -13,10 +13,9 @@ def __validate_onetick_query_integration(): # noqa
13
13
  before raising an exception, we check if onetick.query_webapi is installed.
14
14
  If it is installed, we set OTP_WEBAPI environment variable and avoid raising any exception/warning.
15
15
  """
16
- import os
17
16
  global __webapi__
18
17
 
19
- if os.getenv("OTP_SKIP_OTQ_VALIDATION", False):
18
+ if os.getenv("OTP_SKIP_OTQ_VALIDATION"):
20
19
  return
21
20
 
22
21
  _otq_import_ex = None
@@ -86,7 +85,7 @@ def __validate_onetick_query_integration(): # noqa
86
85
  except ImportError:
87
86
  print('onetick.query_webapi is not available')
88
87
 
89
- if type(_otq_import_ex) is ImportError:
88
+ if isinstance(_otq_import_ex, ImportError):
90
89
  raise ImportError(
91
90
  'The above exception is probably raised '
92
91
  'because your python version is unsupported in this OneTick build'
@@ -127,7 +126,6 @@ def __validate_onetick_query_integration(): # noqa
127
126
 
128
127
 
129
128
  def __get_missed_paths(env, *paths, found_callback=None):
130
- import os
131
129
  from pathlib import Path
132
130
 
133
131
  missed_paths = []
@@ -147,9 +145,7 @@ def __get_missed_paths(env, *paths, found_callback=None):
147
145
 
148
146
 
149
147
  def __set_onetick_path_variables():
150
- import os
151
- global __webapi__
152
- if __webapi__ or os.getenv("OTP_SKIP_OTQ_VALIDATION", False):
148
+ if __webapi__ or os.getenv("OTP_SKIP_OTQ_VALIDATION"):
153
149
  return
154
150
  import warnings
155
151
  import onetick.query as otq
@@ -157,6 +153,7 @@ def __set_onetick_path_variables():
157
153
 
158
154
  onetick_query_init = Path(otq.__file__)
159
155
 
156
+ # pylint: disable=global-variable-undefined
160
157
  global __main_one_tick_dir__, __one_tick_bin_dir__, __one_tick_python_dir__
161
158
  __one_tick_python_dir__ = str(onetick_query_init.parents[2])
162
159
  __one_tick_bin_dir__ = str(onetick_query_init.parents[3])
@@ -196,7 +193,6 @@ from onetick.py.sources import (Tick, TTicks, Ticks, Orders, Trades, NBBO, Quote
196
193
  by_symbol, ODBC, SplitQueryOutputBySymbol, DataFile, PointInTime,
197
194
  ReadSnapshot, ShowSnapshotList, FindSnapshotSymbols)
198
195
  from onetick.py.utils import adaptive, range, perf
199
- from onetick.py.core.eval_query import eval
200
196
  from onetick.py.session import Session, TestSession, Config, Locator, HTTPSession
201
197
  from onetick.py.servers import RemoteTS, LoadBalancing, FaultTolerance
202
198
  from onetick.py.db import DB, RefDB
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.163.0'
2
+ VERSION = '1.165.0'
@@ -78,6 +78,7 @@ def operation_replacer(method):
78
78
  aggs = aggrs.values()
79
79
  else:
80
80
  name = args[0] if args else kwargs.get('name')
81
+ # pylint: disable-next=unidiomatic-typecheck
81
82
  if type(obj.column_name) is _Operation and name is None:
82
83
  raise ValueError('Output field name must be specified when aggregating operation')
83
84
  aggs = [obj]
@@ -85,6 +86,7 @@ def operation_replacer(method):
85
86
  # Add operation from each aggregation object to source `res` as column
86
87
  # and replace *column_name* property in each aggregation object with this column's name.
87
88
  for i, agg in enumerate(aggs):
89
+ # pylint: disable-next=unidiomatic-typecheck
88
90
  if type(agg.column_name) is _Operation:
89
91
  tmp_name = f'__TMP_AGG_COLUMN_{i}__'
90
92
  res[tmp_name] = agg.column_name
@@ -242,7 +244,7 @@ class _Aggregation(ABC):
242
244
  """
243
245
  Abstract method that implements common logic for aggregations
244
246
  """
245
- if type(column) is list:
247
+ if isinstance(column, list):
246
248
  column = ','.join(map(str, column))
247
249
 
248
250
  column_name: Union[str, _Operation] = str(column)
@@ -251,6 +253,7 @@ class _Aggregation(ABC):
251
253
  # TODO: need to understand how to better work with alias
252
254
  column_name = "TIMESTAMP"
253
255
 
256
+ # pylint: disable-next=unidiomatic-typecheck
254
257
  if type(column) is _Operation:
255
258
  column_name = column
256
259
 
@@ -314,7 +317,7 @@ class _Aggregation(ABC):
314
317
  self.end_condition_per_group = end_condition_per_group
315
318
  self.boundary_tick_bucket = boundary_tick_bucket
316
319
  self.large_ints = False
317
- if isinstance(group_by, _Operation) or isinstance(group_by, str):
320
+ if isinstance(group_by, (_Operation, str)):
318
321
  group_by = [group_by]
319
322
  self.group_by = group_by or []
320
323
  self.groups_to_display = groups_to_display
@@ -327,7 +330,7 @@ class _Aggregation(ABC):
327
330
  def _attr2str(value) -> str:
328
331
  if isinstance(value, bool):
329
332
  return 'true' if value else 'false'
330
- if type(value) is list:
333
+ if isinstance(value, list):
331
334
  return ','.join(value)
332
335
  return str(value)
333
336
 
@@ -436,7 +439,7 @@ class _Aggregation(ABC):
436
439
  @staticmethod
437
440
  def validate_output_name(schema: Dict, name: Union[List, str]):
438
441
  """checks that aggregation won't output columns with same names"""
439
- if type(name) is not list:
442
+ if not isinstance(name, list):
440
443
  name = [name]
441
444
 
442
445
  same_fields = []
@@ -902,7 +902,7 @@ def copy_method(obj, mimic=True, drop_examples=False):
902
902
  return _decorator
903
903
 
904
904
 
905
- def copy_signature(obj, add_self=False, drop_parameters=[], return_annotation='Source'):
905
+ def copy_signature(obj, add_self=False, drop_parameters=None, return_annotation='Source'):
906
906
  """
907
907
  Decorator that copies signature of the callable ``obj`` to the decorated function.
908
908
  """
@@ -227,7 +227,7 @@ class Distinct(_AggregationTSSelection):
227
227
  keys: Union[str, List[str], _Column, List[_Column]],
228
228
  key_attrs_only: bool = True,
229
229
  *args, **kwargs):
230
- keys = keys if type(keys) is list else [keys] # type: ignore
230
+ keys = keys if isinstance(keys, list) else [keys] # type: ignore
231
231
  super().__init__(column=keys, *args, **kwargs) # type: ignore
232
232
  self.key_attrs_only = key_attrs_only
233
233
 
@@ -26,6 +26,7 @@ def _convert_dt_to_str(dt: Union[str, datetime, otp_datetime]):
26
26
  return dt
27
27
  elif isinstance(dt, (datetime, otp_datetime)):
28
28
  return dt.strftime('%Y%m%d%H%M%S.%f')
29
+ raise ValueError(f"Unsupported value for 'dt' parameter: {type(dt)}")
29
30
 
30
31
 
31
32
  def _convert_time_intervals(
@@ -29,6 +29,7 @@ class CallbackBase(otq.CallbackBase):
29
29
  3
30
30
  """
31
31
 
32
+ # pylint: disable-next=useless-parent-delegation
32
33
  def __init__(self):
33
34
  """
34
35
  Method ``__init__()`` can be used for callback initialization.
@@ -85,7 +85,7 @@ class _ProxyNode:
85
85
  else:
86
86
  self._hist.node_name(self._key, name)
87
87
  self._name = name
88
-
88
+ return None
89
89
  else:
90
90
  return self._name
91
91
 
@@ -383,7 +383,7 @@ class _TickSequence(_StateBase):
383
383
  return isinstance(self._owner, _EmulateInputObject)
384
384
 
385
385
  def _default_schema(self):
386
- return {field: type for field, type in self._owner.schema.items()}
386
+ return dict(self._owner.schema.items())
387
387
 
388
388
  @property
389
389
  def schema(self) -> dict:
@@ -391,7 +391,7 @@ class _TickSequence(_StateBase):
391
391
  Get schema of the tick sequence.
392
392
  """
393
393
  fields = None
394
- if type(self._schema) is list:
394
+ if isinstance(self._schema, list):
395
395
  fields = self._schema
396
396
  self._schema = None
397
397
  if not self._schema:
@@ -1,6 +1,5 @@
1
1
  import warnings
2
- from inspect import Parameter
3
- from typing import TYPE_CHECKING, Optional, Tuple, Union
2
+ from typing import TYPE_CHECKING, Tuple, Union
4
3
 
5
4
  from onetick import py as otp
6
5
  from onetick.py import aggregations
@@ -397,8 +396,8 @@ def distinct(self: 'Source', *args, **kwargs):
397
396
  """
398
397
  if 'bucket_interval_units' in kwargs:
399
398
  kwargs['bucket_units'] = kwargs.pop('bucket_interval_units')
400
- agg = aggregations.functions.distinct(*args, **kwargs)
401
- return agg.apply(self)
399
+ aggr = aggregations.functions.distinct(*args, **kwargs)
400
+ return aggr.apply(self)
402
401
 
403
402
 
404
403
  # mimic=False for backward compatibility
@@ -421,8 +420,8 @@ def high_time(self: 'Source', *args, **kwargs):
421
420
  FutureWarning,
422
421
  stacklevel=2,
423
422
  )
424
- agg = aggregations.functions.high_time(*args, **kwargs)
425
- return agg.apply(self, 'VALUE')
423
+ aggr = aggregations.functions.high_time(*args, **kwargs)
424
+ return aggr.apply(self, 'VALUE')
426
425
 
427
426
 
428
427
  # mimic=False for backward compatibility
@@ -445,8 +444,8 @@ def low_time(self: 'Source', *args, **kwargs):
445
444
  FutureWarning,
446
445
  stacklevel=2,
447
446
  )
448
- agg = aggregations.functions.low_time(*args, **kwargs)
449
- return agg.apply(self, 'VALUE')
447
+ aggr = aggregations.functions.low_time(*args, **kwargs)
448
+ return aggr.apply(self, 'VALUE')
450
449
 
451
450
 
452
451
  @copy_method(aggregations.functions.ob_snapshot)
@@ -800,7 +799,7 @@ def process_by_group(
800
799
  output_schema[field] = input_schema[field]
801
800
  for field, field_type in output_schema.items():
802
801
  output_source.schema[field] = field_type
803
- output_source = output_source[[field for field in output_schema]]
802
+ output_source = output_source[list(output_schema)]
804
803
  output_source._merge_tmp_otq(main_source)
805
804
  output_sources.append(output_source)
806
805
 
@@ -174,7 +174,7 @@ def apply(self: 'Source', obj) -> Union['otp.Column', 'Source']:
174
174
  return apply_lambda(obj, _EmulateObject(self))
175
175
 
176
176
 
177
- def _extract_columns_from_script(script):
177
+ def _extract_columns_from_script(script_text):
178
178
  result = {}
179
179
  supported_types = {
180
180
  'byte',
@@ -199,7 +199,7 @@ def _extract_columns_from_script(script):
199
199
  length = r"(\[(?P<length>\d+)\])?"
200
200
  name = r"\s+(?P<name>\w+)\s*=\s*"
201
201
  pattern = re.compile(types + length + name)
202
- for p in re.finditer(pattern, script):
202
+ for p in re.finditer(pattern, script_text):
203
203
  groupdict = p.groupdict()
204
204
  type_ = ott.str2type(groupdict["type"]) if groupdict["type"] in supported_types else None
205
205
  if type_:
@@ -236,23 +236,25 @@ def dump(
236
236
  if label:
237
237
  self_c['_OUT_LABEL_'] = label
238
238
 
239
- self_c.sink(
240
- otq.WriteText(
241
- formats_of_fields='TIMESTAMP=%|' + configuration.config.tz + '|%d-%m-%Y %H:%M:%S.%J',
242
- prepend_timestamp=False,
243
- prepend_symbol_name=False,
244
- propagate_ticks=True,
245
- )
239
+ self_c.write_text(
240
+ formats_of_fields={'TIMESTAMP': f'%|{configuration.config.tz}|%d-%m-%Y %H:%M:%S.%J'},
241
+ prepend_timestamp=True,
242
+ prepend_symbol_name=False,
243
+ propagate_ticks=True,
244
+ inplace=True,
246
245
  )
247
246
 
248
247
  # print <no data> in case there are 0 ticks
249
- self_c = self_c.agg({'COUNT': otp.agg.count()})
250
- self_c, _ = self_c[self_c['COUNT'] == 0]
251
- self_c['NO_DATA'] = '<no data>'
252
- self_c = self_c[['NO_DATA']]
253
- self_c.sink(
254
- otq.WriteText(output_headers=False, prepend_timestamp=False, prepend_symbol_name=False, propagate_ticks=True)
255
- )
248
+ if hasattr(otq, 'InsertAtEnd'):
249
+ self_c.sink(otq.InsertAtEnd(delimiter_name='AT_END'))
250
+ self_c.schema['AT_END'] = int
251
+ self_c.state_vars['COUNT'] = otp.state.var(0, scope='branch')
252
+ self_c.state_vars['COUNT'] += 1
253
+ self_c, _ = self_c[(self_c['AT_END'] == 1) & (self_c.state_vars['COUNT'] == 1)]
254
+ self_c['NO_DATA'] = '<no data>'
255
+ self_c = self_c[['NO_DATA']]
256
+ self_c.write_text(output_headers=False, prepend_timestamp=False, prepend_symbol_name=False,
257
+ propagate_ticks=False, inplace=True)
256
258
 
257
259
  # Do not propagate ticks then, because we want just to write them into
258
260
  # the std::out. We have to do that, because otherwise these ticks would
@@ -111,7 +111,7 @@ def drop(self: 'Source', columns: List[Any], inplace=False) -> Optional['Source'
111
111
 
112
112
 
113
113
  def __delitem__(self: 'Source', obj):
114
- if isinstance(obj, list) or isinstance(obj, tuple):
114
+ if isinstance(obj, (list, tuple)):
115
115
  objs = obj
116
116
  else:
117
117
  objs = (obj,)
@@ -127,11 +127,12 @@ def table(self: 'Source', inplace=False, strict: bool = True, **schema) -> Optio
127
127
 
128
128
 
129
129
  def __add_field_parse_value(value):
130
- if type(value) is tuple:
130
+ if isinstance(value, tuple):
131
131
  value, dtype = value
132
132
  else:
133
133
  dtype = ott.get_object_type(value)
134
134
 
135
+ # pylint: disable-next=unidiomatic-typecheck
135
136
  if type(value) is str and len(value) > ott.string.DEFAULT_LENGTH:
136
137
  dtype = ott.string[len(value)]
137
138
 
@@ -213,6 +214,7 @@ def _replace_positive_lag_operator_with_tmp_column(value):
213
214
  )
214
215
  name = f"__{name}_{operation.index}_NEW__"
215
216
  return _Column(name, column.dtype, column.obj_ref, precision=getattr(column, "_precision", None))
217
+ return None
216
218
 
217
219
  op, replace_tuples = value._replace_parameters(fun, return_replace_tuples=True)
218
220
  return op, {str(new): old for old, new in replace_tuples}
@@ -228,7 +230,7 @@ def _update_field(self: 'Source', field, value):
228
230
  if names_mapping:
229
231
  self.add_fields(names_mapping, inplace=True)
230
232
 
231
- if type(value) is tuple:
233
+ if isinstance(value, tuple):
232
234
  # support to be compatible with adding fields to get rid of some strange problems
233
235
  # but really we do not use passed type, because update field does not support it
234
236
  value, _ = value
@@ -327,9 +329,7 @@ def _validate_before_setting(key, value):
327
329
  value = value.item()
328
330
  if not (
329
331
  ott.is_type_supported(ott.get_object_type(value))
330
- or isinstance(value, _Operation)
331
- or type(value) is tuple
332
- or isinstance(value, _ColumnAggregation)
332
+ or isinstance(value, (_Operation, tuple, _ColumnAggregation))
333
333
  ):
334
334
  raise TypeError(f'It is not allowed to set objects of "{type(value)}" type')
335
335
  return value