everysk-lib 1.9.6__tar.gz → 1.9.8__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 (136) hide show
  1. {everysk_lib-1.9.6/src/everysk_lib.egg-info → everysk_lib-1.9.8}/PKG-INFO +2 -2
  2. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/pyproject.toml +1 -1
  3. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/datetime/datetime.py +83 -19
  4. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/secrets/base.py +4 -1
  5. {everysk_lib-1.9.6 → everysk_lib-1.9.8/src/everysk_lib.egg-info}/PKG-INFO +2 -2
  6. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk_lib.egg-info/requires.txt +1 -1
  7. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/LICENSE.txt +0 -0
  8. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/MANIFEST.in +0 -0
  9. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/README.md +0 -0
  10. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/setup.cfg +0 -0
  11. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/setup.py +0 -0
  12. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/__init__.py +0 -0
  13. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/_version.py +0 -0
  14. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/__init__.py +0 -0
  15. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_requestor.py +0 -0
  16. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/__init__.py +0 -0
  17. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/api_resource.py +0 -0
  18. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/calculation.py +0 -0
  19. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/custom_index.py +0 -0
  20. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/datastore.py +0 -0
  21. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/file.py +0 -0
  22. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/market_data.py +0 -0
  23. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/parser.py +0 -0
  24. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/portfolio.py +0 -0
  25. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/private_security.py +0 -0
  26. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/report.py +0 -0
  27. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/report_template.py +0 -0
  28. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/tests.py +0 -0
  29. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/worker_execution.py +0 -0
  30. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/workflow.py +0 -0
  31. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/workflow_execution.py +0 -0
  32. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/api_resources/workspace.py +0 -0
  33. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/http_client.py +0 -0
  34. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/tests.py +0 -0
  35. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/api/utils.py +0 -0
  36. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/config.py +0 -0
  37. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/_tests/serialize/test_json.py +0 -0
  38. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/_tests/serialize/test_orjson.py +0 -0
  39. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/_tests/serialize/test_pickle.py +0 -0
  40. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/cloud_function/main.py +0 -0
  41. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/cloud_function/tests.py +0 -0
  42. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/compress.py +0 -0
  43. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/datetime/__init__.py +0 -0
  44. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/datetime/calendar.py +0 -0
  45. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/datetime/date.py +0 -0
  46. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/datetime/date_expression.py +0 -0
  47. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/datetime/date_mixin.py +0 -0
  48. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/datetime/date_settings.py +0 -0
  49. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/exceptions.py +0 -0
  50. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/fields.py +0 -0
  51. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/firestore.py +0 -0
  52. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/fixtures/_settings.py +0 -0
  53. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/fixtures/other/_settings.py +0 -0
  54. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/fixtures/user_agents.json +0 -0
  55. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/http.py +0 -0
  56. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/lists.py +0 -0
  57. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/log.py +0 -0
  58. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/number.py +0 -0
  59. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/object.py +0 -0
  60. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/redis.py +0 -0
  61. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/serialize.py +0 -0
  62. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/sftp.py +0 -0
  63. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/signing.py +0 -0
  64. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/slack.py +0 -0
  65. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/string.py +0 -0
  66. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/tests.py +0 -0
  67. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/threads.py +0 -0
  68. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/undefined.py +0 -0
  69. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/unittests.py +0 -0
  70. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/core/workers.py +0 -0
  71. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/__init__.py +0 -0
  72. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/base.py +0 -0
  73. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/engines/__init__.py +0 -0
  74. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/engines/cache.py +0 -0
  75. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/engines/compliance.py +0 -0
  76. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/engines/cryptography.py +0 -0
  77. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/engines/lock.py +0 -0
  78. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/engines/market_data.py +0 -0
  79. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/engines/settings.py +0 -0
  80. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/__init__.py +0 -0
  81. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/base.py +0 -0
  82. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/base_list.py +0 -0
  83. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/custom_index/base.py +0 -0
  84. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/custom_index/settings.py +0 -0
  85. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/datastore/base.py +0 -0
  86. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/datastore/settings.py +0 -0
  87. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/fields.py +0 -0
  88. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/file/base.py +0 -0
  89. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/file/settings.py +0 -0
  90. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/portfolio/base.py +0 -0
  91. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/portfolio/securities.py +0 -0
  92. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/portfolio/security.py +0 -0
  93. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/portfolio/settings.py +0 -0
  94. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/private_security/base.py +0 -0
  95. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/private_security/settings.py +0 -0
  96. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/query.py +0 -0
  97. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/report/base.py +0 -0
  98. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/report/settings.py +0 -0
  99. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/script.py +0 -0
  100. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/secrets/script.py +0 -0
  101. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/secrets/settings.py +0 -0
  102. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/settings.py +0 -0
  103. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/tags.py +0 -0
  104. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/worker_execution/base.py +0 -0
  105. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/worker_execution/settings.py +0 -0
  106. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/workflow_execution/base.py +0 -0
  107. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/workflow_execution/settings.py +0 -0
  108. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/workspace/base.py +0 -0
  109. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/entities/workspace/settings.py +0 -0
  110. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/settings.py +0 -0
  111. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/tests.py +0 -0
  112. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sdk/worker_base.py +0 -0
  113. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/__init__.py +0 -0
  114. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/applications.py +0 -0
  115. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/endpoints.py +0 -0
  116. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/example_api.py +0 -0
  117. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/middlewares.py +0 -0
  118. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/requests.py +0 -0
  119. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/responses.py +0 -0
  120. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/routing.py +0 -0
  121. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/settings.py +0 -0
  122. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/server/tests.py +0 -0
  123. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/settings.py +0 -0
  124. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sql/__init__.py +0 -0
  125. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sql/connection.py +0 -0
  126. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sql/model.py +0 -0
  127. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sql/query.py +0 -0
  128. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sql/settings.py +0 -0
  129. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/sql/utils.py +0 -0
  130. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/tests.py +0 -0
  131. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/utils.py +0 -0
  132. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk/version.py +0 -0
  133. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk_lib.egg-info/.gitignore +0 -0
  134. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk_lib.egg-info/SOURCES.txt +0 -0
  135. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk_lib.egg-info/dependency_links.txt +0 -0
  136. {everysk_lib-1.9.6 → everysk_lib-1.9.8}/src/everysk_lib.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: everysk-lib
3
- Version: 1.9.6
3
+ Version: 1.9.8
4
4
  Summary: Generic lib to share python code on Everysk.
5
5
  License-Expression: LicenseRef-Proprietary
6
6
  Project-URL: Homepage, https://everysk.com/
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3.11
12
12
  Requires-Python: >=3.11
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE.txt
15
- Requires-Dist: python-dateutil<=2.9.0,>=2.8.2
15
+ Requires-Dist: python-dateutil<=3.0.0,>=2.8.2
16
16
  Requires-Dist: holidays==0.51
17
17
  Requires-Dist: tzdata<=2025.2,>=2024.1
18
18
  Provides-Extra: requests
@@ -38,7 +38,7 @@ classifiers = [
38
38
 
39
39
  # These are the assumed default dependencies from pip
40
40
  dependencies = [
41
- "python-dateutil>=2.8.2,<=2.9.0",
41
+ "python-dateutil>=2.8.2,<=3.0.0",
42
42
  "holidays==0.51",
43
43
  "tzdata>=2024.1,<=2025.2",
44
44
  ]
@@ -7,17 +7,27 @@
7
7
  # without authorization of EVERYSK TECHNOLOGIES is prohibited.
8
8
  #
9
9
  ###############################################################################
10
- from datetime import datetime, timezone #pylint: disable=import-self
11
- from typing import Any, Union, Self
10
+ from datetime import datetime, timezone # pylint: disable=import-self
11
+ from typing import Any, Self
12
12
  from zoneinfo import ZoneInfo
13
13
 
14
- from everysk.core.datetime.date_mixin import DateMixin
15
14
  from everysk.core.datetime import date_settings
15
+ from everysk.core.datetime.date_mixin import DateMixin
16
16
 
17
17
 
18
- class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
19
-
20
- def __new__(cls, year: int, month: int = None, day: int = None, hour: int = 0, minute: int = 0, second: int = 0, microsecond: int = 0, tzinfo: ZoneInfo = None, fold: int = 0) -> Self:
18
+ class DateTime(DateMixin, datetime): # pylint: disable=inherit-non-class
19
+ def __new__(
20
+ cls,
21
+ year: int,
22
+ month: int = None,
23
+ day: int = None,
24
+ hour: int = 0,
25
+ minute: int = 0,
26
+ second: int = 0,
27
+ microsecond: int = 0,
28
+ tzinfo: ZoneInfo = None,
29
+ fold: int = 0,
30
+ ) -> Self:
21
31
  """
22
32
  Create a new DateTime object.
23
33
 
@@ -46,10 +56,17 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
46
56
  See Also:
47
57
  [Python Documentation](https://docs.python.org/3/library/datetime.html#datetime.datetime.fold)
48
58
  """
49
- # We check for tzinfo to enforce the UTC if empty
50
- if not tzinfo:
59
+ # We check for tzinfo to enforce the UTC if it is not provided
60
+ # This is useful for all methods that do not provide tzinfo except replace - see below
61
+ if tzinfo is None:
51
62
  tzinfo = ZoneInfo('UTC')
52
63
 
64
+ # https://everysk.atlassian.net/browse/COD-13539
65
+ # None is a valid tzinfo used to remove it, only use the replace method so we exchange it for Undefined.
66
+ # See replace method at the bottom of this file.
67
+ if tzinfo is Undefined:
68
+ tzinfo = None
69
+
53
70
  args = (year, month, day, hour, minute, second, microsecond)
54
71
  kwargs = {'tzinfo': tzinfo, 'fold': fold}
55
72
  # To keep the pickle support we need to check the year param
@@ -87,9 +104,20 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
87
104
  DateTime(2023, 9, 15, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='UTC'))
88
105
  """
89
106
  try:
90
- value = cls(value.year, value.month, value.day, value.hour, value.minute, value.second, value.microsecond, value.tzinfo)
107
+ value = cls(
108
+ value.year,
109
+ value.month,
110
+ value.day,
111
+ value.hour,
112
+ value.minute,
113
+ value.second,
114
+ value.microsecond,
115
+ value.tzinfo,
116
+ )
91
117
  except AttributeError as error:
92
- raise ValueError(f"Invalid instantiation of class '{cls.__name__}' from '{value.__class__.__name__}'") from error
118
+ raise ValueError(
119
+ f"Invalid instantiation of class '{cls.__name__}' from '{value.__class__.__name__}'"
120
+ ) from error
93
121
 
94
122
  return value
95
123
 
@@ -237,7 +265,7 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
237
265
  # 2023-08-08T21:29:54.5713046Z -> This is from Refinitiv
238
266
  if '.' in date_string:
239
267
  # We need to get all numbers after the '.'
240
- milliseconds = date_string[date_string.index('.') + 1:-1]
268
+ milliseconds = date_string[date_string.index('.') + 1 : -1]
241
269
 
242
270
  # Then we need to transform to be 6 length exact
243
271
  # rjust will put 0 to the right until reach 6 in size
@@ -311,13 +339,15 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
311
339
  elif force_time == 'LAST_MINUTE':
312
340
  hour, minute, second, microsecond = 23, 59, 59, 999999
313
341
  else:
314
- raise ValueError("Invalid force_time. Please choose one of the following: NOW, MIDDAY, FIRST_MINUTE, LAST_MINUTE.")
342
+ raise ValueError(
343
+ 'Invalid force_time. Please choose one of the following: NOW, MIDDAY, FIRST_MINUTE, LAST_MINUTE.'
344
+ )
315
345
 
316
346
  return self.replace(hour=hour, minute=minute, second=second, microsecond=microsecond)
317
347
 
318
348
  # OLD string_to_date_time
319
349
  @classmethod
320
- def strptime(cls, date_string: str, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> Self: # pylint: disable=redefined-builtin
350
+ def strptime(cls, date_string: str, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> Self: # pylint: disable=redefined-builtin
321
351
  """
322
352
  Parse a string representing a date and time into a DateTime object.
323
353
 
@@ -344,7 +374,7 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
344
374
  return super().strptime(date_string, format)
345
375
 
346
376
  @classmethod
347
- def strptime_or_null(cls, date_string: str, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> Union[Self, None]: # pylint: disable=redefined-builtin
377
+ def strptime_or_null(cls, date_string: str, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> Self | None: # pylint: disable=redefined-builtin
348
378
  """
349
379
  Parse a string representing a date and time into a DateTime object, or return None if parsing fails.
350
380
 
@@ -373,7 +403,7 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
373
403
 
374
404
  try:
375
405
  date_time = cls.strptime(date_string, format=format)
376
- except Exception: # pylint: disable=broad-exception-caught
406
+ except Exception: # pylint: disable=broad-exception-caught
377
407
  pass
378
408
 
379
409
  return date_time
@@ -421,7 +451,7 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
421
451
  force_time = '23:59:59'
422
452
  return super().strptime(f'{date_string} {force_time}', date_settings.DEFAULT_DATE_TIME_FORMAT)
423
453
 
424
- def strftime(self, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> str: # pylint: disable=redefined-builtin, useless-parent-delegation
454
+ def strftime(self, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> str: # pylint: disable=redefined-builtin, useless-parent-delegation
425
455
  """
426
456
  Convert a DateTime object to a date string.
427
457
 
@@ -449,7 +479,7 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
449
479
  return super().strftime(format)
450
480
 
451
481
  @classmethod
452
- def strftime_or_null(cls, datetime_: Any, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> Union[str, None]: # pylint: disable=redefined-builtin
482
+ def strftime_or_null(cls, datetime_: Any, format: str = date_settings.DEFAULT_DATE_TIME_FORMAT) -> str | None: # pylint: disable=redefined-builtin
453
483
  """
454
484
  Convert a `DateTime` object to a string representation or return None if the input is not a Date.
455
485
 
@@ -478,7 +508,7 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
478
508
  if datetime_ is not None:
479
509
  try:
480
510
  datetime_ = datetime_.strftime(format=format)
481
- except Exception: # pylint: disable=broad-exception-caught
511
+ except Exception: # pylint: disable=broad-exception-caught
482
512
  datetime_ = None
483
513
 
484
514
  return datetime_
@@ -542,7 +572,7 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
542
572
  return out
543
573
 
544
574
  @classmethod
545
- def date_to_date_time(cls, date_: 'Date', frc_time: str = date_settings.DEFAULT_FORCE_TIME) -> Self: # type: ignore
575
+ def date_to_date_time(cls, date_: 'Date', frc_time: str = date_settings.DEFAULT_FORCE_TIME) -> Self: # type: ignore
546
576
  """
547
577
  Convert a Date object to a DateTime object.
548
578
 
@@ -647,3 +677,37 @@ class DateTime(DateMixin, datetime): #pylint: disable=inherit-non-class
647
677
  True
648
678
  """
649
679
  return DateTime.now().date() == self.date()
680
+
681
+ def replace(self, **kwargs: Any) -> Self:
682
+ """
683
+ Return a new DateTime object with specified attributes replaced.
684
+
685
+ This method creates a new DateTime object by replacing specified attributes
686
+ of the current DateTime object with new values provided as keyword arguments.
687
+
688
+ We need to use kwargs to not put required parameters and allow only the ones that are passed to be replaced.
689
+
690
+
691
+ Args:
692
+ **kwargs: Keyword arguments representing the attributes to be replaced.
693
+ Valid attributes include 'year', 'month', 'day', 'hour', 'minute',
694
+ 'second', 'microsecond', 'tzinfo', and 'fold'.
695
+
696
+ Example:
697
+ Replace attributes of a DateTime object:
698
+ >>> dt = DateTime(2023, 9, 15, 12, 0)
699
+ >>> new_dt = dt.replace(hour=15, minute=30)
700
+ >>> new_dt
701
+ DateTime(2023, 9, 15, 15, 30, tzinfo=zoneinfo.ZoneInfo(key='UTC'))
702
+ """
703
+ import sys # noqa: PLC0415
704
+
705
+ # On Python 3.12.11 and below, the replace method validate tzinfo, so we can't pass Undefined
706
+ # but the tzinfo=None works as expected.
707
+ if sys.version_info[:3] >= (3, 12, 12):
708
+ # https://everysk.atlassian.net/browse/COD-13539
709
+ # We use Undefined to identify when we want to remove the tzinfo
710
+ if 'tzinfo' in kwargs and kwargs['tzinfo'] is None:
711
+ kwargs['tzinfo'] = Undefined
712
+
713
+ return super().replace(**kwargs)
@@ -119,7 +119,10 @@ class Secrets(BaseEntity, metaclass=SecretsScriptMetaClass):
119
119
  path (str): The path to retrieve the value from.
120
120
 
121
121
  Returns:
122
- Any: The value retrieved from the path.
122
+ Any | None: The value retrieved from the path or None if the path is empty.
123
123
  """
124
+ if not path:
125
+ return None
126
+
124
127
  _, _ = cls._split_path(path)
125
128
  return cls.get_response(params={'path': path})
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: everysk-lib
3
- Version: 1.9.6
3
+ Version: 1.9.8
4
4
  Summary: Generic lib to share python code on Everysk.
5
5
  License-Expression: LicenseRef-Proprietary
6
6
  Project-URL: Homepage, https://everysk.com/
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3.11
12
12
  Requires-Python: >=3.11
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE.txt
15
- Requires-Dist: python-dateutil<=2.9.0,>=2.8.2
15
+ Requires-Dist: python-dateutil<=3.0.0,>=2.8.2
16
16
  Requires-Dist: holidays==0.51
17
17
  Requires-Dist: tzdata<=2025.2,>=2024.1
18
18
  Provides-Extra: requests
@@ -1,4 +1,4 @@
1
- python-dateutil<=2.9.0,>=2.8.2
1
+ python-dateutil<=3.0.0,>=2.8.2
2
2
  holidays==0.51
3
3
  tzdata<=2025.2,>=2024.1
4
4
 
File without changes
File without changes
File without changes
File without changes
File without changes