Skip to content

Commit 4f2c70c

Browse files
committed
Added deprecation helper and redefined public exports via all.
1 parent 064e1dd commit 4f2c70c

2 files changed

Lines changed: 94 additions & 83 deletions

File tree

mediafile/__init__.py

Lines changed: 62 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -13,92 +13,71 @@
1313
# included in all copies or substantial portions of the Software.
1414

1515

16-
17-
from .constants import TYPES, ImageType
18-
from .exceptions import FileTypeError, MutagenError, UnreadableFileError
19-
from .fields import (
20-
CoverArtField,
21-
DateField,
22-
DateItemField,
23-
ImageListField,
24-
ListMediaField,
25-
MediaField,
26-
QNumberField,
27-
)
16+
from .deprecation import deprecate_imports
17+
from .exceptions import FileTypeError, MediaFileError, MutagenError, UnreadableFileError
2818
from .mediafile import MediaFile
29-
from .storage import (
30-
APEv2ImageStorageStyle,
31-
ASFImageStorageStyle,
32-
ASFStorageStyle,
33-
FlacImageStorageStyle,
34-
ListStorageStyle,
35-
MP3DescStorageStyle,
36-
MP3ImageStorageStyle,
37-
MP3ListDescStorageStyle,
38-
MP3ListStorageStyle,
39-
MP3PeopleStorageStyle,
40-
MP3SlashPackStorageStyle,
41-
MP3SoundCheckStorageStyle,
42-
MP3StorageStyle,
43-
MP3UFIDStorageStyle,
44-
MP4BoolStorageStyle,
45-
MP4ImageStorageStyle,
46-
MP4ListStorageStyle,
47-
MP4SoundCheckStorageStyle,
48-
MP4StorageStyle,
49-
MP4TupleStorageStyle,
50-
SoundCheckStorageStyleMixin,
51-
StorageStyle,
52-
VorbisImageStorageStyle,
53-
)
54-
from .utils import (
55-
Image,
56-
image_extension,
57-
image_mime_type,
58-
loadfile,
59-
mutagen_call,
60-
)
19+
from .utils import Image
6120

6221
__all__ = [
63-
"TYPES",
64-
"APEv2ImageStorageStyle",
65-
"ASFImageStorageStyle",
66-
"ASFStorageStyle",
67-
"CoverArtField",
68-
"DateField",
69-
"DateItemField",
70-
"FileTypeError",
71-
"FlacImageStorageStyle",
72-
"Image",
73-
"ImageListField",
74-
"ImageType",
75-
"ListMediaField",
76-
"ListStorageStyle",
77-
"MP3DescStorageStyle",
78-
"MP3ImageStorageStyle",
79-
"MP3ListDescStorageStyle",
80-
"MP3ListStorageStyle",
81-
"MP3PeopleStorageStyle",
82-
"MP3SlashPackStorageStyle",
83-
"MP3SoundCheckStorageStyle",
84-
"MP3StorageStyle",
85-
"MP3UFIDStorageStyle",
86-
"MP4BoolStorageStyle",
87-
"MP4ImageStorageStyle",
88-
"MP4ListStorageStyle",
89-
"MP4SoundCheckStorageStyle",
90-
"MP4StorageStyle",
91-
"MP4TupleStorageStyle",
92-
"MediaField",
9322
"MediaFile",
94-
"MutagenError",
95-
"QNumberField",
96-
"SoundCheckStorageStyleMixin",
97-
"StorageStyle",
23+
"Image",
24+
"MediaFileError",
9825
"UnreadableFileError",
99-
"VorbisImageStorageStyle",
100-
"image_extension",
101-
"image_mime_type",
102-
"loadfile",
103-
"mutagen_call",
26+
"FileTypeError",
27+
"MutagenError",
10428
]
29+
30+
31+
def __getattr__(name: str):
32+
"""Handle deprecated imports."""
33+
34+
return deprecate_imports(
35+
__name__,
36+
{
37+
# Constants
38+
"TYPES": "mediafile.constants",
39+
"ImageType": "mediafile.constants",
40+
# Fields
41+
"MediaField": "mediafile.fields",
42+
"CoverArtField": "mediafile.fields",
43+
"DateField": "mediafile.fields",
44+
"DateItemField": "mediafile.fields",
45+
"ImageListField": "mediafile.fields",
46+
"ListMediaField": "mediafile.fields",
47+
"QNumberField": "mediafile.fields",
48+
# Storage
49+
"StorageStyle": "mediafile.storage",
50+
"ListStorageStyle": "mediafile.storage",
51+
"SoundCheckStorageStyleMixin": "mediafile.storage",
52+
"ASFStorageStyle": "mediafile.storage",
53+
"ASFImageStorageStyle": "mediafile.storage",
54+
"APEv2ImageStorageStyle": "mediafile.storage",
55+
"FlacImageStorageStyle": "mediafile.storage",
56+
"MP3StorageStyle": "mediafile.storage",
57+
"MP3SoundCheckStorageStyle": "mediafile.storage",
58+
"MP3DescStorageStyle": "mediafile.storage",
59+
"MP3PeopleStorageStyle": "mediafile.storage",
60+
"MP3SlashPackStorageStyle": "mediafile.storage",
61+
"MP3ImageStorageStyle": "mediafile.storage",
62+
"MP3ListStorageStyle": "mediafile.storage",
63+
"MP3UFIDStorageStyle": "mediafile.storage",
64+
"MP3ListDescStorageStyle": "mediafile.storage",
65+
"MP4StorageStyle": "mediafile.storage",
66+
"MP4TupleStorageStyle": "mediafile.storage",
67+
"MP4BoolStorageStyle": "mediafile.storage",
68+
"MP4SoundCheckStorageStyle": "mediafile.storage",
69+
"MP4ImageStorageStyle": "mediafile.storage",
70+
"MP4ListStorageStyle": "mediafile.storage",
71+
"VorbisImageStorageStyle": "mediafile.storage",
72+
# Utils
73+
"image_mime_type": "mediafile.utils",
74+
"image_extension": "mediafile.utils",
75+
"loadfile": "mediafile.utils",
76+
"mutagen_call": "mediafile.utils",
77+
"update_filething": "mediafile.utils",
78+
"sc_encode": "mediafile.utils",
79+
"sc_decode": "mediafile.utils",
80+
"safe_cast": "mediafile.utils",
81+
},
82+
name,
83+
)

mediafile/deprecation.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import warnings
2+
from importlib import import_module, metadata
3+
from typing import Any
4+
5+
from packaging.version import Version
6+
7+
8+
def _format_message(old: str, new: str) -> str:
9+
next_major = f"{Version(metadata.version('mediafile')).major + 1}.0.0"
10+
msg = f"'{old}' is deprecated and will be removed in version '{next_major}'."
11+
msg += f" Use '{new}' instead."
12+
return msg
13+
14+
15+
def deprecate_imports(
16+
old_module: str, new_module_by_name: dict[str, str], name: str
17+
) -> Any:
18+
"""Handle deprecated module imports by redirecting to new locations.
19+
20+
Facilitates gradual migration of module structure by intercepting import
21+
attempts for relocated functionality. Issues deprecation warnings while
22+
transparently providing access to the moved implementation, allowing
23+
existing code to continue working during transition periods.
24+
"""
25+
if new_module := new_module_by_name.get(name):
26+
warnings.warn(
27+
_format_message(f"{old_module}.{name}", f"{new_module}.{name}"),
28+
DeprecationWarning,
29+
stacklevel=2,
30+
)
31+
return getattr(import_module(new_module), name)
32+
raise AttributeError(f"module '{old_module}' has no attribute '{name}'")

0 commit comments

Comments
 (0)