openrewrite-migrate-python 0.20.0__py3-none-any.whl → 0.22.0__py3-none-any.whl

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.
@@ -73,6 +73,7 @@ from .locale_deprecations import ReplaceLocaleResetlocale
73
73
  from .locale_getdefaultlocale_deprecation import FindLocaleGetdefaultlocale
74
74
  from .macpath_deprecations import FindMacpathModule
75
75
  from .mailcap_migrations import FindMailcapModule
76
+ from .mock_assertions import AddMockAssertPrefix
76
77
  from .module_cached_attribute import ReplaceModuleCachedAttribute
77
78
  from .nntplib_migrations import FindNntplibModule
78
79
  from .os_deprecations import FindOsPopen, FindOsSpawn
@@ -85,7 +86,7 @@ from .pep594_system_migrations import (
85
86
  FindOssaudiodevModule,
86
87
  FindSpwdModule,
87
88
  )
88
- from .pipes_migrations import FindPipesModule
89
+ from .pipes_migrations import FindPipesModule, ReplacePipesQuote
89
90
  from .pkgutil_deprecations import ReplacePkgutilFindLoader, ReplacePkgutilGetLoader
90
91
  from .profile_deprecations import FindProfileModule
91
92
  from .pydantic_deprecations import (
@@ -192,6 +193,7 @@ __all__ = [
192
193
  "FindInspectGetargspec",
193
194
  "FindMacpathModule",
194
195
  "FindMailcapModule",
196
+ "AddMockAssertPrefix",
195
197
  "FindMsilibModule",
196
198
  "FindNisModule",
197
199
  "FindNntplibModule",
@@ -201,6 +203,7 @@ __all__ = [
201
203
  "FindOssaudiodevModule",
202
204
  "FindPathlibLinkTo",
203
205
  "FindPipesModule",
206
+ "ReplacePipesQuote",
204
207
  "ReplacePlatformPopen",
205
208
  "ReplaceReTemplate",
206
209
  "FindRemovedModules312",
@@ -2,13 +2,14 @@
2
2
  Recipes for migrating deprecated datetime.utcnow() and datetime.utcfromtimestamp() calls.
3
3
 
4
4
  These methods are deprecated in Python 3.12+ because they return naive datetime objects
5
- that don't carry timezone information. The recommended replacements are:
5
+ that don't carry timezone information. The replacements return the same naive value:
6
6
 
7
- - datetime.utcnow() -> datetime.now(UTC)
8
- - datetime.utcfromtimestamp(ts) -> datetime.fromtimestamp(ts, UTC)
7
+ - datetime.utcnow() -> datetime.now(UTC).replace(tzinfo=None)
8
+ - datetime.utcfromtimestamp(ts) -> datetime.fromtimestamp(ts, UTC).replace(tzinfo=None)
9
9
 
10
- The replacements are timezone-aware where the deprecated calls were naive, so values already
11
- stored or compared as naive UTC need migrating alongside the call sites.
10
+ An aware result never equals a naive datetime, raises ``TypeError`` when ordered against or
11
+ subtracted from one, and prints with a ``+00:00`` offset. Making the values aware is a change
12
+ of its own, not part of the upgrade.
12
13
 
13
14
  See: https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow
14
15
  """
@@ -56,18 +57,18 @@ _DATETIME_MODULE = ("datetime", None)
56
57
 
57
58
  @lru_cache(maxsize=None)
58
59
  def _now_template(utc: str) -> Template:
59
- return template(f"{_sel}.now({raw(utc)})")
60
+ return template(f"{_sel}.now({raw(utc)}).replace(tzinfo=None)")
60
61
 
61
62
 
62
63
  @lru_cache(maxsize=None)
63
64
  def _fromtimestamp_template(utc: str) -> Template:
64
- return template(f"{_sel}.fromtimestamp({_ts}, {raw(utc)})")
65
+ return template(f"{_sel}.fromtimestamp({_ts}, {raw(utc)}).replace(tzinfo=None)")
65
66
 
66
67
 
67
68
  class _DatetimeUtcVisitor(PythonVisitor[ExecutionContext]):
68
- """Rewrites a naive UTC constructor to its aware counterpart, spelling UTC the way the
69
- file's own ``datetime`` imports allow. Those imports also identify the receiver, which a
70
- parse that attributes no types still supplies.
69
+ """Rewrites a deprecated naive UTC constructor to its aware counterpart made naive again,
70
+ spelling UTC the way the file's own ``datetime`` imports allow. Those imports also
71
+ identify the receiver, which a parse that attributes no types still supplies.
71
72
  """
72
73
 
73
74
  _target = ""
@@ -131,7 +132,7 @@ class _DatetimeUtcVisitor(PythonVisitor[ExecutionContext]):
131
132
  @categorize(_Python312)
132
133
  class ReplaceDatetimeUtcNow(Recipe):
133
134
  """
134
- Replace ``datetime.utcnow()`` with ``datetime.now(UTC)``.
135
+ Replace ``datetime.utcnow()`` with ``datetime.now(UTC).replace(tzinfo=None)``.
135
136
 
136
137
  The ``datetime.utcnow()`` method is deprecated in Python 3.12 because it returns
137
138
  a naive datetime object that doesn't carry timezone information. This can lead
@@ -144,7 +145,7 @@ class ReplaceDatetimeUtcNow(Recipe):
144
145
 
145
146
  After:
146
147
  from datetime import datetime, UTC
147
- now = datetime.now(UTC)
148
+ now = datetime.now(UTC).replace(tzinfo=None)
148
149
  """
149
150
 
150
151
  @property
@@ -153,15 +154,15 @@ class ReplaceDatetimeUtcNow(Recipe):
153
154
 
154
155
  @property
155
156
  def display_name(self) -> str:
156
- return "Replace `datetime.utcnow()` with `datetime.now(UTC)`"
157
+ return "Replace `datetime.utcnow()` with `datetime.now(UTC).replace(tzinfo=None)`"
157
158
 
158
159
  @property
159
160
  def description(self) -> str:
160
161
  return (
161
162
  "The `datetime.utcnow()` method is deprecated in Python 3.12. "
162
- "Replace it with `datetime.now(UTC)`, importing `UTC` from `datetime` where the "
163
- "name is not already in scope. The result is timezone-aware where `utcnow()` was "
164
- "naive, so stored or compared values may need migrating alongside the call sites."
163
+ "Replace it with `datetime.now(UTC).replace(tzinfo=None)`, importing `UTC` from "
164
+ "`datetime` where the name is not already in scope. The result is the naive UTC "
165
+ "datetime `utcnow()` returned, so it still compares with other naive values."
165
166
  )
166
167
 
167
168
  @property
@@ -193,7 +194,8 @@ class ReplaceDatetimeUtcNow(Recipe):
193
194
  @categorize(_Python312)
194
195
  class ReplaceDatetimeUtcFromTimestamp(Recipe):
195
196
  """
196
- Replace ``datetime.utcfromtimestamp(ts)`` with ``datetime.fromtimestamp(ts, UTC)``.
197
+ Replace ``datetime.utcfromtimestamp(ts)`` with
198
+ ``datetime.fromtimestamp(ts, UTC).replace(tzinfo=None)``.
197
199
 
198
200
  The ``datetime.utcfromtimestamp()`` method is deprecated in Python 3.12 because it
199
201
  returns a naive datetime object.
@@ -205,7 +207,7 @@ class ReplaceDatetimeUtcFromTimestamp(Recipe):
205
207
 
206
208
  After:
207
209
  from datetime import datetime, UTC
208
- dt = datetime.fromtimestamp(1234567890, UTC)
210
+ dt = datetime.fromtimestamp(1234567890, UTC).replace(tzinfo=None)
209
211
  """
210
212
 
211
213
  @property
@@ -214,16 +216,16 @@ class ReplaceDatetimeUtcFromTimestamp(Recipe):
214
216
 
215
217
  @property
216
218
  def display_name(self) -> str:
217
- return "Replace `datetime.utcfromtimestamp()` with `datetime.fromtimestamp(ts, UTC)`"
219
+ return "Replace `datetime.utcfromtimestamp()` with `datetime.fromtimestamp(ts, UTC).replace(tzinfo=None)`"
218
220
 
219
221
  @property
220
222
  def description(self) -> str:
221
223
  return (
222
224
  "The `datetime.utcfromtimestamp()` method is deprecated in Python 3.12. "
223
- "Replace it with `datetime.fromtimestamp(ts, UTC)`, importing `UTC` from "
224
- "`datetime` where the name is not already in scope. The result is timezone-aware "
225
- "where `utcfromtimestamp()` was naive, so stored or compared values may need "
226
- "migrating alongside the call sites."
225
+ "Replace it with `datetime.fromtimestamp(ts, UTC).replace(tzinfo=None)`, importing "
226
+ "`UTC` from `datetime` where the name is not already in scope. The result is the "
227
+ "naive UTC datetime `utcfromtimestamp()` returned, so it still compares with other "
228
+ "naive values."
227
229
  )
228
230
 
229
231
  @property
@@ -0,0 +1,117 @@
1
+ """
2
+ Recipes for mock assertions that Python 3.12 rejects.
3
+
4
+ See: https://docs.python.org/3/whatsnew/3.12.html
5
+ """
6
+
7
+ from typing import Any, List
8
+
9
+ from rewrite import ExecutionContext, Preconditions, Recipe, TreeVisitor
10
+ from rewrite.category import CategoryDescriptor
11
+ from rewrite.decorators import categorize
12
+ from rewrite.marketplace import Python
13
+ from rewrite.java.support_types import JavaType, Space
14
+ from rewrite.java.tree import Assert, Block, J, MethodInvocation
15
+ from rewrite.python.preconditions import uses_method
16
+ from rewrite.python.type_utils import is_of_type_with_name
17
+ from rewrite.python.visitor import PythonVisitor
18
+
19
+ from openrewrite_code_quality_python.codequality._trivia import has_comments
20
+
21
+ _Python312 = [
22
+ *Python,
23
+ CategoryDescriptor(display_name="Migrate"),
24
+ CategoryDescriptor(display_name="Python 3.12"),
25
+ ]
26
+
27
+ # `called` is a property, so a mock still answers it.
28
+ _UNPREFIXED = ("called_once", "called_with", "called_once_with", "any_call", "has_calls", "not_called")
29
+
30
+
31
+ def _is_unprefixed_mock_call(tree: Any) -> bool:
32
+ if not isinstance(tree, MethodInvocation) or tree.select is None:
33
+ return False
34
+ if tree.name.simple_name not in _UNPREFIXED:
35
+ return False
36
+ # A mock stored on `self` in `setUp()` has no type the parser sees.
37
+ receiver = tree.select.type
38
+ return isinstance(receiver, JavaType.Unknown) or is_of_type_with_name(
39
+ receiver, True, lambda n: n.startswith(("unittest.mock.", "mock."))
40
+ )
41
+
42
+
43
+ def _prefixed(call: MethodInvocation, prefix: Space) -> MethodInvocation:
44
+ return call.replace(
45
+ _prefix=prefix,
46
+ _name=call.name.replace(_simple_name=f"assert_{call.name.simple_name}", _type=None, _field_type=None),
47
+ _method_type=None,
48
+ )
49
+
50
+
51
+ @categorize(_Python312)
52
+ class AddMockAssertPrefix(Recipe):
53
+ """
54
+ Add the ``assert_`` prefix to mock assertions that lack it.
55
+
56
+ Example:
57
+ Before:
58
+ def test_cleanup(self):
59
+ self.callback.called_once_with(42)
60
+
61
+ After:
62
+ def test_cleanup(self):
63
+ self.callback.assert_called_once_with(42)
64
+ """
65
+
66
+ @property
67
+ def name(self) -> str:
68
+ return "org.openrewrite.python.migrate.AddMockAssertPrefix"
69
+
70
+ @property
71
+ def display_name(self) -> str:
72
+ return "Add the `assert_` prefix to mock assertions that lack it"
73
+
74
+ @property
75
+ def description(self) -> str:
76
+ return (
77
+ "Since Python 3.12 a mock raises `AttributeError` for `called_once_with()` and the "
78
+ "other assertion names without their `assert_` prefix. Before, such a call asserted "
79
+ "nothing. The prefix is added where the call is a statement of its own inside a "
80
+ "function, the whole condition of an `assert` without a message, or the only argument "
81
+ "of `assertTrue()`. The recipe matches the method name, and leaves a receiver whose "
82
+ "type resolves to a class other than a mock. A test that passed only because nothing "
83
+ "was asserted fails once it asserts."
84
+ )
85
+
86
+ @property
87
+ def tags(self) -> List[str]:
88
+ return ["python", "migration", "3.12", "unittest"]
89
+
90
+ def editor(self) -> TreeVisitor[Any, ExecutionContext]:
91
+ class Visitor(PythonVisitor[ExecutionContext]):
92
+ def visit_method_invocation(self, method: MethodInvocation, p: ExecutionContext) -> J:
93
+ m = super().visit_method_invocation(method, p)
94
+ if not isinstance(m, MethodInvocation) or not isinstance(
95
+ self.cursor.parent_tree_cursor().value, Block
96
+ ):
97
+ return m
98
+ if _is_unprefixed_mock_call(m):
99
+ return _prefixed(m, m.prefix)
100
+ if m.name.simple_name != "assertTrue" or len(m.arguments) != 1:
101
+ return m
102
+ return self._replace_check(m, m.arguments[0])
103
+
104
+ def visit_assert(self, assert_: Assert, p: ExecutionContext) -> J:
105
+ a = super().visit_assert(assert_, p)
106
+ if not isinstance(a, Assert) or a.detail is not None:
107
+ return a
108
+ return self._replace_check(a, a.condition)
109
+
110
+ def _replace_check(self, check: J, condition: Any) -> J:
111
+ if not _is_unprefixed_mock_call(condition) or has_comments(check.replace(_prefix=Space.EMPTY)):
112
+ return check
113
+ return _prefixed(condition, check.prefix)
114
+
115
+ # A gate naming a mock type would drop the unknown receivers the visitor accepts.
116
+ gate = Preconditions.or_(*(uses_method(f"*..* {name}(..)") for name in _UNPREFIXED))
117
+ return Preconditions.check(gate, Visitor())
@@ -17,6 +17,7 @@ from rewrite import ExecutionContext, Recipe, TreeVisitor
17
17
  from rewrite.category import CategoryDescriptor
18
18
  from rewrite.decorators import categorize
19
19
  from rewrite.marketplace import Python
20
+ from rewrite.python.recipes import ChangeImport
20
21
  from ._module_imports import find_module_imports
21
22
 
22
23
  # Define category path: Python > Migrate > Python 3.13
@@ -27,6 +28,46 @@ _Python313 = [
27
28
  ]
28
29
 
29
30
 
31
+ @categorize(_Python313)
32
+ class ReplacePipesQuote(Recipe):
33
+ """
34
+ Replace ``pipes.quote()`` with ``shlex.quote()``.
35
+
36
+ ``pipes.quote`` is ``shlex.quote`` re-exported, and the ``pipes`` module was removed in
37
+ Python 3.13.
38
+
39
+ Example:
40
+ Before:
41
+ import pipes
42
+ quoted = pipes.quote(path)
43
+
44
+ After:
45
+ import shlex
46
+ quoted = shlex.quote(path)
47
+ """
48
+
49
+ @property
50
+ def name(self) -> str:
51
+ return "org.openrewrite.python.migrate.ReplacePipesQuote"
52
+
53
+ @property
54
+ def display_name(self) -> str:
55
+ return "Replace `pipes.quote()` with `shlex.quote()`"
56
+
57
+ @property
58
+ def description(self) -> str:
59
+ return (
60
+ "`pipes.quote()` is `shlex.quote()` under another name, and the `pipes` module was "
61
+ "removed in Python 3.13. The `pipes` import stays where the file uses another of its "
62
+ "members."
63
+ )
64
+
65
+ @property
66
+ def tags(self) -> List[str]:
67
+ return ["python", "migration", "3.13", "PEP 594", "pipes"]
68
+
69
+ def recipe_list(self) -> List[Recipe]:
70
+ return [ChangeImport(old_module="pipes", old_name="quote", new_module="shlex")]
30
71
 
31
72
 
32
73
  @categorize(_Python313)
@@ -62,6 +62,7 @@ class UpgradeToPython312(Recipe):
62
62
  from .distutils_deprecations import FindDistutilsUsage
63
63
  from .distutils_migrations import ReplaceDistutilsVersion
64
64
  from .imp_migrations import FindImpUsage
65
+ from .mock_assertions import AddMockAssertPrefix
65
66
  from .os_deprecations import FindOsPopen, FindOsSpawn
66
67
  from .pathlib_deprecations import FindPathlibLinkTo
67
68
  from .pkgutil_deprecations import ReplacePkgutilFindLoader, ReplacePkgutilGetLoader
@@ -101,6 +102,8 @@ class UpgradeToPython312(Recipe):
101
102
  FindShutilRmtreeOnerror(),
102
103
  # sys.last_type/last_value/last_traceback -> sys.last_exc
103
104
  ReplaceSysLastExcInfo(),
105
+ # Mocks reject `called_once_with()` and the other unprefixed assertion names since 3.12
106
+ AddMockAssertPrefix(),
104
107
  # Deprecated in 3.12, removed in 3.16 and 3.17
105
108
  ReplaceBitwiseInversionOnBool(),
106
109
  FindBitwiseInversionOnBool(),
@@ -80,7 +80,7 @@ class UpgradeToPython313(Recipe):
80
80
  FindOssaudiodevModule,
81
81
  FindSpwdModule,
82
82
  )
83
- from .pipes_migrations import FindPipesModule
83
+ from .pipes_migrations import FindPipesModule, ReplacePipesQuote
84
84
  from .telnetlib_migrations import FindTelnetlibModule
85
85
  from .upgrade_to_python312 import UpgradeToPython312
86
86
  from .uu_migrations import FindUuModule
@@ -91,6 +91,8 @@ class UpgradeToPython313(Recipe):
91
91
  UpgradeToPython312(),
92
92
  # locale.resetlocale() removed in 3.13 (deprecated in 3.11)
93
93
  ReplaceLocaleResetlocale(),
94
+ # Before FindPipesModule, which then marks only the imports still needed
95
+ ReplacePipesQuote(),
94
96
  # PEP 594 "dead batteries" - removed modules (detection only)
95
97
  FindAifcModule(),
96
98
  FindAudioopModule(),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrewrite-migrate-python
3
- Version: 0.20.0
3
+ Version: 0.22.0
4
4
  Summary: OpenRewrite recipes for migrating Python codebases to newer Python versions.
5
5
  Author-email: "Moderne Inc." <support@moderne.io>
6
6
  License: Moderne Proprietary
@@ -51,7 +51,7 @@ openrewrite_code_quality_python/codequality/remove_unconditional_value_overwrite
51
51
  openrewrite_code_quality_python/codequality/simplify_boolean_literal.py,sha256=mlid3xd0_6JaAGf0VHD8Xsh10ahp0QibnKfUKI44rCE,5983
52
52
  openrewrite_code_quality_python/codequality/simplify_redundant_logical_expression.py,sha256=KuI-PbY6aqUw0OWifOoH_xulA3oNgR0y0iZJToGFUOo,3587
53
53
  openrewrite_migrate_python/__init__.py,sha256=AUUYSi3ET9VBhwfF535k61ZTuH8nhJJ4oP9IyeLbftI,1211
54
- openrewrite_migrate_python/migrate/__init__.py,sha256=glrdCZXIIQmncbR0RiFaEX66E28PgaPpR43mjPDL0NQ,12347
54
+ openrewrite_migrate_python/migrate/__init__.py,sha256=p_vcmUibNSzdh1bCHcYWjIu4FGk9eSrEgOK98NWp5b0,12467
55
55
  openrewrite_migrate_python/migrate/_decorators.py,sha256=03DZoAa3LQ9fXZx3FFm_RSmr5tiEpZ1g2HL73qWSNzc,1191
56
56
  openrewrite_migrate_python/migrate/_finders.py,sha256=RVmkMUOWLxxCWx4Ig8SUEbqPTVGqrAP2VVhiazBsCyM,4960
57
57
  openrewrite_migrate_python/migrate/_langchain_tables.py,sha256=TF2A2iwkULa5uybo1rBxp_o2weziCxAmn5NLUcSAXqs,55153
@@ -74,7 +74,7 @@ openrewrite_migrate_python/migrate/cgi_parse_deprecations.py,sha256=8mat6Mp73L7t
74
74
  openrewrite_migrate_python/migrate/collections_abc_migrations.py,sha256=VgTCsfYqPN7SyLcAFHMltpe4L-pge3aNWUv8Ncjg2DM,4792
75
75
  openrewrite_migrate_python/migrate/configparser_deprecations.py,sha256=yuIc8yunDLbWpFre3ClCpFPZqwS1Amy7Kf-pPm7wIq0,4081
76
76
  openrewrite_migrate_python/migrate/ctypes_deprecations.py,sha256=66Exo0Y6B6lentJiHH4ZpWE2TAVBuMXN8RRdKhmWbZw,1983
77
- openrewrite_migrate_python/migrate/datetime_utc.py,sha256=ybAboAG774Y_F5bvxeP7Xoqx8PAFQ5uKtowTj9BnFuA,10809
77
+ openrewrite_migrate_python/migrate/datetime_utc.py,sha256=oHdoqJH-rAaQ_tVziC3UHUB9BnEhsN2ak9KYXNAxgg0,11108
78
78
  openrewrite_migrate_python/migrate/distutils_deprecations.py,sha256=oNi6_-O8JtFnbfyarQ4JBdTonXxKxI2Bzyq98WKyE6o,2530
79
79
  openrewrite_migrate_python/migrate/distutils_migrations.py,sha256=w7Ody6TSEdHdYke_KBsuLdsKWSKXbLZbu9VLtiWIsoY,3705
80
80
  openrewrite_migrate_python/migrate/functools_deprecations.py,sha256=KHm9CR8kaM7ERkvVOl83KgLvjA-GITtvfs4-7Q3E4R8,2945
@@ -94,12 +94,13 @@ openrewrite_migrate_python/migrate/locale_deprecations.py,sha256=_g-r4wnYD1wstAR
94
94
  openrewrite_migrate_python/migrate/locale_getdefaultlocale_deprecation.py,sha256=epCCwMXFtsRI63H37WD2EWOXvrZkaA93-g_-q5mnqP8,3110
95
95
  openrewrite_migrate_python/migrate/macpath_deprecations.py,sha256=anMZkSJwot8tDFIM7fsMfq08IvrJQluyOxnLvrjq1Gc,1797
96
96
  openrewrite_migrate_python/migrate/mailcap_migrations.py,sha256=dKs3Dd22qgZLb8jQgwnUbJbs1k1ySxAxcFifJPKe1wQ,2144
97
+ openrewrite_migrate_python/migrate/mock_assertions.py,sha256=-FlBrgg-IDCmF-mgCAfiaQGahy2AEQ-KN018G7k3MNM,4694
97
98
  openrewrite_migrate_python/migrate/module_cached_attribute.py,sha256=ZhTBxaRsnT4qpghY6YU5geCyPI5j9PXHhTfyzLTOxPI,3843
98
99
  openrewrite_migrate_python/migrate/nntplib_migrations.py,sha256=aus4-ZztqEf6-pP7qXDjuBvasKTGlKEWgUMg-q7fkYM,2171
99
100
  openrewrite_migrate_python/migrate/os_deprecations.py,sha256=2H3odqPJ02IZrHXWP2LR-xdy1RU-IB7BNyYcCBlxbe8,4607
100
101
  openrewrite_migrate_python/migrate/pathlib_deprecations.py,sha256=yKUd6tQ1xpX3IDXlp19Md0YtCSWGxqjSdCFwpx6hY6M,5473
101
102
  openrewrite_migrate_python/migrate/pep594_system_migrations.py,sha256=OU4aKVG2jZfjwuN850XT3qXDD62W1P-6arQjiy_v_WE,7496
102
- openrewrite_migrate_python/migrate/pipes_migrations.py,sha256=acu58pNNCxELd6bXvgwzu_f68LejDQUXXxzK-H2FZlk,2223
103
+ openrewrite_migrate_python/migrate/pipes_migrations.py,sha256=7n1N_M36ZEjvpZIzkcKyDGe30KmYmw5oqArYok8G6Nc,3444
103
104
  openrewrite_migrate_python/migrate/pkgutil_deprecations.py,sha256=UgnyhyeJsfV0OSmqxtXdoTQ5hZcWoARoSgbXJZK9QkQ,5611
104
105
  openrewrite_migrate_python/migrate/platform_deprecations.py,sha256=bJoWc28YdD4zHr8sbwsR-1k5knFzKwG2y4GRiYNAbTM,5443
105
106
  openrewrite_migrate_python/migrate/profile_deprecations.py,sha256=DnYELDb-vPEul27PwHFstjbCQNP_VKR0ayhvQqE3mvc,2065
@@ -133,8 +134,8 @@ openrewrite_migrate_python/migrate/upgrade_to_pandas.py,sha256=LAcMWT9hn4uzXy3LP
133
134
  openrewrite_migrate_python/migrate/upgrade_to_pydantic.py,sha256=WYKdE8d8hJ7rhd4sQldFzy05-w3ZOW471QZ5ssEUrBA,9676
134
135
  openrewrite_migrate_python/migrate/upgrade_to_python310.py,sha256=iePD3K93vtRe1ELnPzuPqTa4DvtBe8cKWBcc9B7LjXU,3605
135
136
  openrewrite_migrate_python/migrate/upgrade_to_python311.py,sha256=eiQXD3Yt75DnuldpcPgAN9Oql09l7JgmUY0G4lizFxE,4396
136
- openrewrite_migrate_python/migrate/upgrade_to_python312.py,sha256=IE1vHCKxnAStRCpGBmqcIx9Ll6-7bv7BT3wJ4ZWvXz0,4890
137
- openrewrite_migrate_python/migrate/upgrade_to_python313.py,sha256=DDJzWbBJi01QIuvihRAas1d0u5_IPFQpisopyekHIWE,4924
137
+ openrewrite_migrate_python/migrate/upgrade_to_python312.py,sha256=vpPaEtQiBJ0Wpar2mJeFFq_j2RcJ5ual3jZmueXnnSg,5082
138
+ openrewrite_migrate_python/migrate/upgrade_to_python313.py,sha256=O1gt5QR2f_8EVOUArglQkQETJxVIw1hq2Vi55FeT8xA,5061
138
139
  openrewrite_migrate_python/migrate/upgrade_to_python314.py,sha256=ix0Fv257epgBnZLNrx4nBXPOhL-QGbCJ-IfsFowKCiw,3639
139
140
  openrewrite_migrate_python/migrate/upgrade_to_python315.py,sha256=v6VHibstcfbPusKtlyRkCwNPSPivabK0BbGNHtwCBww,4305
140
141
  openrewrite_migrate_python/migrate/upgrade_to_python38.py,sha256=Zoo8LlILVoqk4k-oSv30B5qGPSRK82X7zGk2-XnykC0,4144
@@ -145,8 +146,8 @@ openrewrite_migrate_python/migrate/wave_deprecations.py,sha256=QcjcFNpb2mQ4v8VdY
145
146
  openrewrite_migrate_python/migrate/webbrowser_deprecations.py,sha256=2ENvVuz5fcKAxnoMQVWIC62ipFeRy2_Ah_WEUushASM,2205
146
147
  openrewrite_migrate_python/migrate/xdrlib_migrations.py,sha256=khHPyP1TctExRMl1w_sR9d2fh5_QD04WQDNCqN3wUh4,2140
147
148
  openrewrite_migrate_python/migrate/xml_deprecations.py,sha256=mvyEUhVGPQTsjE81OkxBqKQCmis5xqTNg6LcUX1ipp4,7613
148
- openrewrite_migrate_python-0.20.0.dist-info/METADATA,sha256=DAE-EZVWsrzQUdG46PKrWloODLgLzRMjsHoVt7L-Nzk,1450
149
- openrewrite_migrate_python-0.20.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
150
- openrewrite_migrate_python-0.20.0.dist-info/entry_points.txt,sha256=SuygzlMJiKIW19FYJVxx0hhRyzW6HTDCweY7584XpXw,138
151
- openrewrite_migrate_python-0.20.0.dist-info/top_level.txt,sha256=y8dKeC9kb5GUzFraB-OhJGxjPemM3GaPdrAygz2RP0U,59
152
- openrewrite_migrate_python-0.20.0.dist-info/RECORD,,
149
+ openrewrite_migrate_python-0.22.0.dist-info/METADATA,sha256=eddBUlZ9EZKZtnesOrIv4ZYYf4z6II1u3QSaO7Xi-gE,1450
150
+ openrewrite_migrate_python-0.22.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
151
+ openrewrite_migrate_python-0.22.0.dist-info/entry_points.txt,sha256=SuygzlMJiKIW19FYJVxx0hhRyzW6HTDCweY7584XpXw,138
152
+ openrewrite_migrate_python-0.22.0.dist-info/top_level.txt,sha256=y8dKeC9kb5GUzFraB-OhJGxjPemM3GaPdrAygz2RP0U,59
153
+ openrewrite_migrate_python-0.22.0.dist-info/RECORD,,