Skip to content
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

Add basic support for PEP 702 (@deprecated). #17476

Open
wants to merge 36 commits into
base: master
Choose a base branch
from

Conversation

tyralla
Copy link
Contributor

@tyralla tyralla commented Jul 3, 2024

Closes #16111

This PR provides only basic support. Many special cases might need additional attention (descriptors, some special methods like __int__, etc.). Other open issues are code comments, eventual documentation updates, the deprecation message style, etc.). But I wanted to offer these first steps before going on vacation (so I cannot respond to possible reviews too soon).

Maybe someone wants to extend the list of (test) cases the basic support should address?

This comment has been minimized.

This comment has been minimized.

@JelleZijlstra JelleZijlstra self-requested a review July 3, 2024 21:35
@JelleZijlstra
Copy link
Member

Thank you! I'll review this soon.

mypy/checker.py Outdated Show resolved Hide resolved
Copy link
Member

@JelleZijlstra JelleZijlstra left a comment

Choose a reason for hiding this comment

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

Thanks, this is looking pretty good!

mypy/checker.py Outdated Show resolved Hide resolved
mypy/checker.py Outdated Show resolved Hide resolved
mypy/errorcodes.py Show resolved Hide resolved
test-data/unit/check-deprecated.test Outdated Show resolved Hide resolved
mypy/checker.py Outdated Show resolved Hide resolved
@JelleZijlstra
Copy link
Member

mkosi (https://github.com/systemd/mkosi)
+ mkosi/log.py:92:34: error: logging.getLevelName is deprecated - The str -> int case is considered a mistake.  [deprecated]

This is a case where just one overload is deprecated, so I think logging.getLevelName is deprecated is misleading.

For reference, pyright has the same issue:

  /Users/jelle/py/tmp/deproverl.py:18:1 - error: The function "f" is deprecated
    no more floats (reportDeprecated)

Pyanalyze prints the affected overload (but appears to have a bug where the signature degenerates to (*Any, **Any) -> Any:

Use of deprecated overload (*args: Any[inference], **kwargs: Any[inference]) -> Any[unannotated]: no more floats (code: deprecated)
In /Users/jelle/py/tmp/deproverl.py at line 18

I would want it to either print the actual deprecated signature (like pyanalyze) or say something like "Deprecated call to logging.getLevelName", indicating that the function isn't fully deprecated, just this way of calling it is deprecated.

JelleZijlstra added a commit to python/typeshed that referenced this pull request Jul 4, 2024
Noticed this in primer output from python/mypy#17476.

This comment has been minimized.

This comment has been minimized.

AlexWaygood pushed a commit to python/typeshed that referenced this pull request Jul 4, 2024
Noticed this in primer output from python/mypy#17476.

This comment has been minimized.

Check that imported or used feature is deprecated [deprecated]
--------------------------------------------------------------

If you use :option:`--warn-deprecated <mypy --warn-deprecated>`, mypy generates a note if
Copy link
Member

@ilevkivskyi ilevkivskyi Jul 4, 2024

Choose a reason for hiding this comment

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

It looks like there has been some back and forth so docs are out of sync now. To summarize how I see the logic should be:

  • Deprecation messages are always shown as notes by default (with code shown, see my previous comment), this will result in exit code 0 (which is kind of my main concern, I don't want users CI to break unnecessarily on new mypy version).
  • People who still don't want to see the notes, can use --disable-error-code=deprecated and/or # type: ignore[deprecated].
  • There should be a flag that turns notes into errors (for more pedantic people). They will still be able to selectively silence the errors using # type: ignore[deprecated].

Copy link
Contributor Author

Choose a reason for hiding this comment

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

  • There should be a flag that turns notes into errors (for more pedantic people).

Does Mypy implement other checks that can result in errors or notes, depending on an option? (I'm just asking to avoid reinventing the wheel.)

Copy link
Member

Choose a reason for hiding this comment

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

TBH I don't remember. But in any case it should be as simple as changing last line in your warn_deprecated() method in checker.py to something like

if self.options.error_on_deprecated:  # or other flag name
    self.error(...)
else:
    self.note(...)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That seems doable, thanks. I will implement it later.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done! report-deprecated-as-error is the shortest understandable description I could come up with. Other suggestions are welcome, of course.

This comment has been minimized.

This comment has been minimized.

@Youssefares
Copy link

@tyralla are you looking at implementing the feedback for this? I am happy to pick up where you left off otherwise.

This comment has been minimized.

@tyralla
Copy link
Contributor Author

tyralla commented Aug 27, 2024

Sorry, I was too busy the last few weeks to continue working on it.

@Youssefares: I could try to thoroughly address the last remarks in mid-September, but definitely not earlier, and Python 3.13 is on its way. So please do not hesitate if you can start sooner.

@ilevkivskyi:

  • As CallableType already has "symbol properties" ('name', 'definition') for error messages, I assumed that adding deprecation messages would be fine. I have had no time so far to check how many complications moving this property would cause. (Maybe not only for overloads but also for descriptors and special methods like __add__?)
  • I also assumed there should be no problem with caching because a relevant change like adding or removing a descriptor should not remain unnoticed (maybe except for changing a deprecation message). But as you were in doubt, I added a few preliminary fine-grained incremental tests and, in fact, found a thing to improve (8c0260e, just pushed). Unfortunately, one test case (with transitive use sites) still fails (cf2dcaf), and I did not have enough time to investigate why. All I can say is that when I set up testAddFunctionDeprecationIndirectImport1 as an actual project (files on disk) and use the daemon "normally", everything seems to work well. Hence, I am unsure whether this is caused by a flaw in my implementation or a test setup problem.
  • I must admit, I still do not know what you mean by "coarse-grained incremental mode". The "normal" caching on disk when using Mypy repeatedly without the Mypy server being involved?

max-muoto pushed a commit to max-muoto/typeshed that referenced this pull request Sep 8, 2024
@tyralla
Copy link
Contributor Author

tyralla commented Sep 13, 2024

@Youssefares: Did you find time to work on it? I could restart soon, but likely only in small steps. (Especially if I have to solve the mystery about testAddFunctionDeprecationIndirectImport1 myself.) So, if you think you can finish this PR faster, please do. Continuing as a Tag Team would also be cool if you like.

This comment has been minimized.

@tyralla
Copy link
Contributor Author

tyralla commented Sep 22, 2024

@Youssefares: Okay, then I'll pick up again.

@ilevkivskyi: a6d0e59 addresses your second remark (moving the deprecation note creation from checker.py to semanal.py) without any functional changes, as far as the tests tell. testAddFunctionDeprecationIndirectImport1 still fails.

tyralla and others added 2 commits September 28, 2024 23:46
…verloaded` to the symbol nodes `FuncDef` and `OverloadedFuncDef`

This comment has been minimized.

@tyralla
Copy link
Contributor Author

tyralla commented Sep 29, 2024

@ilevkivskyi

I moved the attribute deprecated from the types CallableType and Overloaded to the symbol nodes FuncDef and OverloadedFuncDef. All in all, it improves the code. Except for the case of specific overload deprecations. Maybe you know a better solution than the one I implemented.

After all these changes, testAddFunctionDeprecationIndirectImport1 still fails, which strengthens my impression that the test itself is flawed.

Copy link
Member

@ilevkivskyi ilevkivskyi left a comment

Choose a reason for hiding this comment

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

Except for the case of specific overload deprecations

I actually expected this. I think it is a worthy trade-off.

what strenghtens my impression the the test itself is flawed.

Hm, I don't see anything obviously wrong with the test. As a guess you need to update this part to include the new flag https://github.com/python/mypy/blob/master/mypy/server/astdiff.py#L228-L256 (since currently you effectively rely on node kind switching from function to decorator to trigger the update).

Anyway, my current comments are all minor, this is good to merge as soon as you fix the test.

mypy/checker.py Show resolved Hide resolved
mypy/checker.py Outdated Show resolved Hide resolved
mypy/checker.py Outdated Show resolved Hide resolved
mypy/semanal.py Outdated Show resolved Hide resolved
tyralla and others added 4 commits September 29, 2024 20:38
…cial case so that `testDeprecatedAddFunctionDeprecationIndirectImport` passes both with `cache` and `nocache` and add some more tests.
@tyralla
Copy link
Contributor Author

tyralla commented Sep 29, 2024

Hm, I don't see anything obviously wrong with the test. As a guess, you need to update this part to include the new flag https://github.com/python/mypy/blob/master/mypy/server/astdiff.py#L228-L256 (since currently you effectively rely on node kind switching from function to decorator to trigger the update).

My first attempt to include the new flag into the returned tuple made no difference. While thinking about it, I came across the snapshot_symbol_table function. After the change proposed by commit 09a53d5, all tests passed. However, I have no idea about the further implications of this change (performance?). I could investigate further next week, but maybe it is directly clear to you whether the proposed change is a good or bad idea.

Copy link
Contributor

Diff from mypy_primer, showing the effect of this PR on open source code:

parso (https://github.com/davidhalter/parso)
+ parso/tree.py:1: note: class abc.abstractproperty is deprecated: Use 'property' with 'abstractmethod' instead  [deprecated]

SinbadCogs (https://github.com/mikeshardmind/SinbadCogs)
+ rolemanagement/events.py:41: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ embedmaker/serialize.py:81: note: function datetime.datetime.utcfromtimestamp is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .fromtimestamp(datetime.timezone.utc)  [deprecated]
+ antimentionspam/antimentionspam.py:239: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ scheduler/time_utils.py:42: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ embedmaker/time_utils.py:42: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ scheduler/message.py:82: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ modnotes/modnotes.py:148: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

spack (https://github.com/spack/spack)
+ lib/spack/spack/util/package_hash.py:30: note: class ast.Str is deprecated: Replaced by ast.Constant; removed in Python 3.14  [deprecated]

pydantic (https://github.com/pydantic/pydantic)
+ pydantic/deprecated/parse.py:78: note: function pydantic.deprecated.parse.load_str_bytes is deprecated: `load_str_bytes` is deprecated.  [deprecated]
+ pydantic/__init__.py:59: note: function pydantic.deprecated.class_validators.root_validator is deprecated: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details  [deprecated]
+ pydantic/__init__.py:59: note: function pydantic.deprecated.class_validators.validator is deprecated: Pydantic V1 style `@validator` validators are deprecated. You should migrate to Pydantic V2 style `@field_validator` validators, see the migration guide for more details  [deprecated]
+ pydantic/__init__.py:60: note: class pydantic.deprecated.config.BaseConfig is deprecated: BaseConfig is deprecated. Use the `pydantic.ConfigDict` instead.  [deprecated]
+ pydantic/__init__.py:60: note: class pydantic.deprecated.config.Extra is deprecated: Extra is deprecated. Use literal values instead (e.g. `extra='allow'`)  [deprecated]
+ pydantic/color.py:252: note: class pydantic.color.Color is deprecated: The `Color` class is deprecated, use `pydantic_extra_types` instead. See https://docs.pydantic.dev/latest/api/pydantic_extra_types_color/.  [deprecated]
+ pydantic/deprecated/json.py:16: note: class pydantic.color.Color is deprecated: The `Color` class is deprecated, use `pydantic_extra_types` instead. See https://docs.pydantic.dev/latest/api/pydantic_extra_types_color/.  [deprecated]
+ pydantic/deprecated/json.py:132: note: function pydantic.deprecated.json.pydantic_encoder is deprecated: `pydantic_encoder` is deprecated, use `pydantic_core.to_jsonable_python` instead.  [deprecated]
+ pydantic/main.py:1219: note: function pydantic.deprecated.parse.load_str_bytes is deprecated: `load_str_bytes` is deprecated.  [deprecated]
+ pydantic/main.py:1271: note: function pydantic.deprecated.parse.load_file is deprecated: `load_file` is deprecated.  [deprecated]
+ pydantic/main.py:1278: note: function pydantic.main.BaseModel.parse_obj is deprecated: The `parse_obj` method is deprecated; use `model_validate` instead.  [deprecated]
+ pydantic/deprecated/tools.py:101: note: function pydantic.deprecated.tools.schema_of is deprecated: `schema_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.  [deprecated]
+ pydantic/v1/_hypothesis_plugin.py:105: note: class pydantic.color.Color is deprecated: The `Color` class is deprecated, use `pydantic_extra_types` instead. See https://docs.pydantic.dev/latest/api/pydantic_extra_types_color/.  [deprecated]
+ pydantic/v1/_hypothesis_plugin.py:126: note: class pydantic.types.PaymentCardNumber is deprecated: The `PaymentCardNumber` class is deprecated, use `pydantic_extra_types` instead. See https://docs.pydantic.dev/latest/api/pydantic_extra_types_payment/#pydantic_extra_types.payment.PaymentCardNumber.  [deprecated]
+ pydantic/v1/_hypothesis_plugin.py:139: note: class pydantic.types.PaymentCardNumber is deprecated: The `PaymentCardNumber` class is deprecated, use `pydantic_extra_types` instead. See https://docs.pydantic.dev/latest/api/pydantic_extra_types_payment/#pydantic_extra_types.payment.PaymentCardNumber.  [deprecated]
+ pydantic/deprecated/decorator.py:84: note: function pydantic.deprecated.decorator.validate_arguments is deprecated: The `validate_arguments` method is deprecated; use `validate_call` instead.  [deprecated]

Tanjun (https://github.com/FasterSpeeding/Tanjun)
+ tanjun/injecting.py:106: note: class alluka._self_injecting.AsyncSelfInjecting is deprecated: Use Client.auto_inject_async  [deprecated]
+ tanjun/context/base.py:58: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/base.py:133: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/base.py:136: note: function alluka._context.BasicContext._remove_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/slash.py:321: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/slash.py:1042: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/slash.py:1077: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/slash.py:1085: note: function alluka._context.BasicContext._remove_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/message.py:114: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/message.py:184: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/message.py:189: note: function alluka._context.BasicContext._remove_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/autocomplete.py:95: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/menu.py:98: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/menu.py:153: note: function alluka._context.BasicContext._set_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/context/menu.py:156: note: function alluka._context.BasicContext._remove_type_special_case is deprecated: Use ContextOverride  [deprecated]
+ tanjun/annotations.py:1699: note: @overload should be placed before @deprecated

cloud-init (https://github.com/canonical/cloud-init)
+ cloudinit/reporting/handlers.py:378: note: function datetime.datetime.utcfromtimestamp is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .fromtimestamp(datetime.timezone.utc)  [deprecated]
+ tests/integration_tests/clouds.py:328: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ cloudinit/sources/azure/errors.py:55: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ cloudinit/sources/azure/kvp.py:52: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ tests/unittests/sources/azure/test_kvp.py:14: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ tests/integration_tests/test_paths.py:69: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ tests/integration_tests/test_paths.py:101: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

pywin32 (https://github.com/mhammond/pywin32)
+ AutoDuck/fixHelpCompression.py:16:1: note: function win32.win32api.WriteProfileVal is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]
+ win32/Lib/win32serviceutil.py:140:19: note: function win32.win32api.GetProfileVal is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]
+ Pythonwin/pywin/framework/sgrepmdi.py:615:20: note: function win32.win32api.GetProfileSection is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]
+ Pythonwin/pywin/framework/sgrepmdi.py:629:21: note: function win32.win32api.WriteProfileVal is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]
+ Pythonwin/pywin/framework/mdi_pychecker.py:703:20: note: function win32.win32api.GetProfileSection is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]
+ Pythonwin/pywin/framework/mdi_pychecker.py:717:21: note: function win32.win32api.WriteProfileVal is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]
+ Pythonwin/pywin/framework/editor/vss.py:45:20: note: function win32.win32api.GetProfileVal is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]
+ Pythonwin/pywin/framework/editor/vss.py:46:19: note: function win32.win32api.GetProfileVal is deprecated: This function is obsolete, applications should use the registry instead.  [deprecated]

pwndbg (https://github.com/pwndbg/pwndbg)
+ pwndbg/commands/__init__.py: note: In function "OnlyWithResolvedHeapSyms":
+ pwndbg/commands/__init__.py:453: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]

dd-trace-py (https://github.com/DataDog/dd-trace-py)
+ ddtrace/internal/debug.py:121: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ ddtrace/appsec/_iast/_ast/visitor.py:228: note: class ast.Bytes is deprecated: Replaced by ast.Constant; removed in Python 3.14  [deprecated]
+ ddtrace/appsec/_iast/_ast/visitor.py:238: note: class ast.Num is deprecated: Replaced by ast.Constant; removed in Python 3.14  [deprecated]
+ ddtrace/appsec/_iast/_ast/visitor.py:390: note: class ast.NameConstant is deprecated: Replaced by ast.Constant; removed in Python 3.14  [deprecated]
+ ddtrace/profiling/exporter/http.py:219: note: function datetime.datetime.utcfromtimestamp is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .fromtimestamp(datetime.timezone.utc)  [deprecated]
+ ddtrace/profiling/exporter/http.py:220: note: function datetime.datetime.utcfromtimestamp is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .fromtimestamp(datetime.timezone.utc)  [deprecated]

alerta (https://github.com/alerta/alerta)
+ alerta/dev.py:4: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/utils/audit.py:94: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/note.py:25: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/key.py:31: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/key.py:42: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/key.py:164: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/heartbeat.py:56: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/heartbeat.py:59: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/heartbeat.py:61: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/blackout.py:37: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/blackout.py:60: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:66: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:75: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:282: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:335: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:379: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:430: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:574: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:609: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/alert.py:637: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/auth/utils.py:52: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/user.py:41: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/models/user.py:44: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/database/backends/mongodb/utils.py:250: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/database/backends/mongodb/utils.py:252: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/database/backends/mongodb/utils.py:254: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/database/backends/mongodb/utils.py:345: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ alerta/database/backends/mongodb/utils.py:347: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

scrapy (https://github.com/scrapy/scrapy)
+ scrapy/utils/misc.py:279: note: class ast.NameConstant is deprecated: Replaced by ast.Constant; removed in Python 3.14  [deprecated]

openlibrary (https://github.com/internetarchive/openlibrary)
+ openlibrary/core/yearly_reading_goals.py: note: In member "update_current_count" of class "YearlyReadingGoals":
+ openlibrary/core/yearly_reading_goals.py:103: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/core/yearly_reading_goals.py: note: In member "update_target" of class "YearlyReadingGoals":
+ openlibrary/core/yearly_reading_goals.py:121: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/core/edits.py: note: In member "assign_request" of class "CommunityEditsQueue":
+ openlibrary/core/edits.py:231: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/core/edits.py: note: In member "unassign_request" of class "CommunityEditsQueue":
+ openlibrary/core/edits.py:251: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/core/edits.py: note: In member "update_request_status" of class "CommunityEditsQueue":
+ openlibrary/core/edits.py:280: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/core/edits.py: note: In member "comment_request" of class "CommunityEditsQueue":
+ openlibrary/core/edits.py:296: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/core/edits.py: note: In member "create_comment" of class "CommunityEditsQueue":
+ openlibrary/core/edits.py:322: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/plugins/upstream/borrow.py: note: In function "is_loaned_out":
+ openlibrary/plugins/upstream/borrow.py:609: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/plugins/upstream/borrow.py: note: In function "_update_loan_status":
+ openlibrary/plugins/upstream/borrow.py:635: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/plugins/upstream/borrow.py: note: In function "get_ia_auth_dict":
+ openlibrary/plugins/upstream/borrow.py:826: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ openlibrary/plugins/upstream/addbook.py: note: In function "get_recaptcha":
+ openlibrary/plugins/upstream/addbook.py:50: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

discord.py (https://github.com/Rapptz/discord.py)
+ discord/member.py:946: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ discord/member.py:1002: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ discord/ext/tasks/__init__.py:227: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]

comtypes (https://github.com/enthought/comtypes)
+ comtypes/test/__init__.py:140: note: function unittest.loader.makeSuite is deprecated: Deprecated in Python 3.11; removal scheduled for Python 3.13  [deprecated]
+ comtypes/test/__init__.py:210: note: function unittest.loader.makeSuite is deprecated: Deprecated in Python 3.11; removal scheduled for Python 3.13  [deprecated]

speedrun.com_global_scoreboard_webapp (https://github.com/Avasam/speedrun.com_global_scoreboard_webapp)
+ backend/api/api_wrappers.py:56: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ backend/services/user_updater.py:78: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ backend/api/core_api.py:36: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ backend/api/core_api.py:37: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ backend/api/global_scoreboard_api.py:76: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

dragonchain (https://github.com/dragonchain/dragonchain)
+ dragonchain/lib/dto/smart_contract_model.py:100:86: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ dragonchain/lib/dto/smart_contract_model.py:300:112: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ dragonchain/lib/authorization.py:51:12: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ dragonchain/scheduler/scheduler.py:65:42: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

freqtrade (https://github.com/freqtrade/freqtrade)
+ freqtrade/data/history/history_utils.py:125: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ freqtrade/rpc/api_server/api_ws.py:42: note: function pydantic.main.BaseModel.dict is deprecated: The `dict` method is deprecated; use `model_dump` instead.  [deprecated]

pytest-robotframework (https://github.com/detachhead/pytest-robotframework)
+ pytest_robotframework/__init__.py:471: note: @overload should be placed before @deprecated

sockeye (https://github.com/awslabs/sockeye)
+ sockeye/utils.py:843: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ sockeye/model.py:183: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ sockeye/model.py:187: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]

paasta (https://github.com/yelp/paasta)
+ paasta_tools/utils.py:1496: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ paasta_tools/utils.py:3673: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ paasta_tools/utils.py:3680: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ paasta_tools/utils.py:3688: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ paasta_tools/spark_tools.py:136: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/spark_tools.py:204: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/setup_istio_mesh.py:106: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/smartstack_tools.py:476: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/smartstack_tools.py:533: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/cli/cmds/logs.py:809: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/cli/cmds/logs.py:824: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/cli/cmds/logs.py:829: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/cli/cmds/logs.py:1020: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ paasta_tools/cli/cmds/logs.py:1024: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]
+ paasta_tools/cli/cmds/logs.py:1310: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ paasta_tools/cli/cmds/logs.py:1317: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ paasta_tools/cli/cmds/logs.py:1329: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

bandersnatch (https://github.com/pypa/bandersnatch)
+ src/bandersnatch/utils.py: note: In function "make_time_stamp":
+ src/bandersnatch/utils.py:54: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]
+ src/bandersnatch/mirror.py: note: In member "synchronize" of class "Mirror":
+ src/bandersnatch/mirror.py:58: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

optuna (https://github.com/optuna/optuna)
+ optuna/_gp/gp.py:260: note: function logging.Logger.warn is deprecated: Deprecated; use warning() instead.  [deprecated]

typeshed-stats (https://github.com/AlexWaygood/typeshed-stats)
+ website_macros.py:101: note: function datetime.datetime.utcnow is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .now(datetime.timezone.utc)  [deprecated]

tornado (https://github.com/tornadoweb/tornado)
+ tornado/autoreload.py:339: note: function pkgutil.get_loader is deprecated: Use importlib.util.find_spec() instead. Will be removed in Python 3.14.  [deprecated]
+ tornado/test/httputil_test.py:444: note: function datetime.datetime.utcfromtimestamp is deprecated: Use timezone-aware objects to represent datetimes in UTC; e.g. by calling .fromtimestamp(datetime.timezone.utc)  [deprecated]

... (truncated 25 lines) ...```

@tyralla
Copy link
Contributor Author

tyralla commented Sep 29, 2024

Hm, docstring of module astdiff seems to suggest it is a bad idea.

@tyralla
Copy link
Contributor Author

tyralla commented Sep 30, 2024

@ilevkivskyi

I am now quite sure that testDeprecatedAddFunctionDeprecationIndirectImport-only_when_nocache fails due to a more general problem (or my misunderstanding of only_when_nocache). Mypy does not report any of the two obvious errors, no matter which of the four decorator definitions I select:

[case testReplaceFunctionWithDecoratedFunction-only_when_nocache]
from b import f
x: int = f()
import b
y: int = b.f()

[file b.py]
from a import f

[file a.py]
def f() -> int: ...

[file a.py.2]
from typing import Callable, TypeVar

T = TypeVar("T")

# def d(t: str, /) -> Callable[[T], T]: ...  # version 1
# def d(t: str, /) -> Callable[[Callable[[], str]], Callable[[], str]]: ...  # version 2
# def d(t: T, /) -> T: ...  # version 3
def d(t: Callable[[], str], /) -> Callable[[], str]: ...  # version 4

# @d("deprecated")  # version 1 or 2
@d  # version 3 or 4
def f() -> str: ...

[builtins fixtures/tuple.pyi]
[out]
==
main:2: error: Incompatible types in assignment (expression has type "str", variable has type "int")
main:4: error: Incompatible types in assignment (expression has type "str", variable has type "int")

@tyralla
Copy link
Contributor Author

tyralla commented Oct 3, 2024

I now had time for some debugging but did not come to a helpful conclusion.

The already mentioned docstring seems to suggest that snapshots and fine-grained dependencies have nothing to do with each other. I thought that snapshots would be used to determine the triggers that are used in combination with the fine-grained dependency mappings for determining targets that need reprocessing.

Another confusion comes from the fact that Mypy does not fail the following test cast:

[case testReplaceFunctionWithDecoratedFunction-only_when_nocache]
from b import f
x: int = f()

[file b.py]
from a import f

[file a.py]
def f() -> int: ...

[file a.py.2]
def f() -> str: ...

[builtins fixtures/tuple.pyi]
[out]
==
main:2: error: Incompatible types in assignment (expression has type "str", variable has type "int")

It seems to me that Mypy does not handle this test well because of processing the modules in the right order (a -> b -> main) but because of storing the same FuncDef instance in the symbol tables of the three modules. Hence, if a.f is updated when reanalysing a, b and main know this at once. So, Mypy can detect the error also for the processing order a -> main -> b and then starts another iteration step so that the complete processing order becomes a -> main -> b -> main (it actually finds the same error twice).

Again, all this seems to apply only for only_when_nocache.

I suspect those familiar with Mypy's server functionalities will find it much easier to solve this puzzle (or see, where I am thinking in the wrong direction), so I will wait for help.

@ilevkivskyi
Copy link
Member

I will try to look at this on the weekend, there indeed may be a deeper problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add support for PEP 702 (@deprecated)
5 participants