frequenz-core 1.2.0__tar.gz → 1.3.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 (22) hide show
  1. {frequenz_core-1.2.0/src/frequenz_core.egg-info → frequenz_core-1.3.0}/PKG-INFO +6 -4
  2. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/README.md +5 -3
  3. frequenz_core-1.3.0/RELEASE_NOTES.md +9 -0
  4. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/enum.py +32 -9
  5. {frequenz_core-1.2.0 → frequenz_core-1.3.0/src/frequenz_core.egg-info}/PKG-INFO +6 -4
  6. frequenz_core-1.2.0/RELEASE_NOTES.md +0 -41
  7. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/LICENSE +0 -0
  8. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/MANIFEST.in +0 -0
  9. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/pyproject.toml +0 -0
  10. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/setup.cfg +0 -0
  11. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/__init__.py +0 -0
  12. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/conftest.py +0 -0
  13. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/datetime.py +0 -0
  14. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/id.py +0 -0
  15. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/math.py +0 -0
  16. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/module.py +0 -0
  17. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/py.typed +0 -0
  18. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/typing.py +0 -0
  19. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz_core.egg-info/SOURCES.txt +0 -0
  20. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz_core.egg-info/dependency_links.txt +0 -0
  21. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz_core.egg-info/requires.txt +0 -0
  22. {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz_core.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frequenz-core
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: Core utilities to complement Python's standard library
5
5
  Author-email: Frequenz Energy-as-a-Service GmbH <floss@frequenz.com>
6
6
  License: MIT
@@ -162,13 +162,15 @@ Define enums with deprecated members that raise deprecation warnings when
162
162
  accessed:
163
163
 
164
164
  ```python
165
- from frequenz.core.enum import Enum, DeprecatedMember
165
+ from frequenz.core.enum import Enum, deprecated_member, unique
166
166
 
167
+ @unique
167
168
  class TaskStatus(Enum):
168
169
  OPEN = 1
169
170
  IN_PROGRESS = 2
170
- PENDING = DeprecatedMember(1, "PENDING is deprecated, use OPEN instead")
171
- DONE = DeprecatedMember(3, "DONE is deprecated, use FINISHED instead")
171
+ # Duplicate values are fine with `@unique` as long as they are deprecated
172
+ PENDING = deprecated_member(1, "PENDING is deprecated, use OPEN instead")
173
+ DONE = deprecated_member(3, "DONE is deprecated, use FINISHED instead")
172
174
  FINISHED = 4
173
175
 
174
176
  status1 = TaskStatus.PENDING # Warns: "PENDING is deprecated, use OPEN instead"
@@ -98,13 +98,15 @@ Define enums with deprecated members that raise deprecation warnings when
98
98
  accessed:
99
99
 
100
100
  ```python
101
- from frequenz.core.enum import Enum, DeprecatedMember
101
+ from frequenz.core.enum import Enum, deprecated_member, unique
102
102
 
103
+ @unique
103
104
  class TaskStatus(Enum):
104
105
  OPEN = 1
105
106
  IN_PROGRESS = 2
106
- PENDING = DeprecatedMember(1, "PENDING is deprecated, use OPEN instead")
107
- DONE = DeprecatedMember(3, "DONE is deprecated, use FINISHED instead")
107
+ # Duplicate values are fine with `@unique` as long as they are deprecated
108
+ PENDING = deprecated_member(1, "PENDING is deprecated, use OPEN instead")
109
+ DONE = deprecated_member(3, "DONE is deprecated, use FINISHED instead")
108
110
  FINISHED = 4
109
111
 
110
112
  status1 = TaskStatus.PENDING # Warns: "PENDING is deprecated, use OPEN instead"
@@ -0,0 +1,9 @@
1
+ # Frequenz Core Library Release Notes
2
+
3
+ ## Upgrading
4
+
5
+ - If you used `enum.DeprecatedMember` directly anywhere, you should probably switch to using `enum.deprecated_member` instead, which will tag the member value with the appropriate type.
6
+
7
+ ## New Features
8
+
9
+ - A new `enum.deprecated_member` function has been added to create deprecated enum members with proper typing.
@@ -27,12 +27,19 @@ EnumT = TypeVar("EnumT", bound=enum.Enum)
27
27
  """Type variable for enum types."""
28
28
 
29
29
 
30
+ ValueT = TypeVar("ValueT")
31
+ """Type variable for enum member values."""
32
+
33
+
30
34
  class DeprecatedMemberWarning(DeprecationWarning):
31
35
  """Warning category for deprecated enum members."""
32
36
 
33
37
 
34
38
  class DeprecatedMember:
35
- """Marker used in enum class bodies to declare deprecated members.
39
+ """Class to mark members as deprecated.
40
+
41
+ This class should not be used directly, use
42
+ [`deprecated_member`][frequenz.core.enum.deprecated_member] instead.
36
43
 
37
44
  Please read the [`Enum`][frequenz.core.enum.Enum] documentation for details and
38
45
  examples.
@@ -48,8 +55,24 @@ class DeprecatedMember:
48
55
  self.message = message
49
56
 
50
57
 
58
+ def deprecated_member(value: ValueT, message: str) -> ValueT:
59
+ """Mark an enum member as deprecated.
60
+
61
+ Please read the [`Enum`][frequenz.core.enum.Enum] documentation for details and
62
+ examples.
63
+
64
+ Args:
65
+ value: The value of the enum member to mark as deprecated.
66
+ message: The deprecation message to be shown when the member is accessed.
67
+
68
+ Returns:
69
+ The wrapped value, to mark the enum member as deprecated.
70
+ """
71
+ return cast(ValueT, DeprecatedMember(value, message))
72
+
73
+
51
74
  class DeprecatingEnumType(enum.EnumType):
52
- """Enum metaclass that supports `DeprecatedMember` wrappers.
75
+ """Enum metaclass that supports deprecated members.
53
76
 
54
77
  Tip:
55
78
  Normally it is not necessary to use this class directly, use
@@ -163,7 +186,7 @@ if TYPE_CHECKING:
163
186
  else:
164
187
 
165
188
  class Enum(enum.Enum, metaclass=DeprecatingEnumType):
166
- """Base class for enums that support DeprecatedMember.
189
+ """Base class for enums that support deprecated members.
167
190
 
168
191
  This class extends the standard library's [`enum.Enum`][] to support marking
169
192
  certain members as deprecated. Deprecated members can be accessed, but doing so
@@ -171,7 +194,7 @@ else:
171
194
  a [`DeprecatedMemberWarning`][frequenz.core.enum.DeprecatedMemberWarning].
172
195
 
173
196
  To declare a deprecated member, use the
174
- [`DeprecatedMember`][frequenz.core.enum.DeprecatedMember] wrapper in the class body.
197
+ [`deprecated_member()`][frequenz.core.enum.deprecated_member] function.
175
198
 
176
199
  When using the enum constructor (i.e. `MyEnum(value)`), a warning is only emitted if
177
200
  the resolved member has no non-deprecated aliases. If there is at least one
@@ -179,13 +202,13 @@ else:
179
202
 
180
203
  Example:
181
204
  ```python
182
- from frequenz.core.enum import Enum, DeprecatedMember
205
+ from frequenz.core.enum import Enum, deprecated_member
183
206
 
184
207
  class TaskStatus(Enum):
185
208
  OPEN = 1
186
209
  IN_PROGRESS = 2
187
- PENDING = DeprecatedMember(1, "PENDING is deprecated, use OPEN instead")
188
- DONE = DeprecatedMember(3, "DONE is deprecated, use FINISHED instead")
210
+ PENDING = deprecated_member(1, "PENDING is deprecated, use OPEN instead")
211
+ DONE = deprecated_member(3, "DONE is deprecated, use FINISHED instead")
189
212
  FINISHED = 4
190
213
 
191
214
  # Accessing deprecated members:
@@ -219,14 +242,14 @@ def unique(enumeration: type[EnumT]) -> type[EnumT]:
219
242
 
220
243
  Example:
221
244
  ```python
222
- from frequenz.core.enum import Enum, DeprecatedMember, unique
245
+ from frequenz.core.enum import Enum, deprecated_member, unique
223
246
 
224
247
  @unique
225
248
  class TaskStatus(Enum):
226
249
  OPEN = 1
227
250
  IN_PROGRESS = 2
228
251
  # This is okay, as PENDING is a deprecated alias.
229
- PENDING = DeprecatedMember(1, "Use OPEN instead")
252
+ PENDING = deprecated_member(1, "Use OPEN instead")
230
253
  ```
231
254
 
232
255
  Args:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frequenz-core
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: Core utilities to complement Python's standard library
5
5
  Author-email: Frequenz Energy-as-a-Service GmbH <floss@frequenz.com>
6
6
  License: MIT
@@ -162,13 +162,15 @@ Define enums with deprecated members that raise deprecation warnings when
162
162
  accessed:
163
163
 
164
164
  ```python
165
- from frequenz.core.enum import Enum, DeprecatedMember
165
+ from frequenz.core.enum import Enum, deprecated_member, unique
166
166
 
167
+ @unique
167
168
  class TaskStatus(Enum):
168
169
  OPEN = 1
169
170
  IN_PROGRESS = 2
170
- PENDING = DeprecatedMember(1, "PENDING is deprecated, use OPEN instead")
171
- DONE = DeprecatedMember(3, "DONE is deprecated, use FINISHED instead")
171
+ # Duplicate values are fine with `@unique` as long as they are deprecated
172
+ PENDING = deprecated_member(1, "PENDING is deprecated, use OPEN instead")
173
+ DONE = deprecated_member(3, "DONE is deprecated, use FINISHED instead")
172
174
  FINISHED = 4
173
175
 
174
176
  status1 = TaskStatus.PENDING # Warns: "PENDING is deprecated, use OPEN instead"
@@ -1,41 +0,0 @@
1
- # Frequenz Core Library Release Notes
2
-
3
- ## Summary
4
-
5
- ## New Features
6
-
7
- * `frequenz.core.enum` now provides a `@unique` decorator that is aware of deprecations, and will only check for uniqueness among non-deprecated enum members.
8
-
9
- For example this works:
10
-
11
- ```py
12
- >>> from frequenz.core.enum import DeprecatedMember, Enum, unique
13
- >>>
14
- >>> @unique
15
- ... class Status(Enum):
16
- ... ACTIVE = 1
17
- ... INACTIVE = 2
18
- ... PENDING = DeprecatedMember(1, "PENDING is deprecated, use ACTIVE instead")
19
- ...
20
- >>>
21
- ```
22
-
23
- While using the standard library's `enum.unique` decorator raises a `ValueError`:
24
-
25
- ```py
26
- >>> from enum import unique
27
- >>> from frequenz.core.enum import DeprecatedMember, Enum
28
- >>>
29
- >>> @unique
30
- ... class Status(Enum):
31
- ... ACTIVE = 1
32
- ... INACTIVE = 2
33
- ... PENDING = DeprecatedMember(1, "PENDING is deprecated, use ACTIVE instead")
34
- ...
35
- Traceback (most recent call last):
36
- File "<stdin>", line 1, in <module>
37
- File "/usr/lib/python3.12/enum.py", line 1617, in unique
38
- raise ValueError('duplicate values found in %r: %s' %
39
- ValueError: duplicate values found in <enum 'Status'>: PENDING -> ACTIVE
40
- >>>
41
- ```
File without changes
File without changes
File without changes