Skip to content

Conversation

Julfried
Copy link
Contributor

@Julfried Julfried commented Nov 11, 2024

Type of Changes

Type
πŸ› Bug fix
βœ“ ✨ New feature
πŸ”¨ Refactoring
πŸ“œ Docs

Description

This PR adds a new --max-depth option to pyreverse that allows basic controlling of the visualization depth of packages and classes in the generated diagrams. The depth is simply calculated by counting dots in qualified names, where depth 0 represents top-level packages/classes.

For packages, the full path depth is considered. For classes, the depth is calculated based on their containing module to ensure meaningful class diagrams while respecting the depth limit.

Closes #9233

@Julfried Julfried requested a review from DudeNr33 as a code owner November 11, 2024 16:12
@Julfried Julfried changed the title Set depth Add --max-depth option to control diagram complexity Nov 11, 2024
Copy link

codecov bot commented Nov 11, 2024

Codecov Report

Attention: Patch coverage is 96.42857% with 1 line in your changes missing coverage. Please review.

Project coverage is 95.84%. Comparing base (054f233) to head (94a3898).
Report is 128 commits behind head on main.

Files with missing lines Patch % Lines
pylint/pyreverse/writer.py 96.29% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main   #10077      +/-   ##
==========================================
+ Coverage   95.80%   95.84%   +0.03%     
==========================================
  Files         174      175       +1     
  Lines       18976    19056      +80     
==========================================
+ Hits        18180    18264      +84     
+ Misses        796      792       -4     
Files with missing lines Coverage Ξ”
pylint/pyreverse/main.py 91.66% <ΓΈ> (ΓΈ)
pylint/testutils/pyreverse.py 98.11% <100.00%> (+0.03%) ⬆️
pylint/pyreverse/writer.py 99.15% <96.29%> (-0.85%) ⬇️

... and 7 files with indirect coverage changes

πŸš€ New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@Pierre-Sassoulas Pierre-Sassoulas added Enhancement ✨ Improvement to a component pyreverse Related to pyreverse component labels Nov 11, 2024
@Pierre-Sassoulas Pierre-Sassoulas added this to the 4.0.0 milestone Nov 11, 2024

This comment has been minimized.

This comment has been minimized.

This comment has been minimized.

@Julfried
Copy link
Contributor Author

Quick update: I've completed the implementation and added tests for the --max-depth option. I believe the feature is working as intended and is ready for review. I’m currently fighting some CI issues, but they seem unrelated to my changes. Any help or advice would be much appreciated!

This comment has been minimized.

Copy link
Member

@Pierre-Sassoulas Pierre-Sassoulas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM ! Don't worry about the 3.13 CI fail, this is on main too we can rebase once it's fixed. I'll also wait for a review from Andrea before merging.

@Julfried
Copy link
Contributor Author

Thanks! Appreciate your review and the clarification about the CI issue. I`ll keep an eye on any updates and am happy to rebase if needed.

This comment has been minimized.

@Pierre-Sassoulas
Copy link
Member

Thank you for rebasing, the mypy error is coming from main the other errors seems genuine. (Spelling is checked only in ci not in local pre-commit)

@Julfried
Copy link
Contributor Author

Thanks for pointing out the mypy error, I`ll keep an eye on it if it gets fixed in main. How about disabling spelling check for these test cases because "-" is not allowed in Python naming anyway?

This comment has been minimized.

@Julfried
Copy link
Contributor Author

It seems that the spelling checks still fail, because it checks for words and ignores the quotes. How about adding these testnames to .pylintrc spelling dictionary?

[SPELLING]
# List of comma separated words that should not be checked.
spelling-ignore-words=subpkg,MyClass

This comment has been minimized.

@Julfried
Copy link
Contributor Author

When working on test coverage I noticed tests/data/init.py is empty, which impacts pyreverse's ability to detect complete package relationships. This effects validation of the --max-depth functionality since module relationships aren't fully established and the resulting diagrams do not represent the whole structure.

@Pierre-Sassoulas do you maybe remember if this was an intentional design choice, or did this just grow over time?

Note: Addressing this would require modifying all affected test files to properly reflect package relationships. Given the scope, I think handling such changes in a separate PR would be better, if we decide to do this!

@Pierre-Sassoulas
Copy link
Member

I'm not sure. Pylint had a lot of issues with namespace package and missing __init__.py in the past, is it the issue ? If you meant 'empty' and not 'missing' I'm not sure that an empty init.py should influence the result ?

@Julfried
Copy link
Contributor Author

Thanks for checking! You're right that it's about an empty (not missing) init.py. The difference is how many relationships pyreverse detects:

  • Empty init.py: Shows only direct module dependencies empty init file
  • init.py with imports: Shows both module dependencies and package-level relationships imports in init file

I think this effects depth filtering coverage since we're not testing package-level relationship filtering. Although I want to add, that I am not a testing expert.

Here is what I added to init.py:

from .clientmodule_test import Ancestor, Specialization
from .suppliermodule_test import Interface, DoNothing, DoNothing2
from .nullable_pattern import NullablePatterns
from .property_pattern import PropertyPatterns

This comment has been minimized.

This comment has been minimized.

This comment has been minimized.

@Julfried
Copy link
Contributor Author

Julfried commented Jan 5, 2025

Thanks for your earlier guidance, Pierre! I hope this is PR is not getting to large.

I now rebased to fix the mypy error and addressed the spelling issues. Also, I made some mistakes when setting up the tests, which resulted in pyreverse generating wrong diagrams. Now I use a proper test setup with fixtures and test multiple depths, to improve test coverage. The issue with pyreverse not properly detecting all relationships when init.py is empty still remains. I believe this is why coverage for package-level relationships is still incomplete.

In my understanding, an empty init.py file limits the ability to fully establish package-level relationships, as it doesn’t define imports or explicitly link modules in the package. This might explain why pyreverse struggles with package-level filtering in such cases. However, I’m not entirely sure if this is the root cause or if there’s another factor at play.

I’m happy to explore this further and improve the tests in a follow-up PR if needed. Let me know what you thinkπŸ™‚

Copy link
Member

@Pierre-Sassoulas Pierre-Sassoulas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the delay. Changes seems sensible, I have a possible refactor to suggest. (I'd like a review from Andras if possible though, no pressure @DudeNr33 ;) )

properties=self.get_class_properties(obj),
)
# inheritance links
for rel in diagram.get_relationships("specialization"):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for rel in diagram.get_relationships("specialization"):
for rel in diagram.get_relationships("specialization", depth=self.max_depth):

Wonder if it's possible of filtering on depth directly in get_relationships instead. Seems like it could reduce duplication of .should_show_node checks when looping on it

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the suggestion! I would agree, that handling everything regarding filtering in one place would benefit maintainability. However I think we still need node filtering when emitting nodes, to determine which ones to show in the final diagram. Not sure about splitting this up into 2 files either. What do you think?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I feel like we could simplify this, by introducing get_nodes() alongside get_relationships(). Then the writer would look something like this.

def write_packages(self, diagram: PackageDiagram) -> None:
    for module in diagram.get_nodes(depth=self.max_depth):
        # Emit node logic
    for rel in diagram.get_relationships(depth=self.max_depth):
        # Emit edge logic

That way all the filtering logic would be handled consistently inside the diagram classes and the printer would only need to focus on rendering the final components. What do you think?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great !

Copy link
Contributor Author

@Julfried Julfried Jan 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this is a big change, I am not sure how to approach this. Are you ok with changing it in this PR?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, let's open another PR for the refactor required to add the depth argument.

@Julfried
Copy link
Contributor Author

No worries, Currently I am also very packed. Will try to take a look at it later this week :)

Copy link
Collaborator

@DudeNr33 DudeNr33 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the delay, I am not very active on GitHub at the moment.

Thank you for the PR - this is actually a feature I saw in a similar tool and always thought "would be really helpful to have this in pyreverse"!

Regarding the changes (and following the discussion you already had with Pierre), I feel like the logic is better suited in diadefslib.py, and could be handled similarly to --show_associated.
But like Pierre I think handling this in a follow-up PR makes sense, so that this one does not get too big.

Besides that I only have on remark regarding the option group. πŸ‘

@Julfried
Copy link
Contributor Author

Thanks, appreciate your review. Both of your suggestions make sense - especially the architectural one about moving depth filtering to diadefslib.py alongside other filters like --show_associated. I've moved the --max-depth option to the Filtering and Scope group to better align with similar options. I am happy to do a refactor in a follow up PR :)

Copy link
Contributor

πŸ€– Effect of this PR on checked open source code: πŸ€–

Effect on home-assistant:
The following messages are now emitted:

  1. locally-disabled:
    Locally disabling broad-exception-caught (W0718)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L717
  2. empty-comment:
    Line with empty comment
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L723
  3. empty-comment:
    Line with empty comment
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L727
  4. empty-comment:
    Line with empty comment
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L730
  5. line-too-long:
    Line too long (108/100)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2426
  6. too-many-lines:
    Too many lines in module (3332/1000)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1
  7. too-complex:
    '__async_setup_with_context' is too complex. The McCabe rating is 23
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L552
  8. too-complex:
    'async_unload' is too complex. The McCabe rating is 17
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L796
  9. too-complex:
    'async_migrate' is too complex. The McCabe rating is 11
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L942
  10. too-complex:
    'async_finish_flow' is too complex. The McCabe rating is 15
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1366
  11. too-complex:
    'async_update_issues' is too complex. The McCabe rating is 11
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2447
  12. too-few-public-methods:
    Too few public methods (0/2)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L295
  13. too-many-arguments:
    Too many arguments (17/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L350
  14. too-many-locals:
    Too many local variables (18/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L350
  15. too-many-locals:
    Too many local variables (17/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L552
  16. too-many-try-statements:
    try clause contains 5 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L633
  17. too-many-branches:
    Too many branches (22/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L552
  18. too-many-statements:
    Too many statements (84/50)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L552
  19. consider-using-assignment-expr:
    Use 'if not (supports_unload := hasattr(component, 'async_unload_entry')):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L841
  20. broad-exception-caught:
    Catching too general exception Exception
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L861
  21. too-many-try-statements:
    try clause contains 7 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L848
  22. too-many-return-statements:
    Too many return statements (8/6)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L796
  23. too-many-branches:
    Too many branches (14/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L796
  24. broad-exception-caught:
    Catching too general exception Exception
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L904
  25. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L914
  26. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L914
  27. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L955
  28. consider-using-assignment-expr:
    Use 'if not (supports_migrate := hasattr(component, 'async_migrate_entry')):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L966
  29. broad-exception-caught:
    Catching too general exception Exception
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L985
  30. too-many-try-statements:
    try clause contains 6 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L976
  31. protected-access:
    Access to a protected member _async_schedule_save of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L984
  32. too-many-return-statements:
    Too many return statements (7/6)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L942
  33. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1032
  34. consider-using-any-or-all:
    for loop could be any(flow.flow_id != flow_id and flow.context['source'] in DISCOVERY_SOURCES for flow in self._progress.values())
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1245
  35. magic-value-comparison:
    Consider using a named constant or an enum instead of ''source''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1258
  36. magic-value-comparison:
    Consider using a named constant or an enum instead of ''entry_id''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1265
  37. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1303
  38. consider-using-assignment-expr:
    Use 'if not (flow := await self.async_create_flow(handler, context=context, data=data)):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1335
  39. protected-access:
    Access to a protected member _async_remove of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1508
  40. protected-access:
    Access to a protected member _async_clean_up of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1514
  41. too-many-branches:
    Too many branches (14/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1366
  42. magic-value-comparison:
    Consider using a named constant or an enum instead of ''source''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1533
  43. consider-using-any-or-all:
    for loop could be any(match_items <= progress.context.items() and progress.init_data == data for progress in flows)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1592
  44. consider-using-any-or-all:
    for loop could be any(other_flow is not flow and flow.is_matching(other_flow) for other_flow in set(flows))
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1602
  45. consider-using-assignment-expr:
    Use 'if not (entries := self._domain_unique_id_index.get(domain, {}).get(unique_id)):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1731
  46. magic-value-comparison:
    Consider using a named constant or an enum instead of '2'.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1757
  47. magic-value-comparison:
    Consider using a named constant or an enum instead of ''system_options''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1763
  48. magic-value-comparison:
    Consider using a named constant or an enum instead of '3'.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1779
  49. magic-value-comparison:
    Consider using a named constant or an enum instead of '4'.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1785
  50. consider-using-any-or-all:
    for loop could be any((include_ignore or entry.source != SOURCE_IGNORE) and (include_disabled or not entry.disabled_by) for entry in entries)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1853
  51. consider-ternary-expression:
    Consider rewriting as a ternary expression
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1932
  52. magic-value-comparison:
    Consider using a named constant or an enum instead of ''flow_id''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1962
  53. unused-argument:
    Unused argument 'event'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1970
  54. too-many-arguments:
    Too many arguments (11/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2147
  55. too-many-locals:
    Too many local variables (17/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2147
  56. magic-value-comparison:
    Consider using a named constant or an enum instead of ''flipr''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2184
  57. protected-access:
    Access to a protected member _domain_unique_id_index of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2461
  58. magic-value-comparison:
    Consider using a named constant or an enum instead of ''flipr''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2466
  59. redefined-loop-name:
    Redefining 'entries' from loop (line 2468)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2471
  60. magic-value-comparison:
    Consider using a named constant or an enum instead of '2'.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2480
  61. too-many-public-methods:
    Too many public methods (23/20)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L1795
  62. unused-argument:
    Unused argument 'config_entry'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2578
  63. unused-argument:
    Unused argument 'user_input'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2761
  64. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2801
  65. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2830
  66. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2836
  67. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2842
  68. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2848
  69. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2854
  70. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2860
  71. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2866
  72. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2871
  73. unused-argument:
    Unused argument 'discovery_info'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2876
  74. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2882
  75. too-many-arguments:
    Too many arguments (9/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2914
  76. missing-param-doc:
    "entry" missing in parameter documentation
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2914
  77. too-many-arguments:
    Too many arguments (7/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2961
  78. magic-value-comparison:
    Consider using a named constant or an enum instead of ''entry_id''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2975
  79. too-many-public-methods:
    Too many public methods (21/20)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L2553
  80. too-few-public-methods:
    Too few public methods (1/2)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L3178
  81. magic-value-comparison:
    Consider using a named constant or an enum instead of ''update''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L3268
  82. magic-value-comparison:
    Consider using a named constant or an enum instead of ''disabled_by''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L3269
  83. suppressed-message:
    Suppressed 'broad-exception-caught' (from line 717)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/config_entries.py#L717
  84. too-many-instance-attributes:
    Too many instance attributes (8/7)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/auth/providers/__init__.py#L195
  85. consider-using-assignment-expr:
    Use 'if (auth_module := self._auth_manager.get_auth_mfa_module(self._auth_module_id)) is None:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/auth/providers/__init__.py#L259
  86. consider-using-assignment-expr:
    Use 'if not (result := await auth_module.async_validate(self.user.id, user_input)):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/auth/providers/__init__.py#L279
  87. unused-argument:
    Unused argument 'value'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/util/event_type.pyi#L21
  88. consider-using-assignment-expr:
    Use 'if (entity_comp := hass.data.get(DATA_INSTANCES, {}).get(domain)) is None:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L48
  89. too-many-instance-attributes:
    Too many instance attributes (9/7)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L63
  90. consider-using-assignment-expr:
    Use 'if (key := config_entry.entry_id) in self._platforms:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L181
  91. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L219
  92. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L219
  93. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L256
  94. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L256
  95. consider-using-assignment-expr:
    Use 'if (key := (platform_type, scan_interval, entity_namespace)) not in self._platforms:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L302
  96. unused-argument:
    Unused argument 'event'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_component.py#L392
  97. locally-disabled:
    Locally disabling import-outside-toplevel (C0415)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1539
  98. too-many-lines:
    Too many lines in module (1695/1000)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1
  99. too-complex:
    'async_device_modified' is too complex. The McCabe rating is 12
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L970
  100. too-complex:
    '_async_update_entity' is too complex. The McCabe rating is 12
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1037
  101. too-many-arguments:
    Too many arguments (10/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L646
  102. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L804
  103. too-many-arguments:
    Too many arguments (20/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L814
  104. too-many-locals:
    Too many local variables (28/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L814
  105. consider-using-assignment-expr:
    Use 'if (entity_id := self.async_get_entity_id(domain, platform, unique_id)):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L852
  106. magic-value-comparison:
    Consider using a named constant or an enum instead of ''remove''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L981
  107. magic-value-comparison:
    Consider using a named constant or an enum instead of ''update''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L989
  108. consider-using-assignment-expr:
    Use 'if not (device := device_registry.async_get(event.data['device_id'])):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L998
  109. too-many-arguments:
    Too many arguments (26/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1037
  110. too-many-locals:
    Too many local variables (34/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1037
  111. too-many-arguments:
    Too many arguments (24/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1166
  112. too-many-locals:
    Too many local variables (24/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1166
  113. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1221
  114. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1282
  115. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1344
  116. magic-value-comparison:
    Consider using a named constant or an enum instead of ''remove''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1547
  117. unused-argument:
    Unused argument 'event'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1585
  118. magic-value-comparison:
    Consider using a named constant or an enum instead of ''remove''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1599
  119. suppressed-message:
    Suppressed 'import-outside-toplevel' (from line 1539)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/entity_registry.py#L1539
  120. locally-disabled:
    Locally disabling import-outside-toplevel (C0415)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L170
  121. too-complex:
    '_selector_serializer' is too complex. The McCabe rating is 33
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L512
  122. too-complex:
    '_get_cached_script_parameters' is too complex. The McCabe rating is 16
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L620
  123. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L66
  124. too-few-public-methods:
    Too few public methods (1/2)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L204
  125. consider-using-assignment-expr:
    Use 'if (device := device_reg.async_get(llm_context.device_id)):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L345
  126. possibly-used-before-assignment:
    Possibly using variable 'extra' before assignment
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L355
  127. consider-using-augmented-assign:
    Use '|=' to do an augmented assign directly
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L386
  128. too-few-public-methods:
    Too few public methods (1/2)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L276
  129. too-many-locals:
    Too many local variables (16/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L431
  130. magic-value-comparison:
    Consider using a named constant or an enum instead of ''min''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L541
  131. magic-value-comparison:
    Consider using a named constant or an enum instead of ''min_mireds''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L543
  132. magic-value-comparison:
    Consider using a named constant or an enum instead of ''max''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L545
  133. magic-value-comparison:
    Consider using a named constant or an enum instead of ''max_mireds''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L547
  134. magic-value-comparison:
    Consider using a named constant or an enum instead of ''min''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L581
  135. magic-value-comparison:
    Consider using a named constant or an enum instead of ''max''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L583
  136. too-many-return-statements:
    Too many return statements (27/6)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L512
  137. too-many-branches:
    Too many branches (32/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L512
  138. too-many-locals:
    Too many local variables (18/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L620
  139. consider-using-assignment-expr:
    Use 'if (parameters_cache := hass.data.get(SCRIPT_PARAMETERS_CACHE)) is None:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L632
  140. unused-argument:
    Unused argument 'event'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L647
  141. consider-using-assignment-expr:
    Use 'if not (field_description := config.get('description')):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L667
  142. consider-ternary-expression:
    Consider rewriting as a ternary expression
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L670
  143. magic-value-comparison:
    Consider using a named constant or an enum instead of ''selector''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L674
  144. too-many-branches:
    Too many branches (15/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L620
  145. too-few-public-methods:
    Too few public methods (1/2)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L697
  146. suppressed-message:
    Suppressed 'import-outside-toplevel' (from line 170)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/llm.py#L171
  147. too-many-lines:
    Too many lines in module (1169/1000)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1
  148. unused-argument:
    Unused argument 'variables'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L901
  149. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L975
  150. unused-argument:
    Unused argument 'variables'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L967
  151. magic-value-comparison:
    Consider using a named constant or an enum instead of ''trigger''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1012
  152. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1008
  153. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1002
  154. consider-using-assignment-expr:
    Use 'if (condition := config[CONF_CONDITION]) in ('and', 'not', 'or'):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1048
  155. use-set-for-membership:
    Consider using set for membership test
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1048
  156. redefined-loop-name:
    Redefining 'sub_cond' from loop (line 1050)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1051
  157. use-set-for-membership:
    Consider using set for membership test
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1059
  158. too-many-try-statements:
    try clause contains 3 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1094
  159. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1124
  160. consider-using-assignment-expr:
    Use 'if (condition := config[CONF_CONDITION]) in ('and', 'not', 'or'):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1131
  161. use-set-for-membership:
    Consider using set for membership test
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1131
  162. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1152
  163. use-set-for-membership:
    Consider using set for membership test
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1159
  164. magic-value-comparison:
    Consider using a named constant or an enum instead of ''device''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/condition.py#L1163
  165. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L104
  166. consider-using-assignment-expr:
    Use 'if (item_id := item[CONF_ID]) in old_ids:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L209
  167. no-self-use:
    Method could be a function
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L388
  168. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L523
  169. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L523
  170. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L541
  171. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L541
  172. magic-value-comparison:
    Consider using a named constant or an enum instead of ''/''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L559
  173. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L632
  174. too-many-try-statements:
    try clause contains 5 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L641
  175. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L638
  176. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L658
  177. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L715
  178. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L707
  179. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/collection.py#L734
  180. locally-disabled:
    Locally disabling broad-exception-caught (W0718)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L328
  181. locally-disabled:
    Locally disabling possibly-used-before-assignment (E0606)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L456
  182. too-complex:
    '_async_refresh' is too complex. The McCabe rating is 31
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L351
  183. too-few-public-methods:
    Too few public methods (1/2)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L45
  184. too-many-instance-attributes:
    Too many instance attributes (20/7)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L55
  185. too-many-arguments:
    Too many arguments (10/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L63
  186. overlapping-except:
    Overlapping exceptions (requests.exceptions.RequestException is an ancestor class of requests.exceptions.Timeout)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L313
  187. broad-exception-caught:
    Catching too general exception Exception
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L441
  188. magic-value-comparison:
    Consider using a named constant or an enum instead of ''timed out''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L393
  189. too-many-branches:
    Too many branches (34/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L351
  190. too-many-statements:
    Too many statements (84/50)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L351
  191. redefined-variable-type:
    Redefinition of self.last_exception type from requests.exceptions.RequestException to urllib.error.URLError
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L390
  192. invalid-overridden-method:
    Method 'available' was expected to be 'method', found it instead as 'property'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L581
  193. useless-suppression:
    Useless suppression of 'possibly-used-before-assignment'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L456
  194. suppressed-message:
    Suppressed 'broad-exception-caught' (from line 328)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/update_coordinator.py#L328
  195. too-many-lines:
    Too many lines in module (2111/1000)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1
  196. too-complex:
    '_async_repeat_step' is too complex. The McCabe rating is 37
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L865
  197. too-complex:
    '_find_referenced_target' is too complex. The McCabe rating is 12
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1552
  198. too-complex:
    '_find_referenced_devices' is too complex. The McCabe rating is 16
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1601
  199. too-complex:
    '_find_referenced_entities' is too complex. The McCabe rating is 16
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1651
  200. too-complex:
    'async_run' is too complex. The McCabe rating is 20
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1702
  201. magic-value-comparison:
    Consider using a named constant or an enum instead of ''trigger''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L759
  202. use-set-for-membership:
    Consider using set for membership test
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L760
  203. too-many-try-statements:
    try clause contains 4 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L823
  204. consider-using-assignment-expr:
    Use 'if (trace_element := trace_stack_top(trace_stack_cv)):' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L825
  205. too-many-try-statements:
    try clause contains 5 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L850
  206. protected-access:
    Access to a protected member _get_repeat_script of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L882
  207. too-many-try-statements:
    try clause contains 4 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L945
  208. too-many-try-statements:
    try clause contains 4 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L993
  209. use-set-for-membership:
    Consider using set for membership test
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L996
  210. too-many-branches:
    Too many branches (29/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L865
  211. too-many-statements:
    Too many statements (88/50)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L865
  212. protected-access:
    Access to a protected member _async_get_choose_data of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1038
  213. too-many-try-statements:
    try clause contains 5 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1043
  214. protected-access:
    Access to a protected member _async_get_if_data of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1059
  215. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1062
  216. use-implicit-booleaness-not-comparison-to-zero:
    "timeout == 0" can be simplified to "not timeout", if it is strictly an int, as 0 is falsey
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1141
  217. unused-argument:
    Unused argument 'context'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1153
  218. too-many-try-statements:
    try clause contains 3 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1194
  219. consider-using-assignment-expr:
    Use 'if (resp := self._action[CONF_SET_CONVERSATION_RESPONSE]) is None:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1215
  220. protected-access:
    Access to a protected member _async_get_sequence_script of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1248
  221. protected-access:
    Access to a protected member _async_get_parallel_scripts of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1254
  222. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1290
  223. protected-access:
    Access to a protected member _queue_lck of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1292
  224. protected-access:
    Access to a protected member _queue_lck of a client class
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1304
  225. unused-argument:
    Unused argument 'point_in_time'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1318
  226. unused-argument:
    Unused argument 'event'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1336
  227. too-many-instance-attributes:
    Too many instance attributes (28/7)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1397
  228. too-many-arguments:
    Too many arguments (15/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1400
  229. too-many-locals:
    Too many local variables (16/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1400
  230. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1579
  231. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1584
  232. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1629
  233. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1636
  234. too-many-branches:
    Too many branches (15/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1601
  235. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1680
  236. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1687
  237. too-many-branches:
    Too many branches (15/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1651
  238. magic-value-comparison:
    Consider using a named constant or an enum instead of ''SILENT''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1723
  239. magic-value-comparison:
    Consider using a named constant or an enum instead of ''SILENT''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1728
  240. consider-ternary-expression:
    Consider rewriting as a ternary expression
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1785
  241. too-many-branches:
    Too many branches (20/12)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1702
  242. too-many-statements:
    Too many statements (55/50)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1702
  243. redefined-loop-name:
    Redefining 'parallel_script' from loop (line 1974)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/script.py#L1976
  244. unused-argument:
    Unused argument 'async_'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/singleton.py#L35
  245. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/singleton.py#L94
  246. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/singleton.py#L98
  247. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/singleton.py#L106
  248. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/singleton.py#L113
  249. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/singleton.py#L117
  250. superfluous-parens:
    Unnecessary parens after ':=' keyword
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1517
  251. too-many-lines:
    Too many lines in module (2007/1000)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1
  252. too-complex:
    '_refresh' is too complex. The McCabe rating is 11
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1219
  253. too-many-instance-attributes:
    Too many instance attributes (9/7)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L974
  254. unused-argument:
    Unused argument 'now'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1102
  255. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1336
  256. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1336
  257. unused-argument:
    Unused argument 'now'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1417
  258. consider-ternary-expression:
    Consider rewriting as a ternary expression
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1436
  259. too-many-instance-attributes:
    Too many instance attributes (8/7)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1615
  260. too-many-instance-attributes:
    Too many instance attributes (8/7)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1791
  261. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1848
  262. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1848
  263. magic-value-comparison:
    Consider using a named constant or an enum instead of ''''.*
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1862
  264. consider-using-any-or-all:
    for loop could be any(render_info.all_states or render_info.all_states_lifecycle for render_info in render_infos)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/event.py#L1948
  265. locally-disabled:
    Locally disabling too-many-nested-blocks (R1702)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2192
  266. too-many-lines:
    Too many lines in module (3232/1000)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1
  267. too-complex:
    'merge_response' is too complex. The McCabe rating is 12
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2170
  268. consider-using-assignment-expr:
    Use 'if (attr := state_obj.attributes.get(name, _SENTINEL)) is _SENTINEL:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1885
  269. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1907
  270. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1915
  271. too-many-try-statements:
    try clause contains 4 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1934
  272. magic-value-comparison:
    Consider using a named constant or an enum instead of ''ceil''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1937
  273. magic-value-comparison:
    Consider using a named constant or an enum instead of ''floor''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1939
  274. magic-value-comparison:
    Consider using a named constant or an enum instead of ''half''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1941
  275. use-implicit-booleaness-not-comparison-to-zero:
    "precision == 0" can be simplified to "not precision", if it is strictly an int, as 0 is falsey
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1946
  276. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L1984
  277. too-many-try-statements:
    try clause contains 5 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2059
  278. magic-value-comparison:
    Consider using a named constant or an enum instead of '2'.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2061
  279. magic-value-comparison:
    Consider using a named constant or an enum instead of '3'.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2065
  280. too-many-try-statements:
    try clause contains 4 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2093
  281. unidiomatic-typecheck:
    Use isinstance() rather than type() for a typecheck.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2142
  282. unidiomatic-typecheck:
    Use isinstance() rather than type() for a typecheck.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2145
  283. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2147
  284. use-implicit-booleaness-not-comparison-to-zero:
    "len(args) == 0" can be simplified to "not len(args)", if it is strictly an int, as 0 is falsey
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2253
  285. use-implicit-booleaness-not-comparison-to-zero:
    "len(args) == 0" can be simplified to "not len(args)", if it is strictly an int, as 0 is falsey
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2274
  286. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2283
  287. use-implicit-booleaness-not-comparison-to-zero:
    "len(args) == 0" can be simplified to "not len(args)", if it is strictly an int, as 0 is falsey
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2303
  288. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2312
  289. confusing-consecutive-elif:
    Consecutive elif with differing indentation level, consider creating a function to separate the inner elif
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2343
  290. consider-using-assignment-expr:
    Use 'if (result := jinja2.filters.do_int(value, default=default, base=base)) is _SENTINEL:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2379
  291. consider-using-assignment-expr:
    Use 'if (result := jinja2.filters.do_int(value, default=default, base=base)) is _SENTINEL:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2387
  292. unused-argument:
    Unused argument 'context'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2597
  293. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2606
  294. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2623
  295. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2650
  296. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2672
  297. no-self-use:
    Method could be a function
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2727
  298. unused-argument:
    Unused argument 'hass'
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2827
  299. invalid-name:
    Variable name "_P" doesn't conform to snake_case naming style
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2981
  300. too-many-statements:
    Too many statements (185/50)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2862
  301. magic-value-comparison:
    Consider using a named constant or an enum instead of ''_''.
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L3174
  302. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L3182
  303. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L3182
  304. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L3192
  305. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L3192
  306. too-many-arguments:
    Too many arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L3201
  307. too-many-positional-arguments:
    Too many positional arguments (6/5)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L3201
  308. suppressed-message:
    Suppressed 'too-many-nested-blocks' (from line 2192)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/helpers/template.py#L2192
  309. locally-disabled:
    Locally disabling unnecessary-lambda (W0108)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L69
  310. locally-disabled:
    Locally disabling unnecessary-lambda (W0108)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L71
  311. too-complex:
    'websocket_run' is too complex. The McCabe rating is 16
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L122
  312. too-many-locals:
    Too many local variables (22/15)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L122
  313. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L172
  314. too-many-try-statements:
    try clause contains 2 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L254
  315. too-many-statements:
    Too many statements (54/50)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L122
  316. consider-using-assignment-expr:
    Use 'if (pipeline_id := msg['pipeline_id']) not in pipeline_data.pipeline_debug:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L288
  317. too-many-try-statements:
    try clause contains 8 statements, expected at most 1
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L506
  318. while-used:
    Used while loop
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L509
  319. consider-using-assignment-expr:
    Use 'if (audio_bytes := await audio_queue.queue.get()) is None:' instead
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce44596074d7b2a712/homeassistant/components/assist_pipeline/websocket_api.py#L512
  320. suppressed-message:
    Suppressed 'unnecessary-lambda' (from line 69)
    https://github.com/home-assistant/core/blob/439f22f5844e49ce1f89dbce...

This comment was truncated because GitHub allows only 65536 characters in a comment.

This comment was generated for commit 94a3898

Copy link
Collaborator

@DudeNr33 DudeNr33 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! Now I guess only the failing codecov check in the pipeline prevents this from being merged.
Do you need help with that?

@Julfried
Copy link
Contributor Author

Julfried commented Jan 20, 2025

Thanks for checking! As I said here:

Thanks for your earlier guidance, Pierre! I hope this is PR is not getting to large.

I now rebased to fix the mypy error and addressed the spelling issues. Also, I made some mistakes when setting up the tests, which resulted in pyreverse generating wrong diagrams. Now I use a proper test setup with fixtures and test multiple depths, to improve test coverage. The issue with pyreverse not properly detecting all relationships when init.py is empty still remains. I believe this is why coverage for package-level relationships is still incomplete.

In my understanding, an empty init.py file limits the ability to fully establish package-level relationships, as it doesn’t define imports or explicitly link modules in the package. This might explain why pyreverse struggles with package-level filtering in such cases. However, I’m not entirely sure if this is the root cause or if there’s another factor at play.

I’m happy to explore this further and improve the tests in a follow-up PR if needed. Let me know what you thinkπŸ™‚

I believe this is due to empty __init__.py files in tests/data/. Would you agree with me? Your help would be appreciated, because I believe you have a better understand of what is actually happening in the codebase. Changing the test files would be to large for this PR :)

@Julfried
Copy link
Contributor Author

Hey @Pierre-Sassoulas , I believe I am not able to resolve codecov, without changing the structure of the testfiles. How about merging this and doing the proposed refactor in a follow-up PR?

Copy link
Member

@Pierre-Sassoulas Pierre-Sassoulas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's do that !

@Pierre-Sassoulas Pierre-Sassoulas merged commit 05e83c4 into pylint-dev:main Jan 24, 2025
43 of 44 checks passed
@Julfried Julfried deleted the set-depth branch January 26, 2025 10:44
luketainton pushed a commit to luketainton/roboluke-tasks that referenced this pull request Oct 13, 2025
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.3` -> `<4.1.0,>=4.0.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pylint/4.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pylint/3.3.9/4.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>pylint-dev/pylint (pylint)</summary>

### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0)

[Compare Source](pylint-dev/pylint@v3.3.9...v4.0.0)

- Pylint now supports Python 3.14.

- Pylint's inference engine (`astroid`) is now much more precise,
  understanding implicit booleanness and ternary expressions. (Thanks [@&#8203;zenlyj](https://github.com/zenlyj)!)

Consider this example:

```python
class Result:
    errors: dict | None = None

result = Result()
if result.errors:
    result.errors[field_key]

### inference engine understands result.errors cannot be None
### pylint no longer raises unsubscriptable-object
```

The required `astroid` version is now 4.0.0. See the [astroid changelog](https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-4-0-0) for additional fixes, features, and performance improvements applicable to pylint.

- Handling of `invalid-name` at the module level was patchy. Now,
  module-level constants that are reassigned are treated as variables and checked
  against `--variable-rgx` rather than `--const-rgx`. Module-level lists,
  sets, and objects can pass against either regex.

Here, `LIMIT` is reassigned, so pylint only uses `--variable-rgx`:

```python
LIMIT = 500  # [invalid-name]
if sometimes:
    LIMIT = 1  # [invalid-name]
```

If this is undesired, refactor using *exclusive* assignment so that it is
evident that this assignment happens only once:

```python
if sometimes:
    LIMIT = 1
else:
    LIMIT = 500  # exclusive assignment: uses const regex, no warning
```

Lists, sets, and objects still pass against either `const-rgx` or `variable-rgx`
even if reassigned, but are no longer completely skipped:

```python
MY_LIST = []
my_list = []
My_List = []  # [invalid-name]
```

Remember to adjust the [regexes](https://pylint.readthedocs.io/en/latest/user_guide/messages/convention/invalid-name.html) and [allow lists](https://pylint.readthedocs.io/en/latest/user_guide/configuration/all-options.html#good-names) to your liking.

## Breaking Changes

- `invalid-name` now distinguishes module-level constants that are assigned only once
  from those that are reassigned and now applies `--variable-rgx` to the latter. Values
  other than literals (lists, sets, objects) can pass against either the constant or
  variable regexes (e.g. "LOGGER" or "logger" but not "LoGgEr").

  Remember that `--good-names` or `--good-names-rgxs` can be provided to explicitly
  allow good names.

  Closes [#&#8203;3585](pylint-dev/pylint#3585)

- The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated
  and will be removed.

  Refs [#&#8203;6052](pylint-dev/pylint#6052)

- Commented out code blocks such as `#    bar() # TODO: remove dead code` will no longer emit `fixme`.

  Refs [#&#8203;9255](pylint-dev/pylint#9255)

- `pyreverse` `Run` was changed to no longer call `sys.exit()` in its `__init__`.
  You should now call `Run(args).run()` which will return the exit code instead.
  Having a class that always raised a `SystemExit` exception was considered a bug.

  Normal usage of pyreverse through the CLI will not be affected by this change.

  Refs [#&#8203;9689](pylint-dev/pylint#9689)

- The `suggestion-mode` option was removed, as pylint now always emits user-friendly hints instead
  of false-positive error messages. You should remove it from your conf if it's defined.

  Refs [#&#8203;9962](pylint-dev/pylint#9962)

- The `async.py` checker module has been renamed to `async_checker.py` since `async` is a Python keyword
  and cannot be imported directly. This allows for better testing and extensibility of the async checker functionality.

  Refs [#&#8203;10071](pylint-dev/pylint#10071)

- The message-id of `continue-in-finally` was changed from `E0116` to `W0136`. The warning is
  now emitted for every Python version since it will raise a syntax warning in Python 3.14.
  See [PEP 765 - Disallow return/break/continue that exit a finally block](https://peps.python.org/pep-0765/).

  Refs [#&#8203;10480](pylint-dev/pylint#10480)

- Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead.

  Refs [#&#8203;10583](pylint-dev/pylint#10583)

- Version requirement for `isort` has been bumped to >=5.0.0.
  The internal compatibility for older `isort` versions exposed via `pylint.utils.IsortDriver` has
  been removed.

  Refs [#&#8203;10637](pylint-dev/pylint#10637)

## New Features

- `comparison-of-constants` now uses the unicode from the ast instead of reformatting from
  the node's values preventing some bad formatting due to `utf-8` limitation. The message now uses
  `"` instead of `'` to better work with what the python ast returns.

  Refs [#&#8203;8736](pylint-dev/pylint#8736)

- Enhanced pyreverse to properly distinguish between UML relationship types (association, aggregation, composition) based on object ownership semantics. Type annotations without assignment are now treated as associations, parameter assignments as aggregations, and object instantiation as compositions.

  Closes [#&#8203;9045](pylint-dev/pylint#9045)
  Closes [#&#8203;9267](pylint-dev/pylint#9267)

- The `fixme` check can now search through docstrings as well as comments, by using
  `check-fixme-in-docstring = true` in the `[tool.pylint.miscellaneous]` section.

  Closes [#&#8203;9255](pylint-dev/pylint#9255)

- The `use-implicit-booleaness-not-x` checks now distinguish between comparisons
  used in boolean contexts and those that are not, enabling them to provide more accurate refactoring suggestions.

  Closes [#&#8203;9353](pylint-dev/pylint#9353)

- The verbose option now outputs the filenames of the files that have been checked.
  Previously, it only included the number of checked and skipped files.

  Closes [#&#8203;9357](pylint-dev/pylint#9357)

- colorized reporter now colorizes messages/categories that have been configured as `fail-on` in red inverse.
  This makes it easier to quickly find the errors that are causing pylint CI job failures.

  Closes [#&#8203;9898](pylint-dev/pylint#9898)

- Enhanced support for [@&#8203;property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.

  Closes [#&#8203;10057](pylint-dev/pylint#10057)

- Add --max-depth option to pyreverse to control diagram complexity. A depth of 0 shows only top-level packages, 1 shows one level of subpackages, etc.
  This helps manage visualization of large codebases by limiting the depth of displayed packages and classes.

  Refs [#&#8203;10077](pylint-dev/pylint#10077)

- Handle deferred evaluation of annotations in Python 3.14.

  Closes [#&#8203;10149](pylint-dev/pylint#10149)

- Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).

  Closes [#&#8203;10236](pylint-dev/pylint#10236)

- `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`.

  Closes [#&#8203;10242](pylint-dev/pylint#10242)

- pypy 3.11 is now officially supported.

  Refs [#&#8203;10287](pylint-dev/pylint#10287)

- Add support for Python 3.14.

  Refs [#&#8203;10467](pylint-dev/pylint#10467)

- Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style.

  Refs [#&#8203;10541](pylint-dev/pylint#10541)

## New Checks

- Add `match-statements` checker and the following message:
  `bare-name-capture-pattern`.
  This will emit an error message when a name capture pattern is used in a match statement which would make the remaining patterns unreachable.
  This code is a SyntaxError at runtime.

  Closes [#&#8203;7128](pylint-dev/pylint#7128)

- Add new check `async-context-manager-with-regular-with` to detect async context managers used with regular `with` statements instead of `async with`.

  Refs [#&#8203;10408](pylint-dev/pylint#10408)

- Add `break-in-finally` warning. Using `break` inside the `finally` clause
  will raise a syntax warning in Python 3.14.
  See `PEP 765 - Disallow return/break/continue that exit a finally block <https://peps.python.org/pep-0765/>`\_.

  Refs [#&#8203;10480](pylint-dev/pylint#10480)

- Add new checks for invalid uses of class patterns in :keyword:`match`.

  - :ref:`invalid-match-args-definition` is emitted if :py:data:`object.__match_args__` isn't a tuple of strings.
  - :ref:`too-many-positional-sub-patterns` if there are more positional sub-patterns than specified in :py:data:`object.__match_args__`.
  - :ref:`multiple-class-sub-patterns` if there are multiple sub-patterns for the same attribute.

  Refs [#&#8203;10559](pylint-dev/pylint#10559)

- Add additional checks for suboptimal uses of class patterns in :keyword:`match`.

  - :ref:`match-class-bind-self` is emitted if a name is bound to `self` instead of
    using an `as` pattern.
  - :ref:`match-class-positional-attributes` is emitted if a class pattern has positional
    attributes when keywords could be used.

  Refs [#&#8203;10587](pylint-dev/pylint#10587)

- Add a `consider-math-not-float` message. `float("nan")` and `float("inf")` are slower
  than their counterpart `math.inf` and `math.nan` by a factor of 4 (notwithstanding
  the initial import of math) and they are also not well typed when using mypy.
  This check also catches typos in float calls as a side effect.

  The :ref:`pylint.extensions.code_style` need to be activated for this check to work.

  Refs [#&#8203;10621](pylint-dev/pylint#10621)

## False Positives Fixed

- Fix a false positive for `used-before-assignment` when a variable defined under
  an `if` and via a named expression (walrus operator) is used later when guarded
  under the same `if` test.

  Closes [#&#8203;10061](pylint-dev/pylint#10061)

- Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14.

  Closes [#&#8203;10632](pylint-dev/pylint#10632)

## False Negatives Fixed

- Fix false negative for `used-before-assignment` when a `TYPE_CHECKING` import is used as a type annotation prior to erroneous usage.

  Refs [#&#8203;8893](pylint-dev/pylint#8893)

- Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.

  Refs [#&#8203;9667](pylint-dev/pylint#9667)

- Check module-level constants with type annotations for `invalid-name`.
  Remember to adjust `const-naming-style` or `const-rgx` to your liking.

  Closes [#&#8203;9770](pylint-dev/pylint#9770)

- Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.

  Closes [#&#8203;9894](pylint-dev/pylint#9894)

- We now raise a `logging-too-few-args` for format string with no
  interpolation arguments at all (i.e. for something like `logging.debug("Awaiting process %s")`
  or `logging.debug("Awaiting process {pid}")`). Previously we did not raise for such case.

  Closes [#&#8203;9999](pylint-dev/pylint#9999)

- Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later.

  Closes [#&#8203;10028](pylint-dev/pylint#10028)

- Fix a false negative for `possibly-used-before-assignment` when a variable is conditionally defined
  and later assigned to a type-annotated variable.

  Closes [#&#8203;10421](pylint-dev/pylint#10421)

- Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence.

  Refs [#&#8203;10453](pylint-dev/pylint#10453)

- Count match cases for `too-many-branches` check.

  Refs [#&#8203;10542](pylint-dev/pylint#10542)

- Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement.

  Refs [#&#8203;10633](pylint-dev/pylint#10633)

## Other Bug Fixes

- When displaying unicode with surrogates (or other potential `UnicodeEncodeError`),
  pylint will now display a '?' character (using `encode(encoding="utf-8", errors="replace")`)
  instead of crashing. The functional tests classes are also updated to handle this case.

  Closes [#&#8203;8736](pylint-dev/pylint#8736)

- Fixed unidiomatic-typecheck only checking left-hand side.

  Closes [#&#8203;10217](pylint-dev/pylint#10217)

- Fix a crash caused by malformed format strings when using `.format` with keyword arguments.

  Closes [#&#8203;10282](pylint-dev/pylint#10282)

- Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions.

  Closes [#&#8203;10508](pylint-dev/pylint#10508)

- Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max`
  instead of `min` or `max` directly.

  Closes [#&#8203;10626](pylint-dev/pylint#10626)

- Fixed a crash in :ref:`unnecessary-dict-index-lookup` when the index of an enumerated list
  was deleted inside a for loop.

  Closes [#&#8203;10627](pylint-dev/pylint#10627)

## Other Changes

- Remove support for launching pylint with Python 3.9.
  Code that supports Python 3.9 can still be linted with the `--py-version=3.9` setting.

  Refs [#&#8203;10405](pylint-dev/pylint#10405)

## Internal Changes

- Modified test framework to allow for different test output for different Python versions.

  Refs [#&#8203;10382](pylint-dev/pylint#10382)

</details>

---

### Configuration

πŸ“… **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

β™» **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

πŸ”• **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==-->

Reviewed-on: https://git.tainton.uk/repos/roboluke/pulls/384
Co-authored-by: renovate[bot] <[email protected]>
Co-committed-by: renovate[bot] <[email protected]>
luketainton pushed a commit to luketainton/epage that referenced this pull request Oct 13, 2025
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.3` -> `<4.1.0,>=4.0.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pylint/4.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pylint/3.3.9/4.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>pylint-dev/pylint (pylint)</summary>

### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0)

[Compare Source](pylint-dev/pylint@v3.3.9...v4.0.0)

- Pylint now supports Python 3.14.

- Pylint's inference engine (`astroid`) is now much more precise,
  understanding implicit booleanness and ternary expressions. (Thanks [@&#8203;zenlyj](https://github.com/zenlyj)!)

Consider this example:

```python
class Result:
    errors: dict | None = None

result = Result()
if result.errors:
    result.errors[field_key]

### inference engine understands result.errors cannot be None
### pylint no longer raises unsubscriptable-object
```

The required `astroid` version is now 4.0.0. See the [astroid changelog](https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-4-0-0) for additional fixes, features, and performance improvements applicable to pylint.

- Handling of `invalid-name` at the module level was patchy. Now,
  module-level constants that are reassigned are treated as variables and checked
  against `--variable-rgx` rather than `--const-rgx`. Module-level lists,
  sets, and objects can pass against either regex.

Here, `LIMIT` is reassigned, so pylint only uses `--variable-rgx`:

```python
LIMIT = 500  # [invalid-name]
if sometimes:
    LIMIT = 1  # [invalid-name]
```

If this is undesired, refactor using *exclusive* assignment so that it is
evident that this assignment happens only once:

```python
if sometimes:
    LIMIT = 1
else:
    LIMIT = 500  # exclusive assignment: uses const regex, no warning
```

Lists, sets, and objects still pass against either `const-rgx` or `variable-rgx`
even if reassigned, but are no longer completely skipped:

```python
MY_LIST = []
my_list = []
My_List = []  # [invalid-name]
```

Remember to adjust the [regexes](https://pylint.readthedocs.io/en/latest/user_guide/messages/convention/invalid-name.html) and [allow lists](https://pylint.readthedocs.io/en/latest/user_guide/configuration/all-options.html#good-names) to your liking.

## Breaking Changes

- `invalid-name` now distinguishes module-level constants that are assigned only once
  from those that are reassigned and now applies `--variable-rgx` to the latter. Values
  other than literals (lists, sets, objects) can pass against either the constant or
  variable regexes (e.g. "LOGGER" or "logger" but not "LoGgEr").

  Remember that `--good-names` or `--good-names-rgxs` can be provided to explicitly
  allow good names.

  Closes [#&#8203;3585](pylint-dev/pylint#3585)

- The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated
  and will be removed.

  Refs [#&#8203;6052](pylint-dev/pylint#6052)

- Commented out code blocks such as `#    bar() # TODO: remove dead code` will no longer emit `fixme`.

  Refs [#&#8203;9255](pylint-dev/pylint#9255)

- `pyreverse` `Run` was changed to no longer call `sys.exit()` in its `__init__`.
  You should now call `Run(args).run()` which will return the exit code instead.
  Having a class that always raised a `SystemExit` exception was considered a bug.

  Normal usage of pyreverse through the CLI will not be affected by this change.

  Refs [#&#8203;9689](pylint-dev/pylint#9689)

- The `suggestion-mode` option was removed, as pylint now always emits user-friendly hints instead
  of false-positive error messages. You should remove it from your conf if it's defined.

  Refs [#&#8203;9962](pylint-dev/pylint#9962)

- The `async.py` checker module has been renamed to `async_checker.py` since `async` is a Python keyword
  and cannot be imported directly. This allows for better testing and extensibility of the async checker functionality.

  Refs [#&#8203;10071](pylint-dev/pylint#10071)

- The message-id of `continue-in-finally` was changed from `E0116` to `W0136`. The warning is
  now emitted for every Python version since it will raise a syntax warning in Python 3.14.
  See [PEP 765 - Disallow return/break/continue that exit a finally block](https://peps.python.org/pep-0765/).

  Refs [#&#8203;10480](pylint-dev/pylint#10480)

- Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead.

  Refs [#&#8203;10583](pylint-dev/pylint#10583)

- Version requirement for `isort` has been bumped to >=5.0.0.
  The internal compatibility for older `isort` versions exposed via `pylint.utils.IsortDriver` has
  been removed.

  Refs [#&#8203;10637](pylint-dev/pylint#10637)

## New Features

- `comparison-of-constants` now uses the unicode from the ast instead of reformatting from
  the node's values preventing some bad formatting due to `utf-8` limitation. The message now uses
  `"` instead of `'` to better work with what the python ast returns.

  Refs [#&#8203;8736](pylint-dev/pylint#8736)

- Enhanced pyreverse to properly distinguish between UML relationship types (association, aggregation, composition) based on object ownership semantics. Type annotations without assignment are now treated as associations, parameter assignments as aggregations, and object instantiation as compositions.

  Closes [#&#8203;9045](pylint-dev/pylint#9045)
  Closes [#&#8203;9267](pylint-dev/pylint#9267)

- The `fixme` check can now search through docstrings as well as comments, by using
  `check-fixme-in-docstring = true` in the `[tool.pylint.miscellaneous]` section.

  Closes [#&#8203;9255](pylint-dev/pylint#9255)

- The `use-implicit-booleaness-not-x` checks now distinguish between comparisons
  used in boolean contexts and those that are not, enabling them to provide more accurate refactoring suggestions.

  Closes [#&#8203;9353](pylint-dev/pylint#9353)

- The verbose option now outputs the filenames of the files that have been checked.
  Previously, it only included the number of checked and skipped files.

  Closes [#&#8203;9357](pylint-dev/pylint#9357)

- colorized reporter now colorizes messages/categories that have been configured as `fail-on` in red inverse.
  This makes it easier to quickly find the errors that are causing pylint CI job failures.

  Closes [#&#8203;9898](pylint-dev/pylint#9898)

- Enhanced support for [@&#8203;property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.

  Closes [#&#8203;10057](pylint-dev/pylint#10057)

- Add --max-depth option to pyreverse to control diagram complexity. A depth of 0 shows only top-level packages, 1 shows one level of subpackages, etc.
  This helps manage visualization of large codebases by limiting the depth of displayed packages and classes.

  Refs [#&#8203;10077](pylint-dev/pylint#10077)

- Handle deferred evaluation of annotations in Python 3.14.

  Closes [#&#8203;10149](pylint-dev/pylint#10149)

- Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).

  Closes [#&#8203;10236](pylint-dev/pylint#10236)

- `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`.

  Closes [#&#8203;10242](pylint-dev/pylint#10242)

- pypy 3.11 is now officially supported.

  Refs [#&#8203;10287](pylint-dev/pylint#10287)

- Add support for Python 3.14.

  Refs [#&#8203;10467](pylint-dev/pylint#10467)

- Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style.

  Refs [#&#8203;10541](pylint-dev/pylint#10541)

## New Checks

- Add `match-statements` checker and the following message:
  `bare-name-capture-pattern`.
  This will emit an error message when a name capture pattern is used in a match statement which would make the remaining patterns unreachable.
  This code is a SyntaxError at runtime.

  Closes [#&#8203;7128](pylint-dev/pylint#7128)

- Add new check `async-context-manager-with-regular-with` to detect async context managers used with regular `with` statements instead of `async with`.

  Refs [#&#8203;10408](pylint-dev/pylint#10408)

- Add `break-in-finally` warning. Using `break` inside the `finally` clause
  will raise a syntax warning in Python 3.14.
  See `PEP 765 - Disallow return/break/continue that exit a finally block <https://peps.python.org/pep-0765/>`\_.

  Refs [#&#8203;10480](pylint-dev/pylint#10480)

- Add new checks for invalid uses of class patterns in :keyword:`match`.

  - :ref:`invalid-match-args-definition` is emitted if :py:data:`object.__match_args__` isn't a tuple of strings.
  - :ref:`too-many-positional-sub-patterns` if there are more positional sub-patterns than specified in :py:data:`object.__match_args__`.
  - :ref:`multiple-class-sub-patterns` if there are multiple sub-patterns for the same attribute.

  Refs [#&#8203;10559](pylint-dev/pylint#10559)

- Add additional checks for suboptimal uses of class patterns in :keyword:`match`.

  - :ref:`match-class-bind-self` is emitted if a name is bound to `self` instead of
    using an `as` pattern.
  - :ref:`match-class-positional-attributes` is emitted if a class pattern has positional
    attributes when keywords could be used.

  Refs [#&#8203;10587](pylint-dev/pylint#10587)

- Add a `consider-math-not-float` message. `float("nan")` and `float("inf")` are slower
  than their counterpart `math.inf` and `math.nan` by a factor of 4 (notwithstanding
  the initial import of math) and they are also not well typed when using mypy.
  This check also catches typos in float calls as a side effect.

  The :ref:`pylint.extensions.code_style` need to be activated for this check to work.

  Refs [#&#8203;10621](pylint-dev/pylint#10621)

## False Positives Fixed

- Fix a false positive for `used-before-assignment` when a variable defined under
  an `if` and via a named expression (walrus operator) is used later when guarded
  under the same `if` test.

  Closes [#&#8203;10061](pylint-dev/pylint#10061)

- Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14.

  Closes [#&#8203;10632](pylint-dev/pylint#10632)

## False Negatives Fixed

- Fix false negative for `used-before-assignment` when a `TYPE_CHECKING` import is used as a type annotation prior to erroneous usage.

  Refs [#&#8203;8893](pylint-dev/pylint#8893)

- Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.

  Refs [#&#8203;9667](pylint-dev/pylint#9667)

- Check module-level constants with type annotations for `invalid-name`.
  Remember to adjust `const-naming-style` or `const-rgx` to your liking.

  Closes [#&#8203;9770](pylint-dev/pylint#9770)

- Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.

  Closes [#&#8203;9894](pylint-dev/pylint#9894)

- We now raise a `logging-too-few-args` for format string with no
  interpolation arguments at all (i.e. for something like `logging.debug("Awaiting process %s")`
  or `logging.debug("Awaiting process {pid}")`). Previously we did not raise for such case.

  Closes [#&#8203;9999](pylint-dev/pylint#9999)

- Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later.

  Closes [#&#8203;10028](pylint-dev/pylint#10028)

- Fix a false negative for `possibly-used-before-assignment` when a variable is conditionally defined
  and later assigned to a type-annotated variable.

  Closes [#&#8203;10421](pylint-dev/pylint#10421)

- Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence.

  Refs [#&#8203;10453](pylint-dev/pylint#10453)

- Count match cases for `too-many-branches` check.

  Refs [#&#8203;10542](pylint-dev/pylint#10542)

- Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement.

  Refs [#&#8203;10633](pylint-dev/pylint#10633)

## Other Bug Fixes

- When displaying unicode with surrogates (or other potential `UnicodeEncodeError`),
  pylint will now display a '?' character (using `encode(encoding="utf-8", errors="replace")`)
  instead of crashing. The functional tests classes are also updated to handle this case.

  Closes [#&#8203;8736](pylint-dev/pylint#8736)

- Fixed unidiomatic-typecheck only checking left-hand side.

  Closes [#&#8203;10217](pylint-dev/pylint#10217)

- Fix a crash caused by malformed format strings when using `.format` with keyword arguments.

  Closes [#&#8203;10282](pylint-dev/pylint#10282)

- Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions.

  Closes [#&#8203;10508](pylint-dev/pylint#10508)

- Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max`
  instead of `min` or `max` directly.

  Closes [#&#8203;10626](pylint-dev/pylint#10626)

- Fixed a crash in :ref:`unnecessary-dict-index-lookup` when the index of an enumerated list
  was deleted inside a for loop.

  Closes [#&#8203;10627](pylint-dev/pylint#10627)

## Other Changes

- Remove support for launching pylint with Python 3.9.
  Code that supports Python 3.9 can still be linted with the `--py-version=3.9` setting.

  Refs [#&#8203;10405](pylint-dev/pylint#10405)

## Internal Changes

- Modified test framework to allow for different test output for different Python versions.

  Refs [#&#8203;10382](pylint-dev/pylint#10382)

</details>

---

### Configuration

πŸ“… **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

β™» **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

πŸ”• **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==-->

Reviewed-on: https://git.tainton.uk/repos/epage/pulls/168
Co-authored-by: renovate[bot] <[email protected]>
Co-committed-by: renovate[bot] <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Enhancement ✨ Improvement to a component pyreverse Related to pyreverse component

Projects

None yet

Development

Successfully merging this pull request may close these issues.

set depth in pyreverse

3 participants