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.
- {frequenz_core-1.2.0/src/frequenz_core.egg-info → frequenz_core-1.3.0}/PKG-INFO +6 -4
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/README.md +5 -3
- frequenz_core-1.3.0/RELEASE_NOTES.md +9 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/enum.py +32 -9
- {frequenz_core-1.2.0 → frequenz_core-1.3.0/src/frequenz_core.egg-info}/PKG-INFO +6 -4
- frequenz_core-1.2.0/RELEASE_NOTES.md +0 -41
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/LICENSE +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/MANIFEST.in +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/pyproject.toml +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/setup.cfg +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/__init__.py +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/conftest.py +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/datetime.py +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/id.py +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/math.py +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/module.py +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/py.typed +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz/core/typing.py +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz_core.egg-info/SOURCES.txt +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz_core.egg-info/dependency_links.txt +0 -0
- {frequenz_core-1.2.0 → frequenz_core-1.3.0}/src/frequenz_core.egg-info/requires.txt +0 -0
- {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.
|
|
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,
|
|
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
|
-
|
|
171
|
-
|
|
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,
|
|
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
|
-
|
|
107
|
-
|
|
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
|
-
"""
|
|
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
|
|
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
|
|
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
|
-
[`
|
|
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,
|
|
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 =
|
|
188
|
-
DONE =
|
|
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,
|
|
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 =
|
|
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.
|
|
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,
|
|
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
|
-
|
|
171
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|