openrewrite-migrate-python 0.14.0.dev20260902105951__tar.gz → 0.14.0.dev20260902123950__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 (147) hide show
  1. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/PKG-INFO +1 -1
  2. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/pyproject.toml +1 -1
  3. openrewrite_migrate_python-0.14.0.dev20260902123950/src/openrewrite_code_quality_python/codequality/remove_self_assignment.py +275 -0
  4. openrewrite_migrate_python-0.14.0.dev20260902123950/src/openrewrite_migrate_python/migrate/_langchain_tables.py +716 -0
  5. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/langchain_classic_imports.py +44 -0
  6. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/langchain_community_imports.py +52 -42
  7. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python.egg-info/PKG-INFO +1 -1
  8. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python.egg-info/SOURCES.txt +1 -0
  9. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_langchain_classic_imports.py +52 -0
  10. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_langchain_community_imports.py +69 -0
  11. openrewrite_migrate_python-0.14.0.dev20260902105951/src/openrewrite_code_quality_python/codequality/remove_self_assignment.py +0 -152
  12. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/setup.cfg +0 -0
  13. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/__init__.py +0 -0
  14. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/__init__.py +0 -0
  15. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/_reindent.py +0 -0
  16. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/_semantically_equal.py +0 -0
  17. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/all_branches_identical.py +0 -0
  18. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/boolean_checks_not_inverted.py +0 -0
  19. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/collapsible_if_statements.py +0 -0
  20. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/find_suspicious_chained_comparison.py +0 -0
  21. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/merge_identical_branches.py +0 -0
  22. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/remove_duplicate_conditions.py +0 -0
  23. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/remove_unconditional_value_overwrite.py +0 -0
  24. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/simplify_boolean_literal.py +0 -0
  25. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_code_quality_python/codequality/simplify_redundant_logical_expression.py +0 -0
  26. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/__init__.py +0 -0
  27. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/__init__.py +0 -0
  28. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/_import_hygiene.py +0 -0
  29. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/_markers.py +0 -0
  30. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/_typing_imports.py +0 -0
  31. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/aifc_migrations.py +0 -0
  32. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/array_deprecations.py +0 -0
  33. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/ast_deprecations.py +0 -0
  34. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/asyncio_coroutine_to_async.py +0 -0
  35. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/asyncio_deprecations.py +0 -0
  36. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/avro_migrations.py +0 -0
  37. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/calendar_deprecations.py +0 -0
  38. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/cgi_migrations.py +0 -0
  39. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/cgi_parse_deprecations.py +0 -0
  40. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/collections_abc_migrations.py +0 -0
  41. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/configparser_deprecations.py +0 -0
  42. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/datetime_utc.py +0 -0
  43. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/distutils_deprecations.py +0 -0
  44. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/distutils_migrations.py +0 -0
  45. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/functools_deprecations.py +0 -0
  46. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/future_imports.py +0 -0
  47. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/gettext_deprecations.py +0 -0
  48. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/html_parser_deprecations.py +0 -0
  49. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/imp_migrations.py +0 -0
  50. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/langchain_provider_imports.py +0 -0
  51. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/locale_deprecations.py +0 -0
  52. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/locale_getdefaultlocale_deprecation.py +0 -0
  53. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/macpath_deprecations.py +0 -0
  54. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/mailcap_migrations.py +0 -0
  55. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/nntplib_migrations.py +0 -0
  56. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/os_deprecations.py +0 -0
  57. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/pathlib_deprecations.py +0 -0
  58. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/pep594_system_migrations.py +0 -0
  59. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/pipes_migrations.py +0 -0
  60. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/pkgutil_deprecations.py +0 -0
  61. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/platform_deprecations.py +0 -0
  62. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/pydantic_deprecations.py +0 -0
  63. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/pydantic_fields.py +0 -0
  64. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/pydantic_model_fields.py +0 -0
  65. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/re_deprecations.py +0 -0
  66. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/removed_modules_312.py +0 -0
  67. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/shutil_deprecations.py +0 -0
  68. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/socket_deprecations.py +0 -0
  69. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/ssl_deprecations.py +0 -0
  70. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/string_formatting.py +0 -0
  71. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/sys_deprecations.py +0 -0
  72. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/sys_last_deprecations.py +0 -0
  73. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/tarfile_deprecations.py +0 -0
  74. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/telnetlib_migrations.py +0 -0
  75. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/tempfile_deprecations.py +0 -0
  76. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/threading_deprecations.py +0 -0
  77. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/threading_is_alive_deprecation.py +0 -0
  78. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/typing_callable.py +0 -0
  79. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/typing_deprecations.py +0 -0
  80. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/typing_union_to_pipe.py +0 -0
  81. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/unittest_deprecations.py +0 -0
  82. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain02.py +0 -0
  83. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_langchain1.py +0 -0
  84. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_pydantic.py +0 -0
  85. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_python310.py +0 -0
  86. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_python311.py +0 -0
  87. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_python312.py +0 -0
  88. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_python313.py +0 -0
  89. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_python314.py +0 -0
  90. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_python38.py +0 -0
  91. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/upgrade_to_python39.py +0 -0
  92. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/urllib_deprecations.py +0 -0
  93. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/uu_migrations.py +0 -0
  94. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/xdrlib_migrations.py +0 -0
  95. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python/migrate/xml_deprecations.py +0 -0
  96. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python.egg-info/dependency_links.txt +0 -0
  97. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python.egg-info/entry_points.txt +0 -0
  98. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python.egg-info/requires.txt +0 -0
  99. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/src/openrewrite_migrate_python.egg-info/top_level.txt +0 -0
  100. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_aifc_migrations.py +0 -0
  101. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_array_deprecations.py +0 -0
  102. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_ast_deprecations.py +0 -0
  103. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_asyncio_coroutine_to_async.py +0 -0
  104. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_asyncio_deprecations.py +0 -0
  105. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_avro_migrations.py +0 -0
  106. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_calendar_deprecations.py +0 -0
  107. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_cgi_parse_deprecations.py +0 -0
  108. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_change_import_recipes.py +0 -0
  109. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_collections_abc_migrations.py +0 -0
  110. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_configparser_deprecations.py +0 -0
  111. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_datetime_utc.py +0 -0
  112. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_distutils_deprecations.py +0 -0
  113. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_future_imports.py +0 -0
  114. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_gettext_deprecations.py +0 -0
  115. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_html_parser_deprecations.py +0 -0
  116. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_imp_migrations.py +0 -0
  117. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_langchain_provider_imports.py +0 -0
  118. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_locale_deprecations.py +0 -0
  119. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_locale_getdefaultlocale_deprecation.py +0 -0
  120. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_macpath_deprecations.py +0 -0
  121. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_os_deprecations.py +0 -0
  122. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_pep594_migrations.py +0 -0
  123. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_pep594_system_migrations.py +0 -0
  124. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_pkgutil_deprecations.py +0 -0
  125. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_platform_deprecations.py +0 -0
  126. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_pydantic_deprecations.py +0 -0
  127. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_pydantic_fields.py +0 -0
  128. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_pydantic_model_fields.py +0 -0
  129. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_re_deprecations.py +0 -0
  130. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_removed_modules_312.py +0 -0
  131. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_shutil_deprecations.py +0 -0
  132. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_ssl_deprecations.py +0 -0
  133. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_string_formatting.py +0 -0
  134. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_sys_deprecations.py +0 -0
  135. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_sys_last_deprecations.py +0 -0
  136. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_tarfile_deprecations.py +0 -0
  137. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_threading_deprecations.py +0 -0
  138. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_threading_extended.py +0 -0
  139. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_threading_is_alive_deprecation.py +0 -0
  140. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_typing_alias_moves.py +0 -0
  141. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_typing_callable.py +0 -0
  142. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_typing_deprecations.py +0 -0
  143. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_typing_union_to_pipe.py +0 -0
  144. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_unittest_deprecations.py +0 -0
  145. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_upgrade_recipes.py +0 -0
  146. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/tests/test_upgrade_to_pydantic.py +0 -0
  147. {openrewrite_migrate_python-0.14.0.dev20260902105951 → openrewrite_migrate_python-0.14.0.dev20260902123950}/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.dev20260902105951
3
+ Version: 0.14.0.dev20260902123950
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.dev20260902105951" # Updated dynamically during release
8
+ version = "0.14.0.dev20260902123950" # 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,275 @@
1
+ """
2
+ Recipe to remove self-assignments.
3
+
4
+ Assigning a plain local name to itself (``x = x``) has no effect and is
5
+ almost always a copy-paste error or leftover from a refactoring.
6
+ Removing these statements makes the code cleaner and avoids
7
+ confusion about the author's intent.
8
+
9
+ See: https://rules.sonarsource.com/python/RSPEC-S1656/
10
+ """
11
+
12
+ from itertools import islice
13
+ from typing import Any, List, Optional, Tuple
14
+
15
+ from rewrite import Cursor, ExecutionContext, Recipe, TreeVisitor
16
+ from rewrite.category import CategoryDescriptor
17
+ from rewrite.decorators import categorize
18
+ from rewrite.marketplace import Python
19
+ from rewrite.python.tree import CompilationUnit
20
+ from rewrite.python.visitor import PythonVisitor
21
+ from rewrite.java.support_types import Space
22
+ from rewrite.java.tree import (
23
+ Assignment,
24
+ Block,
25
+ ClassDeclaration,
26
+ Identifier,
27
+ If,
28
+ MethodDeclaration,
29
+ Statement,
30
+ )
31
+
32
+ _CodeQuality = [
33
+ *Python,
34
+ CategoryDescriptor(display_name="Code quality"),
35
+ ]
36
+
37
+
38
+ def _is_local_self_assignment(statement: Statement) -> bool:
39
+ """Return True for ``x = x`` on a plain name.
40
+
41
+ Only a plain name is a no-op. ``obj.x = obj.x`` and ``d[k] = d[k]``
42
+ read *and* write through ``__set__``/``__setitem__``, and the other
43
+ assignment shapes (``x: int = x``, ``x = y = y``, ``x += x``) parse to
44
+ node types this deliberately does not match.
45
+ """
46
+ if not isinstance(statement, Assignment):
47
+ return False
48
+ target, value = statement.variable, statement.assignment
49
+ return (
50
+ isinstance(target, Identifier)
51
+ and isinstance(value, Identifier)
52
+ and target.simple_name == value.simple_name
53
+ )
54
+
55
+
56
+ def _in_function_scope(cursor: Cursor) -> bool:
57
+ """Return True when the block at ``cursor`` belongs to a function.
58
+
59
+ ``X = X`` is a no-op only where both sides bind the same name. In a
60
+ class body or at module scope the right-hand side reads an enclosing
61
+ binding while the left-hand side creates a new one, so the statement
62
+ is what publishes the name.
63
+ """
64
+ for value in islice(cursor.get_path(), 1, None):
65
+ if isinstance(value, MethodDeclaration):
66
+ return True
67
+ if isinstance(value, (ClassDeclaration, CompilationUnit)):
68
+ return False
69
+ return False
70
+
71
+
72
+ def _space_after_block(cursor: Cursor) -> Optional[Space]:
73
+ """The trivia the printer emits after the block at ``cursor``.
74
+
75
+ A statement's trailing comment is stored on whatever follows it, so a
76
+ block's last statement keeps its comment outside the block -- on the
77
+ next statement of an enclosing block, on the `else` of an enclosing
78
+ `if`, or at end of file. Returns None for the containers this does not
79
+ know how to look past.
80
+ """
81
+ child = cursor.value
82
+ for parent in islice(cursor.get_path(), 1, None):
83
+ if isinstance(parent, (Block, CompilationUnit)):
84
+ statements = parent._statements
85
+ index = next(
86
+ (i for i, s in enumerate(statements) if s.element.id == child.id),
87
+ None,
88
+ )
89
+ if index is None:
90
+ return None
91
+ if index + 1 < len(statements):
92
+ return statements[index + 1].element.prefix
93
+ if isinstance(parent, CompilationUnit):
94
+ return parent.eof
95
+ elif isinstance(parent, If):
96
+ if parent.else_part is not None and parent.else_part.id != child.id:
97
+ return parent.else_part.prefix
98
+ elif not isinstance(parent, (ClassDeclaration, If.Else, MethodDeclaration)):
99
+ return None
100
+ child = parent
101
+ return None
102
+
103
+
104
+ def _ends_line_with_comment(space: Space) -> bool:
105
+ """Return True when ``space`` opens with a comment on the line it continues."""
106
+ split = _split_line(space)
107
+ return bool((split[0] if split else space).comments)
108
+
109
+
110
+ def _split_line(space: Space) -> Optional[Tuple[Space, Space]]:
111
+ """Split ``space`` at its first newline, or return None if it has no newline.
112
+
113
+ The head is the trivia that still belongs to the preceding line -- most
114
+ importantly that line's trailing comment. The tail starts with the
115
+ newline itself.
116
+ """
117
+ newline = space.whitespace.find("\n")
118
+ if newline != -1:
119
+ return (
120
+ Space(_comments=[], _whitespace=space.whitespace[:newline]),
121
+ Space(_comments=space.comments, _whitespace=space.whitespace[newline:]),
122
+ )
123
+ for i, comment in enumerate(space.comments):
124
+ newline = comment.suffix.find("\n")
125
+ if newline != -1:
126
+ return (
127
+ Space(
128
+ _comments=[
129
+ *space.comments[:i],
130
+ comment.replace(_suffix=comment.suffix[:newline]),
131
+ ],
132
+ _whitespace=space.whitespace,
133
+ ),
134
+ Space(
135
+ _comments=space.comments[i + 1:],
136
+ _whitespace=comment.suffix[newline:],
137
+ ),
138
+ )
139
+ return None
140
+
141
+
142
+ def _concat(left: Space, right: Space) -> Space:
143
+ """Return the trivia that prints as ``left`` followed by ``right``."""
144
+ if not left.comments:
145
+ return Space(
146
+ _comments=right.comments,
147
+ _whitespace=left.whitespace + right.whitespace,
148
+ )
149
+ last = left.comments[-1]
150
+ return Space(
151
+ _comments=[
152
+ *left.comments[:-1],
153
+ last.replace(_suffix=last.suffix + right.whitespace),
154
+ *right.comments,
155
+ ],
156
+ _whitespace=left.whitespace,
157
+ )
158
+
159
+
160
+ def _removable(padded_statements: list, i: int, space_after_block: Optional[Space]) -> bool:
161
+ """Return True when statement ``i`` can be dropped without disturbing its neighbours.
162
+
163
+ The removal is expressed by splicing line-level trivia, so the statement
164
+ has to occupy a line of its own, and so does whatever the printer emits
165
+ next -- either the following statement or, for the last one, the trivia
166
+ after the block. A last statement whose line ends in a comment stays:
167
+ that comment is held outside the block, out of reach.
168
+ """
169
+ if not _is_local_self_assignment(padded_statements[i].element):
170
+ return False
171
+ if _split_line(padded_statements[i].element.prefix) is None:
172
+ return False
173
+ if i + 1 < len(padded_statements):
174
+ return _split_line(padded_statements[i + 1].element.prefix) is not None
175
+ return space_after_block is not None and not _ends_line_with_comment(space_after_block)
176
+
177
+
178
+ def _remove_self_assignments(
179
+ padded_statements: list, end: Space, space_after_block: Optional[Space]
180
+ ) -> Optional[Tuple[list, Space]]:
181
+ """Return the block's statements and end trivia with self-assignments removed, or None if unchanged.
182
+
183
+ Each removed statement's leading trivia is kept up to its own line (it
184
+ holds the preceding statement's trailing comment) and its successor's is
185
+ dropped up to the same point (it holds the removed statement's own).
186
+ Emptying a block would leave its header without a body, so the last
187
+ surviving statement stays.
188
+ """
189
+ to_remove = {
190
+ i
191
+ for i in range(len(padded_statements))
192
+ if _removable(padded_statements, i, space_after_block)
193
+ }
194
+ if not to_remove or len(to_remove) == len(padded_statements):
195
+ return None
196
+
197
+ result = []
198
+ pending_head: Optional[Space] = None
199
+ for i, padded in enumerate(padded_statements):
200
+ if i in to_remove:
201
+ if pending_head is None:
202
+ pending_head, _ = _split_line(padded.element.prefix)
203
+ continue
204
+ if pending_head is not None:
205
+ _, tail = _split_line(padded.element.prefix)
206
+ padded = padded.replace(
207
+ _element=padded.element.replace(
208
+ _prefix=_concat(pending_head, tail)
209
+ )
210
+ )
211
+ pending_head = None
212
+ result.append(padded)
213
+ return result, end if pending_head is None else _concat(pending_head, end)
214
+
215
+
216
+ @categorize(_CodeQuality)
217
+ class RemoveSelfAssignment(Recipe):
218
+ """
219
+ Remove assignments of a plain local name to itself.
220
+
221
+ A self-assignment like ``x = x`` inside a function does nothing at
222
+ runtime. These statements typically result from copy-paste mistakes
223
+ or incomplete refactorings and should be deleted to keep the code
224
+ clear.
225
+
226
+ Example:
227
+ Before:
228
+ x = x
229
+
230
+ After:
231
+ (statement removed)
232
+ """
233
+
234
+ @property
235
+ def name(self) -> str:
236
+ return "org.openrewrite.python.codequality.RemoveSelfAssignment"
237
+
238
+ @property
239
+ def display_name(self) -> str:
240
+ return "Remove self-assignments"
241
+
242
+ @property
243
+ def description(self) -> str:
244
+ return (
245
+ "Remove statements inside a function that assign a plain local name "
246
+ "to itself (`x = x`), since they have no effect. Class-body and "
247
+ "module-level `X = X` bind a new name from an enclosing one and are "
248
+ "left alone, as are attribute and subscript targets, which run "
249
+ "`__set__` and `__setitem__`."
250
+ )
251
+
252
+ @property
253
+ def tags(self) -> List[str]:
254
+ return ["python", "code-quality", "RSPEC-S1656"]
255
+
256
+ @property
257
+ def estimated_effort_per_occurrence(self) -> int:
258
+ return 3
259
+
260
+ def editor(self) -> TreeVisitor[Any, ExecutionContext]:
261
+ class Visitor(PythonVisitor[ExecutionContext]):
262
+ def visit_block(
263
+ self, block: Block, p: ExecutionContext
264
+ ) -> Optional[Block]:
265
+ block = super().visit_block(block, p)
266
+ if not isinstance(block, Block) or not _in_function_scope(self.cursor):
267
+ return block
268
+ removed = _remove_self_assignments(
269
+ block._statements, block.end, _space_after_block(self.cursor)
270
+ )
271
+ if removed is not None:
272
+ return block.replace(_statements=removed[0], _end=removed[1])
273
+ return block
274
+
275
+ return Visitor()