-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Log a warning if selected font weight differs from requested #30272
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
96be1df
to
8d7f02e
Compare
lib/matplotlib/font_manager.pyi
Outdated
@@ -19,6 +18,7 @@ MSUserFontDirectories: list[str] | |||
X11FontDirectories: list[str] | |||
OSXFontDirectories: list[str] | |||
|
|||
def _normalize_weight(weight: str | Number) -> Number: ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typical font weights are multiples of 100. Can / should this be any Number or can we specialize to int?
def _normalize_weight(weight: str | Number) -> Number: ... | |
def _normalize_weight(weight: str | int) -> int: ... |
If we want a general Number, there should be a test case for it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking at the OpenType spec, it does appear to be integral only: https://learn.microsoft.com/en-us/typography/opentype/spec/os2#usweightclass
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, I think the original PR just used Number
because it was already imported in font_manager.py
.
def test_map_weights(): | ||
assert _normalize_weight('ultralight') == 100 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's reframe this to test the helper instead of the mapping, so that we can also test the passthrough behavior
def test_map_weights(): | |
assert _normalize_weight('ultralight') == 100 | |
def test_normalize_weight(): | |
assert _normalize_weight(300) == 300 # passthough | |
assert _normalize_weight('ultralight') == 100 |
Maybe also add an error case e.g. "italic"
lib/matplotlib/font_manager.py
Outdated
if best_font is not None: | ||
if (_normalize_weight(prop.get_weight()) != | ||
_normalize_weight(best_font.weight)): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are these nested ifs instead of if A and B
?
8d7f02e
to
86983e4
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One minor suggestion to improve the changelog - take it or leave it, and feel free to self merge.
``font_manager.findfont`` logs if selected font weight does not match requested | ||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
``font_manager.findfont`` logs if selected font weight does not match requested | |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
``font_manager.findfont`` warns if selected the font weight does not match requested | |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, it's not a warning.
def test_font_match_warning(caplog): | ||
findfont(FontProperties(family=["DejaVu Sans"], weight=750)) | ||
logs = [rec.message for rec in caplog.records] | ||
assert 'findfont: Failed to find font weight 750, now using 700.' in logs |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just for my own interest, is there a reason to check the logs, instead of using a pytest.warns
context?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same reason as above.
PR summary
This is a rebase of the orphaned #15615, but with @anntzer's comments handled.
PR checklist