Part 2 of the work fixing types in beets.util.__init__ #5215.
Mypy was not happy here because _legalize_stage function implementation concatenates path and extension parameters, implying that their types need to match.
You can see that initially path parameter was defined as a str while extension was bytes.
In reality, depending on the fragment parameter value, extension was sometimes provided as a str and sometimes as bytes. The same parameter decided whether path gets converted into bytes within _legalize_stage implementation. No surprise that mypy was confused here.
_legalize_stage is only used within Item.destination method implementation which is where fragment is defined. I determined that the fragment parameter controls the form of the output path:
fragment=False returned absolute path as bytes (default)
fragment=True returned path relative to the library directory as str.
Given the above, the change
Renames fragment parameter to relative_to_libdir for clarity
Makes Item.destination to return the same type in both cases. I picked bytes since that's the type that majority of the code using this method expects.
I converted the output path to str for the code that has been expecting a string there.
Decouples _legalize_stage and _legalize_path implementations from the relative_to_libdir. The logic now uses str type only.
Description
Part 2 of the work fixing types in
beets.util.__init__
#5215.Mypy was not happy here because
_legalize_stage
function implementation concatenatespath
andextension
parameters, implying that their types need to match.You can see that initially
path
parameter was defined as astr
whileextension
wasbytes
.In reality, depending on the
fragment
parameter value,extension
was sometimes provided as astr
and sometimes asbytes
. The same parameter decided whetherpath
gets converted intobytes
within_legalize_stage
implementation. No surprise that mypy was confused here._legalize_stage
is only used withinItem.destination
method implementation which is wherefragment
is defined. I determined that thefragment
parameter controls the form of the output path:fragment=False
returned absolute path as bytes (default)fragment=True
returned path relative to the library directory as str.Given the above, the change
Renames
fragment
parameter torelative_to_libdir
for clarityMakes
Item.destination
to return the same type in both cases. I pickedbytes
since that's the type that majority of the code using this method expects.I converted the output path to
str
for the code that has been expecting a string there.Decouples
_legalize_stage
and_legalize_path
implementations from therelative_to_libdir
. The logic now usesstr
type only.