openrewrite-migrate-python 0.10.0.dev20260714174242__tar.gz → 0.10.0.dev20260715111001__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 (143) hide show
  1. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/PKG-INFO +1 -1
  2. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/pyproject.toml +1 -1
  3. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/__init__.py +2 -0
  4. openrewrite_migrate_python-0.10.0.dev20260715111001/src/openrewrite_migrate_python/migrate/avro_migrations.py +53 -0
  5. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/typing_callable.py +7 -2
  6. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_python313.py +8 -1
  7. openrewrite_migrate_python-0.10.0.dev20260715111001/src/openrewrite_migrate_python/migrate/upgrade_to_python39.py +130 -0
  8. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python.egg-info/PKG-INFO +1 -1
  9. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python.egg-info/SOURCES.txt +3 -0
  10. openrewrite_migrate_python-0.10.0.dev20260715111001/tests/test_avro_migrations.py +32 -0
  11. openrewrite_migrate_python-0.10.0.dev20260715111001/tests/test_change_type_recipes.py +65 -0
  12. openrewrite_migrate_python-0.10.0.dev20260715111001/tests/test_typing_callable.py +25 -0
  13. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_upgrade_recipes.py +12 -0
  14. openrewrite_migrate_python-0.10.0.dev20260714174242/src/openrewrite_migrate_python/migrate/upgrade_to_python39.py +0 -128
  15. openrewrite_migrate_python-0.10.0.dev20260714174242/tests/test_typing_callable.py +0 -34
  16. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/setup.cfg +0 -0
  17. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/__init__.py +0 -0
  18. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/__init__.py +0 -0
  19. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/_semantically_equal.py +0 -0
  20. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/all_branches_identical.py +0 -0
  21. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/boolean_checks_not_inverted.py +0 -0
  22. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/collapsible_if_statements.py +0 -0
  23. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/merge_identical_branches.py +0 -0
  24. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/remove_duplicate_conditions.py +0 -0
  25. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/remove_self_assignment.py +0 -0
  26. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/remove_unconditional_value_overwrite.py +0 -0
  27. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/simplify_boolean_literal.py +0 -0
  28. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_code_quality_python/codequality/simplify_redundant_logical_expression.py +0 -0
  29. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/__init__.py +0 -0
  30. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/_markers.py +0 -0
  31. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/aifc_migrations.py +0 -0
  32. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/array_deprecations.py +0 -0
  33. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/ast_deprecations.py +0 -0
  34. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/asyncio_coroutine_to_async.py +0 -0
  35. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/asyncio_deprecations.py +0 -0
  36. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/calendar_deprecations.py +0 -0
  37. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/cgi_migrations.py +0 -0
  38. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/cgi_parse_deprecations.py +0 -0
  39. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/collections_abc_migrations.py +0 -0
  40. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/configparser_deprecations.py +0 -0
  41. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/datetime_utc.py +0 -0
  42. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/distutils_deprecations.py +0 -0
  43. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/distutils_migrations.py +0 -0
  44. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/functools_deprecations.py +0 -0
  45. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/future_imports.py +0 -0
  46. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/gettext_deprecations.py +0 -0
  47. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/html_parser_deprecations.py +0 -0
  48. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/imp_migrations.py +0 -0
  49. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/langchain_classic_imports.py +0 -0
  50. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/langchain_community_imports.py +0 -0
  51. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/langchain_provider_imports.py +0 -0
  52. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/locale_deprecations.py +0 -0
  53. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/locale_getdefaultlocale_deprecation.py +0 -0
  54. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/macpath_deprecations.py +0 -0
  55. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/mailcap_migrations.py +0 -0
  56. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/nntplib_migrations.py +0 -0
  57. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/os_deprecations.py +0 -0
  58. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/pathlib_deprecations.py +0 -0
  59. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/pep594_system_migrations.py +0 -0
  60. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/pipes_migrations.py +0 -0
  61. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/pkgutil_deprecations.py +0 -0
  62. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/platform_deprecations.py +0 -0
  63. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/pydantic_deprecations.py +0 -0
  64. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/pydantic_fields.py +0 -0
  65. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/pydantic_model_fields.py +0 -0
  66. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/re_deprecations.py +0 -0
  67. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/removed_modules_312.py +0 -0
  68. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/shutil_deprecations.py +0 -0
  69. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/socket_deprecations.py +0 -0
  70. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/ssl_deprecations.py +0 -0
  71. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/string_formatting.py +0 -0
  72. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/sys_deprecations.py +0 -0
  73. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/sys_last_deprecations.py +0 -0
  74. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/tarfile_deprecations.py +0 -0
  75. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/telnetlib_migrations.py +0 -0
  76. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/tempfile_deprecations.py +0 -0
  77. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/threading_deprecations.py +0 -0
  78. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/threading_is_alive_deprecation.py +0 -0
  79. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/typing_deprecations.py +0 -0
  80. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/typing_union_to_pipe.py +0 -0
  81. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/unittest_deprecations.py +0 -0
  82. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain02.py +0 -0
  83. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain1.py +0 -0
  84. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_pydantic.py +0 -0
  85. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_python310.py +0 -0
  86. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_python311.py +0 -0
  87. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_python312.py +0 -0
  88. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_python314.py +0 -0
  89. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/upgrade_to_python38.py +0 -0
  90. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/urllib_deprecations.py +0 -0
  91. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/uu_migrations.py +0 -0
  92. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/xdrlib_migrations.py +0 -0
  93. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python/migrate/xml_deprecations.py +0 -0
  94. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python.egg-info/dependency_links.txt +0 -0
  95. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python.egg-info/entry_points.txt +0 -0
  96. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python.egg-info/requires.txt +0 -0
  97. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/src/openrewrite_migrate_python.egg-info/top_level.txt +0 -0
  98. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_aifc_migrations.py +0 -0
  99. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_array_deprecations.py +0 -0
  100. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_ast_deprecations.py +0 -0
  101. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_asyncio_coroutine_to_async.py +0 -0
  102. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_asyncio_deprecations.py +0 -0
  103. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_calendar_deprecations.py +0 -0
  104. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_cgi_parse_deprecations.py +0 -0
  105. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_change_import_recipes.py +0 -0
  106. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_collections_abc_migrations.py +0 -0
  107. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_configparser_deprecations.py +0 -0
  108. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_datetime_utc.py +0 -0
  109. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_distutils_deprecations.py +0 -0
  110. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_future_imports.py +0 -0
  111. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_gettext_deprecations.py +0 -0
  112. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_html_parser_deprecations.py +0 -0
  113. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_imp_migrations.py +0 -0
  114. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_langchain_classic_imports.py +0 -0
  115. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_langchain_community_imports.py +0 -0
  116. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_langchain_provider_imports.py +0 -0
  117. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_locale_deprecations.py +0 -0
  118. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_locale_getdefaultlocale_deprecation.py +0 -0
  119. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_macpath_deprecations.py +0 -0
  120. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_os_deprecations.py +0 -0
  121. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_pep594_migrations.py +0 -0
  122. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_pep594_system_migrations.py +0 -0
  123. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_pkgutil_deprecations.py +0 -0
  124. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_platform_deprecations.py +0 -0
  125. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_pydantic_deprecations.py +0 -0
  126. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_pydantic_fields.py +0 -0
  127. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_pydantic_model_fields.py +0 -0
  128. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_re_deprecations.py +0 -0
  129. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_removed_modules_312.py +0 -0
  130. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_shutil_deprecations.py +0 -0
  131. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_ssl_deprecations.py +0 -0
  132. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_string_formatting.py +0 -0
  133. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_sys_deprecations.py +0 -0
  134. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_sys_last_deprecations.py +0 -0
  135. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_tarfile_deprecations.py +0 -0
  136. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_threading_deprecations.py +0 -0
  137. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_threading_extended.py +0 -0
  138. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_threading_is_alive_deprecation.py +0 -0
  139. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_typing_deprecations.py +0 -0
  140. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_typing_union_to_pipe.py +0 -0
  141. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_unittest_deprecations.py +0 -0
  142. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/tests/test_upgrade_to_pydantic.py +0 -0
  143. {openrewrite_migrate_python-0.10.0.dev20260714174242 → openrewrite_migrate_python-0.10.0.dev20260715111001}/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.10.0.dev20260714174242
3
+ Version: 0.10.0.dev20260715111001
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.10.0.dev20260714174242" # Updated dynamically during release
8
+ version = "0.10.0.dev20260715111001" # 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"
@@ -30,6 +30,7 @@ from .ast_deprecations import (
30
30
  )
31
31
  from .asyncio_coroutine_to_async import MigrateAsyncioCoroutine
32
32
  from .asyncio_deprecations import FindAsyncioCoroutineDecorator
33
+ from .avro_migrations import MigrateAvroPython3ToAvro
33
34
  from .calendar_deprecations import ReplaceCalendarConstants
34
35
  from .cgi_migrations import FindCgiModule, FindCgitbModule
35
36
  from .cgi_parse_deprecations import ReplaceCgiParseQs, ReplaceCgiParseQsl
@@ -192,6 +193,7 @@ __all__ = [
192
193
  "ReplaceAstStr",
193
194
  # Auto-fix: Asyncio
194
195
  "MigrateAsyncioCoroutine",
196
+ "MigrateAvroPython3ToAvro",
195
197
  # Auto-fix: Calendar
196
198
  "ReplaceCalendarConstants",
197
199
  # Auto-fix: Collections
@@ -0,0 +1,53 @@
1
+ """Recipe for migrating the deprecated ``avro-python3`` package to Apache ``avro``."""
2
+
3
+ from typing import List
4
+
5
+ from rewrite import Recipe
6
+ from rewrite.category import CategoryDescriptor
7
+ from rewrite.decorators import categorize
8
+ from rewrite.marketplace import Python
9
+ from rewrite.rpc import RpcRecipe
10
+ from rewrite.python.recipes import ChangeType
11
+
12
+ # Define category path: Python > Migrate
13
+ _Migrate = [*Python, CategoryDescriptor(display_name="Migrate")]
14
+
15
+
16
+ @categorize(_Migrate)
17
+ class MigrateAvroPython3ToAvro(Recipe):
18
+
19
+ @property
20
+ def name(self) -> str:
21
+ return "org.openrewrite.python.migrate.MigrateAvroPython3ToAvro"
22
+
23
+ @property
24
+ def display_name(self) -> str:
25
+ return "Migrate the deprecated `avro-python3` package to `avro`"
26
+
27
+ @property
28
+ def description(self) -> str:
29
+ return (
30
+ "Replace the deprecated `avro-python3` distribution with its maintained successor, "
31
+ "Apache `avro`. Both install the same top-level `avro` import package, so module imports "
32
+ "are unchanged, but `avro-python3`'s `avro.schema.Parse` was renamed to the lowercase "
33
+ "`avro.schema.parse` (and `Parse` removed) in `avro` 1.11+, so that reference is "
34
+ "rewritten. The dependency swap is applied by `org.openrewrite.python.ChangeDependency`."
35
+ )
36
+
37
+ @property
38
+ def tags(self) -> List[str]:
39
+ return ["python", "migration", "avro", "dependencies"]
40
+
41
+ def recipe_list(self) -> List[Recipe]:
42
+ return [
43
+ ChangeType(
44
+ old_fully_qualified_type_name="avro.schema.Parse",
45
+ new_fully_qualified_type_name="avro.schema.parse",
46
+ ),
47
+ RpcRecipe(
48
+ "org.openrewrite.python.ChangeDependency",
49
+ oldPackageName="avro-python3",
50
+ newPackageName="avro",
51
+ newVersion=">=1.11.3",
52
+ ),
53
+ ]
@@ -15,7 +15,7 @@ from rewrite import Recipe
15
15
  from rewrite.category import CategoryDescriptor
16
16
  from rewrite.decorators import categorize
17
17
  from rewrite.marketplace import Python
18
- from rewrite.python.recipes import ChangeImport
18
+ from rewrite.python.recipes import ChangeType
19
19
 
20
20
  # Define category path
21
21
  _Python39 = [
@@ -59,4 +59,9 @@ class ReplaceTypingCallableWithCollectionsAbcCallable(Recipe):
59
59
  )
60
60
 
61
61
  def recipe_list(self) -> List[Recipe]:
62
- return [ChangeImport(old_module="typing", old_name="Callable", new_module="collections.abc")]
62
+ return [
63
+ ChangeType(
64
+ old_fully_qualified_type_name="typing.Callable",
65
+ new_fully_qualified_type_name="collections.abc.Callable",
66
+ )
67
+ ]
@@ -47,7 +47,9 @@ class UpgradeToPython313(Recipe):
47
47
  return (
48
48
  "Migrate deprecated and removed APIs for Python 3.13 compatibility. "
49
49
  "This includes detecting usage of modules removed in PEP 594 "
50
- "('dead batteries') and other API changes between Python 3.12 and 3.13."
50
+ "('dead batteries'), other API changes between Python 3.12 and 3.13, and bumping "
51
+ "third-party dependencies (`ruff`, `avro-python3`) whose pinned releases do not "
52
+ "install cleanly on Python 3.13."
51
53
  )
52
54
 
53
55
  @property
@@ -107,6 +109,11 @@ class UpgradeToPython313(Recipe):
107
109
  FindTelnetlibModule(),
108
110
  FindUuModule(),
109
111
  FindXdrlibModule(),
112
+ # Bump third-party pins that don't install cleanly on 3.13 (avro-python3 off its fragile 1.8.2 sdist).
113
+ RpcRecipe("org.openrewrite.python.UpgradeDependencyVersion",
114
+ packageName="ruff", newVersion=">=0.15.21"),
115
+ RpcRecipe("org.openrewrite.python.UpgradeDependencyVersion",
116
+ packageName="avro-python3", newVersion=">=1.10.2"),
110
117
  # Update project metadata, packaging, Dockerfiles, CloudFormation templates, and .whitesource files to the target version
111
118
  RpcRecipe("org.openrewrite.python.migrate.UpgradePythonVersionTo313"),
112
119
  ]
@@ -0,0 +1,130 @@
1
+ """Composite recipe for upgrading from Python 3.8 to Python 3.9."""
2
+
3
+ from typing import List
4
+
5
+ from rewrite import Recipe
6
+ from rewrite.category import CategoryDescriptor
7
+ from rewrite.decorators import categorize
8
+ from rewrite.marketplace import Python
9
+ from rewrite.rpc import RpcRecipe
10
+ from rewrite.python.recipes import ChangeImport, ChangeType
11
+
12
+ # Define category path: Python > Migrate
13
+ _Migrate = [*Python, CategoryDescriptor(display_name="Migrate")]
14
+
15
+
16
+ @categorize(_Migrate)
17
+ class UpgradeToPython39(Recipe):
18
+ """
19
+ Migrate deprecated APIs for Python 3.9 compatibility.
20
+
21
+ This composite recipe applies all necessary migrations for code
22
+ running on Python 3.8 to be compatible with Python 3.9.
23
+
24
+ Key changes in Python 3.9:
25
+ - PEP 585: Built-in generics (`list[int]` instead of `typing.List[int]`)
26
+ - `base64.encodestring()` / `decodestring()` removed
27
+ - `Element.getiterator()` deprecated (use `iter()`)
28
+ - `Element.getchildren()` deprecated (use `list(element)`)
29
+ - `typing.Callable` deprecated in favor of `collections.abc.Callable`
30
+
31
+ See: https://docs.python.org/3/whatsnew/3.9.html
32
+ """
33
+
34
+ @property
35
+ def name(self) -> str:
36
+ return "org.openrewrite.python.migrate.UpgradeToPython39"
37
+
38
+ @property
39
+ def display_name(self) -> str:
40
+ return "Upgrade to Python 3.9"
41
+
42
+ @property
43
+ def description(self) -> str:
44
+ return (
45
+ "Migrate deprecated APIs for Python 3.9 compatibility. "
46
+ "This includes PEP 585 built-in generics, removed base64 functions, "
47
+ "and deprecated XML Element methods."
48
+ )
49
+
50
+ @property
51
+ def tags(self) -> List[str]:
52
+ return ["python", "migration", "3.9"]
53
+
54
+ def recipe_list(self) -> List[Recipe]:
55
+ """Return the list of recipes to apply for Python 3.9 upgrade."""
56
+ from .html_parser_deprecations import ReplaceHtmlParserUnescape
57
+ from .threading_is_alive_deprecation import ReplaceThreadIsAlive
58
+ from .typing_callable import ReplaceTypingCallableWithCollectionsAbcCallable
59
+ from .upgrade_to_python38 import UpgradeToPython38
60
+ from .xml_deprecations import ReplaceElementGetchildren, ReplaceElementGetiterator
61
+
62
+ return [
63
+ # First apply all Python 3.8 upgrades
64
+ UpgradeToPython38(),
65
+ # base64 encodestring/decodestring removed in Python 3.9.
66
+ # These are functions, not types, so they stay on ChangeImport
67
+ ChangeImport(old_module="base64", old_name="encodestring", new_module="base64", new_name="encodebytes"),
68
+ ChangeImport(old_module="base64", old_name="decodestring", new_module="base64", new_name="decodebytes"),
69
+ # PEP 585: Replace typing.List[X] with list[X], etc. (Python 3.9+).
70
+ # These targets are genuine types (typing.List, typing.Mapping, ...) with ChangeType
71
+ ChangeType(old_fully_qualified_type_name="typing.List", new_fully_qualified_type_name="builtins.list"),
72
+ ChangeType(old_fully_qualified_type_name="typing.Dict", new_fully_qualified_type_name="builtins.dict"),
73
+ ChangeType(old_fully_qualified_type_name="typing.Set", new_fully_qualified_type_name="builtins.set"),
74
+ ChangeType(old_fully_qualified_type_name="typing.FrozenSet", new_fully_qualified_type_name="builtins.frozenset"),
75
+ ChangeType(old_fully_qualified_type_name="typing.Tuple", new_fully_qualified_type_name="builtins.tuple"),
76
+ ChangeType(old_fully_qualified_type_name="typing.Type", new_fully_qualified_type_name="builtins.type"),
77
+ # typing.Callable -> collections.abc.Callable (PEP 585)
78
+ ReplaceTypingCallableWithCollectionsAbcCallable(),
79
+ # PEP 585: typing -> collections replacements
80
+ ChangeType(old_fully_qualified_type_name="typing.Deque", new_fully_qualified_type_name="collections.deque"),
81
+ ChangeType(old_fully_qualified_type_name="typing.DefaultDict", new_fully_qualified_type_name="collections.defaultdict"),
82
+ ChangeType(old_fully_qualified_type_name="typing.OrderedDict", new_fully_qualified_type_name="collections.OrderedDict"),
83
+ ChangeType(old_fully_qualified_type_name="typing.Counter", new_fully_qualified_type_name="collections.Counter"),
84
+ ChangeType(old_fully_qualified_type_name="typing.ChainMap", new_fully_qualified_type_name="collections.ChainMap"),
85
+ # PEP 585: typing -> re replacements
86
+ ChangeType(old_fully_qualified_type_name="typing.Pattern", new_fully_qualified_type_name="re.Pattern"),
87
+ ChangeType(old_fully_qualified_type_name="typing.Match", new_fully_qualified_type_name="re.Match"),
88
+ # PEP 585: typing -> contextlib replacements
89
+ ChangeType(old_fully_qualified_type_name="typing.ContextManager", new_fully_qualified_type_name="contextlib.AbstractContextManager"),
90
+ ChangeType(old_fully_qualified_type_name="typing.AsyncContextManager", new_fully_qualified_type_name="contextlib.AbstractAsyncContextManager"),
91
+ # PEP 585: typing -> collections.abc replacements
92
+ ChangeType(old_fully_qualified_type_name="typing.Iterable", new_fully_qualified_type_name="collections.abc.Iterable"),
93
+ ChangeType(old_fully_qualified_type_name="typing.Iterator", new_fully_qualified_type_name="collections.abc.Iterator"),
94
+ ChangeType(old_fully_qualified_type_name="typing.Generator", new_fully_qualified_type_name="collections.abc.Generator"),
95
+ ChangeType(old_fully_qualified_type_name="typing.Sequence", new_fully_qualified_type_name="collections.abc.Sequence"),
96
+ ChangeType(old_fully_qualified_type_name="typing.MutableSequence", new_fully_qualified_type_name="collections.abc.MutableSequence"),
97
+ ChangeType(old_fully_qualified_type_name="typing.Mapping", new_fully_qualified_type_name="collections.abc.Mapping"),
98
+ ChangeType(old_fully_qualified_type_name="typing.MutableMapping", new_fully_qualified_type_name="collections.abc.MutableMapping"),
99
+ ChangeType(old_fully_qualified_type_name="typing.AbstractSet", new_fully_qualified_type_name="collections.abc.Set"),
100
+ ChangeType(old_fully_qualified_type_name="typing.MutableSet", new_fully_qualified_type_name="collections.abc.MutableSet"),
101
+ ChangeType(old_fully_qualified_type_name="typing.Awaitable", new_fully_qualified_type_name="collections.abc.Awaitable"),
102
+ ChangeType(old_fully_qualified_type_name="typing.Coroutine", new_fully_qualified_type_name="collections.abc.Coroutine"),
103
+ ChangeType(old_fully_qualified_type_name="typing.AsyncIterable", new_fully_qualified_type_name="collections.abc.AsyncIterable"),
104
+ ChangeType(old_fully_qualified_type_name="typing.AsyncIterator", new_fully_qualified_type_name="collections.abc.AsyncIterator"),
105
+ ChangeType(old_fully_qualified_type_name="typing.AsyncGenerator", new_fully_qualified_type_name="collections.abc.AsyncGenerator"),
106
+ ChangeType(old_fully_qualified_type_name="typing.Reversible", new_fully_qualified_type_name="collections.abc.Reversible"),
107
+ ChangeType(old_fully_qualified_type_name="typing.Container", new_fully_qualified_type_name="collections.abc.Container"),
108
+ ChangeType(old_fully_qualified_type_name="typing.Collection", new_fully_qualified_type_name="collections.abc.Collection"),
109
+ ChangeType(old_fully_qualified_type_name="typing.MappingView", new_fully_qualified_type_name="collections.abc.MappingView"),
110
+ ChangeType(old_fully_qualified_type_name="typing.KeysView", new_fully_qualified_type_name="collections.abc.KeysView"),
111
+ ChangeType(old_fully_qualified_type_name="typing.ItemsView", new_fully_qualified_type_name="collections.abc.ItemsView"),
112
+ ChangeType(old_fully_qualified_type_name="typing.ValuesView", new_fully_qualified_type_name="collections.abc.ValuesView"),
113
+ ChangeType(old_fully_qualified_type_name="typing.Hashable", new_fully_qualified_type_name="collections.abc.Hashable"),
114
+ ChangeType(old_fully_qualified_type_name="typing.Sized", new_fully_qualified_type_name="collections.abc.Sized"),
115
+ # XML Element.getiterator() deprecated in 3.9, use iter()
116
+ ReplaceElementGetiterator(),
117
+ # XML Element.getchildren() -> list(element) (3.9)
118
+ ReplaceElementGetchildren(),
119
+ # fractions.gcd() removed in 3.9, use math.gcd() (function -> ChangeImport, not ChangeType)
120
+ ChangeImport(old_module="fractions", old_name="gcd", new_module="math"),
121
+ # sys.getcheckinterval/setcheckinterval removed in 3.9 (functions -> ChangeImport)
122
+ ChangeImport(old_module="sys", old_name="getcheckinterval", new_module="sys", new_name="getswitchinterval"),
123
+ ChangeImport(old_module="sys", old_name="setcheckinterval", new_module="sys", new_name="setswitchinterval"),
124
+ # Thread.isAlive() removed in 3.9
125
+ ReplaceThreadIsAlive(),
126
+ # HTMLParser.unescape() -> html.unescape() (removed in 3.9)
127
+ ReplaceHtmlParserUnescape(),
128
+ # Update project metadata, packaging, Dockerfiles, CloudFormation templates, and .whitesource files to the target version
129
+ RpcRecipe("org.openrewrite.python.migrate.UpgradePythonVersionTo39"),
130
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrewrite-migrate-python
3
- Version: 0.10.0.dev20260714174242
3
+ Version: 0.10.0.dev20260715111001
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
@@ -25,6 +25,7 @@ src/openrewrite_migrate_python/migrate/array_deprecations.py
25
25
  src/openrewrite_migrate_python/migrate/ast_deprecations.py
26
26
  src/openrewrite_migrate_python/migrate/asyncio_coroutine_to_async.py
27
27
  src/openrewrite_migrate_python/migrate/asyncio_deprecations.py
28
+ src/openrewrite_migrate_python/migrate/avro_migrations.py
28
29
  src/openrewrite_migrate_python/migrate/calendar_deprecations.py
29
30
  src/openrewrite_migrate_python/migrate/cgi_migrations.py
30
31
  src/openrewrite_migrate_python/migrate/cgi_parse_deprecations.py
@@ -91,9 +92,11 @@ tests/test_array_deprecations.py
91
92
  tests/test_ast_deprecations.py
92
93
  tests/test_asyncio_coroutine_to_async.py
93
94
  tests/test_asyncio_deprecations.py
95
+ tests/test_avro_migrations.py
94
96
  tests/test_calendar_deprecations.py
95
97
  tests/test_cgi_parse_deprecations.py
96
98
  tests/test_change_import_recipes.py
99
+ tests/test_change_type_recipes.py
97
100
  tests/test_collections_abc_migrations.py
98
101
  tests/test_configparser_deprecations.py
99
102
  tests/test_datetime_utc.py
@@ -0,0 +1,32 @@
1
+ """Tests for the avro-python3 -> avro migration recipe.
2
+
3
+ The recipe is composed of RPC-delegated recipes (``ChangeType`` and ``ChangeDependency``), which run
4
+ in the Moderne runtime; these tests assert the composite wires them with the correct options.
5
+ """
6
+
7
+ from openrewrite_migrate_python.migrate import MigrateAvroPython3ToAvro
8
+ from rewrite.python.recipes import ChangeType
9
+ from rewrite.rpc import RpcRecipe
10
+
11
+
12
+ class TestMigrateAvroPython3ToAvroStructure:
13
+
14
+ def test_change_type_rewrites_parse_reference(self):
15
+ recipe_list = MigrateAvroPython3ToAvro().recipe_list()
16
+ assert any(
17
+ isinstance(r, ChangeType) and
18
+ r.old_fully_qualified_type_name == "avro.schema.Parse" and
19
+ r.new_fully_qualified_type_name == "avro.schema.parse"
20
+ for r in recipe_list
21
+ )
22
+
23
+ def test_dependency_swap_delegates_over_rpc(self):
24
+ recipe_list = MigrateAvroPython3ToAvro().recipe_list()
25
+ rpc = [r for r in recipe_list if isinstance(r, RpcRecipe)]
26
+ assert len(rpc) == 1
27
+ assert rpc[0].name == "org.openrewrite.python.ChangeDependency"
28
+ assert rpc[0].delegates_to_options == {
29
+ "oldPackageName": "avro-python3",
30
+ "newPackageName": "avro",
31
+ "newVersion": ">=1.11.3",
32
+ }
@@ -0,0 +1,65 @@
1
+ """Structural tests for the ChangeType-based typing.* renames in UpgradeToPython39.
2
+
3
+ ChangeType delegates to the JVM peer, so it can't be run in this harness; these assert wiring.
4
+ """
5
+
6
+ from openrewrite_migrate_python.migrate import UpgradeToPython39
7
+ from rewrite.python.recipes import ChangeType
8
+
9
+
10
+ def _change_type_pairs(recipe):
11
+ return {
12
+ (r.old_fully_qualified_type_name, r.new_fully_qualified_type_name)
13
+ for r in recipe.recipe_list()
14
+ if isinstance(r, ChangeType)
15
+ }
16
+
17
+
18
+ class TestUpgradeToPython39TypingChangeTypes:
19
+ def test_wires_pep585_typing_renames(self):
20
+ expected = {
21
+ ("typing.List", "builtins.list"),
22
+ ("typing.Dict", "builtins.dict"),
23
+ ("typing.Set", "builtins.set"),
24
+ ("typing.FrozenSet", "builtins.frozenset"),
25
+ ("typing.Tuple", "builtins.tuple"),
26
+ ("typing.Type", "builtins.type"),
27
+ ("typing.Deque", "collections.deque"),
28
+ ("typing.DefaultDict", "collections.defaultdict"),
29
+ ("typing.OrderedDict", "collections.OrderedDict"),
30
+ ("typing.Counter", "collections.Counter"),
31
+ ("typing.ChainMap", "collections.ChainMap"),
32
+ ("typing.Pattern", "re.Pattern"),
33
+ ("typing.Match", "re.Match"),
34
+ ("typing.ContextManager", "contextlib.AbstractContextManager"),
35
+ ("typing.AsyncContextManager", "contextlib.AbstractAsyncContextManager"),
36
+ ("typing.Iterable", "collections.abc.Iterable"),
37
+ ("typing.Iterator", "collections.abc.Iterator"),
38
+ ("typing.Generator", "collections.abc.Generator"),
39
+ ("typing.Sequence", "collections.abc.Sequence"),
40
+ ("typing.MutableSequence", "collections.abc.MutableSequence"),
41
+ ("typing.Mapping", "collections.abc.Mapping"),
42
+ ("typing.MutableMapping", "collections.abc.MutableMapping"),
43
+ ("typing.AbstractSet", "collections.abc.Set"),
44
+ ("typing.MutableSet", "collections.abc.MutableSet"),
45
+ ("typing.Awaitable", "collections.abc.Awaitable"),
46
+ ("typing.Coroutine", "collections.abc.Coroutine"),
47
+ ("typing.AsyncIterable", "collections.abc.AsyncIterable"),
48
+ ("typing.AsyncIterator", "collections.abc.AsyncIterator"),
49
+ ("typing.AsyncGenerator", "collections.abc.AsyncGenerator"),
50
+ ("typing.Reversible", "collections.abc.Reversible"),
51
+ ("typing.Container", "collections.abc.Container"),
52
+ ("typing.Collection", "collections.abc.Collection"),
53
+ ("typing.MappingView", "collections.abc.MappingView"),
54
+ ("typing.KeysView", "collections.abc.KeysView"),
55
+ ("typing.ItemsView", "collections.abc.ItemsView"),
56
+ ("typing.ValuesView", "collections.abc.ValuesView"),
57
+ ("typing.Hashable", "collections.abc.Hashable"),
58
+ ("typing.Sized", "collections.abc.Sized"),
59
+ }
60
+ assert expected <= _change_type_pairs(UpgradeToPython39())
61
+
62
+ def test_function_renames_are_not_change_type(self):
63
+ # These are functions, not types; they must NOT be wired as ChangeType.
64
+ pairs = _change_type_pairs(UpgradeToPython39())
65
+ assert not any(old.startswith(("base64.", "fractions.", "sys.")) for old, _ in pairs)
@@ -0,0 +1,25 @@
1
+ """Tests for the typing.Callable migration recipe.
2
+
3
+ The recipe now delegates to the RPC-backed ``ChangeType`` (Java's
4
+ ``org.openrewrite.java.ChangeType``), which rewrites the ``typing.Callable`` reference
5
+ across both the ``from typing import Callable`` and qualified ``typing.Callable`` forms and
6
+ updates imports. ``ChangeType`` requires the JVM peer and is exercised in the Moderne runtime
7
+ rather than in this pytest harness, so this test is structural: it asserts the recipe wires
8
+ ``ChangeType`` with the correct old/new fully-qualified names.
9
+ """
10
+
11
+ from rewrite.python.recipes import ChangeType
12
+ from openrewrite_migrate_python.migrate.typing_callable import (
13
+ ReplaceTypingCallableWithCollectionsAbcCallable,
14
+ )
15
+
16
+
17
+ class TestReplaceTypingCallableWithCollectionsAbcCallable:
18
+ def test_wires_change_type_for_callable(self):
19
+ recipe_list = ReplaceTypingCallableWithCollectionsAbcCallable().recipe_list()
20
+ change_types = [r for r in recipe_list if isinstance(r, ChangeType)]
21
+ assert any(
22
+ r.old_fully_qualified_type_name == "typing.Callable"
23
+ and r.new_fully_qualified_type_name == "collections.abc.Callable"
24
+ for r in change_types
25
+ )
@@ -9,6 +9,7 @@ from openrewrite_migrate_python.migrate import (
9
9
  UpgradeToPython313,
10
10
  UpgradeToPython314,
11
11
  )
12
+ from rewrite.rpc import RpcRecipe
12
13
 
13
14
  class TestUpgradeRecipeChaining:
14
15
  """Tests for verifying upgrade recipe chaining."""
@@ -79,6 +80,17 @@ class TestUpgradeRecipeChaining:
79
80
  assert "org.openrewrite.python.migrate.UpgradeToPython39" in all_names
80
81
  assert "org.openrewrite.python.migrate.UpgradeToPython38" in all_names
81
82
 
83
+ def test_upgrade_to_python313_bumps_incompatible_dependencies(self):
84
+ """UpgradeToPython313 inlines the 3.13-incompatible dependency bumps over RPC."""
85
+ recipe_list = UpgradeToPython313().recipe_list()
86
+ dep_bumps = {
87
+ (r.delegates_to_options.get("packageName"), r.delegates_to_options.get("newVersion"))
88
+ for r in recipe_list
89
+ if isinstance(r, RpcRecipe) and r.name == "org.openrewrite.python.UpgradeDependencyVersion"
90
+ }
91
+ assert ("ruff", ">=0.15.21") in dep_bumps
92
+ assert ("avro-python3", ">=1.10.2") in dep_bumps
93
+
82
94
  def test_each_composite_calls_its_file_upgrade_recipe(self):
83
95
  """Each composite must call the Java project-file recipe for its own version."""
84
96
  cases = [
@@ -1,128 +0,0 @@
1
- """Composite recipe for upgrading from Python 3.8 to Python 3.9."""
2
-
3
- from typing import List
4
-
5
- from rewrite import Recipe
6
- from rewrite.category import CategoryDescriptor
7
- from rewrite.decorators import categorize
8
- from rewrite.marketplace import Python
9
- from rewrite.rpc import RpcRecipe
10
- from rewrite.python.recipes import ChangeImport
11
-
12
- # Define category path: Python > Migrate
13
- _Migrate = [*Python, CategoryDescriptor(display_name="Migrate")]
14
-
15
-
16
- @categorize(_Migrate)
17
- class UpgradeToPython39(Recipe):
18
- """
19
- Migrate deprecated APIs for Python 3.9 compatibility.
20
-
21
- This composite recipe applies all necessary migrations for code
22
- running on Python 3.8 to be compatible with Python 3.9.
23
-
24
- Key changes in Python 3.9:
25
- - PEP 585: Built-in generics (`list[int]` instead of `typing.List[int]`)
26
- - `base64.encodestring()` / `decodestring()` removed
27
- - `Element.getiterator()` deprecated (use `iter()`)
28
- - `Element.getchildren()` deprecated (use `list(element)`)
29
- - `typing.Callable` deprecated in favor of `collections.abc.Callable`
30
-
31
- See: https://docs.python.org/3/whatsnew/3.9.html
32
- """
33
-
34
- @property
35
- def name(self) -> str:
36
- return "org.openrewrite.python.migrate.UpgradeToPython39"
37
-
38
- @property
39
- def display_name(self) -> str:
40
- return "Upgrade to Python 3.9"
41
-
42
- @property
43
- def description(self) -> str:
44
- return (
45
- "Migrate deprecated APIs for Python 3.9 compatibility. "
46
- "This includes PEP 585 built-in generics, removed base64 functions, "
47
- "and deprecated XML Element methods."
48
- )
49
-
50
- @property
51
- def tags(self) -> List[str]:
52
- return ["python", "migration", "3.9"]
53
-
54
- def recipe_list(self) -> List[Recipe]:
55
- """Return the list of recipes to apply for Python 3.9 upgrade."""
56
- from .html_parser_deprecations import ReplaceHtmlParserUnescape
57
- from .threading_is_alive_deprecation import ReplaceThreadIsAlive
58
- from .typing_callable import ReplaceTypingCallableWithCollectionsAbcCallable
59
- from .upgrade_to_python38 import UpgradeToPython38
60
- from .xml_deprecations import ReplaceElementGetchildren, ReplaceElementGetiterator
61
-
62
- return [
63
- # First apply all Python 3.8 upgrades
64
- UpgradeToPython38(),
65
- # base64 encodestring/decodestring removed in Python 3.9
66
- ChangeImport(old_module="base64", old_name="encodestring", new_module="base64", new_name="encodebytes"),
67
- ChangeImport(old_module="base64", old_name="decodestring", new_module="base64", new_name="decodebytes"),
68
- # PEP 585: Replace typing.List[X] with list[X], etc. (Python 3.9+)
69
- ChangeImport(old_module="typing", old_name="List", new_module="builtins", new_name="list"),
70
- ChangeImport(old_module="typing", old_name="Dict", new_module="builtins", new_name="dict"),
71
- ChangeImport(old_module="typing", old_name="Set", new_module="builtins", new_name="set"),
72
- ChangeImport(old_module="typing", old_name="FrozenSet", new_module="builtins", new_name="frozenset"),
73
- ChangeImport(old_module="typing", old_name="Tuple", new_module="builtins", new_name="tuple"),
74
- ChangeImport(old_module="typing", old_name="Type", new_module="builtins", new_name="type"),
75
- # typing.Callable -> collections.abc.Callable (PEP 585)
76
- ReplaceTypingCallableWithCollectionsAbcCallable(),
77
- # PEP 585: typing -> collections replacements
78
- ChangeImport(old_module="typing", old_name="Deque", new_module="collections", new_name="deque"),
79
- ChangeImport(old_module="typing", old_name="DefaultDict", new_module="collections", new_name="defaultdict"),
80
- ChangeImport(old_module="typing", old_name="OrderedDict", new_module="collections"),
81
- ChangeImport(old_module="typing", old_name="Counter", new_module="collections"),
82
- ChangeImport(old_module="typing", old_name="ChainMap", new_module="collections"),
83
- # PEP 585: typing -> re replacements
84
- ChangeImport(old_module="typing", old_name="Pattern", new_module="re"),
85
- ChangeImport(old_module="typing", old_name="Match", new_module="re"),
86
- # PEP 585: typing -> contextlib replacements
87
- ChangeImport(old_module="typing", old_name="ContextManager", new_module="contextlib", new_name="AbstractContextManager"),
88
- ChangeImport(old_module="typing", old_name="AsyncContextManager", new_module="contextlib", new_name="AbstractAsyncContextManager"),
89
- # PEP 585: typing -> collections.abc replacements
90
- ChangeImport(old_module="typing", old_name="Iterable", new_module="collections.abc"),
91
- ChangeImport(old_module="typing", old_name="Iterator", new_module="collections.abc"),
92
- ChangeImport(old_module="typing", old_name="Generator", new_module="collections.abc"),
93
- ChangeImport(old_module="typing", old_name="Sequence", new_module="collections.abc"),
94
- ChangeImport(old_module="typing", old_name="MutableSequence", new_module="collections.abc"),
95
- ChangeImport(old_module="typing", old_name="Mapping", new_module="collections.abc"),
96
- ChangeImport(old_module="typing", old_name="MutableMapping", new_module="collections.abc"),
97
- ChangeImport(old_module="typing", old_name="AbstractSet", new_module="collections.abc", new_name="Set"),
98
- ChangeImport(old_module="typing", old_name="MutableSet", new_module="collections.abc"),
99
- ChangeImport(old_module="typing", old_name="Awaitable", new_module="collections.abc"),
100
- ChangeImport(old_module="typing", old_name="Coroutine", new_module="collections.abc"),
101
- ChangeImport(old_module="typing", old_name="AsyncIterable", new_module="collections.abc"),
102
- ChangeImport(old_module="typing", old_name="AsyncIterator", new_module="collections.abc"),
103
- ChangeImport(old_module="typing", old_name="AsyncGenerator", new_module="collections.abc"),
104
- ChangeImport(old_module="typing", old_name="Reversible", new_module="collections.abc"),
105
- ChangeImport(old_module="typing", old_name="Container", new_module="collections.abc"),
106
- ChangeImport(old_module="typing", old_name="Collection", new_module="collections.abc"),
107
- ChangeImport(old_module="typing", old_name="MappingView", new_module="collections.abc"),
108
- ChangeImport(old_module="typing", old_name="KeysView", new_module="collections.abc"),
109
- ChangeImport(old_module="typing", old_name="ItemsView", new_module="collections.abc"),
110
- ChangeImport(old_module="typing", old_name="ValuesView", new_module="collections.abc"),
111
- ChangeImport(old_module="typing", old_name="Hashable", new_module="collections.abc"),
112
- ChangeImport(old_module="typing", old_name="Sized", new_module="collections.abc"),
113
- # XML Element.getiterator() deprecated in 3.9, use iter()
114
- ReplaceElementGetiterator(),
115
- # XML Element.getchildren() -> list(element) (3.9)
116
- ReplaceElementGetchildren(),
117
- # fractions.gcd() removed in 3.9, use math.gcd()
118
- ChangeImport(old_module="fractions", old_name="gcd", new_module="math"),
119
- # sys.getcheckinterval/setcheckinterval removed in 3.9
120
- ChangeImport(old_module="sys", old_name="getcheckinterval", new_module="sys", new_name="getswitchinterval"),
121
- ChangeImport(old_module="sys", old_name="setcheckinterval", new_module="sys", new_name="setswitchinterval"),
122
- # Thread.isAlive() removed in 3.9
123
- ReplaceThreadIsAlive(),
124
- # HTMLParser.unescape() -> html.unescape() (removed in 3.9)
125
- ReplaceHtmlParserUnescape(),
126
- # Update project metadata, packaging, Dockerfiles, CloudFormation templates, and .whitesource files to the target version
127
- RpcRecipe("org.openrewrite.python.migrate.UpgradePythonVersionTo39"),
128
- ]
@@ -1,34 +0,0 @@
1
- """Tests for typing.Callable migration recipe."""
2
-
3
- from rewrite.test import RecipeSpec, python
4
- from openrewrite_migrate_python.migrate.typing_callable import (
5
- ReplaceTypingCallableWithCollectionsAbcCallable,
6
- )
7
-
8
-
9
- class TestReplaceTypingCallableWithCollectionsAbcCallable:
10
- def test_replaces_from_typing_import_callable(self):
11
- spec = RecipeSpec(recipe=ReplaceTypingCallableWithCollectionsAbcCallable())
12
- spec.rewrite_run(
13
- python(
14
- """
15
- from typing import Callable
16
- handler: Callable[[int], str] = lambda x: str(x)
17
- """,
18
- """
19
- from collections.abc import Callable
20
- handler: Callable[[int], str] = lambda x: str(x)
21
- """,
22
- )
23
- )
24
-
25
- def test_no_change_when_collections_abc_callable(self):
26
- spec = RecipeSpec(recipe=ReplaceTypingCallableWithCollectionsAbcCallable())
27
- spec.rewrite_run(
28
- python(
29
- """
30
- from collections.abc import Callable
31
- handler: Callable[[int], str] = lambda x: str(x)
32
- """
33
- )
34
- )