openrewrite-migrate-python 0.14.0.dev20260902064123__tar.gz → 0.14.0.dev20260902102558__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 (145) hide show
  1. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/PKG-INFO +1 -1
  2. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/pyproject.toml +1 -1
  3. openrewrite_migrate_python-0.14.0.dev20260902102558/src/openrewrite_code_quality_python/codequality/_reindent.py +93 -0
  4. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/all_branches_identical.py +32 -32
  5. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/collapsible_if_statements.py +71 -46
  6. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python.egg-info/PKG-INFO +1 -1
  7. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python.egg-info/SOURCES.txt +1 -0
  8. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/setup.cfg +0 -0
  9. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/__init__.py +0 -0
  10. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/__init__.py +0 -0
  11. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/_semantically_equal.py +0 -0
  12. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/boolean_checks_not_inverted.py +0 -0
  13. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/find_suspicious_chained_comparison.py +0 -0
  14. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/merge_identical_branches.py +0 -0
  15. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/remove_duplicate_conditions.py +0 -0
  16. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/remove_self_assignment.py +0 -0
  17. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/remove_unconditional_value_overwrite.py +0 -0
  18. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/simplify_boolean_literal.py +0 -0
  19. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_code_quality_python/codequality/simplify_redundant_logical_expression.py +0 -0
  20. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/__init__.py +0 -0
  21. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/__init__.py +0 -0
  22. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/_import_hygiene.py +0 -0
  23. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/_markers.py +0 -0
  24. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/_typing_imports.py +0 -0
  25. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/aifc_migrations.py +0 -0
  26. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/array_deprecations.py +0 -0
  27. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/ast_deprecations.py +0 -0
  28. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/asyncio_coroutine_to_async.py +0 -0
  29. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/asyncio_deprecations.py +0 -0
  30. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/avro_migrations.py +0 -0
  31. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/calendar_deprecations.py +0 -0
  32. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/cgi_migrations.py +0 -0
  33. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/cgi_parse_deprecations.py +0 -0
  34. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/collections_abc_migrations.py +0 -0
  35. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/configparser_deprecations.py +0 -0
  36. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/datetime_utc.py +0 -0
  37. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/distutils_deprecations.py +0 -0
  38. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/distutils_migrations.py +0 -0
  39. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/functools_deprecations.py +0 -0
  40. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/future_imports.py +0 -0
  41. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/gettext_deprecations.py +0 -0
  42. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/html_parser_deprecations.py +0 -0
  43. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/imp_migrations.py +0 -0
  44. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/langchain_classic_imports.py +0 -0
  45. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/langchain_community_imports.py +0 -0
  46. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/langchain_provider_imports.py +0 -0
  47. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/locale_deprecations.py +0 -0
  48. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/locale_getdefaultlocale_deprecation.py +0 -0
  49. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/macpath_deprecations.py +0 -0
  50. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/mailcap_migrations.py +0 -0
  51. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/nntplib_migrations.py +0 -0
  52. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/os_deprecations.py +0 -0
  53. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/pathlib_deprecations.py +0 -0
  54. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/pep594_system_migrations.py +0 -0
  55. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/pipes_migrations.py +0 -0
  56. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/pkgutil_deprecations.py +0 -0
  57. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/platform_deprecations.py +0 -0
  58. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/pydantic_deprecations.py +0 -0
  59. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/pydantic_fields.py +0 -0
  60. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/pydantic_model_fields.py +0 -0
  61. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/re_deprecations.py +0 -0
  62. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/removed_modules_312.py +0 -0
  63. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/shutil_deprecations.py +0 -0
  64. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/socket_deprecations.py +0 -0
  65. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/ssl_deprecations.py +0 -0
  66. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/string_formatting.py +0 -0
  67. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/sys_deprecations.py +0 -0
  68. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/sys_last_deprecations.py +0 -0
  69. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/tarfile_deprecations.py +0 -0
  70. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/telnetlib_migrations.py +0 -0
  71. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/tempfile_deprecations.py +0 -0
  72. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/threading_deprecations.py +0 -0
  73. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/threading_is_alive_deprecation.py +0 -0
  74. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/typing_callable.py +0 -0
  75. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/typing_deprecations.py +0 -0
  76. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/typing_union_to_pipe.py +0 -0
  77. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/unittest_deprecations.py +0 -0
  78. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain02.py +0 -0
  79. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain1.py +0 -0
  80. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_pydantic.py +0 -0
  81. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_python310.py +0 -0
  82. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_python311.py +0 -0
  83. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_python312.py +0 -0
  84. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_python313.py +0 -0
  85. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_python314.py +0 -0
  86. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_python38.py +0 -0
  87. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/upgrade_to_python39.py +0 -0
  88. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/urllib_deprecations.py +0 -0
  89. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/uu_migrations.py +0 -0
  90. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/xdrlib_migrations.py +0 -0
  91. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python/migrate/xml_deprecations.py +0 -0
  92. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python.egg-info/dependency_links.txt +0 -0
  93. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python.egg-info/entry_points.txt +0 -0
  94. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python.egg-info/requires.txt +0 -0
  95. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/src/openrewrite_migrate_python.egg-info/top_level.txt +0 -0
  96. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_aifc_migrations.py +0 -0
  97. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_array_deprecations.py +0 -0
  98. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_ast_deprecations.py +0 -0
  99. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_asyncio_coroutine_to_async.py +0 -0
  100. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_asyncio_deprecations.py +0 -0
  101. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_avro_migrations.py +0 -0
  102. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_calendar_deprecations.py +0 -0
  103. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_cgi_parse_deprecations.py +0 -0
  104. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_change_import_recipes.py +0 -0
  105. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_collections_abc_migrations.py +0 -0
  106. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_configparser_deprecations.py +0 -0
  107. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_datetime_utc.py +0 -0
  108. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_distutils_deprecations.py +0 -0
  109. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_future_imports.py +0 -0
  110. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_gettext_deprecations.py +0 -0
  111. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_html_parser_deprecations.py +0 -0
  112. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_imp_migrations.py +0 -0
  113. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_langchain_classic_imports.py +0 -0
  114. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_langchain_community_imports.py +0 -0
  115. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_langchain_provider_imports.py +0 -0
  116. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_locale_deprecations.py +0 -0
  117. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_locale_getdefaultlocale_deprecation.py +0 -0
  118. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_macpath_deprecations.py +0 -0
  119. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_os_deprecations.py +0 -0
  120. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_pep594_migrations.py +0 -0
  121. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_pep594_system_migrations.py +0 -0
  122. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_pkgutil_deprecations.py +0 -0
  123. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_platform_deprecations.py +0 -0
  124. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_pydantic_deprecations.py +0 -0
  125. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_pydantic_fields.py +0 -0
  126. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_pydantic_model_fields.py +0 -0
  127. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_re_deprecations.py +0 -0
  128. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_removed_modules_312.py +0 -0
  129. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_shutil_deprecations.py +0 -0
  130. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_ssl_deprecations.py +0 -0
  131. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_string_formatting.py +0 -0
  132. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_sys_deprecations.py +0 -0
  133. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_sys_last_deprecations.py +0 -0
  134. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_tarfile_deprecations.py +0 -0
  135. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_threading_deprecations.py +0 -0
  136. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_threading_extended.py +0 -0
  137. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_threading_is_alive_deprecation.py +0 -0
  138. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_typing_alias_moves.py +0 -0
  139. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_typing_callable.py +0 -0
  140. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_typing_deprecations.py +0 -0
  141. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_typing_union_to_pipe.py +0 -0
  142. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_unittest_deprecations.py +0 -0
  143. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_upgrade_recipes.py +0 -0
  144. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/tests/test_upgrade_to_pydantic.py +0 -0
  145. {openrewrite_migrate_python-0.14.0.dev20260902064123 → openrewrite_migrate_python-0.14.0.dev20260902102558}/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.dev20260902064123
3
+ Version: 0.14.0.dev20260902102558
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.14.0.dev20260902064123" # Updated dynamically during release
8
+ version = "0.14.0.dev20260902102558" # 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"
@@ -0,0 +1,93 @@
1
+ """Shared indentation helpers for recipes that lift a block out of its parent.
2
+
3
+ Python indentation lives in the ``Space`` before each token, so moving a block
4
+ to a shallower nesting level means rewriting every line it spans.
5
+ """
6
+
7
+ from typing import Optional, TypeVar
8
+
9
+ from rewrite.java.support_types import Space
10
+ from rewrite.java.tree import Statement
11
+ from rewrite.python.tree import ExpressionStatement, StatementExpression
12
+ from rewrite.python.visitor import PythonVisitor
13
+
14
+ T = TypeVar("T")
15
+
16
+
17
+ def inherited_prefix(dropped: Space, body: Space) -> Space:
18
+ """Prefix for the statement that takes the place of a dropped enclosing node.
19
+
20
+ It starts where the dropped node started, and the comments the dropped node
21
+ carried stay ahead of the body's own. Those comments' suffixes already
22
+ indent to the level the body now occupies.
23
+ """
24
+ return Space(
25
+ _comments=[*dropped.comments, *body.comments],
26
+ _whitespace=dropped.whitespace,
27
+ )
28
+
29
+
30
+ def with_prefix(stmt: Statement, prefix: Space) -> Statement:
31
+ """Set the prefix of *stmt*, threading through the ``Py`` wrappers whose
32
+ own prefix is a read-only view of the node they hold.
33
+
34
+ Drop once openrewrite/rewrite#8742 is the version floor: it gives those
35
+ wrappers a write path, so `stmt.replace(_prefix=...)` suffices alone.
36
+ """
37
+ if isinstance(stmt, ExpressionStatement):
38
+ return stmt.replace(_expression=with_prefix(stmt.expression, prefix))
39
+ if isinstance(stmt, StatementExpression):
40
+ return stmt.replace(_statement=with_prefix(stmt.statement, prefix))
41
+ return stmt.replace(_prefix=prefix)
42
+
43
+
44
+ def line_indent(space: Space) -> Optional[str]:
45
+ """Indentation of the line the token following *space* starts on, or
46
+ ``None`` when that token shares a line with what precedes it.
47
+
48
+ A trailing comment puts the newline in the comment's suffix rather than in
49
+ ``Space.whitespace``; empty whitespace is a file's first token, at column 0.
50
+ """
51
+ text = space.comments[-1].suffix if space.comments else space.whitespace
52
+ if "\n" in text:
53
+ return text.rsplit("\n", 1)[-1]
54
+ return text if text == "" else None
55
+
56
+
57
+ def _rebase(text: str, old_base: str, new_base: str) -> str:
58
+ head, sep, indent = text.rpartition("\n")
59
+ if not sep or not indent.startswith(old_base):
60
+ return text
61
+ return head + sep + new_base + indent[len(old_base):]
62
+
63
+
64
+ class _Reindent(PythonVisitor[None]):
65
+ def __init__(self, old_base: str, new_base: str):
66
+ super().__init__()
67
+ self._old_base = old_base
68
+ self._new_base = new_base
69
+
70
+ def visit_space(self, space: Optional[Space], p: None) -> Space:
71
+ if space is None:
72
+ return Space.EMPTY
73
+ whitespace = _rebase(space.whitespace, self._old_base, self._new_base)
74
+ comments = [
75
+ c.replace(suffix=_rebase(c.suffix, self._old_base, self._new_base))
76
+ for c in space.comments
77
+ ]
78
+ if whitespace == space.whitespace and all(
79
+ c.suffix == o.suffix for c, o in zip(comments, space.comments)
80
+ ):
81
+ return space
82
+ return Space(_comments=comments, _whitespace=whitespace)
83
+
84
+
85
+ def reindent(tree: T, old_base: str, new_base: str) -> T:
86
+ """Re-base every line in *tree* that is indented at least to *old_base*.
87
+
88
+ Lines indented less deeply are continuation lines whose alignment is
89
+ independent of the block's nesting, so they are left alone.
90
+ """
91
+ if old_base == new_base:
92
+ return tree
93
+ return _Reindent(old_base, new_base).visit(tree, None)
@@ -16,12 +16,17 @@ from rewrite.category import CategoryDescriptor
16
16
  from rewrite.decorators import categorize
17
17
  from rewrite.marketplace import Python
18
18
  from rewrite.python.visitor import PythonVisitor
19
- from rewrite.java.support_types import Space
20
19
  from rewrite.java.tree import (
21
20
  Block,
22
21
  If,
23
22
  Statement,
24
23
  )
24
+ from openrewrite_code_quality_python.codequality._reindent import (
25
+ inherited_prefix,
26
+ line_indent,
27
+ reindent,
28
+ with_prefix,
29
+ )
25
30
  from openrewrite_code_quality_python.codequality._semantically_equal import SemanticallyEqual
26
31
 
27
32
  _CodeQuality = [
@@ -152,9 +157,6 @@ def _replace_identical_ifs_padded(padded_stmts) -> Optional[list]:
152
157
  Works on a list of JRightPadded[Statement] and returns a new padded list,
153
158
  or None if nothing changed.
154
159
  """
155
- from rewrite.java.support_types import JRightPadded
156
- from rewrite.markers import Markers
157
-
158
160
  result = []
159
161
  changed = False
160
162
  for rp in padded_stmts:
@@ -170,36 +172,34 @@ def _replace_identical_ifs_padded(padded_stmts) -> Optional[list]:
170
172
  result.append(rp)
171
173
  continue
172
174
 
173
- # Extract the body statements from the then_part Block.
174
175
  body = s.then_part
175
- if isinstance(body, Block) and body._statements:
176
- first = True
177
- for body_rp in body._statements:
178
- bs = body_rp.element
179
- if first:
180
- # First body statement gets the if statement's prefix
181
- new_elem = bs.replace(_prefix=s.prefix)
182
- result.append(rp.replace(_element=new_elem))
183
- first = False
184
- else:
185
- # Subsequent body statements keep their whitespace
186
- # but with one indent level removed
187
- ws = bs.prefix.whitespace
188
- if_ws = s.prefix.whitespace
189
- base = if_ws.split("\n")[-1] if "\n" in if_ws else if_ws
190
- body_indent = ws.split("\n")[-1] if "\n" in ws else ws
191
- if len(body_indent) > len(base):
192
- new_ws = ws.replace(body_indent, base, 1)
193
- else:
194
- new_ws = ws
195
- new_elem = bs.replace(_prefix=Space(
196
- _comments=bs.prefix.comments,
197
- _whitespace=new_ws,
198
- ))
199
- result.append(body_rp.replace(_element=new_elem))
200
- changed = True
201
- else:
176
+ if not isinstance(body, Block) or not body._statements:
202
177
  result.append(rp)
178
+ continue
179
+
180
+ if_indent = line_indent(s.prefix)
181
+ body_indent = line_indent(body._statements[0].element.prefix)
182
+ if (
183
+ if_indent is None
184
+ or body_indent is None
185
+ or not body_indent.startswith(if_indent)
186
+ ):
187
+ result.append(rp)
188
+ continue
189
+
190
+ body = reindent(body, body_indent, if_indent)
191
+ first = body._statements[0]
192
+ # Each lifted statement keeps its own padding, which is where a `;`
193
+ # separating it from the next one is recorded.
194
+ result.append(
195
+ first.replace(
196
+ _element=with_prefix(
197
+ first.element, inherited_prefix(s.prefix, first.element.prefix)
198
+ )
199
+ )
200
+ )
201
+ result.extend(body._statements[1:])
202
+ changed = True
203
203
 
204
204
  if not changed:
205
205
  return None
@@ -16,43 +16,62 @@ from rewrite.category import CategoryDescriptor
16
16
  from rewrite.decorators import categorize
17
17
  from rewrite.marketplace import Python
18
18
  from rewrite.markers import Markers
19
+ from rewrite.python.tree import StatementExpression
19
20
  from rewrite.python.visitor import PythonVisitor
20
21
  from rewrite.java.support_types import JLeftPadded, JRightPadded, Space
21
22
  from rewrite.java.tree import (
23
+ Assignment,
22
24
  Binary as JBinary,
23
25
  Block,
24
26
  ControlParentheses,
25
27
  Expression,
26
28
  If,
29
+ Lambda,
27
30
  Parentheses,
31
+ Ternary,
28
32
  )
29
33
  from rewrite.utils import random_id
30
34
 
35
+ from openrewrite_code_quality_python.codequality._reindent import (
36
+ inherited_prefix,
37
+ line_indent,
38
+ reindent,
39
+ with_prefix,
40
+ )
41
+
31
42
  _CodeQuality = [
32
43
  *Python,
33
44
  CategoryDescriptor(display_name="Code quality"),
34
45
  ]
35
46
 
36
47
 
37
- def _contains_or(expr: Expression) -> bool:
38
- """Return True if the top-level expression is an ``or`` binary."""
39
- return isinstance(expr, JBinary) and expr.operator == JBinary.Type.Or
48
+ def _binds_looser_than_and(expr: Expression) -> bool:
49
+ """Return True for the operand forms that ``and`` would capture.
40
50
 
41
-
42
- def _dedent_block(block: Block, indent: str) -> Block:
43
- """Remove one level of *indent* from every statement in *block*."""
44
- if not indent:
45
- return block
46
- new_stmts = []
47
- for rp in block._statements:
48
- s = rp.element
49
- ws = s.prefix.whitespace
50
- if indent in ws:
51
- ws = ws.replace(indent, "", 1)
52
- s = s.replace(_prefix=Space(_comments=s.prefix.comments, _whitespace=ws))
53
- rp = rp.replace(_element=s)
54
- new_stmts.append(rp)
55
- return block.replace(_statements=new_stmts)
51
+ Everything below ``and`` in Python's precedence table: ``or``, the
52
+ conditional expression, ``lambda``, ``:=`` (a ``J.Assignment`` here) and
53
+ ``yield`` (a ``Py.StatementExpression``).
54
+ """
55
+ if isinstance(expr, JBinary):
56
+ return expr.operator == JBinary.Type.Or
57
+ return isinstance(expr, (Ternary, Lambda, Assignment, StatementExpression))
58
+
59
+
60
+ def _operand(expr: Expression, prefix: Space) -> Expression:
61
+ """Prepare *expr* as an operand of the merged ``and``, parenthesizing it
62
+ when its own operator would otherwise be captured."""
63
+ if _binds_looser_than_and(expr):
64
+ return Parentheses(
65
+ _id=random_id(),
66
+ _prefix=prefix,
67
+ _markers=Markers.EMPTY,
68
+ _tree=JRightPadded(
69
+ _element=expr.replace(_prefix=Space.EMPTY),
70
+ _after=Space.EMPTY,
71
+ _markers=Markers.EMPTY,
72
+ ),
73
+ )
74
+ return expr.replace(_prefix=prefix)
56
75
 
57
76
 
58
77
  @categorize(_CodeQuality)
@@ -129,36 +148,34 @@ class CollapsibleIfStatements(Recipe):
129
148
  if inner.else_part is not None:
130
149
  return if_
131
150
 
132
- outer_cond = if_.if_condition.tree
133
- inner_cond = inner.if_condition.tree
151
+ inner_body = inner.then_part
152
+ if not isinstance(inner_body, Block) or not inner_body.statements:
153
+ return if_
134
154
 
135
- # Wrap inner condition in parens if it contains `or`
136
- # to preserve precedence with the new `and`
137
- if _contains_or(inner_cond):
138
- inner_cond = Parentheses(
139
- _id=random_id(),
140
- _prefix=Space.SINGLE_SPACE,
141
- _markers=Markers.EMPTY,
142
- _tree=JRightPadded(
143
- _element=inner_cond.replace(_prefix=Space.EMPTY),
144
- _after=Space.EMPTY,
145
- _markers=Markers.EMPTY,
146
- ),
147
- )
148
- else:
149
- inner_cond = inner_cond.replace(_prefix=Space.SINGLE_SPACE)
155
+ # The body rises to where the inner `if` header sat, which is
156
+ # always deeper than the surviving header whatever the file's
157
+ # indent unit -- and is a line start even when the outer `if`
158
+ # is an `elif`, whose own prefix holds no newline.
159
+ header_indent = line_indent(inner.prefix)
160
+ body_indent = line_indent(inner_body.statements[0].prefix)
161
+ if (
162
+ header_indent is None
163
+ or body_indent is None
164
+ or not body_indent.startswith(header_indent)
165
+ ):
166
+ return if_
150
167
 
151
168
  combined = JBinary(
152
169
  _id=random_id(),
153
- _prefix=outer_cond.prefix,
170
+ _prefix=if_.if_condition.tree.prefix,
154
171
  _markers=Markers.EMPTY,
155
- _left=outer_cond.replace(_prefix=Space.EMPTY),
172
+ _left=_operand(if_.if_condition.tree, Space.EMPTY),
156
173
  _operator=JLeftPadded(
157
174
  _before=Space.SINGLE_SPACE,
158
175
  _element=JBinary.Type.And,
159
176
  _markers=Markers.EMPTY,
160
177
  ),
161
- _right=inner_cond,
178
+ _right=_operand(inner.if_condition.tree, Space.SINGLE_SPACE),
162
179
  _type=None,
163
180
  )
164
181
 
@@ -173,14 +190,22 @@ class CollapsibleIfStatements(Recipe):
173
190
  ),
174
191
  )
175
192
 
176
- # Dedent the inner body by one level since it was
177
- # nested inside the inner if that we're removing.
178
- inner_body = inner.then_part
179
- if isinstance(inner_body, Block):
180
- # The inner if's prefix tells us the indent unit
181
- ws = inner.prefix.whitespace
182
- indent = ws.split("\n")[-1] if "\n" in ws else ws
183
- inner_body = _dedent_block(inner_body, indent)
193
+ # One level per visit: a chain of three or more `if`s merges a
194
+ # level at a time, and each pass rebases the comments the
195
+ # previous one left at the level it dropped.
196
+ inner_body = reindent(inner_body, body_indent, header_indent)
197
+ first = inner_body._statements[0]
198
+ inner_body = inner_body.replace(
199
+ _statements=[
200
+ first.replace(
201
+ _element=with_prefix(
202
+ first.element,
203
+ inherited_prefix(inner.prefix, first.element.prefix),
204
+ )
205
+ ),
206
+ *inner_body._statements[1:],
207
+ ]
208
+ )
184
209
 
185
210
  return if_.replace(
186
211
  _if_condition=new_condition,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrewrite-migrate-python
3
- Version: 0.14.0.dev20260902064123
3
+ Version: 0.14.0.dev20260902102558
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
@@ -1,6 +1,7 @@
1
1
  pyproject.toml
2
2
  src/openrewrite_code_quality_python/__init__.py
3
3
  src/openrewrite_code_quality_python/codequality/__init__.py
4
+ src/openrewrite_code_quality_python/codequality/_reindent.py
4
5
  src/openrewrite_code_quality_python/codequality/_semantically_equal.py
5
6
  src/openrewrite_code_quality_python/codequality/all_branches_identical.py
6
7
  src/openrewrite_code_quality_python/codequality/boolean_checks_not_inverted.py