openrewrite-migrate-python 0.14.0.dev20260909112655__tar.gz → 0.15.0__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 (158) hide show
  1. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/PKG-INFO +3 -5
  2. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/pyproject.toml +5 -7
  3. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/pydantic_deprecations.py +42 -8
  4. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/pydantic_fields.py +6 -2
  5. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/pydantic_model_fields.py +6 -2
  6. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/typing_deprecations.py +5 -42
  7. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/typing_union_to_pipe.py +3 -0
  8. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python.egg-info/PKG-INFO +3 -5
  9. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python.egg-info/requires.txt +1 -1
  10. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_typing_deprecations.py +6 -6
  11. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_typing_union_to_pipe.py +17 -0
  12. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/setup.cfg +0 -0
  13. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/__init__.py +0 -0
  14. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/__init__.py +0 -0
  15. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/_reindent.py +0 -0
  16. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/_semantically_equal.py +0 -0
  17. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/_trivia.py +0 -0
  18. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/all_branches_identical.py +0 -0
  19. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/boolean_checks_not_inverted.py +0 -0
  20. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/collapsible_if_statements.py +0 -0
  21. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/find_suspicious_chained_comparison.py +0 -0
  22. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/merge_identical_branches.py +0 -0
  23. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/remove_duplicate_conditions.py +0 -0
  24. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/remove_self_assignment.py +0 -0
  25. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/remove_unconditional_value_overwrite.py +0 -0
  26. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/simplify_boolean_literal.py +0 -0
  27. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_code_quality_python/codequality/simplify_redundant_logical_expression.py +0 -0
  28. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/__init__.py +0 -0
  29. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/__init__.py +0 -0
  30. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/_from_imports.py +0 -0
  31. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/_import_hygiene.py +0 -0
  32. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/_langchain_tables.py +0 -0
  33. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/_markers.py +0 -0
  34. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/_slots.py +0 -0
  35. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/_typing_imports.py +0 -0
  36. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/aifc_migrations.py +0 -0
  37. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/array_deprecations.py +0 -0
  38. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/ast_deprecations.py +0 -0
  39. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/asyncio_coroutine_to_async.py +0 -0
  40. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/asyncio_deprecations.py +0 -0
  41. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/avro_migrations.py +0 -0
  42. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/calendar_deprecations.py +0 -0
  43. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/cgi_migrations.py +0 -0
  44. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/cgi_parse_deprecations.py +0 -0
  45. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/collections_abc_migrations.py +0 -0
  46. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/configparser_deprecations.py +0 -0
  47. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/datetime_utc.py +0 -0
  48. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/distutils_deprecations.py +0 -0
  49. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/distutils_migrations.py +0 -0
  50. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/functools_deprecations.py +0 -0
  51. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/future_imports.py +0 -0
  52. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/gettext_deprecations.py +0 -0
  53. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/html_parser_deprecations.py +0 -0
  54. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/imp_migrations.py +0 -0
  55. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/langchain_classic_imports.py +0 -0
  56. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/langchain_community_imports.py +0 -0
  57. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/langchain_provider_imports.py +0 -0
  58. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/locale_deprecations.py +0 -0
  59. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/locale_getdefaultlocale_deprecation.py +0 -0
  60. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/macpath_deprecations.py +0 -0
  61. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/mailcap_migrations.py +0 -0
  62. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/nntplib_migrations.py +0 -0
  63. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/os_deprecations.py +0 -0
  64. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/pathlib_deprecations.py +0 -0
  65. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/pep594_system_migrations.py +0 -0
  66. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/pipes_migrations.py +0 -0
  67. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/pkgutil_deprecations.py +0 -0
  68. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/platform_deprecations.py +0 -0
  69. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/re_deprecations.py +0 -0
  70. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/removed_modules_312.py +0 -0
  71. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/shutil_deprecations.py +0 -0
  72. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/socket_deprecations.py +0 -0
  73. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/ssl_deprecations.py +0 -0
  74. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/string_formatting.py +0 -0
  75. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/sys_deprecations.py +0 -0
  76. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/sys_last_deprecations.py +0 -0
  77. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/tarfile_deprecations.py +0 -0
  78. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/telnetlib_migrations.py +0 -0
  79. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/tempfile_deprecations.py +0 -0
  80. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/threading_deprecations.py +0 -0
  81. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/threading_is_alive_deprecation.py +0 -0
  82. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/typing_callable.py +0 -0
  83. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/unittest_deprecations.py +0 -0
  84. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain02.py +0 -0
  85. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain1.py +0 -0
  86. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_pydantic.py +0 -0
  87. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_python310.py +0 -0
  88. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_python311.py +0 -0
  89. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_python312.py +0 -0
  90. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_python313.py +0 -0
  91. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_python314.py +0 -0
  92. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_python38.py +0 -0
  93. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/upgrade_to_python39.py +0 -0
  94. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/urllib_deprecations.py +0 -0
  95. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/uu_migrations.py +0 -0
  96. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/xdrlib_migrations.py +0 -0
  97. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python/migrate/xml_deprecations.py +0 -0
  98. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python.egg-info/SOURCES.txt +0 -0
  99. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python.egg-info/dependency_links.txt +0 -0
  100. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python.egg-info/entry_points.txt +0 -0
  101. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/src/openrewrite_migrate_python.egg-info/top_level.txt +0 -0
  102. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_aifc_migrations.py +0 -0
  103. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_array_deprecations.py +0 -0
  104. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_ast_deprecations.py +0 -0
  105. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_asyncio_coroutine_to_async.py +0 -0
  106. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_asyncio_deprecations.py +0 -0
  107. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_avro_migrations.py +0 -0
  108. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_calendar_deprecations.py +0 -0
  109. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_cgi_parse_deprecations.py +0 -0
  110. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_change_import_recipes.py +0 -0
  111. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_collections_abc_migrations.py +0 -0
  112. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_configparser_deprecations.py +0 -0
  113. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_datetime_utc.py +0 -0
  114. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_distutils_deprecations.py +0 -0
  115. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_distutils_migrations.py +0 -0
  116. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_functools_deprecations.py +0 -0
  117. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_future_imports.py +0 -0
  118. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_gettext_deprecations.py +0 -0
  119. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_html_parser_deprecations.py +0 -0
  120. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_imp_migrations.py +0 -0
  121. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_langchain_classic_imports.py +0 -0
  122. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_langchain_community_imports.py +0 -0
  123. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_langchain_provider_imports.py +0 -0
  124. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_locale_deprecations.py +0 -0
  125. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_locale_getdefaultlocale_deprecation.py +0 -0
  126. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_macpath_deprecations.py +0 -0
  127. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_mailcap_migrations.py +0 -0
  128. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_markers.py +0 -0
  129. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_os_deprecations.py +0 -0
  130. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_pathlib_deprecations.py +0 -0
  131. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_pep594_migrations.py +0 -0
  132. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_pep594_system_migrations.py +0 -0
  133. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_pkgutil_deprecations.py +0 -0
  134. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_platform_deprecations.py +0 -0
  135. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_pydantic_deprecations.py +0 -0
  136. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_pydantic_fields.py +0 -0
  137. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_pydantic_model_fields.py +0 -0
  138. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_re_deprecations.py +0 -0
  139. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_removed_modules_312.py +0 -0
  140. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_shutil_deprecations.py +0 -0
  141. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_socket_deprecations.py +0 -0
  142. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_ssl_deprecations.py +0 -0
  143. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_string_formatting.py +0 -0
  144. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_sys_deprecations.py +0 -0
  145. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_sys_last_deprecations.py +0 -0
  146. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_tarfile_deprecations.py +0 -0
  147. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_tempfile_deprecations.py +0 -0
  148. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_threading_deprecations.py +0 -0
  149. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_threading_extended.py +0 -0
  150. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_threading_is_alive_deprecation.py +0 -0
  151. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_typing_alias_moves.py +0 -0
  152. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_typing_callable.py +0 -0
  153. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_unittest_deprecations.py +0 -0
  154. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_upgrade_recipes.py +0 -0
  155. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_upgrade_to_pydantic.py +0 -0
  156. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_urllib_deprecations.py +0 -0
  157. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/tests/test_xdrlib_migrations.py +0 -0
  158. {openrewrite_migrate_python-0.14.0.dev20260909112655 → openrewrite_migrate_python-0.15.0}/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.14.0.dev20260909112655
3
+ Version: 0.15.0
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
@@ -11,17 +11,15 @@ Project-URL: Issues, https://github.com/openrewrite/rewrite-migrate-python/issue
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: Other/Proprietary License
14
- Classifier: Programming Language :: Python :: 3.10
15
- Classifier: Programming Language :: Python :: 3.11
16
14
  Classifier: Programming Language :: Python :: 3.12
17
15
  Classifier: Programming Language :: Python :: 3.13
18
16
  Classifier: Topic :: Software Development :: Code Generators
19
17
  Classifier: Topic :: Software Development :: Quality Assurance
20
18
  Classifier: Typing :: Typed
21
- Requires-Python: >=3.10
19
+ Requires-Python: >=3.12
22
20
  Description-Content-Type: text/markdown
23
21
  Provides-Extra: dev
24
- Requires-Dist: openrewrite>=8.91.6; extra == "dev"
22
+ Requires-Dist: openrewrite>=8.92.3; extra == "dev"
25
23
  Requires-Dist: pydantic>=2.11; extra == "dev"
26
24
  Requires-Dist: pytest>=8.0.0; extra == "dev"
27
25
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
@@ -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.14.0.dev20260909112655" # Updated dynamically during release
8
+ version = "0.15.0" # 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"
@@ -13,15 +13,13 @@ classifiers = [
13
13
  "Development Status :: 4 - Beta",
14
14
  "Intended Audience :: Developers",
15
15
  "License :: Other/Proprietary License",
16
- "Programming Language :: Python :: 3.10",
17
- "Programming Language :: Python :: 3.11",
18
16
  "Programming Language :: Python :: 3.12",
19
17
  "Programming Language :: Python :: 3.13",
20
18
  "Topic :: Software Development :: Code Generators",
21
19
  "Topic :: Software Development :: Quality Assurance",
22
20
  "Typing :: Typed",
23
21
  ]
24
- requires-python = ">=3.10"
22
+ requires-python = ">=3.12"
25
23
  # openrewrite is a runtime dependency but is provided by the host
26
24
  # environment (like a plugin framework). It is listed under
27
25
  # [project.optional-dependencies] dev so it is available during
@@ -30,7 +28,7 @@ dependencies = []
30
28
 
31
29
  [project.optional-dependencies]
32
30
  dev = [
33
- "openrewrite>=8.91.6",
31
+ "openrewrite>=8.92.3",
34
32
  # Needed so type-attribution tests can resolve `pydantic` types.
35
33
  "pydantic>=2.11",
36
34
  "pytest>=8.0.0",
@@ -62,11 +60,11 @@ include = ["openrewrite_migrate_python", "openrewrite_migrate_python.*", "openre
62
60
 
63
61
  [tool.black]
64
62
  line-length = 120
65
- target-version = ["py310", "py311", "py312", "py313"]
63
+ target-version = ["py312", "py313"]
66
64
 
67
65
  [tool.ruff]
68
66
  line-length = 120
69
- target-version = "py310"
67
+ target-version = "py312"
70
68
 
71
69
  [tool.ruff.lint]
72
70
  select = ["E", "F", "I", "UP"]
@@ -24,7 +24,7 @@ https://github.com/pydantic/pydantic/issues/11119
24
24
 
25
25
  from typing import Any, List, Optional, cast
26
26
 
27
- from rewrite import ExecutionContext, Recipe, TreeVisitor
27
+ from rewrite import ExecutionContext, Preconditions, Recipe, TreeVisitor
28
28
  from rewrite.category import CategoryDescriptor
29
29
  from rewrite.decorators import categorize
30
30
  from rewrite.java.support_types import JavaType
@@ -43,6 +43,7 @@ from rewrite.java.tree import (
43
43
  )
44
44
  from rewrite.marketplace import Python
45
45
  from rewrite.python.add_import import AddImportOptions, maybe_add_import
46
+ from rewrite.python.preconditions import uses_import
46
47
  from rewrite.python.remove_import import RemoveImportOptions, maybe_remove_import
47
48
  from rewrite.python.tree import MultiImport, NamedArgument, TypeHint, TypeHintedExpression
48
49
  from rewrite.python.type_utils import is_assignable_to
@@ -321,7 +322,13 @@ class ReplaceFinalFieldWithClassVar(Recipe):
321
322
 
322
323
  return a.replace(_variable=new_var)
323
324
 
324
- return Visitor()
325
+ return Preconditions.check(
326
+ Preconditions.or_(
327
+ uses_import("pydantic"),
328
+ uses_import("pydantic_settings"),
329
+ ),
330
+ Visitor(),
331
+ )
325
332
 
326
333
 
327
334
  @categorize(_Pydantic)
@@ -381,7 +388,13 @@ class ReplacePopulateByNameWithValidateByName(Recipe):
381
388
  arg = cast(NamedArgument, super().visit_named_argument(named_argument, p))
382
389
  return _rename_configdict_option(self, arg, "populate_by_name", "validate_by_name")
383
390
 
384
- return Visitor()
391
+ return Preconditions.check(
392
+ Preconditions.or_(
393
+ uses_import("pydantic"),
394
+ uses_import("pydantic_settings"),
395
+ ),
396
+ Visitor(),
397
+ )
385
398
 
386
399
 
387
400
  @categorize(_Pydantic)
@@ -435,7 +448,13 @@ class FindDeprecatedSchemaGenerator(Recipe):
435
448
  arg = cast(NamedArgument, super().visit_named_argument(named_argument, p))
436
449
  return _flag_configdict_option(self, arg, "schema_generator", _SCHEMA_GEN_MSG)
437
450
 
438
- return Visitor()
451
+ return Preconditions.check(
452
+ Preconditions.or_(
453
+ uses_import("pydantic"),
454
+ uses_import("pydantic_settings"),
455
+ ),
456
+ Visitor(),
457
+ )
439
458
 
440
459
 
441
460
  @categorize(_Pydantic)
@@ -492,7 +511,13 @@ class FindDeprecatedJsonEncoders(Recipe):
492
511
  arg = cast(NamedArgument, super().visit_named_argument(named_argument, p))
493
512
  return _flag_configdict_option(self, arg, "json_encoders", _JSON_ENCODERS_MSG)
494
513
 
495
- return Visitor()
514
+ return Preconditions.check(
515
+ Preconditions.or_(
516
+ uses_import("pydantic"),
517
+ uses_import("pydantic_settings"),
518
+ ),
519
+ Visitor(),
520
+ )
496
521
 
497
522
 
498
523
  _MODEL_VALIDATOR_AFTER_MSG = (
@@ -622,7 +647,10 @@ class FindModelValidatorAfterClassmethod(Recipe):
622
647
  _leading_annotations=[flagged if a is validator else a for a in annotations]
623
648
  )
624
649
 
625
- return Visitor()
650
+ return Preconditions.check(
651
+ uses_import("pydantic"),
652
+ Visitor(),
653
+ )
626
654
 
627
655
 
628
656
  @categorize(_Pydantic)
@@ -677,7 +705,10 @@ class FindSerializeAsAnyUsage(Recipe):
677
705
  arg = cast(NamedArgument, super().visit_named_argument(named_argument, p))
678
706
  return _flag_call_option(self, arg, "serialize_as_any", _DUMP_METHODS, _SERIALIZE_AS_ANY_MSG)
679
707
 
680
- return Visitor()
708
+ return Preconditions.check(
709
+ uses_import("pydantic"),
710
+ Visitor(),
711
+ )
681
712
 
682
713
 
683
714
  @categorize(_Pydantic)
@@ -749,4 +780,7 @@ class FindEvalTypeBackportUsage(Recipe):
749
780
  return mark_deprecated(mi, _EVAL_TYPE_BACKPORT_MSG)
750
781
  return mi
751
782
 
752
- return Visitor()
783
+ return Preconditions.check(
784
+ uses_import("eval_type_backport"),
785
+ Visitor(),
786
+ )
@@ -17,13 +17,14 @@ https://docs.pydantic.dev/latest/concepts/fields/
17
17
 
18
18
  from typing import Any, List, Optional, cast
19
19
 
20
- from rewrite import ExecutionContext, Recipe, TreeVisitor
20
+ from rewrite import ExecutionContext, Preconditions, Recipe, TreeVisitor
21
21
  from rewrite.category import CategoryDescriptor
22
22
  from rewrite.decorators import categorize
23
23
  from rewrite.java.support_types import JavaType, JRightPadded, Space
24
24
  from rewrite.java.tree import Empty, J, Literal, MethodInvocation
25
25
  from rewrite.markers import Markers
26
26
  from rewrite.marketplace import Python
27
+ from rewrite.python.preconditions import uses_method
27
28
  from rewrite.python.type_utils import is_of_class_type
28
29
  from rewrite.python.visitor import PythonVisitor
29
30
  from rewrite.utils import random_id
@@ -152,4 +153,7 @@ class RemoveEllipsisFromField(Recipe):
152
153
  ]
153
154
  return mi.replace(_arguments=container.padding.replace(elements=kept))
154
155
 
155
- return Visitor()
156
+ return Preconditions.check(
157
+ uses_method("pydantic.fields Field(..)"),
158
+ Visitor(),
159
+ )
@@ -26,10 +26,11 @@ https://github.com/pydantic/pydantic/pull/11169
26
26
 
27
27
  from typing import Any, List, Optional, cast
28
28
 
29
- from rewrite import ExecutionContext, Recipe, TreeVisitor
29
+ from rewrite import ExecutionContext, Preconditions, Recipe, TreeVisitor
30
30
  from rewrite.category import CategoryDescriptor
31
31
  from rewrite.decorators import categorize
32
32
  from rewrite.marketplace import Python
33
+ from rewrite.python.preconditions import uses_import
33
34
  from rewrite.python.visitor import PythonVisitor
34
35
  from rewrite.python.template import pattern, template, capture
35
36
  from rewrite.python.type_utils import is_assignable_to
@@ -161,4 +162,7 @@ class ReplaceModelFieldsInstanceAccess(Recipe):
161
162
 
162
163
  return fa
163
164
 
164
- return Visitor()
165
+ return Preconditions.check(
166
+ uses_import("pydantic"),
167
+ Visitor(),
168
+ )
@@ -20,7 +20,6 @@ handled with `ChangeImport` in `upgrade_to_python39`.
20
20
  See: https://peps.python.org/pep-0585/
21
21
  """
22
22
 
23
- import ast
24
23
  from typing import Any, ClassVar, Optional, Set, cast
25
24
 
26
25
  from rewrite import ExecutionContext, Recipe, Tree, TreeVisitor
@@ -148,44 +147,6 @@ def _in_type_position(cursor: Cursor) -> bool:
148
147
  return False
149
148
 
150
149
 
151
- def _rename_in_quoted_body(body: str, old_name: str, new_name: str) -> Optional[str]:
152
- """`body` with each name lookup of `old_name` renamed, or None when it holds none.
153
-
154
- A quoted annotation carries a whole expression in one identifier, so the
155
- rename has to land on its `ast.Name` nodes. Only parsing separates those
156
- from a string constant the body encloses, where the name is a value:
157
- renaming in `Literal['Text', 'Binary']` would change the type.
158
- """
159
- stripped = body.strip()
160
- try:
161
- expression = ast.parse(stripped, mode="eval")
162
- except (SyntaxError, ValueError):
163
- return None
164
- matches = [
165
- node
166
- for node in ast.walk(expression)
167
- if isinstance(node, ast.Name) and node.id == old_name
168
- ]
169
- if not matches:
170
- return None
171
-
172
- # `col_offset` counts UTF-8 bytes, so the splice has to happen in bytes.
173
- source = stripped.encode()
174
- line_starts = [0]
175
- for line in source.split(b"\n"):
176
- line_starts.append(line_starts[-1] + len(line) + 1)
177
- for node in sorted(matches, key=lambda n: (n.lineno, n.col_offset), reverse=True):
178
- line = line_starts[node.lineno - 1]
179
- source = (
180
- source[: line + node.col_offset]
181
- + new_name.encode()
182
- + source[line + cast(int, node.end_col_offset) :]
183
- )
184
-
185
- leading = len(body) - len(body.lstrip())
186
- return body[:leading] + source.decode() + body[leading + len(stripped) :]
187
-
188
-
189
150
  def _make_builtin_alias_editor(
190
151
  old_name: str, new_name: str, type_positions_only: bool
191
152
  ) -> "TreeVisitor[Any, ExecutionContext]":
@@ -278,9 +239,11 @@ def _make_builtin_alias_editor(
278
239
  if type_positions_only and not _in_type_position(self.cursor):
279
240
  return ident
280
241
 
281
- if ident.markers.find_first(Quoted) is not None:
282
- renamed = _rename_in_quoted_body(ident.simple_name, self._bare_ref, new_name)
283
- return ident if renamed is None else ident.replace(_simple_name=renamed)
242
+ # A quoted body the parser could not structure arrives whole, where a
243
+ # rename would overwrite the annotation rather than the name in it.
244
+ if (ident.markers.find_first(Quoted) is not None
245
+ and ident.simple_name != self._bare_ref):
246
+ return ident
284
247
  return ident.replace(_simple_name=new_name)
285
248
 
286
249
  return BuiltinAliasVisitor()
@@ -222,6 +222,9 @@ class ReplaceTypingOptionalWithUnion(Recipe):
222
222
 
223
223
  # Get the type argument from the dimension
224
224
  index = array_access.dimension.index
225
+ # Several arguments arrive as a CollectionLiteral, and `Optional` takes one.
226
+ if isinstance(index, CollectionLiteral):
227
+ return array_access
225
228
  if not self._can_transform_args([index]):
226
229
  return array_access
227
230
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrewrite-migrate-python
3
- Version: 0.14.0.dev20260909112655
3
+ Version: 0.15.0
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
@@ -11,17 +11,15 @@ Project-URL: Issues, https://github.com/openrewrite/rewrite-migrate-python/issue
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: Other/Proprietary License
14
- Classifier: Programming Language :: Python :: 3.10
15
- Classifier: Programming Language :: Python :: 3.11
16
14
  Classifier: Programming Language :: Python :: 3.12
17
15
  Classifier: Programming Language :: Python :: 3.13
18
16
  Classifier: Topic :: Software Development :: Code Generators
19
17
  Classifier: Topic :: Software Development :: Quality Assurance
20
18
  Classifier: Typing :: Typed
21
- Requires-Python: >=3.10
19
+ Requires-Python: >=3.12
22
20
  Description-Content-Type: text/markdown
23
21
  Provides-Extra: dev
24
- Requires-Dist: openrewrite>=8.91.6; extra == "dev"
22
+ Requires-Dist: openrewrite>=8.92.3; extra == "dev"
25
23
  Requires-Dist: pydantic>=2.11; extra == "dev"
26
24
  Requires-Dist: pytest>=8.0.0; extra == "dev"
27
25
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
@@ -1,6 +1,6 @@
1
1
 
2
2
  [dev]
3
- openrewrite>=8.91.6
3
+ openrewrite>=8.92.3
4
4
  pydantic>=2.11
5
5
  pytest>=8.0.0
6
6
  pytest-cov>=4.0.0
@@ -450,16 +450,16 @@ class TestPep585CornerCases:
450
450
  a: "List" = []
451
451
  b: "List[int]" = []
452
452
  c: "Dict[str, List[int]]" = {}
453
- d: " List[int] " = []
454
- e: "dict[Café, List[int]]" = {}
453
+ d: "dict[Café, List[int]]" = {}
454
+ e: " List[int]" = []
455
455
  """,
456
456
  """
457
457
  from typing import Dict
458
458
  a: "list" = []
459
459
  b: "list[int]" = []
460
460
  c: "Dict[str, list[int]]" = {}
461
- d: " list[int] " = []
462
- e: "dict[Café, list[int]]" = {}
461
+ d: "dict[Café, list[int]]" = {}
462
+ e: " list[int]" = []
463
463
  """,
464
464
  )
465
465
  )
@@ -482,7 +482,7 @@ class TestPep585CornerCases:
482
482
  )
483
483
 
484
484
  def test_leaves_quoted_annotated_metadata_alone(self):
485
- """The parser quotes `Annotated` metadata like a type; only its first argument is one."""
485
+ """Only the first `Annotated` argument is a type; the metadata string is a value, not a `List` reference."""
486
486
  spec = RecipeSpec(recipe=ReplaceTypingListWithList())
487
487
  spec.rewrite_run(
488
488
  python(
@@ -491,7 +491,7 @@ class TestPep585CornerCases:
491
491
  x: Annotated["List[int]", "List"] = []
492
492
  """,
493
493
  """
494
- from typing import Annotated, List
494
+ from typing import Annotated
495
495
  x: Annotated["list[int]", "List"] = []
496
496
  """,
497
497
  )
@@ -96,6 +96,23 @@ class TestReplaceTypingOptionalWithUnion:
96
96
  )
97
97
  )
98
98
 
99
+ def test_no_change_for_optional_with_several_arguments(self):
100
+ """`Optional` takes one argument; both node shapes it arrives in must decline the rest.
101
+
102
+ The annotation is a `ParameterizedType` and the union operand an
103
+ `ArrayAccess`, so the same input reaches both branches at once.
104
+ """
105
+ spec = RecipeSpec(recipe=ReplaceTypingOptionalWithUnion())
106
+ spec.rewrite_run(
107
+ python(
108
+ """
109
+ from typing import Optional
110
+ a: Optional[int, str] = 1
111
+ b: Optional[int, str] | None = 1
112
+ """
113
+ )
114
+ )
115
+
99
116
  def test_no_change_when_not_optional(self):
100
117
  """Test that non-Optional types are not modified."""
101
118
  spec = RecipeSpec(recipe=ReplaceTypingOptionalWithUnion())