openrewrite-migrate-python 0.17.0.dev20261022150922__tar.gz → 0.17.0.dev20261022193254__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/PKG-INFO +1 -1
  2. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/pyproject.toml +1 -1
  3. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/__init__.py +23 -3
  4. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/_finders.py +109 -0
  5. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/ctypes_deprecations.py +68 -0
  6. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/glob_deprecations.py +52 -3
  7. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/http_server_deprecations.py +61 -0
  8. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/importlib_deprecations.py +136 -0
  9. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/pathlib_deprecations.py +59 -0
  10. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/platform_deprecations.py +51 -1
  11. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/sre_migrations.py +66 -0
  12. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/text_encoding.py +170 -0
  13. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/types_deprecations.py +78 -0
  14. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/typing_deprecations.py +53 -1
  15. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python315.py +23 -1
  16. openrewrite_migrate_python-0.17.0.dev20261022193254/src/openrewrite_migrate_python/migrate/wave_deprecations.py +72 -0
  17. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python.egg-info/PKG-INFO +1 -1
  18. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python.egg-info/SOURCES.txt +15 -0
  19. openrewrite_migrate_python-0.17.0.dev20261022193254/tests/test_ctypes_deprecations.py +19 -0
  20. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_glob_deprecations.py +15 -1
  21. openrewrite_migrate_python-0.17.0.dev20261022193254/tests/test_http_server_deprecations.py +79 -0
  22. openrewrite_migrate_python-0.17.0.dev20261022193254/tests/test_importlib_deprecations.py +70 -0
  23. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_pathlib_deprecations.py +36 -1
  24. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_platform_deprecations.py +15 -1
  25. openrewrite_migrate_python-0.17.0.dev20261022193254/tests/test_sre_migrations.py +26 -0
  26. openrewrite_migrate_python-0.17.0.dev20261022193254/tests/test_text_encoding.py +143 -0
  27. openrewrite_migrate_python-0.17.0.dev20261022193254/tests/test_types_deprecations.py +62 -0
  28. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_typing_deprecations.py +38 -0
  29. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_upgrade_recipes.py +2 -0
  30. openrewrite_migrate_python-0.17.0.dev20261022193254/tests/test_wave_deprecations.py +35 -0
  31. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/setup.cfg +0 -0
  32. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/__init__.py +0 -0
  33. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/__init__.py +0 -0
  34. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/_literals.py +0 -0
  35. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/_negation.py +0 -0
  36. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/assign_return.py +0 -0
  37. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/attr_access.py +0 -0
  38. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/boolean_simplification.py +0 -0
  39. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/collection_literals.py +0 -0
  40. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/comparison_simplification.py +0 -0
  41. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/complex_transforms.py +0 -0
  42. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/comprehension_cleanup.py +0 -0
  43. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/conditionals.py +0 -0
  44. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/datetime_cleanup.py +0 -0
  45. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/dict_cleanup.py +0 -0
  46. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/exception_cleanup.py +0 -0
  47. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/expression_simplification.py +0 -0
  48. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/logger_warn.py +0 -0
  49. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/loop_cleanup.py +0 -0
  50. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/merge_nested_with.py +0 -0
  51. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/merge_startswith_endswith.py +0 -0
  52. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/naming_conventions.py +0 -0
  53. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/negated_operators.py +0 -0
  54. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/none_and_identity.py +0 -0
  55. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/object_inheritance.py +0 -0
  56. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/pandas_cleanup.py +0 -0
  57. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/python_best_practices.py +0 -0
  58. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/range_cleanup.py +0 -0
  59. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/redundant_code.py +0 -0
  60. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/remove_trailing_return_none.py +0 -0
  61. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/string_cleanup.py +0 -0
  62. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/unreachable_code.py +0 -0
  63. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/use_items.py +0 -0
  64. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/use_list_clear.py +0 -0
  65. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/cleanup/yoda_conditions.py +0 -0
  66. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/__init__.py +0 -0
  67. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/_reindent.py +0 -0
  68. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/_semantically_equal.py +0 -0
  69. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/_side_effects.py +0 -0
  70. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/_trivia.py +0 -0
  71. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/_truth_value.py +0 -0
  72. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/all_branches_identical.py +0 -0
  73. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/boolean_checks_not_inverted.py +0 -0
  74. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/code_quality.py +0 -0
  75. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/collapsible_if_statements.py +0 -0
  76. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/find_suspicious_chained_comparison.py +0 -0
  77. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/merge_identical_branches.py +0 -0
  78. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/remove_duplicate_conditions.py +0 -0
  79. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/remove_self_assignment.py +0 -0
  80. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/remove_unconditional_value_overwrite.py +0 -0
  81. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/simplify_boolean_literal.py +0 -0
  82. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_code_quality_python/codequality/simplify_redundant_logical_expression.py +0 -0
  83. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/__init__.py +0 -0
  84. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/_decorators.py +0 -0
  85. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/_langchain_tables.py +0 -0
  86. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/_markers.py +0 -0
  87. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/_method_renames.py +0 -0
  88. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/_module_imports.py +0 -0
  89. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/_slots.py +0 -0
  90. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/aifc_migrations.py +0 -0
  91. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/array_deprecations.py +0 -0
  92. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/ast_deprecations.py +0 -0
  93. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/asyncio_coroutine_to_async.py +0 -0
  94. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/asyncio_deprecations.py +0 -0
  95. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/avro_migrations.py +0 -0
  96. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/backoff_to_tenacity.py +0 -0
  97. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/calendar_deprecations.py +0 -0
  98. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/cgi_escape_deprecations.py +0 -0
  99. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/cgi_migrations.py +0 -0
  100. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/cgi_parse_deprecations.py +0 -0
  101. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/collections_abc_migrations.py +0 -0
  102. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/configparser_deprecations.py +0 -0
  103. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/datetime_utc.py +0 -0
  104. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/distutils_deprecations.py +0 -0
  105. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/distutils_migrations.py +0 -0
  106. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/functools_deprecations.py +0 -0
  107. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/future_imports.py +0 -0
  108. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/gettext_deprecations.py +0 -0
  109. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/html_parser_deprecations.py +0 -0
  110. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/imp_migrations.py +0 -0
  111. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/importlib_resources_deprecations.py +0 -0
  112. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/inspect_deprecations.py +0 -0
  113. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/langchain_classic_imports.py +0 -0
  114. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/langchain_community_imports.py +0 -0
  115. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/langchain_provider_imports.py +0 -0
  116. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/locale_deprecations.py +0 -0
  117. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/locale_getdefaultlocale_deprecation.py +0 -0
  118. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/macpath_deprecations.py +0 -0
  119. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/mailcap_migrations.py +0 -0
  120. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/module_cached_attribute.py +0 -0
  121. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/nntplib_migrations.py +0 -0
  122. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/os_deprecations.py +0 -0
  123. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/pep594_system_migrations.py +0 -0
  124. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/pipes_migrations.py +0 -0
  125. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/pkgutil_deprecations.py +0 -0
  126. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/pydantic_deprecations.py +0 -0
  127. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/pydantic_fields.py +0 -0
  128. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/pydantic_model_fields.py +0 -0
  129. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/re_deprecations.py +0 -0
  130. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/removed_modules_312.py +0 -0
  131. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/shutil_deprecations.py +0 -0
  132. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/socket_deprecations.py +0 -0
  133. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/ssl_deprecations.py +0 -0
  134. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/string_formatting.py +0 -0
  135. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/sys_deprecations.py +0 -0
  136. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/sys_last_deprecations.py +0 -0
  137. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/tarfile_deprecations.py +0 -0
  138. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/telnetlib_migrations.py +0 -0
  139. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/tempfile_deprecations.py +0 -0
  140. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/threading_deprecations.py +0 -0
  141. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/threading_is_alive_deprecation.py +0 -0
  142. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/typing_callable.py +0 -0
  143. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/typing_functional_syntax.py +0 -0
  144. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/typing_union_to_pipe.py +0 -0
  145. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/unittest_deprecations.py +0 -0
  146. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain02.py +0 -0
  147. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain1.py +0 -0
  148. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_pandas.py +0 -0
  149. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_pydantic.py +0 -0
  150. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python310.py +0 -0
  151. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python311.py +0 -0
  152. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python312.py +0 -0
  153. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python313.py +0 -0
  154. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python314.py +0 -0
  155. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python38.py +0 -0
  156. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/upgrade_to_python39.py +0 -0
  157. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/urllib_deprecations.py +0 -0
  158. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/uu_migrations.py +0 -0
  159. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/xdrlib_migrations.py +0 -0
  160. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python/migrate/xml_deprecations.py +0 -0
  161. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python.egg-info/dependency_links.txt +0 -0
  162. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python.egg-info/entry_points.txt +0 -0
  163. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python.egg-info/requires.txt +0 -0
  164. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/src/openrewrite_migrate_python.egg-info/top_level.txt +0 -0
  165. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_aifc_migrations.py +0 -0
  166. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_array_deprecations.py +0 -0
  167. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_ast_deprecations.py +0 -0
  168. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_asyncio_coroutine_to_async.py +0 -0
  169. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_asyncio_deprecations.py +0 -0
  170. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_avro_migrations.py +0 -0
  171. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_backoff_to_tenacity.py +0 -0
  172. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_calendar_deprecations.py +0 -0
  173. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_cgi_escape_deprecations.py +0 -0
  174. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_cgi_parse_deprecations.py +0 -0
  175. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_change_import_recipes.py +0 -0
  176. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_collections_abc_migrations.py +0 -0
  177. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_configparser_deprecations.py +0 -0
  178. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_datetime_utc.py +0 -0
  179. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_distutils_deprecations.py +0 -0
  180. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_distutils_migrations.py +0 -0
  181. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_functools_deprecations.py +0 -0
  182. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_future_imports.py +0 -0
  183. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_gettext_deprecations.py +0 -0
  184. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_html_parser_deprecations.py +0 -0
  185. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_imp_migrations.py +0 -0
  186. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_importlib_resources_deprecations.py +0 -0
  187. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_inspect_deprecations.py +0 -0
  188. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_langchain_classic_imports.py +0 -0
  189. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_langchain_community_imports.py +0 -0
  190. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_langchain_provider_imports.py +0 -0
  191. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_locale_deprecations.py +0 -0
  192. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_locale_getdefaultlocale_deprecation.py +0 -0
  193. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_macpath_deprecations.py +0 -0
  194. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_mailcap_migrations.py +0 -0
  195. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_markers.py +0 -0
  196. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_module_cached_attribute.py +0 -0
  197. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_os_deprecations.py +0 -0
  198. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_pep594_migrations.py +0 -0
  199. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_pep594_system_migrations.py +0 -0
  200. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_pkgutil_deprecations.py +0 -0
  201. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_pydantic_deprecations.py +0 -0
  202. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_pydantic_fields.py +0 -0
  203. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_pydantic_model_fields.py +0 -0
  204. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_re_deprecations.py +0 -0
  205. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_removed_modules_312.py +0 -0
  206. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_shutil_deprecations.py +0 -0
  207. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_socket_deprecations.py +0 -0
  208. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_ssl_deprecations.py +0 -0
  209. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_string_formatting.py +0 -0
  210. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_sys_deprecations.py +0 -0
  211. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_sys_last_deprecations.py +0 -0
  212. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_tarfile_deprecations.py +0 -0
  213. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_tempfile_deprecations.py +0 -0
  214. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_threading_deprecations.py +0 -0
  215. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_threading_extended.py +0 -0
  216. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_threading_is_alive_deprecation.py +0 -0
  217. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_typing_alias_moves.py +0 -0
  218. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_typing_callable.py +0 -0
  219. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_typing_functional_syntax.py +0 -0
  220. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_typing_union_to_pipe.py +0 -0
  221. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_unittest_deprecations.py +0 -0
  222. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_upgrade_to_pydantic.py +0 -0
  223. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_urllib_deprecations.py +0 -0
  224. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_xdrlib_migrations.py +0 -0
  225. {openrewrite_migrate_python-0.17.0.dev20261022150922 → openrewrite_migrate_python-0.17.0.dev20261022193254}/tests/test_xml_deprecations.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrewrite-migrate-python
3
- Version: 0.17.0.dev20261022150922
3
+ Version: 0.17.0.dev20261022193254
4
4
  Summary: OpenRewrite recipes for migrating Python codebases to newer Python versions.
5
5
  Author-email: "Moderne Inc." <support@moderne.io>
6
6
  License: Moderne Proprietary
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "openrewrite-migrate-python"
7
7
  description = "OpenRewrite recipes for migrating Python codebases to newer Python versions."
8
- version = "0.17.0.dev20261022150922" # Updated dynamically during release
8
+ version = "0.17.0.dev20261022193254" # Updated dynamically during release
9
9
  authors = [{ name = "Moderne Inc.", email = "support@moderne.io" }]
10
10
  license = { text = "Moderne Proprietary" }
11
11
  readme = "README.md"
@@ -44,15 +44,18 @@ from .configparser_deprecations import (
44
44
  ReplaceConfigparserReadfp,
45
45
  ReplaceConfigparserSafeConfigParser,
46
46
  )
47
+ from .ctypes_deprecations import FindCtypesSetPointerType
47
48
  from .datetime_utc import ReplaceDatetimeUtcFromTimestamp, ReplaceDatetimeUtcNow
48
49
  from .distutils_deprecations import FindDistutilsUsage
49
50
  from .distutils_migrations import ReplaceDistutilsVersion
50
51
  from .functools_deprecations import FindFunctoolsCmpToKey
51
52
  from .future_imports import RemoveFutureImports
52
53
  from .gettext_deprecations import ReplaceGettextDeprecations
53
- from .glob_deprecations import ReplaceGlobGlob1
54
+ from .glob_deprecations import FindGlobGlob0, ReplaceGlobGlob1
54
55
  from .html_parser_deprecations import ReplaceHtmlParserUnescape
56
+ from .http_server_deprecations import FindCgiHttpRequestHandler
55
57
  from .imp_migrations import FindImpUsage
58
+ from .importlib_deprecations import FindLoaderLoadModule
56
59
  from .importlib_resources_deprecations import ReplaceImportlibResourcesFilesPackage
57
60
  from .inspect_deprecations import FindInspectGetargspec
58
61
  from .locale_deprecations import ReplaceLocaleResetlocale
@@ -62,8 +65,8 @@ from .mailcap_migrations import FindMailcapModule
62
65
  from .module_cached_attribute import ReplaceModuleCachedAttribute
63
66
  from .nntplib_migrations import FindNntplibModule
64
67
  from .os_deprecations import FindOsPopen, FindOsSpawn
65
- from .pathlib_deprecations import FindPathlibLinkTo
66
- from .platform_deprecations import ReplacePlatformPopen
68
+ from .pathlib_deprecations import FindPathlibIsReserved, FindPathlibLinkTo
69
+ from .platform_deprecations import FindPlatformJavaVer, ReplacePlatformPopen
67
70
  from .pep594_system_migrations import (
68
71
  FindCryptModule,
69
72
  FindMsilibModule,
@@ -88,6 +91,7 @@ from .re_deprecations import ReplaceReTemplate
88
91
  from .removed_modules_312 import FindRemovedModules312
89
92
  from .shutil_deprecations import FindShutilRmtreeOnerror
90
93
  from .socket_deprecations import FindSocketGetFQDN
94
+ from .sre_migrations import FindSreModules
91
95
  from .ssl_deprecations import FindSslMatchHostname
92
96
  from .string_formatting import ReplacePercentFormatWithFString, ReplaceStrFormatWithFString
93
97
  from .sys_deprecations import FindSysCheckInterval, FindSysCoroutineWrapper
@@ -95,6 +99,7 @@ from .sys_last_deprecations import ReplaceSysLastExcInfo
95
99
  from .tarfile_deprecations import ReplaceTarfileFilemode
96
100
  from .telnetlib_migrations import FindTelnetlibModule
97
101
  from .tempfile_deprecations import FindTempfileMktemp
102
+ from .text_encoding import FindImplicitTextEncoding
98
103
  from .threading_is_alive_deprecation import ReplaceThreadIsAlive
99
104
  from .threading_deprecations import (
100
105
  ReplaceConditionNotifyAll,
@@ -106,8 +111,10 @@ from .threading_deprecations import (
106
111
  ReplaceThreadingActiveCount,
107
112
  ReplaceThreadingCurrentThread,
108
113
  )
114
+ from .types_deprecations import FindCodeObjectCoLnotab
109
115
  from .typing_callable import ReplaceTypingCallableWithCollectionsAbcCallable
110
116
  from .typing_deprecations import (
117
+ FindTypingNoTypeCheckDecorator,
111
118
  ReplaceTypingDictWithDict,
112
119
  ReplaceTypingFrozenSetWithFrozenset,
113
120
  ReplaceTypingListWithList,
@@ -140,6 +147,7 @@ from .upgrade_to_pydantic import (
140
147
  )
141
148
  from .urllib_deprecations import FindUrllibParseSplitFunctions, FindUrllibParseToBytes
142
149
  from .uu_migrations import FindUuModule
150
+ from .wave_deprecations import FindWaveMarkers
143
151
  from .xdrlib_migrations import FindXdrlibModule
144
152
  from .xml_deprecations import ReplaceElementGetchildren, ReplaceElementGetiterator
145
153
 
@@ -259,6 +267,18 @@ __all__ = [
259
267
  "ReplaceModuleCachedAttribute",
260
268
  "ReplaceNamedTupleKeywordFields",
261
269
  "ReplaceTypedDictWithoutFields",
270
+ # Detection: Python 3.15
271
+ "FindCgiHttpRequestHandler",
272
+ "FindCodeObjectCoLnotab",
273
+ "FindCtypesSetPointerType",
274
+ "FindGlobGlob0",
275
+ "FindImplicitTextEncoding",
276
+ "FindLoaderLoadModule",
277
+ "FindPathlibIsReserved",
278
+ "FindPlatformJavaVer",
279
+ "FindSreModules",
280
+ "FindTypingNoTypeCheckDecorator",
281
+ "FindWaveMarkers",
262
282
  # Auto-fix: LangChain
263
283
  "ReplaceLangchainCommunityImports",
264
284
  "ReplaceLangchainProviderImports",
@@ -0,0 +1,109 @@
1
+ """Marking calls and module-member references that a recipe only reports."""
2
+
3
+ from typing import Any, Dict, List, Sequence
4
+
5
+ from rewrite import Cursor, ExecutionContext, Preconditions, TreeVisitor
6
+ from rewrite.java.tree import FieldAccess, Identifier, J, MethodInvocation
7
+ from rewrite.python.binding_utils import import_bindings
8
+ from rewrite.python.method_matcher import MethodMatcher
9
+ from rewrite.python.preconditions import uses_import, uses_method
10
+ from rewrite.python.visitor import PythonVisitor
11
+
12
+ from ._markers import mark_deprecated
13
+
14
+
15
+ def module_member_path(cursor: Cursor, node: J) -> str | None:
16
+ """The dotted path ``node`` reads, such as ``http.server.CGIHTTPRequestHandler``, or None.
17
+
18
+ ``cursor`` stands on ``node``. A name answers where a ``from`` import binds it, and a dotted
19
+ attribute where its root name is a module an import binds. A guarded or relative import binds
20
+ a name that may not be the standard library's, so it answers None.
21
+ """
22
+ attributes: List[str] = []
23
+ chain: List[FieldAccess] = []
24
+ root = node
25
+ while isinstance(root, FieldAccess):
26
+ attributes.append(root.name.simple_name)
27
+ chain.append(root)
28
+ root = root.target
29
+ if not isinstance(root, Identifier):
30
+ return None
31
+
32
+ root_cursor = cursor
33
+ for field_access in chain[1:]:
34
+ root_cursor = Cursor(root_cursor, field_access)
35
+ binding = import_bindings(cursor).reference(root_cursor, root)
36
+ if binding is None or binding.guarded or binding.module.startswith(".") or binding.member == "*":
37
+ return None
38
+
39
+ if binding.member is not None:
40
+ base = f"{binding.module}.{binding.member}"
41
+ elif binding.name == binding.module.split(".")[0]:
42
+ # `import http.server` binds `http`, and the code spells the rest of the path itself.
43
+ base = binding.name
44
+ else:
45
+ base = binding.module
46
+ return ".".join([base, *reversed(attributes)])
47
+
48
+
49
+ def _gate(refs: Sequence[Any]) -> Any:
50
+ return refs[0] if len(refs) == 1 else Preconditions.or_(*refs)
51
+
52
+
53
+ def find_calls(
54
+ patterns: Sequence[str], message: str, match_overrides: bool = False
55
+ ) -> TreeVisitor[Any, ExecutionContext]:
56
+ """Marks each call matching one of ``patterns``."""
57
+ matchers = [MethodMatcher.create(p, match_overrides=match_overrides) for p in patterns]
58
+
59
+ class Visitor(PythonVisitor[ExecutionContext]):
60
+ def visit_method_invocation(self, method: MethodInvocation, p: ExecutionContext) -> J:
61
+ m = super().visit_method_invocation(method, p)
62
+ if isinstance(m, MethodInvocation) and any(mm.matches(m, cursor=self.cursor) for mm in matchers):
63
+ return mark_deprecated(m, message)
64
+ return m
65
+
66
+ return Preconditions.check(
67
+ _gate([uses_method(p, match_overrides=match_overrides) for p in patterns]), Visitor()
68
+ )
69
+
70
+
71
+ def find_member_references(messages: Dict[str, str]) -> TreeVisitor[Any, ExecutionContext]:
72
+ """Marks every use of a module member in ``messages``, keyed by its dotted path, called or not.
73
+
74
+ A use reaches the visitor in one of three shapes, one ``visit_*`` method each:
75
+
76
+ - a name a ``from`` import binds: ``CGIHTTPRequestHandler``, also as the name of a call
77
+ - a dotted attribute: ``http.server.CGIHTTPRequestHandler``
78
+ - a dotted call, held as a method invocation whose ``select`` is the owner rather than as a
79
+ field access: ``http.server.CGIHTTPRequestHandler(...)``
80
+
81
+ A name or attribute that no import binds to the module, such as ``obj.CGIHTTPRequestHandler``,
82
+ is left alone.
83
+ """
84
+ modules = {path.rsplit(".", 1)[0] for path in messages}
85
+
86
+ class Visitor(PythonVisitor[ExecutionContext]):
87
+ def visit_method_invocation(self, method: MethodInvocation, p: ExecutionContext) -> J:
88
+ m = super().visit_method_invocation(method, p)
89
+ if not isinstance(m, MethodInvocation) or m.select is None:
90
+ return m
91
+ owner = module_member_path(Cursor(self.cursor, m.select), m.select)
92
+ message = messages.get(f"{owner}.{m.name.simple_name}") if owner else None
93
+ return mark_deprecated(m, message) if message else m
94
+
95
+ def visit_field_access(self, field_access: FieldAccess, p: ExecutionContext) -> J:
96
+ fa = super().visit_field_access(field_access, p)
97
+ if not isinstance(fa, FieldAccess):
98
+ return fa
99
+ message = messages.get(module_member_path(self.cursor, fa) or "")
100
+ return mark_deprecated(fa, message) if message else fa
101
+
102
+ def visit_identifier(self, ident: Identifier, p: ExecutionContext) -> J:
103
+ i = super().visit_identifier(ident, p)
104
+ if not isinstance(i, Identifier):
105
+ return i
106
+ message = messages.get(module_member_path(self.cursor, i) or "")
107
+ return mark_deprecated(i, message) if message else i
108
+
109
+ return Preconditions.check(_gate([uses_import(m) for m in sorted(modules)]), Visitor())
@@ -0,0 +1,68 @@
1
+ """
2
+ Recipe for finding the removed `ctypes.SetPointerType()`.
3
+
4
+ The undocumented `ctypes.SetPointerType()` was deprecated in Python 3.13
5
+ and removed in Python 3.15. Call `set_type()` on the incomplete pointer
6
+ type instead.
7
+
8
+ See: https://docs.python.org/3/whatsnew/3.15.html#removed
9
+ """
10
+
11
+ from typing import Any, List
12
+
13
+ from rewrite import ExecutionContext, Recipe, TreeVisitor
14
+ from rewrite.category import CategoryDescriptor
15
+ from rewrite.decorators import categorize
16
+ from rewrite.marketplace import Python
17
+
18
+ from ._finders import find_calls
19
+
20
+ # Define category path: Python > Migrate > Python 3.15
21
+ _Python315 = [
22
+ *Python,
23
+ CategoryDescriptor(display_name="Migrate"),
24
+ CategoryDescriptor(display_name="Python 3.15"),
25
+ ]
26
+
27
+
28
+ @categorize(_Python315)
29
+ class FindCtypesSetPointerType(Recipe):
30
+ """
31
+ Find calls to the undocumented `ctypes.SetPointerType()`, removed in
32
+ Python 3.15.
33
+
34
+ Example:
35
+ Before:
36
+ import ctypes
37
+ ctypes.SetPointerType(node_p, Node)
38
+
39
+ After:
40
+ import ctypes
41
+ node_p.set_type(Node)
42
+ """
43
+
44
+ @property
45
+ def name(self) -> str:
46
+ return "org.openrewrite.python.migrate.FindCtypesSetPointerType"
47
+
48
+ @property
49
+ def display_name(self) -> str:
50
+ return "Find removed `ctypes.SetPointerType()`"
51
+
52
+ @property
53
+ def description(self) -> str:
54
+ return (
55
+ "The undocumented `ctypes.SetPointerType()` was removed in Python 3.15. "
56
+ "Call `set_type()` on the incomplete pointer type instead."
57
+ )
58
+
59
+ @property
60
+ def tags(self) -> List[str]:
61
+ return ["python", "migration", "3.15", "ctypes"]
62
+
63
+ def editor(self) -> TreeVisitor[Any, ExecutionContext]:
64
+ return find_calls(
65
+ ["ctypes SetPointerType(..)"],
66
+ "ctypes.SetPointerType() was removed in Python 3.15. "
67
+ "Call set_type() on the pointer type instead.",
68
+ )
@@ -1,8 +1,10 @@
1
1
  """
2
- Recipe for replacing the removed `glob.glob1()`.
2
+ Recipes for the removed `glob.glob0()` and `glob.glob1()`.
3
3
 
4
- The undocumented `glob.glob1()` was deprecated in Python 3.13 and removed
5
- in Python 3.15. `glob.glob()` with `root_dir` returns the same names.
4
+ The undocumented `glob.glob0()` and `glob.glob1()` were deprecated in
5
+ Python 3.13 and removed in Python 3.15. `glob.glob()` with `root_dir`
6
+ returns the same names as `glob1()`. `glob0()` treated its argument
7
+ literally rather than as a pattern, so its calls are only found.
6
8
 
7
9
  See: https://docs.python.org/3/whatsnew/3.15.html#glob
8
10
  """
@@ -21,6 +23,8 @@ from rewrite.python.template import capture, template
21
23
  from rewrite.python.tree import NamedArgument
22
24
  from rewrite.python.visitor import PythonVisitor
23
25
 
26
+ from ._finders import find_calls
27
+
24
28
  # Define category path: Python > Migrate > Python 3.15
25
29
  _Python315 = [
26
30
  *Python,
@@ -110,3 +114,48 @@ class ReplaceGlobGlob1(Recipe):
110
114
  return replaced
111
115
 
112
116
  return Preconditions.check(uses_method(_GLOB1), Visitor())
117
+
118
+
119
+ @categorize(_Python315)
120
+ class FindGlobGlob0(Recipe):
121
+ """
122
+ Find calls to the undocumented `glob.glob0()`, removed in Python 3.15.
123
+
124
+ `glob0(dirname, basename)` returned `[basename]` when it existed in
125
+ `dirname`, treating `basename` literally rather than as a pattern.
126
+
127
+ Example:
128
+ Before:
129
+ import glob
130
+ glob.glob0("src", "setup.py")
131
+
132
+ After:
133
+ import os.path
134
+ ["setup.py"] if os.path.lexists(os.path.join("src", "setup.py")) else []
135
+ """
136
+
137
+ @property
138
+ def name(self) -> str:
139
+ return "org.openrewrite.python.migrate.FindGlobGlob0"
140
+
141
+ @property
142
+ def display_name(self) -> str:
143
+ return "Find removed `glob.glob0()`"
144
+
145
+ @property
146
+ def description(self) -> str:
147
+ return (
148
+ "The undocumented `glob.glob0()` was removed in Python 3.15. Use `glob.glob()` with "
149
+ "`root_dir`, escaping the name with `glob.escape()`, or test for the file directly."
150
+ )
151
+
152
+ @property
153
+ def tags(self) -> List[str]:
154
+ return ["python", "migration", "3.15", "glob"]
155
+
156
+ def editor(self) -> TreeVisitor[Any, ExecutionContext]:
157
+ return find_calls(
158
+ ["glob glob0(..)"],
159
+ "glob.glob0() was removed in Python 3.15. "
160
+ "Use glob.glob(glob.escape(basename), root_dir=dirname) instead.",
161
+ )
@@ -0,0 +1,61 @@
1
+ """
2
+ Recipe for finding the removed `http.server.CGIHTTPRequestHandler`.
3
+
4
+ `CGIHTTPRequestHandler` was deprecated in Python 3.13 and removed in
5
+ Python 3.15, along with the `--cgi` flag of `python -m http.server`.
6
+
7
+ See: https://docs.python.org/3/whatsnew/3.15.html#removed
8
+ """
9
+
10
+ from typing import Any, List
11
+
12
+ from rewrite import ExecutionContext, Recipe, TreeVisitor
13
+ from rewrite.category import CategoryDescriptor
14
+ from rewrite.decorators import categorize
15
+ from rewrite.marketplace import Python
16
+
17
+ from ._finders import find_member_references
18
+
19
+ # Define category path: Python > Migrate > Python 3.15
20
+ _Python315 = [
21
+ *Python,
22
+ CategoryDescriptor(display_name="Migrate"),
23
+ CategoryDescriptor(display_name="Python 3.15"),
24
+ ]
25
+
26
+
27
+ @categorize(_Python315)
28
+ class FindCgiHttpRequestHandler(Recipe):
29
+ """
30
+ Find references to `http.server.CGIHTTPRequestHandler`, removed in
31
+ Python 3.15.
32
+
33
+ Example:
34
+ Before:
35
+ from http.server import CGIHTTPRequestHandler, HTTPServer
36
+ HTTPServer(("", 8000), CGIHTTPRequestHandler).serve_forever()
37
+ """
38
+
39
+ @property
40
+ def name(self) -> str:
41
+ return "org.openrewrite.python.migrate.FindCgiHttpRequestHandler"
42
+
43
+ @property
44
+ def display_name(self) -> str:
45
+ return "Find removed `http.server.CGIHTTPRequestHandler`"
46
+
47
+ @property
48
+ def description(self) -> str:
49
+ return (
50
+ "`http.server.CGIHTTPRequestHandler` was removed in Python 3.15, along with the `--cgi` "
51
+ "flag of `python -m http.server`. Serve CGI scripts through a WSGI or ASGI server instead."
52
+ )
53
+
54
+ @property
55
+ def tags(self) -> List[str]:
56
+ return ["python", "migration", "3.15", "http.server"]
57
+
58
+ def editor(self) -> TreeVisitor[Any, ExecutionContext]:
59
+ return find_member_references({
60
+ "http.server.CGIHTTPRequestHandler": "http.server.CGIHTTPRequestHandler was removed in Python 3.15.",
61
+ })
@@ -0,0 +1,136 @@
1
+ """
2
+ Recipe for finding the removed `load_module()` of import loaders.
3
+
4
+ Python 3.15 removed `importlib.abc.Loader.load_module()` and
5
+ `zipimport.zipimporter.load_module()`, and the import system no longer
6
+ calls `load_module()` on a custom loader.
7
+
8
+ See: https://docs.python.org/3/whatsnew/3.15.html#removed
9
+ """
10
+
11
+ from typing import Any, List
12
+
13
+ from rewrite import Cursor, ExecutionContext, Preconditions, Recipe, TreeVisitor
14
+ from rewrite.category import CategoryDescriptor
15
+ from rewrite.decorators import categorize
16
+ from rewrite.marketplace import Python
17
+ from rewrite.java.tree import ClassDeclaration, J, MethodDeclaration, MethodInvocation
18
+ from rewrite.python.method_matcher import MethodMatcher
19
+ from rewrite.python.preconditions import uses_method, uses_type
20
+ from rewrite.python.type_utils import is_assignable_to
21
+ from rewrite.python.visitor import PythonVisitor
22
+
23
+ from ._markers import mark_deprecated
24
+
25
+ # Define category path: Python > Migrate > Python 3.15
26
+ _Python315 = [
27
+ *Python,
28
+ CategoryDescriptor(display_name="Migrate"),
29
+ CategoryDescriptor(display_name="Python 3.15"),
30
+ ]
31
+
32
+
33
+ def _is_loader(type_: Any) -> bool:
34
+ return any(is_assignable_to(loader, type_) for loader in _LOADER_TYPES)
35
+
36
+
37
+ def _declaring_class(cursor: Cursor) -> ClassDeclaration | None:
38
+ """The class whose body declares the method ``cursor`` stands on, None for a nested function."""
39
+ enclosing = cursor.parent
40
+ while enclosing is not None:
41
+ if isinstance(enclosing.value, ClassDeclaration):
42
+ return enclosing.value
43
+ if isinstance(enclosing.value, MethodDeclaration):
44
+ return None
45
+ enclosing = enclosing.parent
46
+ return None
47
+
48
+
49
+ # typeshed declares `importlib.abc.Loader` in `importlib._abc` and re-exports it.
50
+ _LOADER_TYPES = ("importlib._abc.Loader", "importlib.abc.Loader")
51
+ _LOAD_MODULE_PATTERNS = [
52
+ *(f"{loader} load_module(..)" for loader in _LOADER_TYPES),
53
+ "zipimport.zipimporter load_module(..)",
54
+ ]
55
+ _LOAD_MODULE_MESSAGE = (
56
+ "load_module() was removed in Python 3.15, and the import system no longer calls it. "
57
+ "Implement create_module() and exec_module() instead."
58
+ )
59
+
60
+
61
+ @categorize(_Python315)
62
+ class FindLoaderLoadModule(Recipe):
63
+ """
64
+ Find `load_module()` calls on, and definitions in, import loaders.
65
+
66
+ Python 3.15 removed `importlib.abc.Loader.load_module()` and
67
+ `zipimport.zipimporter.load_module()`, and the import system no longer
68
+ calls `load_module()` on a custom loader. A loader that only defines
69
+ `load_module()` stops loading anything.
70
+
71
+ Example:
72
+ Before:
73
+ import importlib.abc
74
+
75
+ class Loader(importlib.abc.Loader):
76
+ def load_module(self, fullname): ...
77
+
78
+ After:
79
+ import importlib.abc
80
+
81
+ class Loader(importlib.abc.Loader):
82
+ def create_module(self, spec): ...
83
+ def exec_module(self, module): ...
84
+ """
85
+
86
+ @property
87
+ def name(self) -> str:
88
+ return "org.openrewrite.python.migrate.FindLoaderLoadModule"
89
+
90
+ @property
91
+ def display_name(self) -> str:
92
+ return "Find removed `load_module()` on import loaders"
93
+
94
+ @property
95
+ def description(self) -> str:
96
+ return (
97
+ "`importlib.abc.Loader.load_module()` and `zipimport.zipimporter.load_module()` were "
98
+ "removed in Python 3.15, and the import system no longer calls `load_module()` on a "
99
+ "custom loader. Marks calls to it and its definitions in `Loader` subclasses. Only fires "
100
+ "where the receiver's or class's type resolves."
101
+ )
102
+
103
+ @property
104
+ def tags(self) -> List[str]:
105
+ return ["python", "migration", "3.15", "importlib"]
106
+
107
+ def editor(self) -> TreeVisitor[Any, ExecutionContext]:
108
+ matchers = [MethodMatcher.create(p, match_overrides=True) for p in _LOAD_MODULE_PATTERNS]
109
+
110
+ class Visitor(PythonVisitor[ExecutionContext]):
111
+ def visit_method_invocation(self, method: MethodInvocation, p: ExecutionContext) -> J:
112
+ m = super().visit_method_invocation(method, p)
113
+ if not isinstance(m, MethodInvocation) or m.name.simple_name != "load_module":
114
+ return m
115
+ # A loader subclass declares its own `load_module`, which the method type names
116
+ # without the class hierarchy, so the receiver's type decides it.
117
+ if any(mm.matches(m, cursor=self.cursor) for mm in matchers) or (
118
+ m.select is not None and _is_loader(m.select.type)
119
+ ):
120
+ return mark_deprecated(m, _LOAD_MODULE_MESSAGE)
121
+ return m
122
+
123
+ def visit_method_declaration(self, method: MethodDeclaration, p: ExecutionContext) -> J:
124
+ md = super().visit_method_declaration(method, p)
125
+ if not isinstance(md, MethodDeclaration) or md.name.simple_name != "load_module":
126
+ return md
127
+ owner = _declaring_class(self.cursor)
128
+ if owner is not None and _is_loader(owner.type):
129
+ return mark_deprecated(md, _LOAD_MODULE_MESSAGE)
130
+ return md
131
+
132
+ gate = Preconditions.or_(
133
+ *(uses_method(p, match_overrides=True) for p in _LOAD_MODULE_PATTERNS),
134
+ *(uses_type(loader, check_assignability=True) for loader in _LOADER_TYPES),
135
+ )
136
+ return Preconditions.check(gate, Visitor())
@@ -4,6 +4,9 @@ Recipes for migrating deprecated pathlib methods.
4
4
  Path.link_to() was deprecated in Python 3.10 and removed in Python 3.12.
5
5
  Use Path.hardlink_to() instead (note the reversed argument order).
6
6
 
7
+ PurePath.is_reserved() was deprecated in Python 3.13 and removed in
8
+ Python 3.15. Use os.path.isreserved(), which is only available on Windows.
9
+
7
10
  See: https://docs.python.org/3/library/pathlib.html
8
11
  """
9
12
 
@@ -18,6 +21,7 @@ from rewrite.python.preconditions import uses_method
18
21
  from rewrite.python.visitor import PythonVisitor
19
22
  from rewrite.java.tree import J, MethodInvocation
20
23
  from ._markers import mark_deprecated
24
+ from ._finders import find_calls
21
25
 
22
26
  _LINK_TO = "pathlib.Path link_to(..)"
23
27
  _LINK_TO_MATCHER = MethodMatcher.create(_LINK_TO, match_overrides=True)
@@ -29,6 +33,12 @@ _Python312 = [
29
33
  CategoryDescriptor(display_name="Python 3.12"),
30
34
  ]
31
35
 
36
+ _Python315 = [
37
+ *Python,
38
+ CategoryDescriptor(display_name="Migrate"),
39
+ CategoryDescriptor(display_name="Python 3.15"),
40
+ ]
41
+
32
42
 
33
43
  @categorize(_Python312)
34
44
  class FindPathlibLinkTo(Recipe):
@@ -88,3 +98,52 @@ class FindPathlibLinkTo(Recipe):
88
98
  )
89
99
 
90
100
  return Preconditions.check(uses_method(_LINK_TO, match_overrides=True), Visitor())
101
+
102
+
103
+ @categorize(_Python315)
104
+ class FindPathlibIsReserved(Recipe):
105
+ """
106
+ Find calls to `PurePath.is_reserved()`, removed in Python 3.15.
107
+
108
+ `os.path.isreserved()` is the replacement, but only exists on Windows,
109
+ where reserved names exist at all. `PurePosixPath.is_reserved()` always
110
+ returned `False`, so code that is not Windows-only can usually drop the
111
+ check.
112
+
113
+ Example:
114
+ Before:
115
+ from pathlib import PureWindowsPath
116
+ PureWindowsPath("nul").is_reserved()
117
+
118
+ After:
119
+ import os.path
120
+ os.path.isreserved("nul") # on Windows
121
+ """
122
+
123
+ @property
124
+ def name(self) -> str:
125
+ return "org.openrewrite.python.migrate.FindPathlibIsReserved"
126
+
127
+ @property
128
+ def display_name(self) -> str:
129
+ return "Find removed `PurePath.is_reserved()`"
130
+
131
+ @property
132
+ def description(self) -> str:
133
+ return (
134
+ "`pathlib.PurePath.is_reserved()` was removed in Python 3.15. Use `os.path.isreserved()`, "
135
+ "which is only available on Windows. Only fires where the receiver's type resolves to a "
136
+ "`pathlib` path."
137
+ )
138
+
139
+ @property
140
+ def tags(self) -> List[str]:
141
+ return ["python", "migration", "3.15", "pathlib"]
142
+
143
+ def editor(self) -> TreeVisitor[Any, ExecutionContext]:
144
+ return find_calls(
145
+ ["pathlib.PurePath is_reserved(..)"],
146
+ "PurePath.is_reserved() was removed in Python 3.15. "
147
+ "Use os.path.isreserved(), which is only available on Windows.",
148
+ match_overrides=True,
149
+ )