onetick-py 1.179.0__py3-none-any.whl → 1.180.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
onetick/py/_version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.179.0'
2
+ VERSION = '1.180.0'
@@ -859,3 +859,9 @@ def is_not_fixed_bds_484():
859
859
  # BDS-484: seems like timezone is ignored in otq.run in some cases
860
860
  return _is_min_build_or_version(None, None,
861
861
  20251010120000, min_update_number=2)
862
+
863
+
864
+ def is_webapi_access_token_scope_supported():
865
+ # 20251030: Fixed OTDEV-37063: onetick.query_webapi.get_access_token method must take scope as a parameter
866
+ return _is_min_build_or_version(None, None,
867
+ 20251010120000, min_update_number=2)
@@ -644,6 +644,13 @@ class Config:
644
644
  env_var_name='OTP_ACCESS_TOKEN_URL',
645
645
  )
646
646
 
647
+ access_token_scope = OtpProperty(
648
+ description='Scope for obtaining SSO access token.',
649
+ base_default=None,
650
+ allowed_types=str,
651
+ env_var_name='OTP_ACCESS_TOKEN_SCOPE',
652
+ )
653
+
647
654
  trusted_certificates_file = OtpProperty(
648
655
  description='Either a boolean, in which case it controls whether we verify the server TLS certificate '
649
656
  'or a string with the path to the file with list of '
@@ -8,6 +8,7 @@ from onetick.py.compatibility import is_existing_fields_handling_supported
8
8
  from onetick.py.core._internal._state_objects import _StateColumn
9
9
  from onetick.py.core.column import _Column, _ColumnAggregation, _LagOperator
10
10
  from onetick.py.core.column_operations._methods.methods import is_arithmetical, is_compare
11
+ from onetick.py.core.column_operations._methods.op_types import are_ints_not_time
11
12
  from onetick.py.core.column_operations.base import _Operation
12
13
  from onetick.py.core.cut_builder import _BaseCutBuilder
13
14
  from onetick.py.core.lambda_object import _LambdaIfElse
@@ -280,6 +281,13 @@ def _update_field(self: 'Source', field, value):
280
281
  elif issubclass(field.dtype, str) and base_type is int:
281
282
  type_changes = True
282
283
  convert_to_type = int
284
+ elif (
285
+ are_ints_not_time(field.dtype, value_dtype) and
286
+ not issubclass(field.dtype, bool) and not issubclass(value_dtype, bool) and
287
+ value_dtype is not field.dtype
288
+ ):
289
+ # case for converting values between int based types, like long or byte
290
+ convert_to_type = value_dtype
283
291
  else:
284
292
  if issubclass(value_dtype, bool):
285
293
  value_dtype = float
@@ -259,16 +259,27 @@ def write(
259
259
  raise ValueError('LOAD out_of_range_tick_action cannot be used with start_date+end_date, use date instead')
260
260
  elif out_of_range_tick_action.upper() == 'EXCEPTION':
261
261
  if start_date and end_date:
262
+ end = end_date + otp.Day(1) # end_date is inclusive
263
+
262
264
  # WRITE_TO_ONETICK_DB use DAY_BOUNDARY_TZ and DAY_BOUNDARY_OFFSET
263
265
  # to check tick timestamp is out of range or not
264
266
  # so we mimic it here with THROW event processor
265
- src = otp.Source(otq.DbShowConfig(str(db), 'DB_TIME_INTERVALS'))
267
+ src = otp.Source(otq.DbShowConfig(str(db), 'DB_TIME_INTERVALS'), schema={
268
+ 'DAY_BOUNDARY_TZ': int, 'DAY_BOUNDARY_OFFSET': int, 'START_DATE': int, 'END_DATE': int,
269
+ })
270
+
271
+ # Filter not relevant locator time intervals
272
+ src, _ = src[
273
+ (src['START_DATE'].astype(otp.msectime) <= otp.dt(start_date).to_operation()) &
274
+ (src['END_DATE'].astype(otp.msectime) > otp.dt(end).to_operation())
275
+ ]
266
276
  src.table(inplace=True, DAY_BOUNDARY_TZ=str, DAY_BOUNDARY_OFFSET=int)
267
277
  # DAY_BOUNDARY_OFFSET offset are in seconds
268
278
  src['DAY_BOUNDARY_OFFSET'] = src['DAY_BOUNDARY_OFFSET'] * 1000
269
279
  src.rename(
270
280
  {'DAY_BOUNDARY_TZ': '__DAY_BOUNDARY_TZ', 'DAY_BOUNDARY_OFFSET': '__DAY_BOUNDARY_OFFSET'}, inplace=True
271
281
  )
282
+
272
283
  self = self.join_with_query(src, symbol=f"{str(db)}::DUMMY", caching='per_symbol')
273
284
  timezone = self['__DAY_BOUNDARY_TZ']
274
285
  offset = self['__DAY_BOUNDARY_OFFSET']
@@ -288,7 +299,6 @@ def write(
288
299
  inplace=True,
289
300
  )
290
301
 
291
- end = end_date + otp.Day(1) # end_date is inclusive
292
302
  end_formatted = end.strftime('%Y-%m-%d')
293
303
  end_op = otp.dt(end).to_operation(timezone=timezone) + offset
294
304
  self.throw(
onetick/py/otq.py CHANGED
@@ -58,7 +58,10 @@ elif otp.__webapi__:
58
58
 
59
59
  def run(*args, **kwargs):
60
60
  from onetick.py import config # noqa
61
- from onetick.py.compatibility import is_max_concurrency_with_webapi_supported
61
+ from onetick.py.compatibility import (
62
+ is_max_concurrency_with_webapi_supported,
63
+ is_webapi_access_token_scope_supported
64
+ )
62
65
 
63
66
  if not config.http_address and 'http_address' not in kwargs:
64
67
  raise ValueError('otp.run() http_address keyword param, '
@@ -149,7 +152,20 @@ elif otp.__webapi__:
149
152
  if not param_value:
150
153
  raise ValueError(f'`access_token_url` parameter set, however `{param_name}` parameter missing.')
151
154
 
152
- kwargs['access_token'] = otq.get_access_token(access_token_url, client_id, client_secret)
155
+ token_kwargs = {}
156
+
157
+ if 'scope' in kwargs:
158
+ scope = kwargs.pop('scope')
159
+ else:
160
+ scope = config.access_token_scope
161
+
162
+ if scope:
163
+ if not is_webapi_access_token_scope_supported():
164
+ raise RuntimeError('Parameter `scope` is not supported on used version of OneTick')
165
+
166
+ token_kwargs['scope'] = scope
167
+
168
+ kwargs['access_token'] = otq.get_access_token(access_token_url, client_id, client_secret, **token_kwargs)
153
169
 
154
170
  if 'access_token_url' in kwargs:
155
171
  del kwargs['access_token_url']
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onetick-py
3
- Version: 1.179.0
3
+ Version: 1.180.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
@@ -13,17 +13,17 @@ onetick/lib/__init__.py,sha256=Rp7CIDoA4E6LIm1f2mNvl_5b_n-0U3suA3FmBXbmKoU,114
13
13
  onetick/lib/instance.py,sha256=3FJB8PWs2ap-EGb6DzsnLRL2meTMUViTdy343m6tHvM,4825
14
14
  onetick/py/__init__.py,sha256=JVXbKakzScRnwpJVEkerJkX-UAX7Surdp4PCImvvieA,11183
15
15
  onetick/py/_stack_info.py,sha256=PHZOkW_fK7Fbl4YEj5CaYK9L6vh4j-bUU7_cSYOWZ30,2546
16
- onetick/py/_version.py,sha256=NIQ4soDVt1sFWTMrIBFgdv_DSfBeoHRI7JLquEtfnD4,76
16
+ onetick/py/_version.py,sha256=8n3ad__RjM8-XMyjhawmGAHuiKRoMCK49_dkHY8-P9k,76
17
17
  onetick/py/backports.py,sha256=mR00mxe7E7UgBljf-Wa93Mo6lpi-C4Op561uhPUoEt8,815
18
18
  onetick/py/cache.py,sha256=BBZg8n0AGjZzZapg4752LkSZdX5C6DGf7vU9sAStv6A,12798
19
- onetick/py/compatibility.py,sha256=FuFLY1XAaYU9E8g0nj9hbBAv7euY4IaZd9W5BWDC9FU,34250
20
- onetick/py/configuration.py,sha256=KCX44v_nEOZDvo-rItIrNVKKvqyM73QUwIivez2VHvY,28448
19
+ onetick/py/compatibility.py,sha256=rBLoszCoSZrl9SnBYiPzWuoudZwhOP6d4exshy3BJTw,34530
20
+ onetick/py/configuration.py,sha256=wOmGBaaT89uz6Eny3Pp_tFpATto-qZXcqNRyy4rzmQw,28655
21
21
  onetick/py/functions.py,sha256=Kqromia64o1K4fgbLbijw64o5pFGBZRog52824wOxlA,98004
22
22
  onetick/py/license.py,sha256=50dsFrE-NKsPOdkAoyxHr44bH8DzFCr_6TabX0JH6tQ,6140
23
23
  onetick/py/log.py,sha256=Els2drZcVjJrD6kvbwgFGEpg6jAacoUEtyN6rCaauuk,2723
24
24
  onetick/py/math.py,sha256=MZvlyUjxOWGJvmxK8pfMkCr4THM52AE6NyGEidgDMyE,26311
25
25
  onetick/py/misc.py,sha256=mD-EJslLGjQ0ROEez76HvOY0tsX8_1bC1QOkyHY9FZ8,13934
26
- onetick/py/otq.py,sha256=VSdCrp3zTzNQHv9gM_xE4Al4ujBsio7uWk3SqU4eC4Y,8271
26
+ onetick/py/otq.py,sha256=TAOFw8e_p0mfTEV92qb_AzHplbv_H71hMwnT3qNmksg,8780
27
27
  onetick/py/pyomd_mock.py,sha256=A7IIUraN9yCsPhvnHXQUZrmwFjlh7vofSnYm4G7bdsc,2006
28
28
  onetick/py/run.py,sha256=Ql-hN0R9GZvxf0ukRUgVpqxk69Dez6T0CA1Cn2Fq1dY,40805
29
29
  onetick/py/servers.py,sha256=h6l0X55kcnpI25bZcYaBpPAAGBZjqk9mt1SQe4xZrh0,6840
@@ -77,7 +77,7 @@ onetick/py/core/_source/source_methods/columns.py,sha256=JJNr0Wqf8B9igLVoCNtFeNE
77
77
  onetick/py/core/_source/source_methods/data_quality.py,sha256=iz8e-60se-rNH72k5fRxX3cm3ahfbBZ7R7E46Be5zhs,9343
78
78
  onetick/py/core/_source/source_methods/debugs.py,sha256=Hq08HYjF2sEZQAcBlwNMVKpu0muCWNIYEhmPqbKkSZw,10176
79
79
  onetick/py/core/_source/source_methods/drops.py,sha256=3ZXfQWXsl0-ZLHdp6D-wTu2saqCYHZ-Gn777aMRSRp0,4403
80
- onetick/py/core/_source/source_methods/fields.py,sha256=6GozvRornClXfEu6oY9-JpN3gOceewB6OJweRR7x2Zw,22740
80
+ onetick/py/core/_source/source_methods/fields.py,sha256=bPCViMBCBHatoC3TUcGyyLT5em2ObUyNKTr4uE3XlmA,23165
81
81
  onetick/py/core/_source/source_methods/filters.py,sha256=WuSnK-tQsP3fL2bqVfMZpbpPgk_LG4L8lrYULSSGoKE,33930
82
82
  onetick/py/core/_source/source_methods/joins.py,sha256=Qq50NfHH46jAfotXEf-lccN47erYBukJgtnP9NhOaok,61637
83
83
  onetick/py/core/_source/source_methods/merges.py,sha256=vhU640pAUklzJh1J_yFZ7O-vFjbmSWg7jHPo0o0NXj8,24486
@@ -88,7 +88,7 @@ onetick/py/core/_source/source_methods/sorts.py,sha256=tDFt3rObNHP-S_HOtDd6SLpgk
88
88
  onetick/py/core/_source/source_methods/switches.py,sha256=pcnfT45QWn87qq1pWkvZbqeEoM7lrq8qNPxM8g9raxs,3846
89
89
  onetick/py/core/_source/source_methods/symbols.py,sha256=MG0dgVVVJ6fD_-GJkkXEgTeAsfS79ymJWmuKSL-0QSs,3968
90
90
  onetick/py/core/_source/source_methods/times.py,sha256=2kbLHG-3RQM6uWmw8pBGDiAz4R83KK46Tp1smTY6SR8,27665
91
- onetick/py/core/_source/source_methods/writes.py,sha256=fPUbiqlm30Kb4QzXZLtWCsQiTFBDxK5oOWuVyfVXbYM,42717
91
+ onetick/py/core/_source/source_methods/writes.py,sha256=Ar57d3Gn9ZOezyd6Gl4QgMEyZRky2NwXh32h1--XQfA,43125
92
92
  onetick/py/core/column_operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  onetick/py/core/column_operations/base.py,sha256=gn-4rz4FMAR2pp-7e9DulKc6L05YAMkGkIiEwzHmYmo,36102
94
94
  onetick/py/core/column_operations/_methods/__init__.py,sha256=_C5hpQG51MingtWW2N8vYzSVFpR314xIrtukBfEfPMk,207
@@ -147,9 +147,9 @@ onetick/py/utils/script.py,sha256=Y8NujEo2_5QaP6KDnLKJiKQ7SmMjw8_dv8sYL9rHDCE,11
147
147
  onetick/py/utils/temp.py,sha256=j-BC155dE46k0zfKTTs26KTF0CK6WA1hO2GD54iunyM,17380
148
148
  onetick/py/utils/types.py,sha256=7u9s9uN1jlkgud8_TSLy6iFzQFBtKJ0v3yamgOVitrs,3747
149
149
  onetick/py/utils/tz.py,sha256=sYUKigaORonp7Xa6x806xVYJ69lYJHd6NrLxQHB5AZo,2878
150
- onetick_py-1.179.0.dist-info/licenses/LICENSE,sha256=Yhu7lKNFS0fsaN-jSattEMRtCOPueP58Eu5BPH8ZGjM,1075
151
- onetick_py-1.179.0.dist-info/METADATA,sha256=BArsneiokQHldh-5zgW4LhXjMI4lCb9ZzCDyYg6ud1s,7290
152
- onetick_py-1.179.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
153
- onetick_py-1.179.0.dist-info/entry_points.txt,sha256=bafJo_C7lPHz5pAdlIryLzxAlJ8F-We5cC7psdwcx4Q,131
154
- onetick_py-1.179.0.dist-info/top_level.txt,sha256=Na1jSJmVMyYGOndaswt554QKIUwQjcYh6th2ATsmw0U,23
155
- onetick_py-1.179.0.dist-info/RECORD,,
150
+ onetick_py-1.180.0.dist-info/licenses/LICENSE,sha256=Yhu7lKNFS0fsaN-jSattEMRtCOPueP58Eu5BPH8ZGjM,1075
151
+ onetick_py-1.180.0.dist-info/METADATA,sha256=zYczc716GKhFld-J6sJWqJoiqRx5b2mYedFYyYUZ1KM,7290
152
+ onetick_py-1.180.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
153
+ onetick_py-1.180.0.dist-info/entry_points.txt,sha256=bafJo_C7lPHz5pAdlIryLzxAlJ8F-We5cC7psdwcx4Q,131
154
+ onetick_py-1.180.0.dist-info/top_level.txt,sha256=Na1jSJmVMyYGOndaswt554QKIUwQjcYh6th2ATsmw0U,23
155
+ onetick_py-1.180.0.dist-info/RECORD,,