everysk-lib 1.10.2__cp312-cp312-win_amd64.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.
Files changed (137) hide show
  1. everysk/__init__.py +30 -0
  2. everysk/_version.py +683 -0
  3. everysk/api/__init__.py +61 -0
  4. everysk/api/api_requestor.py +167 -0
  5. everysk/api/api_resources/__init__.py +23 -0
  6. everysk/api/api_resources/api_resource.py +371 -0
  7. everysk/api/api_resources/calculation.py +779 -0
  8. everysk/api/api_resources/custom_index.py +42 -0
  9. everysk/api/api_resources/datastore.py +81 -0
  10. everysk/api/api_resources/file.py +42 -0
  11. everysk/api/api_resources/market_data.py +223 -0
  12. everysk/api/api_resources/parser.py +66 -0
  13. everysk/api/api_resources/portfolio.py +43 -0
  14. everysk/api/api_resources/private_security.py +42 -0
  15. everysk/api/api_resources/report.py +65 -0
  16. everysk/api/api_resources/report_template.py +39 -0
  17. everysk/api/api_resources/tests.py +115 -0
  18. everysk/api/api_resources/worker_execution.py +64 -0
  19. everysk/api/api_resources/workflow.py +65 -0
  20. everysk/api/api_resources/workflow_execution.py +93 -0
  21. everysk/api/api_resources/workspace.py +42 -0
  22. everysk/api/http_client.py +63 -0
  23. everysk/api/tests.py +32 -0
  24. everysk/api/utils.py +262 -0
  25. everysk/config.py +451 -0
  26. everysk/core/_tests/serialize/test_json.py +336 -0
  27. everysk/core/_tests/serialize/test_orjson.py +295 -0
  28. everysk/core/_tests/serialize/test_pickle.py +48 -0
  29. everysk/core/cloud_function/main.py +78 -0
  30. everysk/core/cloud_function/tests.py +86 -0
  31. everysk/core/compress.py +245 -0
  32. everysk/core/datetime/__init__.py +12 -0
  33. everysk/core/datetime/calendar.py +144 -0
  34. everysk/core/datetime/date.py +424 -0
  35. everysk/core/datetime/date_expression.py +299 -0
  36. everysk/core/datetime/date_mixin.py +1475 -0
  37. everysk/core/datetime/date_settings.py +30 -0
  38. everysk/core/datetime/datetime.py +713 -0
  39. everysk/core/exceptions.py +435 -0
  40. everysk/core/fields.py +1176 -0
  41. everysk/core/firestore.py +555 -0
  42. everysk/core/fixtures/_settings.py +29 -0
  43. everysk/core/fixtures/other/_settings.py +18 -0
  44. everysk/core/fixtures/user_agents.json +88 -0
  45. everysk/core/http.py +691 -0
  46. everysk/core/lists.py +92 -0
  47. everysk/core/log.py +709 -0
  48. everysk/core/number.py +37 -0
  49. everysk/core/object.py +1469 -0
  50. everysk/core/redis.py +1021 -0
  51. everysk/core/retry.py +51 -0
  52. everysk/core/serialize.py +674 -0
  53. everysk/core/sftp.py +414 -0
  54. everysk/core/signing.py +53 -0
  55. everysk/core/slack.py +127 -0
  56. everysk/core/string.py +199 -0
  57. everysk/core/tests.py +240 -0
  58. everysk/core/threads.py +199 -0
  59. everysk/core/undefined.py +70 -0
  60. everysk/core/unittests.py +73 -0
  61. everysk/core/workers.py +241 -0
  62. everysk/sdk/__init__.py +23 -0
  63. everysk/sdk/base.py +98 -0
  64. everysk/sdk/brutils/cnpj.py +391 -0
  65. everysk/sdk/brutils/cnpj_pd.py +129 -0
  66. everysk/sdk/engines/__init__.py +26 -0
  67. everysk/sdk/engines/cache.py +185 -0
  68. everysk/sdk/engines/compliance.py +37 -0
  69. everysk/sdk/engines/cryptography.py +69 -0
  70. everysk/sdk/engines/expression.cp312-win_amd64.pyd +0 -0
  71. everysk/sdk/engines/expression.pyi +55 -0
  72. everysk/sdk/engines/helpers.cp312-win_amd64.pyd +0 -0
  73. everysk/sdk/engines/helpers.pyi +26 -0
  74. everysk/sdk/engines/lock.py +120 -0
  75. everysk/sdk/engines/market_data.py +244 -0
  76. everysk/sdk/engines/settings.py +19 -0
  77. everysk/sdk/entities/__init__.py +23 -0
  78. everysk/sdk/entities/base.py +784 -0
  79. everysk/sdk/entities/base_list.py +131 -0
  80. everysk/sdk/entities/custom_index/base.py +209 -0
  81. everysk/sdk/entities/custom_index/settings.py +29 -0
  82. everysk/sdk/entities/datastore/base.py +160 -0
  83. everysk/sdk/entities/datastore/settings.py +17 -0
  84. everysk/sdk/entities/fields.py +375 -0
  85. everysk/sdk/entities/file/base.py +215 -0
  86. everysk/sdk/entities/file/settings.py +63 -0
  87. everysk/sdk/entities/portfolio/base.py +248 -0
  88. everysk/sdk/entities/portfolio/securities.py +241 -0
  89. everysk/sdk/entities/portfolio/security.py +580 -0
  90. everysk/sdk/entities/portfolio/settings.py +97 -0
  91. everysk/sdk/entities/private_security/base.py +226 -0
  92. everysk/sdk/entities/private_security/settings.py +17 -0
  93. everysk/sdk/entities/query.py +603 -0
  94. everysk/sdk/entities/report/base.py +214 -0
  95. everysk/sdk/entities/report/settings.py +23 -0
  96. everysk/sdk/entities/script.py +310 -0
  97. everysk/sdk/entities/secrets/base.py +128 -0
  98. everysk/sdk/entities/secrets/script.py +119 -0
  99. everysk/sdk/entities/secrets/settings.py +17 -0
  100. everysk/sdk/entities/settings.py +48 -0
  101. everysk/sdk/entities/tags.py +174 -0
  102. everysk/sdk/entities/worker_execution/base.py +307 -0
  103. everysk/sdk/entities/worker_execution/settings.py +63 -0
  104. everysk/sdk/entities/workflow_execution/base.py +113 -0
  105. everysk/sdk/entities/workflow_execution/settings.py +32 -0
  106. everysk/sdk/entities/workspace/base.py +99 -0
  107. everysk/sdk/entities/workspace/settings.py +27 -0
  108. everysk/sdk/settings.py +67 -0
  109. everysk/sdk/tests.py +105 -0
  110. everysk/sdk/worker_base.py +47 -0
  111. everysk/server/__init__.py +9 -0
  112. everysk/server/applications.py +63 -0
  113. everysk/server/endpoints.py +516 -0
  114. everysk/server/example_api.py +69 -0
  115. everysk/server/middlewares.py +80 -0
  116. everysk/server/requests.py +62 -0
  117. everysk/server/responses.py +119 -0
  118. everysk/server/routing.py +64 -0
  119. everysk/server/settings.py +36 -0
  120. everysk/server/tests.py +36 -0
  121. everysk/settings.py +98 -0
  122. everysk/sql/__init__.py +9 -0
  123. everysk/sql/connection.py +232 -0
  124. everysk/sql/model.py +376 -0
  125. everysk/sql/query.py +417 -0
  126. everysk/sql/row_factory.py +63 -0
  127. everysk/sql/settings.py +49 -0
  128. everysk/sql/utils.py +129 -0
  129. everysk/tests.py +23 -0
  130. everysk/utils.py +81 -0
  131. everysk/version.py +15 -0
  132. everysk_lib-1.10.2.dist-info/.gitignore +5 -0
  133. everysk_lib-1.10.2.dist-info/METADATA +326 -0
  134. everysk_lib-1.10.2.dist-info/RECORD +137 -0
  135. everysk_lib-1.10.2.dist-info/WHEEL +5 -0
  136. everysk_lib-1.10.2.dist-info/licenses/LICENSE.txt +9 -0
  137. everysk_lib-1.10.2.dist-info/top_level.txt +2 -0
@@ -0,0 +1,185 @@
1
+ ###############################################################################
2
+ #
3
+ # (C) Copyright 2025 EVERYSK TECHNOLOGIES
4
+ #
5
+ # This is an unpublished work containing confidential and proprietary
6
+ # information of EVERYSK TECHNOLOGIES. Disclosure, use, or reproduction
7
+ # without authorization of EVERYSK TECHNOLOGIES is prohibited.
8
+ #
9
+ ###############################################################################
10
+ from typing import Any, Iterable
11
+
12
+ from everysk.config import settings
13
+ from everysk.core.fields import IntField, StrField
14
+ from everysk.sdk.base import BaseSDK
15
+
16
+ ###############################################################################
17
+ # UserCache Class Implementation
18
+ ###############################################################################
19
+ class UserCache(BaseSDK):
20
+
21
+ timeout_default = IntField(default=settings.ENGINES_CACHE_EXECUTION_EXPIRATION_TIME, max=settings.ENGINES_CACHE_EXECUTION_EXPIRATION_TIME)
22
+ prefix = StrField()
23
+
24
+ def _validate_timeout(self, timeout: int) -> None:
25
+ """
26
+ Validate the timeout value for cache operations.
27
+
28
+ Args:
29
+ timeout (int): The timeout value to validate.
30
+
31
+ Raises:
32
+ ValueError: If the timeout value is not a positive integer or exceeds the default expiration time.
33
+ """
34
+ if not isinstance(timeout, int) or timeout <= 0 or timeout > settings.ENGINES_CACHE_EXECUTION_EXPIRATION_TIME:
35
+ raise ValueError('Invalid timeout value. The timeout value should be an integer greater than 0 and less than or equal to the default expiration time.')
36
+
37
+ def get(self, key: str) -> Any:
38
+ """
39
+ Get the value of a key from the cache.
40
+
41
+ Args:
42
+ key (str): The key to get the value of.
43
+
44
+ Returns:
45
+ Any: The value of the key.
46
+
47
+ Example:
48
+ >>> cache = UserCache()
49
+ >>> cache.get('key')
50
+ """
51
+ return self.get_response(self_obj=self, params={'key': key})
52
+
53
+ def get_multi(self, keys: list[str]) -> dict[str, Any]:
54
+ """
55
+ Get the values of multiple keys from the cache.
56
+
57
+ Args:
58
+ keys (list[str]): The keys to get the values of.
59
+
60
+ Returns:
61
+ dict[str, Any]: The values of the keys.
62
+
63
+ Example:
64
+ >>> cache = UserCache()
65
+ >>> cache.get_multi(['key1', 'key2'])
66
+ {
67
+ 'key1': 'value1',
68
+ 'key2': 'value2'
69
+ }
70
+ """
71
+ return self.get_response(self_obj=self, params={'keys': keys})
72
+
73
+ def set(self, key: str, value: Any, timeout: int = settings.ENGINES_CACHE_EXECUTION_EXPIRATION_TIME) -> bool:
74
+ """
75
+ Set the value of a key in the cache.
76
+
77
+ Args:
78
+ key (str): The key to set the value of.
79
+ value (Any): The value to set.
80
+ timeout (int): The expiration time of the key in seconds.
81
+
82
+ Returns:
83
+ bool: True if the key is set, False otherwise.
84
+
85
+ Example:
86
+ >>> cache = UserCache()
87
+ >>> cache.set('key', 'value')
88
+ """
89
+ self._validate_timeout(timeout)
90
+ return self.get_response(self_obj=self, params={'key': key, 'value': value, 'timeout': timeout})
91
+
92
+ def set_multi(self, data_dict: dict, timeout: int = settings.ENGINES_CACHE_EXECUTION_EXPIRATION_TIME) -> list:
93
+ """
94
+ Set the values of multiple keys in the cache.
95
+
96
+ Args:
97
+ data_dict (dict): The keys and values to set.
98
+ timeout (int): The expiration time of the keys in seconds.
99
+
100
+ Returns:
101
+ list: The keys that are set.
102
+
103
+ Example:
104
+ >>> cache = UserCache()
105
+ >>> cache.set_multi({'key1': 'value1', 'key2': 'value2'})
106
+ ['key1', 'key2']
107
+ """
108
+ self._validate_timeout(timeout)
109
+ return self.get_response(self_obj=self, params={'data_dict': data_dict, 'timeout': timeout})
110
+
111
+ def incr(self, key: str, delta: int = 1, initial_value: Any = None, timeout: int = settings.ENGINES_CACHE_EXECUTION_EXPIRATION_TIME) -> int:
112
+ """
113
+ Increment the value of a key in the cache.
114
+
115
+ Args:
116
+ key (str): The key to increment the value of.
117
+ delta (int): The amount to increment the value by.
118
+ initial_value (Any): The initial value of the key.
119
+ timeout (int): The expiration time of the key in seconds.
120
+
121
+ Returns:
122
+ int: The new value of the key.
123
+
124
+ Example:
125
+ >>> cache = UserCache()
126
+ >>> cache.incr('key', 1, 0)
127
+ 1
128
+ """
129
+ self._validate_timeout(timeout)
130
+ return self.get_response(self_obj=self, params={'key': key, 'delta': delta, 'initial_value': initial_value, 'timeout': timeout})
131
+
132
+ def decr(self, key: str, delta: int = 1, initial_value: Any = None, timeout: int = settings.ENGINES_CACHE_EXECUTION_EXPIRATION_TIME) -> int | None:
133
+ """
134
+ Decrement the value of a key in the cache.
135
+
136
+ Args:
137
+ key (str): The key to decrement the value of.
138
+ delta (int): The amount to decrement the value by.
139
+ initial_value (Any): The initial value of the key.
140
+ timeout (int): The expiration time of the key in seconds.
141
+
142
+ Returns:
143
+ int: The new value of the key.
144
+
145
+ Example:
146
+ >>> cache = UserCache()
147
+ >>> cache.decr('key', 1, 0)
148
+ 0
149
+ """
150
+ self._validate_timeout(timeout)
151
+ return self.get_response(self_obj=self, params={'key': key, 'delta': delta, 'initial_value': initial_value, 'timeout': timeout})
152
+
153
+ def delete(self, key: bytes | str | Iterable) -> bool:
154
+ """
155
+ Delete a key from the cache.
156
+
157
+ Args:
158
+ key (bytes | str | Iterable): The key to delete. Can be a single key or an iterable of keys.
159
+
160
+ Returns:
161
+ bool: True if the key is deleted, False otherwise.
162
+
163
+ Example:
164
+ >>> cache = UserCache()
165
+ >>> cache.delete('key')
166
+ True
167
+ """
168
+ return self.get_response(self_obj=self, params={'key': key})
169
+
170
+ def delete_multi(self, keys: Iterable) -> bool:
171
+ """
172
+ Delete multiple keys from the cache.
173
+
174
+ Args:
175
+ keys (Iterable): The keys to delete. Can be a list or any iterable of keys.
176
+
177
+ Returns:
178
+ bool: True if the keys are deleted, False otherwise.
179
+
180
+ Example:
181
+ >>> cache = UserCache()
182
+ >>> cache.delete_multi(['key1', 'key2'])
183
+ True
184
+ """
185
+ return self.get_response(self_obj=self, params={'keys': keys})
@@ -0,0 +1,37 @@
1
+ ###############################################################################
2
+ #
3
+ # (C) Copyright 2025 EVERYSK TECHNOLOGIES
4
+ #
5
+ # This is an unpublished work containing confidential and proprietary
6
+ # information of EVERYSK TECHNOLOGIES. Disclosure, use, or reproduction
7
+ # without authorization of EVERYSK TECHNOLOGIES is prohibited.
8
+ #
9
+ ###############################################################################
10
+ from everysk.sdk.base import BaseSDK
11
+
12
+
13
+ ###############################################################################
14
+ # Compliance Class Implementation
15
+ ###############################################################################
16
+ class Compliance(BaseSDK):
17
+
18
+ @classmethod
19
+ def check(cls, rules: list, datastore: list, metadata: dict = None) -> dict:
20
+ """
21
+ Check compliance of data against rules.
22
+
23
+ Args:
24
+ rules (list): The rules to check against.
25
+ datastore (list): The data to check.
26
+ metadata (dict, optional): The metadata to use for checking. Default is None.
27
+
28
+ Returns:
29
+ dict: The compliance check result.
30
+
31
+ Example:
32
+ >>> Compliance.check(rules=[{'rule': 'rule1'}, {'rule': 'rule2'}], datastore=[{'data': 'data1'}, {'data': 'data2'}])
33
+ {
34
+ 'compliance': True
35
+ }
36
+ """
37
+ return cls.get_response(params={'rules': rules, 'datastore': datastore, 'metadata': metadata})
@@ -0,0 +1,69 @@
1
+ ###############################################################################
2
+ #
3
+ # (C) Copyright 2023 EVERYSK TECHNOLOGIES
4
+ #
5
+ # This is an unpublished work containing confidential and proprietary
6
+ # information of EVERYSK TECHNOLOGIES. Disclosure, use, or reproduction
7
+ # without authorization of EVERYSK TECHNOLOGIES is prohibited.
8
+ #
9
+ ###############################################################################
10
+ import string
11
+ import secrets
12
+ import uuid
13
+
14
+ from everysk.config import settings
15
+
16
+
17
+ ALPHANUMERIC = string.ascii_letters + string.digits
18
+ SYMBOL_ID_MAX_LEN = settings.SYMBOL_ID_MAX_LEN
19
+
20
+
21
+ ###############################################################################
22
+ # Public Functions Implementation
23
+ ###############################################################################
24
+ def generate_random_id(length: int, characters: str = ALPHANUMERIC) -> str:
25
+ """
26
+ Generate a random ID based on the specified length and characters.
27
+
28
+ Args:
29
+ length (int): The desired length for the random ID.
30
+ characters (str, optional): The characters to use for generating the ID.
31
+ Default is alphanumeric characters.
32
+
33
+ Returns:
34
+ str: The generated random ID consisting of the specified characters.
35
+
36
+ Example:
37
+ >>> generate_random_id(18)
38
+ 'xiXwQuig6cI11ny095'
39
+
40
+ >>> generate_random_id(5, 'abc')
41
+ 'cbacb'
42
+ """
43
+ return ''.join(secrets.choice(characters) for i in range(length))
44
+
45
+ def generate_unique_id():
46
+ """
47
+ Generate a unique ID with fixed length (32 characters).
48
+
49
+ Returns:
50
+ str: The generated unique ID consisting of hexadecimal characters.
51
+
52
+ Example:
53
+ >>> generate_unique_id()
54
+ 'dbdc803042ff48e19a344ad080a102dd'
55
+ """
56
+ return uuid.uuid4().hex
57
+
58
+ def generate_short_random_id() -> str:
59
+ """
60
+ Generate a random ID with a fixed length of 8 characters.
61
+
62
+ Returns:
63
+ str: The generated unique ID consisting of alphanumeric characters.
64
+
65
+ Example:
66
+ >>> generate_short_random_id()
67
+ 'u0tmNqHP'
68
+ """
69
+ return generate_random_id(length=settings.SIMPLE_UNIQUE_ID_LENGTH)
@@ -0,0 +1,55 @@
1
+ # This file was generated by Nuitka
2
+
3
+ # Stubs included by default
4
+ from __future__ import annotations
5
+ from everysk.sdk.engines.expression.base import ExpressionEngine
6
+
7
+
8
+ __name__ = ...
9
+
10
+
11
+
12
+ # Modules used internally, to allow implicit dependencies to be seen:
13
+ import os
14
+ import everysk
15
+ import everysk.sdk
16
+ import everysk.sdk.engines
17
+ import typing
18
+ import lark
19
+ import lark.tree
20
+ import everysk.config
21
+ import everysk.core
22
+ import everysk.core.log
23
+ import _frozen_importlib_external
24
+ import functools
25
+ import importlib
26
+ import inspect
27
+ import pkgutil
28
+ import collections
29
+ import collections.abc
30
+ import numpy
31
+ import pandas
32
+ import everysk.core.datetime
33
+ import everysk.core.datetime.Date
34
+ import everysk.core.datetime.DateTime
35
+ import everysk.core.datetime.date_settings
36
+ import everysk.sdk.engines.helpers
37
+ import everysk.sdk.engines.helpers.transform
38
+ import datetime
39
+ import everysk.core.datetime.date_mixin
40
+ import everysk.sdk.engines.helpers.algorithms
41
+ import everysk.sdk.engines.helpers.mathematical
42
+ import collections.OrderedDict
43
+ import everysk.sdk.brutils
44
+ import everysk.sdk.brutils.cnpj
45
+ import everysk.sdk.engines.helpers.formater
46
+ import re
47
+ import unicodedata
48
+ import everysk.sdk.engines.cryptography
49
+ import unittest
50
+ import copy
51
+ import unittest.mock
52
+ import everysk.core.datetime.calendar
53
+ import lark.visitors
54
+ import decimal
55
+ import lark.exceptions
@@ -0,0 +1,26 @@
1
+ # This file was generated by Nuitka
2
+
3
+ # Stubs included by default
4
+ from __future__ import annotations
5
+
6
+
7
+ __name__ = ...
8
+
9
+
10
+
11
+ # Modules used internally, to allow implicit dependencies to be seen:
12
+ import os
13
+ import pandas
14
+ import numpy
15
+ import math
16
+ import decimal
17
+ import everysk
18
+ import everysk.core
19
+ import everysk.core.datetime
20
+ import everysk.core.datetime.DateTime
21
+ import everysk.sdk
22
+ import everysk.sdk.engines
23
+ import functools
24
+ import typing
25
+ import _frozen_importlib_external
26
+ import unittest
@@ -0,0 +1,120 @@
1
+ ###############################################################################
2
+ #
3
+ # (C) Copyright 2025 EVERYSK TECHNOLOGIES
4
+ #
5
+ # This is an unpublished work containing confidential and proprietary
6
+ # information of EVERYSK TECHNOLOGIES. Disclosure, use, or reproduction
7
+ # without authorization of EVERYSK TECHNOLOGIES is prohibited.
8
+ #
9
+ ###############################################################################
10
+ from uuid import uuid1
11
+
12
+ from everysk.config import settings
13
+ from everysk.core.fields import StrField, FloatField, BoolField
14
+ from everysk.core.exceptions import InvalidArgumentError
15
+ from everysk.sdk.base import BaseSDK
16
+
17
+ ###############################################################################
18
+ # UserLock Class Implementation
19
+ ###############################################################################
20
+ class UserLock(BaseSDK):
21
+ """
22
+ UserLock class for acquiring and releasing locks.
23
+ This class provides methods to acquire a lock for a given token, release the lock,
24
+ and get information about the lock status.
25
+ It is used to manage locks in a distributed system to
26
+ prevent multiple processes from accessing the same resource simultaneously.
27
+
28
+ Attributes:
29
+ token (str): The unique identifier for the lock.
30
+ name (str): The name of the lock.
31
+ timeout (int): The expiration time for the lock in seconds.
32
+
33
+ Example:
34
+ >>> user_lock = UserLock(name='my_lock')
35
+ >>> user_lock.acquire()
36
+ UserLock(token='generated_token', name='my_lock', timeout=30)
37
+ >>> user_lock.get_lock_info()
38
+ {'locked': True, 'name': 'my_lock'}
39
+ >>> user_lock.release()
40
+ None
41
+ """
42
+ token = StrField(default=None)
43
+ name = StrField(default=None, required=True)
44
+ timeout = FloatField(default=settings.USER_CACHE_LOCK_EXPIRATION_TIME, min_size=settings.USER_CACHE_LOCK_MIN_EXPIRATION_TIME, max_size=settings.USER_CACHE_LOCK_MAX_EXPIRATION_TIME)
45
+ blocking = BoolField(default=True) # If True, the lock will block until it can be acquired.
46
+
47
+ def acquire(self, token: str = None, blocking: bool = None, blocking_timeout: float = None) -> bool:
48
+ """
49
+ Acquire a lock for a given token.
50
+
51
+ Args:
52
+ token (str | None): The token to use for the lock. If None, a new token will be generated.
53
+ blocking (bool | None): If True, wait until the lock is acquired. Defaults to None.
54
+ blocking_timeout (float | None): The maximum number of seconds to wait for the lock. Defaults to None.
55
+
56
+ Returns:
57
+ bool: True if the lock was acquired successfully, False otherwise.
58
+
59
+ Example:
60
+ >>> user_lock = UserLock(name='my_lock')
61
+ >>> user_lock.acquire()
62
+ True
63
+ """
64
+ if not token and not self.token:
65
+ self.token = uuid1().hex
66
+ elif token:
67
+ self.token = token
68
+
69
+ return self.get_response(self_obj=self, params={'token': token, 'blocking': blocking, 'blocking_timeout': blocking_timeout})
70
+
71
+
72
+ def release(self, force: bool = False) -> None:
73
+ """
74
+ Release the lock for a given identifier.
75
+
76
+ Args:
77
+ force (bool): If True, force the release of the lock even if it is not owned.
78
+ This will delete the key from Redis. Defaults to False.
79
+
80
+ Example:
81
+ >>> UserLock.release('my_lock')
82
+ None
83
+ """
84
+ if not self.token:
85
+ raise InvalidArgumentError("Cannot release an unlocked lock")
86
+
87
+ return self.get_response(self_obj=self, params={'force': force})
88
+
89
+ def do_release(self, expected_token: str) -> None:
90
+ """
91
+ Release the lock for a given token.
92
+ This method is used to release a lock that was previously acquired.
93
+
94
+ Args:
95
+ expected_token (str): The unique token for the lock to release.
96
+
97
+ Example:
98
+ >>> user_lock = UserLock(name='my_lock')
99
+ >>> user_lock.do_release(token='token')
100
+ None
101
+ """
102
+ if not expected_token:
103
+ raise InvalidArgumentError("Cannot release an unlocked lock")
104
+
105
+ return self.get_response(self_obj=self, params={'expected_token': expected_token})
106
+
107
+ def get_lock_info(self) -> dict:
108
+ """
109
+ Get information about the lock status.
110
+ This method returns a dictionary containing information about the lock status.
111
+
112
+ Returns:
113
+ dict: A dictionary containing the lock status and other information.
114
+
115
+ Example:
116
+ >>> user_lock = UserLock(name='my_lock')
117
+ >>> user_lock.get_lock_info()
118
+ {'locked': True, 'name': 'my_lock'}
119
+ """
120
+ return self.get_response(self_obj=self)