Skip to content

Add support of sharing message in multiple checkers. Fix DeprecatedChecker example #6693

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Jun 16, 2022

Conversation

matusvalo
Copy link
Collaborator

@matusvalo matusvalo commented May 24, 2022

Type of Changes

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

Description

This PR move message definitions from msgs attribute of DeprecatecMixin to separate class attributes. msgs attribute cannot be used directly anyway because it mixes two different message classes: W15XX and W04XX.

Closes #6656

@coveralls
Copy link

coveralls commented May 25, 2022

Pull Request Test Coverage Report for Build 2493613951

  • 13 of 13 (100.0%) changed or added relevant lines in 6 files are covered.
  • 260 unchanged lines in 25 files lost coverage.
  • Overall coverage increased (+0.1%) to 95.543%

Files with Coverage Reduction New Missed Lines %
pylint/checkers/spelling.py 1 77.78%
pylint/extensions/comparetozero.py 1 97.06%
pylint/utils/docs.py 1 98.15%
pylint/checkers/base/basic_error_checker.py 2 95.45%
pylint/checkers/modified_iterating_checker.py 2 97.56%
pylint/config/arguments_manager.py 2 98.22%
pylint/checkers/base/docstring_checker.py 3 96.63%
pylint/config/find_default_config_files.py 3 89.23%
pylint/extensions/docparams.py 3 98.43%
pylint/checkers/imports.py 4 94.42%
Totals Coverage Status
Change from base Build 2378134557: 0.1%
Covered Lines: 16420
Relevant Lines: 17186

πŸ’› - Coveralls

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.

Would it be possible to add a short example in the developer guide, please ? I think this one checker is very likely to be customized. (Maybe we could provide a way to just configure what is deprecated or not in the configuration but that's probably for another MR)

@matusvalo
Copy link
Collaborator Author

Would it be possible to add a short example in the developer guide, please ?

I can. Should be done in this MR or should I create new one?

Moreover I think, we should include in our tests execution of the examples to avoid having them outdated and not running...

@Pierre-Sassoulas
Copy link
Member

Pierre-Sassoulas commented May 25, 2022

Either works :)

Related to your last point about checking the exemples of the doc we'd need some kind of structure like for bad.py / good.py, but this is a really neat idea !


msgs: dict[str, MessageDefinitionTuple] = {
DEPRECATED_MSGS: dict[str, MessageDefinitionTuple] = {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Shouldn't this be called:

Suggested change
DEPRECATED_MSGS: dict[str, MessageDefinitionTuple] = {
DEPRECATED_MSGS_STDLIB: dict[str, MessageDefinitionTuple] = {

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This is a question how DeprecatedMixin is supposed to be used:

  • should external users reuse DeprecatedMixin?
    • if yes should they use MSGS which are used also in STDLIB checker (W15XX) and import checker (W0402)? If W15XX and W0402 are reused also for external users the renaming is confusing then because it is not connected to STDLIB only.
    • if no we should somehow parametrize the mixin allowing users to specify which message should be raised
  • if external users should not reuse DeprecatedMixin we can do the renaming.

Copy link
Member

Choose a reason for hiding this comment

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

should external users reuse DeprecatedMixin?

I'm wondering why we do not have a configuration for deprecations checks ? Isn't it possible to have user modifiable deprecated_functions, deprecated_classes list options ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I'm wondering why we do not have a configuration for deprecations checks ? Isn't it possible to have user modifiable deprecated_functions, deprecated_classes list options ?

We can provide to the user these options. Should it go with this PR?

In any case I think some users will need subclassing DeprecatedMixin. By subclassing mixin user can check the deprecated function also based on version - e.g. django plugin can check deprecated django functions/classes based on django version. This cannot be done by simple list of functions/modules in configuration file.

Copy link
Member

Choose a reason for hiding this comment

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

We can provide to the user these options. Should it go with this PR?

Let's first handle this PR.

By subclassing mixin user can check the deprecated function also based on version - e.g. django plugin can check deprecated django functions/classes based on django version.

Ha right, it make sense.

@Pierre-Sassoulas Pierre-Sassoulas modified the milestones: 2.14.0, 2.15.0 Jun 1, 2022
@DanielNoord
Copy link
Collaborator

DanielNoord commented Jun 2, 2022

@matusvalo What about moving these messages to (for example) 49xx and special casing 49xx in the CI check to be mixed with other prefixes? Wouldn't that also solve the problem?

Edit: That also allows plugin writers to use our CI check by creating any new deprecation messages with 49xx as well.

@matusvalo
Copy link
Collaborator Author

What about moving these messages to (for example) 49xx and special casing 49xx in the CI check to be mixed with other prefixes? Wouldn't that also solve the problem?

@DanielNoord unfortunately I don't understand. :-( What is CI?

@DanielNoord
Copy link
Collaborator

What about moving these messages to (for example) 49xx and special casing 49xx in the CI check to be mixed with other prefixes? Wouldn't that also solve the problem?

@DanielNoord unfortunately I don't understand. :-( What is CI?

Continuous Integration. The checks we run with Github Actions.

The reason for the weird dictionary creation is because we have a check that makes sure that all messages in a checker have the same first two digits. This is what is causing issues for this Mixin. It's defining messages for different checkers that have different "prefixes" (those two first digits).
My idea is to create a prefix for the mixing (let's say 49) and then allow that prefix to be mixed with other prefixes in checkers. That would remove the need for the double dictionaries and still pass all tests.

@matusvalo
Copy link
Collaborator Author

My idea is to create a prefix for the mixing (let's say 49) and then allow that prefix to be mixed with other prefixes in checkers. That would remove the need for the double dictionaries and still pass all tests.

I understand now. But I have a two questions:

  1. stdlib checker and import checker should be migrated to the new codes of mixin? If yes it will break backward compatibility (e.g. msg ID W0402 for deprecated-module will change to W49XY).
  2. other posibility is to leave deprecated-module/W0402 in stdlib checker and create new on derecated-module2/W4902. I don't like it because it is confusing for users (why we have multiple messages for deprecated-module? Again maybe we can have 2 checks with same name with different msg ID but this will be totally confusing

Hence, for now I did most safest change:

  1. I have added shared_messages dictionary where you have messages which are not checked by consistency check.
  2. I have left all messages from stdlib checker/import checker in DeprecatedMixin
    The change is backward compatible and user friendly. The only issue is that the Message IDs are coming from different checkers (not ideal better to have special msg IDs for the mixin), but I consider it a lesser evil comparing to previous 2 points/questions.

@matusvalo
Copy link
Collaborator Author

Hm CI is failing due inconsistent Messages. Now I see why we were talking about CI... :-/

@github-actions

This comment has been minimized.

@DanielNoord
Copy link
Collaborator

  1. stdlib checker and import checker should be migrated to the new codes of mixin? If yes it will break backward compatibility (e.g. msg ID W0402 for deprecated-module will change to W49XY).

Let's do this with the old_names setup. You can look at missing-class-docstring to see how that works normally. That is a safe way to rename messages to new ids.

@github-actions

This comment has been minimized.

Copy link
Collaborator

@DanielNoord DanielNoord left a comment

Choose a reason for hiding this comment

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

This is exactly what I meant! Thanks @matusvalo!

Only one issue remains:
The creation of the messages documentation. As you can see from the RTD output we're not creating two pages for every message in the MixIn as they are found on two checkers. Do you think you'll be able to find a solution for this or do you need some pointers? I don't have a good idea yet, but since this is based on our own Sphinx extension it shouldn't be too hard!

@matusvalo
Copy link
Collaborator Author

@DanielNoord @Pierre-Sassoulas please have a look to PR:

  1. The Deprecated messages can be now shared between Checkers using shared option.
  2. The sphinx plugin now can detect shared messages and add the links to the documentation of the messages
  3. The deprecated example was updated and now is working

Copy link
Collaborator

@DanielNoord DanielNoord left a comment

Choose a reason for hiding this comment

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

Some early feedback!

Thanks for all the work you put in to this @matusvalo!

@@ -7,7 +7,7 @@
import os
Copy link
Collaborator

Choose a reason for hiding this comment

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

This all seems to work.

The only thing I would add is to add all checkers that can emit a message to the page. So for these messages both stdlib and imports. But that can also be done in a follow-up.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The only thing I would add is to add all checkers that can emit a message to the page

If I understand your comment correctly, this is already implemented. See _write_single_shared_message_page and _write_single_message_page functions.

Copy link
Collaborator

Choose a reason for hiding this comment

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

@matusvalo Did you decide to do a follow-up? If so, could you open the issue?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The only thing I would add is to add all checkers that can emit a message to the page. So for these messages both stdlib and imports. But that can also be done in a follow-up.

@DanielNoord not sure if I understand. Currently, all checkers emitting the message are showed. Currently, we don't have a Message that is used by multiple checkers, hence only one checker is showed for deprecated-* messages:
image

But the logic is universal, suppose we add to the Imports checker another message used by stdlib checker:

image

When we generate documentation with this code change, following page is showed:
image

matusvalo and others added 2 commits June 11, 2022 13:25
Co-authored-by: DaniΓ«l van Noord <[email protected]>
Co-authored-by: DaniΓ«l van Noord <[email protected]>
@matusvalo matusvalo changed the title Move message definitions from DeprecatedMixin Add support of sharing message in multiple checkers. Fix DeprecatedChecker example Jun 11, 2022
@github-actions

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, amazing work ! It will be useful to make the checker more modular. I wonder if you could create a small explanation on how to do that in the contributor doc on checkers ?

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@matusvalo
Copy link
Collaborator Author

LGTM, amazing work ! It will be useful to make the checker more modular. I wonder if you could create a small explanation on how to do that in the contributor doc on checkers ?

I saw that extra options does not have documentation. So I decided to create separate PR adding all of them: #6947 . Marked as draft because it documents also shared extra option.

Copy link
Collaborator

@DanielNoord DanielNoord left a comment

Choose a reason for hiding this comment

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

Final nitpicks. Thanks @matusvalo πŸ‘

@@ -7,7 +7,7 @@
import os
Copy link
Collaborator

Choose a reason for hiding this comment

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

@matusvalo Did you decide to do a follow-up? If so, could you open the issue?

Co-authored-by: DaniΓ«l van Noord <[email protected]>
@github-actions
Copy link
Contributor

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

Effect on black:
The following messages are now emitted:

  1. deprecated-argument:
    Using deprecated argument loop of method gather()
    https://github.com/psf/black/blob/main/src/black/__init__.py#L878
  2. deprecated-argument:
    Using deprecated argument loop of method gather()
    https://github.com/psf/black/blob/main/src/black/concurrency.py#L49

The following messages are no longer emitted:

  1. deprecated-argument:
    Using deprecated argument loop of method gather()
    https://github.com/psf/black/blob/main/src/black/__init__.py#L878
  2. deprecated-argument:
    Using deprecated argument loop of method gather()
    https://github.com/psf/black/blob/main/src/black/concurrency.py#L49

Effect on pandas:
The following messages are now emitted:

  1. deprecated-module:
    Deprecated module 'optparse'
    https://github.com/pandas-dev/pandas/blob/main/pandas/util/_print_versions.py#L138

The following messages are no longer emitted:

  1. deprecated-module:
    Deprecated module 'optparse'
    https://github.com/pandas-dev/pandas/blob/main/pandas/util/_print_versions.py#L138

Effect on sentry:
The following messages are now emitted:

  1. deprecated-decorator:
    Using deprecated decorator abc.abstractproperty()
    https://github.com/getsentry/sentry/blob/master/src/sentry/unmerge.py#L62
  2. deprecated-module:
    Deprecated module 'distutils.version'
    https://github.com/getsentry/sentry/blob/master/src/sentry/sdk_updates.py#L2
  3. deprecated-module:
    Deprecated module 'asyncore'
    https://github.com/getsentry/sentry/blob/master/src/sentry/services/smtp.py#L1
  4. deprecated-module:
    Deprecated module 'smtpd'
    https://github.com/getsentry/sentry/blob/master/src/sentry/services/smtp.py#L4
  5. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L11
  6. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L17
  7. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L25
  8. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L30
  9. deprecated-decorator:
    Using deprecated decorator abc.abstractproperty()
    https://github.com/getsentry/sentry/blob/master/src/sentry/web/frontend/unsubscribe_notifications.py#L46
  10. deprecated-decorator:
    Using deprecated decorator abc.abstractproperty()
    https://github.com/getsentry/sentry/blob/master/src/sentry/web/frontend/unsubscribe_notifications.py#L50
  11. deprecated-method:
    Using deprecated method getcallargs()
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/services.py#L298
  12. deprecated-method:
    Using deprecated method setDaemon()
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/pubsub.py#L40
  13. deprecated-method:
    Using deprecated method setDaemon()
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/metrics.py#L105
  14. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/base.py#L5
  15. deprecated-module:
    Deprecated module 'distutils.core'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/base.py#L6
  16. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/build_js_sdk_registry.py#L8
  17. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/build_assets.py#L10
  18. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/build_integration_docs.py#L2
  19. deprecated-method:
    Using deprecated method getcallargs()
    https://github.com/getsentry/sentry/blob/master/src/sentry/tsdb/redissnuba.py#L81
  20. deprecated-module:
    Deprecated module 'optparse'
    https://github.com/getsentry/sentry/blob/master/src/sentry/management/commands/serve_normalize.py#L9
  21. deprecated-method:
    Using deprecated method setDaemon()
    https://github.com/getsentry/sentry/blob/master/src/sentry/bgtasks/api.py#L58

The following messages are no longer emitted:

  1. deprecated-decorator:
    Using deprecated decorator abc.abstractproperty()
    https://github.com/getsentry/sentry/blob/master/src/sentry/unmerge.py#L62
  2. deprecated-module:
    Deprecated module 'distutils.version'
    https://github.com/getsentry/sentry/blob/master/src/sentry/sdk_updates.py#L2
  3. deprecated-module:
    Deprecated module 'asyncore'
    https://github.com/getsentry/sentry/blob/master/src/sentry/services/smtp.py#L1
  4. deprecated-module:
    Deprecated module 'smtpd'
    https://github.com/getsentry/sentry/blob/master/src/sentry/services/smtp.py#L4
  5. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L11
  6. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L17
  7. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L25
  8. deprecated-method:
    Using deprecated method currentThread()
    https://github.com/getsentry/sentry/blob/master/src/sentry/debug/utils/thread_collector.py#L30
  9. deprecated-decorator:
    Using deprecated decorator abc.abstractproperty()
    https://github.com/getsentry/sentry/blob/master/src/sentry/web/frontend/unsubscribe_notifications.py#L46
  10. deprecated-decorator:
    Using deprecated decorator abc.abstractproperty()
    https://github.com/getsentry/sentry/blob/master/src/sentry/web/frontend/unsubscribe_notifications.py#L50
  11. deprecated-method:
    Using deprecated method getcallargs()
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/services.py#L298
  12. deprecated-method:
    Using deprecated method setDaemon()
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/pubsub.py#L40
  13. deprecated-method:
    Using deprecated method setDaemon()
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/metrics.py#L105
  14. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/base.py#L5
  15. deprecated-module:
    Deprecated module 'distutils.core'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/base.py#L6
  16. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/build_js_sdk_registry.py#L8
  17. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/build_assets.py#L10
  18. deprecated-module:
    Deprecated module 'distutils'
    https://github.com/getsentry/sentry/blob/master/src/sentry/utils/distutils/commands/build_integration_docs.py#L2
  19. deprecated-method:
    Using deprecated method getcallargs()
    https://github.com/getsentry/sentry/blob/master/src/sentry/tsdb/redissnuba.py#L81
  20. deprecated-module:
    Deprecated module 'optparse'
    https://github.com/getsentry/sentry/blob/master/src/sentry/management/commands/serve_normalize.py#L9
  21. deprecated-method:
    Using deprecated method setDaemon()
    https://github.com/getsentry/sentry/blob/master/src/sentry/bgtasks/api.py#L58

This comment was generated for commit 7be4aab

Copy link
Collaborator

@DanielNoord DanielNoord left a comment

Choose a reason for hiding this comment

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

https://github.com/PyCQA/pylint/pull/6693/files#r896124542
https://github.com/PyCQA/pylint/pull/6693/files#r896129061

@matusvalo I think you resolved these without answering the questions in them. Or am I overseeing your answers somewhere?

{"old_names": [("W1513", "old-deprecated-decorator")], "shared": True},
),
}

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I splitted the messages because when documentation is generated, the messages attached to the checkers are discovered. I wanted to avoid to listing messages not emitted by checker in the documentation (e.g. ImportsChecker is using only deprecated-module)

):
shared_messages_list = list(shared_messages)
if len(shared_messages_list) > 1:
_write_single_shared_message_page(category_dir, shared_messages_list)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

_write_single_shared_message_page is used when we have multiple checkers using the same message. Currently, there is no such message, but I added it to cover all cases.

@@ -7,7 +7,7 @@
import os
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The only thing I would add is to add all checkers that can emit a message to the page

If I understand your comment correctly, this is already implemented. See _write_single_shared_message_page and _write_single_message_page functions.

@@ -7,7 +7,7 @@
import os
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The only thing I would add is to add all checkers that can emit a message to the page. So for these messages both stdlib and imports. But that can also be done in a follow-up.

@DanielNoord not sure if I understand. Currently, all checkers emitting the message are showed. Currently, we don't have a Message that is used by multiple checkers, hence only one checker is showed for deprecated-* messages:
image

But the logic is universal, suppose we add to the Imports checker another message used by stdlib checker:

image

When we generate documentation with this code change, following page is showed:
image

@matusvalo
Copy link
Collaborator Author

https://github.com/PyCQA/pylint/pull/6693/files#r896124542 https://github.com/PyCQA/pylint/pull/6693/files#r896129061

@matusvalo I think you resolved these without answering the questions in them. Or am I overseeing your answers somewhere?

@DanielNoord My bad. I had pending review, for days and I missed that. I left you multiple messages waiting for publishing 🀦

@DanielNoord
Copy link
Collaborator

https://github.com/PyCQA/pylint/pull/6693/files#r896124542 https://github.com/PyCQA/pylint/pull/6693/files#r896129061
@matusvalo I think you resolved these without answering the questions in them. Or am I overseeing your answers somewhere?

@DanielNoord My bad. I had pending review, for days and I missed that. I left you multiple messages waiting for publishing 🀦

Well it seems I was mistaken as well. The only thing I was worried about was #6693 (comment) and you already fixed that before I even mentioned it.

Thanks for all the work here @matusvalo, LVGTM πŸ‘

@matusvalo
Copy link
Collaborator Author

Thank you @DanielNoord @Pierre-Sassoulas for your review!

@matusvalo matusvalo merged commit e666506 into pylint-dev:main Jun 16, 2022
@matusvalo matusvalo deleted the fix_deprecated_example branch June 16, 2022 09:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

deprecation_checker example is not working
4 participants