codeshift 0.3.3__py3-none-any.whl → 0.3.4__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.
Files changed (36) hide show
  1. codeshift/cli/commands/apply.py +24 -2
  2. codeshift/cli/package_manager.py +102 -0
  3. codeshift/knowledge/generator.py +11 -1
  4. codeshift/knowledge_base/libraries/aiohttp.yaml +186 -0
  5. codeshift/knowledge_base/libraries/attrs.yaml +181 -0
  6. codeshift/knowledge_base/libraries/celery.yaml +244 -0
  7. codeshift/knowledge_base/libraries/click.yaml +195 -0
  8. codeshift/knowledge_base/libraries/django.yaml +355 -0
  9. codeshift/knowledge_base/libraries/flask.yaml +270 -0
  10. codeshift/knowledge_base/libraries/httpx.yaml +183 -0
  11. codeshift/knowledge_base/libraries/marshmallow.yaml +238 -0
  12. codeshift/knowledge_base/libraries/numpy.yaml +429 -0
  13. codeshift/knowledge_base/libraries/pytest.yaml +192 -0
  14. codeshift/knowledge_base/libraries/sqlalchemy.yaml +2 -1
  15. codeshift/migrator/engine.py +60 -0
  16. codeshift/migrator/transforms/__init__.py +2 -0
  17. codeshift/migrator/transforms/aiohttp_transformer.py +608 -0
  18. codeshift/migrator/transforms/attrs_transformer.py +570 -0
  19. codeshift/migrator/transforms/celery_transformer.py +546 -0
  20. codeshift/migrator/transforms/click_transformer.py +526 -0
  21. codeshift/migrator/transforms/django_transformer.py +852 -0
  22. codeshift/migrator/transforms/fastapi_transformer.py +12 -7
  23. codeshift/migrator/transforms/flask_transformer.py +505 -0
  24. codeshift/migrator/transforms/httpx_transformer.py +419 -0
  25. codeshift/migrator/transforms/marshmallow_transformer.py +515 -0
  26. codeshift/migrator/transforms/numpy_transformer.py +413 -0
  27. codeshift/migrator/transforms/pydantic_v1_to_v2.py +53 -8
  28. codeshift/migrator/transforms/pytest_transformer.py +351 -0
  29. codeshift/migrator/transforms/requests_transformer.py +74 -1
  30. codeshift/migrator/transforms/sqlalchemy_transformer.py +692 -39
  31. {codeshift-0.3.3.dist-info → codeshift-0.3.4.dist-info}/METADATA +46 -4
  32. {codeshift-0.3.3.dist-info → codeshift-0.3.4.dist-info}/RECORD +36 -15
  33. {codeshift-0.3.3.dist-info → codeshift-0.3.4.dist-info}/WHEEL +0 -0
  34. {codeshift-0.3.3.dist-info → codeshift-0.3.4.dist-info}/entry_points.txt +0 -0
  35. {codeshift-0.3.3.dist-info → codeshift-0.3.4.dist-info}/licenses/LICENSE +0 -0
  36. {codeshift-0.3.3.dist-info → codeshift-0.3.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,355 @@
1
+ # Django Knowledge Base
2
+ # Breaking changes from Django 2.2/3.x to 4.x/5.x
3
+
4
+ name: django
5
+ display_name: Django
6
+ description: High-level Python web framework for rapid development
7
+ migration_guide_url: https://docs.djangoproject.com/en/stable/howto/upgrade-version/
8
+
9
+ supported_migrations:
10
+ - from: "2.2"
11
+ to: "4.0"
12
+ - from: "3.0"
13
+ to: "4.0"
14
+ - from: "3.1"
15
+ to: "4.0"
16
+ - from: "3.2"
17
+ to: "4.0"
18
+ - from: "4.0"
19
+ to: "5.0"
20
+ - from: "4.1"
21
+ to: "5.0"
22
+ - from: "4.2"
23
+ to: "5.0"
24
+
25
+ breaking_changes:
26
+ # URL Configuration Changes (Django 4.0)
27
+ - symbol: "django.conf.urls.url"
28
+ change_type: removed
29
+ severity: high
30
+ from_version: "2.0"
31
+ to_version: "4.0"
32
+ description: "url() function removed, use path() or re_path() instead"
33
+ replacement: "django.urls.path or django.urls.re_path"
34
+ has_deterministic_transform: true
35
+ transform_name: url_to_path_or_re_path
36
+ notes: "url() with regex patterns should use re_path(), simple patterns should use path()"
37
+
38
+ - symbol: "django.conf.urls.include"
39
+ change_type: moved
40
+ severity: medium
41
+ from_version: "1.0"
42
+ to_version: "4.0"
43
+ description: "include() should be imported from django.urls instead of django.conf.urls"
44
+ replacement: "from django.urls import include"
45
+ has_deterministic_transform: true
46
+ transform_name: include_import_fix
47
+
48
+ # Encoding Functions Removed (Django 4.0/5.0)
49
+ - symbol: "django.utils.encoding.force_text"
50
+ change_type: removed
51
+ severity: high
52
+ from_version: "1.0"
53
+ to_version: "4.0"
54
+ description: "force_text() removed, use force_str() instead"
55
+ replacement: "django.utils.encoding.force_str"
56
+ has_deterministic_transform: true
57
+ transform_name: force_text_to_force_str
58
+
59
+ - symbol: "django.utils.encoding.smart_text"
60
+ change_type: removed
61
+ severity: high
62
+ from_version: "1.0"
63
+ to_version: "4.0"
64
+ description: "smart_text() removed, use smart_str() instead"
65
+ replacement: "django.utils.encoding.smart_str"
66
+ has_deterministic_transform: true
67
+ transform_name: smart_text_to_smart_str
68
+
69
+ # Translation Functions Removed (Django 4.0)
70
+ - symbol: "django.utils.translation.ugettext"
71
+ change_type: removed
72
+ severity: high
73
+ from_version: "1.0"
74
+ to_version: "4.0"
75
+ description: "ugettext() removed, use gettext() instead"
76
+ replacement: "django.utils.translation.gettext"
77
+ has_deterministic_transform: true
78
+ transform_name: ugettext_to_gettext
79
+
80
+ - symbol: "django.utils.translation.ugettext_lazy"
81
+ change_type: removed
82
+ severity: high
83
+ from_version: "1.0"
84
+ to_version: "4.0"
85
+ description: "ugettext_lazy() removed, use gettext_lazy() instead"
86
+ replacement: "django.utils.translation.gettext_lazy"
87
+ has_deterministic_transform: true
88
+ transform_name: ugettext_lazy_to_gettext_lazy
89
+
90
+ - symbol: "django.utils.translation.ugettext_noop"
91
+ change_type: removed
92
+ severity: medium
93
+ from_version: "1.0"
94
+ to_version: "4.0"
95
+ description: "ugettext_noop() removed, use gettext_noop() instead"
96
+ replacement: "django.utils.translation.gettext_noop"
97
+ has_deterministic_transform: true
98
+ transform_name: ugettext_noop_to_gettext_noop
99
+
100
+ - symbol: "django.utils.translation.ungettext"
101
+ change_type: removed
102
+ severity: medium
103
+ from_version: "1.0"
104
+ to_version: "4.0"
105
+ description: "ungettext() removed, use ngettext() instead"
106
+ replacement: "django.utils.translation.ngettext"
107
+ has_deterministic_transform: true
108
+ transform_name: ungettext_to_ngettext
109
+
110
+ - symbol: "django.utils.translation.ungettext_lazy"
111
+ change_type: removed
112
+ severity: medium
113
+ from_version: "1.0"
114
+ to_version: "4.0"
115
+ description: "ungettext_lazy() removed, use ngettext_lazy() instead"
116
+ replacement: "django.utils.translation.ngettext_lazy"
117
+ has_deterministic_transform: true
118
+ transform_name: ungettext_lazy_to_ngettext_lazy
119
+
120
+ # HTTP Utilities Removed (Django 4.0)
121
+ - symbol: "django.utils.http.urlquote"
122
+ change_type: removed
123
+ severity: medium
124
+ from_version: "1.0"
125
+ to_version: "4.0"
126
+ description: "urlquote() removed, use urllib.parse.quote instead"
127
+ replacement: "urllib.parse.quote"
128
+ has_deterministic_transform: true
129
+ transform_name: urlquote_to_urllib_quote
130
+
131
+ - symbol: "django.utils.http.urlquote_plus"
132
+ change_type: removed
133
+ severity: medium
134
+ from_version: "1.0"
135
+ to_version: "4.0"
136
+ description: "urlquote_plus() removed, use urllib.parse.quote_plus instead"
137
+ replacement: "urllib.parse.quote_plus"
138
+ has_deterministic_transform: true
139
+ transform_name: urlquote_plus_to_urllib
140
+
141
+ - symbol: "django.utils.http.urlunquote"
142
+ change_type: removed
143
+ severity: medium
144
+ from_version: "1.0"
145
+ to_version: "4.0"
146
+ description: "urlunquote() removed, use urllib.parse.unquote instead"
147
+ replacement: "urllib.parse.unquote"
148
+ has_deterministic_transform: true
149
+ transform_name: urlunquote_to_urllib
150
+
151
+ - symbol: "django.utils.http.urlunquote_plus"
152
+ change_type: removed
153
+ severity: medium
154
+ from_version: "1.0"
155
+ to_version: "4.0"
156
+ description: "urlunquote_plus() removed, use urllib.parse.unquote_plus instead"
157
+ replacement: "urllib.parse.unquote_plus"
158
+ has_deterministic_transform: true
159
+ transform_name: urlunquote_plus_to_urllib
160
+
161
+ - symbol: "django.utils.http.is_safe_url"
162
+ change_type: renamed
163
+ severity: medium
164
+ from_version: "1.0"
165
+ to_version: "4.0"
166
+ description: "is_safe_url() renamed to url_has_allowed_host_and_scheme()"
167
+ replacement: "django.utils.http.url_has_allowed_host_and_scheme"
168
+ has_deterministic_transform: true
169
+ transform_name: is_safe_url_to_url_has_allowed
170
+
171
+ # Model Field Changes (Django 4.0)
172
+ - symbol: "NullBooleanField"
173
+ change_type: removed
174
+ severity: high
175
+ from_version: "1.0"
176
+ to_version: "4.0"
177
+ description: "NullBooleanField removed, use BooleanField(null=True) instead"
178
+ replacement: "BooleanField(null=True)"
179
+ has_deterministic_transform: true
180
+ transform_name: null_boolean_field_to_boolean_field
181
+ notes: "Except for historical migrations"
182
+
183
+ - symbol: "django.contrib.postgres.fields.JSONField"
184
+ change_type: moved
185
+ severity: high
186
+ from_version: "1.0"
187
+ to_version: "4.0"
188
+ description: "PostgreSQL-specific JSONField moved to django.db.models.JSONField"
189
+ replacement: "django.db.models.JSONField"
190
+ has_deterministic_transform: true
191
+ transform_name: postgres_jsonfield_to_models
192
+ notes: "The cross-database JSONField is now preferred"
193
+
194
+ # Request Methods Removed (Django 4.0)
195
+ - symbol: "request.is_ajax()"
196
+ change_type: removed
197
+ severity: high
198
+ from_version: "1.0"
199
+ to_version: "4.0"
200
+ description: "HttpRequest.is_ajax() method removed"
201
+ replacement: "request.headers.get('X-Requested-With') == 'XMLHttpRequest'"
202
+ has_deterministic_transform: true
203
+ transform_name: is_ajax_to_header_check
204
+ notes: "Check X-Requested-With header directly"
205
+
206
+ # Timezone Changes (Django 5.0)
207
+ - symbol: "django.utils.timezone.utc"
208
+ change_type: removed
209
+ severity: medium
210
+ from_version: "4.0"
211
+ to_version: "5.0"
212
+ description: "django.utils.timezone.utc removed, use datetime.timezone.utc"
213
+ replacement: "datetime.timezone.utc"
214
+ has_deterministic_transform: true
215
+ transform_name: timezone_utc_to_datetime
216
+
217
+ # Settings Changes (Django 5.0)
218
+ - symbol: "USE_L10N"
219
+ change_type: removed
220
+ severity: low
221
+ from_version: "4.0"
222
+ to_version: "5.0"
223
+ description: "USE_L10N setting removed, localization is always enabled"
224
+ replacement: "Remove USE_L10N from settings"
225
+ has_deterministic_transform: false
226
+ notes: "Remove this setting entirely, localization is now always enabled"
227
+
228
+ - symbol: "PASSWORD_RESET_TIMEOUT_DAYS"
229
+ change_type: removed
230
+ severity: medium
231
+ from_version: "2.0"
232
+ to_version: "4.0"
233
+ description: "PASSWORD_RESET_TIMEOUT_DAYS removed, use PASSWORD_RESET_TIMEOUT (in seconds)"
234
+ replacement: "PASSWORD_RESET_TIMEOUT"
235
+ has_deterministic_transform: false
236
+ notes: "Multiply days by 86400 to convert to seconds"
237
+
238
+ - symbol: "default_app_config"
239
+ change_type: removed
240
+ severity: low
241
+ from_version: "1.0"
242
+ to_version: "4.0"
243
+ description: "default_app_config in __init__.py is no longer needed"
244
+ replacement: "Remove default_app_config"
245
+ has_deterministic_transform: true
246
+ transform_name: remove_default_app_config
247
+ notes: "Django now automatically discovers AppConfig"
248
+
249
+ # Template Tag Changes (Django 4.0)
250
+ - symbol: "{% ifequal %}"
251
+ change_type: removed
252
+ severity: medium
253
+ from_version: "1.0"
254
+ to_version: "4.0"
255
+ description: "{% ifequal %} template tag removed, use {% if %} instead"
256
+ replacement: "{% if var1 == var2 %}"
257
+ has_deterministic_transform: false
258
+ notes: "Manual template migration required"
259
+
260
+ - symbol: "{% ifnotequal %}"
261
+ change_type: removed
262
+ severity: medium
263
+ from_version: "1.0"
264
+ to_version: "4.0"
265
+ description: "{% ifnotequal %} template tag removed, use {% if %} instead"
266
+ replacement: "{% if var1 != var2 %}"
267
+ has_deterministic_transform: false
268
+ notes: "Manual template migration required"
269
+
270
+ # Admin Changes (Django 4.0)
271
+ - symbol: "django.contrib.admin.util"
272
+ change_type: moved
273
+ severity: low
274
+ from_version: "1.0"
275
+ to_version: "2.0"
276
+ description: "django.contrib.admin.util moved to django.contrib.admin.utils"
277
+ replacement: "django.contrib.admin.utils"
278
+ has_deterministic_transform: true
279
+ transform_name: admin_util_to_utils
280
+
281
+ # Form Changes (Django 4.0)
282
+ - symbol: "django.forms.util"
283
+ change_type: moved
284
+ severity: low
285
+ from_version: "1.0"
286
+ to_version: "2.0"
287
+ description: "django.forms.util moved to django.forms.utils"
288
+ replacement: "django.forms.utils"
289
+ has_deterministic_transform: true
290
+ transform_name: forms_util_to_utils
291
+
292
+ # GIS Admin Changes (Django 5.0)
293
+ - symbol: "django.contrib.gis.admin.GeoModelAdmin"
294
+ change_type: removed
295
+ severity: medium
296
+ from_version: "4.0"
297
+ to_version: "5.0"
298
+ description: "GeoModelAdmin deprecated and removed, use ModelAdmin with GISModelAdmin mixin"
299
+ replacement: "django.contrib.admin.ModelAdmin"
300
+ has_deterministic_transform: false
301
+ notes: "Manual migration may be needed for GIS-specific features"
302
+
303
+ - symbol: "django.contrib.gis.admin.OSMGeoAdmin"
304
+ change_type: removed
305
+ severity: medium
306
+ from_version: "4.0"
307
+ to_version: "5.0"
308
+ description: "OSMGeoAdmin deprecated and removed"
309
+ replacement: "django.contrib.admin.ModelAdmin with OSM widget"
310
+ has_deterministic_transform: false
311
+ notes: "Configure OSM widget manually"
312
+
313
+ # Session Serializer (Django 4.1)
314
+ - symbol: "django.contrib.sessions.serializers.PickleSerializer"
315
+ change_type: removed
316
+ severity: high
317
+ from_version: "4.0"
318
+ to_version: "4.1"
319
+ description: "PickleSerializer removed due to security risks"
320
+ replacement: "django.contrib.sessions.serializers.JSONSerializer"
321
+ has_deterministic_transform: true
322
+ transform_name: pickle_serializer_to_json
323
+
324
+ # Database Backend Changes (Django 3.0)
325
+ - symbol: "django.db.backends.postgresql_psycopg2"
326
+ change_type: renamed
327
+ severity: medium
328
+ from_version: "1.0"
329
+ to_version: "3.0"
330
+ description: "postgresql_psycopg2 backend renamed to postgresql"
331
+ replacement: "django.db.backends.postgresql"
332
+ has_deterministic_transform: false
333
+ notes: "Update DATABASES ENGINE setting"
334
+
335
+ # Static Files (Django 4.1)
336
+ - symbol: "django.contrib.staticfiles.storage.CachedStaticFilesStorage"
337
+ change_type: removed
338
+ severity: medium
339
+ from_version: "1.0"
340
+ to_version: "4.1"
341
+ description: "CachedStaticFilesStorage removed, use ManifestStaticFilesStorage"
342
+ replacement: "django.contrib.staticfiles.storage.ManifestStaticFilesStorage"
343
+ has_deterministic_transform: true
344
+ transform_name: cached_storage_to_manifest
345
+
346
+ # Test Runner Changes (Django 4.0)
347
+ - symbol: "django.test.runner.reorder_suite"
348
+ change_type: renamed
349
+ severity: low
350
+ from_version: "1.0"
351
+ to_version: "4.0"
352
+ description: "reorder_suite() renamed to reorder_tests()"
353
+ replacement: "django.test.runner.reorder_tests"
354
+ has_deterministic_transform: true
355
+ transform_name: reorder_suite_to_reorder_tests
@@ -0,0 +1,270 @@
1
+ # Flask Knowledge Base
2
+ # Breaking changes from Flask 1.x to 2.x/3.x
3
+
4
+ name: flask
5
+ display_name: Flask
6
+ description: Lightweight WSGI web application framework
7
+ migration_guide_url: https://flask.palletsprojects.com/en/stable/changes/
8
+
9
+ supported_migrations:
10
+ - from: "1.0"
11
+ to: "2.0"
12
+ - from: "2.0"
13
+ to: "3.0"
14
+
15
+ breaking_changes:
16
+ # Import changes (Flask 2.3/3.0)
17
+ - symbol: "flask.escape"
18
+ change_type: moved
19
+ severity: high
20
+ from_version: "1.0"
21
+ to_version: "2.3"
22
+ description: "escape function moved from flask to markupsafe"
23
+ replacement: "from markupsafe import escape"
24
+ has_deterministic_transform: true
25
+ transform_name: flask_escape_to_markupsafe
26
+ notes: "Deprecated in 2.3, removed in 3.0"
27
+
28
+ - symbol: "flask.Markup"
29
+ change_type: moved
30
+ severity: high
31
+ from_version: "1.0"
32
+ to_version: "2.3"
33
+ description: "Markup class moved from flask to markupsafe"
34
+ replacement: "from markupsafe import Markup"
35
+ has_deterministic_transform: true
36
+ transform_name: flask_markup_to_markupsafe
37
+ notes: "Deprecated in 2.3, removed in 3.0"
38
+
39
+ # send_file parameter changes (Flask 2.0)
40
+ - symbol: "send_file(attachment_filename=...)"
41
+ change_type: renamed
42
+ severity: high
43
+ from_version: "1.0"
44
+ to_version: "2.0"
45
+ description: "attachment_filename parameter renamed to download_name"
46
+ replacement: "send_file(download_name=...)"
47
+ has_deterministic_transform: true
48
+ transform_name: send_file_attachment_filename_to_download_name
49
+ notes: "Deprecated in 2.0, removed in 2.2"
50
+
51
+ - symbol: "send_file(cache_timeout=...)"
52
+ change_type: renamed
53
+ severity: medium
54
+ from_version: "1.0"
55
+ to_version: "2.0"
56
+ description: "cache_timeout parameter renamed to max_age"
57
+ replacement: "send_file(max_age=...)"
58
+ has_deterministic_transform: true
59
+ transform_name: send_file_cache_timeout_to_max_age
60
+ notes: "Deprecated in 2.0, removed in 2.2"
61
+
62
+ - symbol: "send_file(add_etags=...)"
63
+ change_type: renamed
64
+ severity: low
65
+ from_version: "1.0"
66
+ to_version: "2.0"
67
+ description: "add_etags parameter renamed to etag"
68
+ replacement: "send_file(etag=...)"
69
+ has_deterministic_transform: true
70
+ transform_name: send_file_add_etags_to_etag
71
+ notes: "Deprecated in 2.0, removed in 2.2"
72
+
73
+ # send_from_directory parameter changes (Flask 2.0)
74
+ - symbol: "send_from_directory(filename=...)"
75
+ change_type: renamed
76
+ severity: medium
77
+ from_version: "1.0"
78
+ to_version: "2.0"
79
+ description: "filename parameter renamed to path in send_from_directory"
80
+ replacement: "send_from_directory(path=...)"
81
+ has_deterministic_transform: true
82
+ transform_name: send_from_directory_filename_to_path
83
+ notes: "Deprecated in 2.0, removed in 2.2"
84
+
85
+ # Decorator removals (Flask 2.2/3.0)
86
+ - symbol: "@app.before_first_request"
87
+ change_type: removed
88
+ severity: high
89
+ from_version: "1.0"
90
+ to_version: "2.2"
91
+ description: "before_first_request decorator is deprecated, run setup code when creating the app"
92
+ replacement: "Run setup in create_app() function or use app_context"
93
+ has_deterministic_transform: false
94
+ transform_name: before_first_request_removal
95
+ notes: "Deprecated in 2.2, removed in 3.0. Requires manual migration."
96
+
97
+ - symbol: "@bp.before_app_first_request"
98
+ change_type: removed
99
+ severity: high
100
+ from_version: "1.0"
101
+ to_version: "2.2"
102
+ description: "Blueprint before_app_first_request decorator is deprecated"
103
+ replacement: "Run setup in create_app() function"
104
+ has_deterministic_transform: false
105
+ transform_name: bp_before_app_first_request_removal
106
+ notes: "Deprecated in 2.2, removed in 3.0. Requires manual migration."
107
+
108
+ # JSON encoder/decoder changes (Flask 2.2/3.0)
109
+ - symbol: "app.json_encoder"
110
+ change_type: removed
111
+ severity: high
112
+ from_version: "1.0"
113
+ to_version: "2.2"
114
+ description: "json_encoder attribute replaced with app.json provider"
115
+ replacement: "app.json = CustomJSONProvider(app)"
116
+ has_deterministic_transform: false
117
+ transform_name: json_encoder_to_provider
118
+ notes: "Deprecated in 2.2, removed in 3.0. Requires creating a JSONProvider subclass."
119
+
120
+ - symbol: "app.json_decoder"
121
+ change_type: removed
122
+ severity: high
123
+ from_version: "1.0"
124
+ to_version: "2.2"
125
+ description: "json_decoder attribute replaced with app.json provider"
126
+ replacement: "app.json = CustomJSONProvider(app)"
127
+ has_deterministic_transform: false
128
+ transform_name: json_decoder_to_provider
129
+ notes: "Deprecated in 2.2, removed in 3.0. Requires creating a JSONProvider subclass."
130
+
131
+ - symbol: "flask.json.JSONEncoder"
132
+ change_type: removed
133
+ severity: high
134
+ from_version: "1.0"
135
+ to_version: "3.0"
136
+ description: "JSONEncoder class removed, use JSONProvider instead"
137
+ replacement: "Subclass DefaultJSONProvider"
138
+ has_deterministic_transform: false
139
+ notes: "Fully removed in 3.0"
140
+
141
+ # Context stack removals (Flask 2.3/3.0)
142
+ - symbol: "flask.globals._app_ctx_stack"
143
+ change_type: removed
144
+ severity: high
145
+ from_version: "1.0"
146
+ to_version: "2.3"
147
+ description: "_app_ctx_stack is deprecated, use flask.g instead"
148
+ replacement: "flask.g"
149
+ has_deterministic_transform: true
150
+ transform_name: app_ctx_stack_to_g
151
+ notes: "Deprecated in 2.3, removed in 3.0"
152
+
153
+ - symbol: "flask.globals._request_ctx_stack"
154
+ change_type: removed
155
+ severity: high
156
+ from_version: "1.0"
157
+ to_version: "2.3"
158
+ description: "_request_ctx_stack is deprecated, use flask.g instead"
159
+ replacement: "flask.g"
160
+ has_deterministic_transform: true
161
+ transform_name: request_ctx_stack_to_g
162
+ notes: "Deprecated in 2.3, removed in 3.0"
163
+
164
+ # Environment configuration removals (Flask 2.3/3.0)
165
+ - symbol: "FLASK_ENV"
166
+ change_type: removed
167
+ severity: medium
168
+ from_version: "1.0"
169
+ to_version: "2.3"
170
+ description: "FLASK_ENV environment variable is deprecated, use FLASK_DEBUG"
171
+ replacement: "FLASK_DEBUG=1 or flask --debug"
172
+ has_deterministic_transform: false
173
+ notes: "Deprecated in 2.2, removed in 2.3"
174
+
175
+ - symbol: "app.env"
176
+ change_type: removed
177
+ severity: medium
178
+ from_version: "1.0"
179
+ to_version: "2.3"
180
+ description: "app.env property is deprecated"
181
+ replacement: "app.debug"
182
+ has_deterministic_transform: true
183
+ transform_name: app_env_to_debug
184
+ notes: "Deprecated in 2.2, removed in 2.3"
185
+
186
+ - symbol: "config['ENV']"
187
+ change_type: removed
188
+ severity: medium
189
+ from_version: "1.0"
190
+ to_version: "2.3"
191
+ description: "ENV config key is deprecated"
192
+ replacement: "Use DEBUG config key"
193
+ has_deterministic_transform: false
194
+ notes: "Deprecated in 2.2, removed in 2.3"
195
+
196
+ # Utility function removals (Flask 2.1)
197
+ - symbol: "flask.safe_join"
198
+ change_type: moved
199
+ severity: medium
200
+ from_version: "1.0"
201
+ to_version: "2.0"
202
+ description: "safe_join moved to werkzeug.utils"
203
+ replacement: "from werkzeug.utils import safe_join"
204
+ has_deterministic_transform: true
205
+ transform_name: flask_safe_join_to_werkzeug
206
+ notes: "Deprecated in 2.0, removed in 2.1"
207
+
208
+ # Config loading changes (Flask 2.1)
209
+ - symbol: "app.config.from_json"
210
+ change_type: renamed
211
+ severity: medium
212
+ from_version: "1.0"
213
+ to_version: "2.1"
214
+ description: "from_json removed, use from_file with json.load"
215
+ replacement: "app.config.from_file('config.json', load=json.load)"
216
+ has_deterministic_transform: true
217
+ transform_name: config_from_json_to_from_file
218
+ notes: "Removed in 2.1"
219
+
220
+ # Test client changes (Flask 2.1)
221
+ - symbol: "client.get(as_tuple=True)"
222
+ change_type: removed
223
+ severity: medium
224
+ from_version: "1.0"
225
+ to_version: "2.0"
226
+ description: "Test client as_tuple parameter removed, use response.request.environ"
227
+ replacement: "response = client.get(...); environ = response.request.environ"
228
+ has_deterministic_transform: false
229
+ notes: "Deprecated in 2.0, removed in 2.1"
230
+
231
+ # JSON config keys removed (Flask 2.3/3.0)
232
+ - symbol: "config['JSON_AS_ASCII']"
233
+ change_type: removed
234
+ severity: low
235
+ from_version: "1.0"
236
+ to_version: "2.3"
237
+ description: "JSON_AS_ASCII config key removed, configure on app.json provider"
238
+ replacement: "Configure via app.json provider"
239
+ has_deterministic_transform: false
240
+ notes: "Deprecated in 2.3, removed in 3.0"
241
+
242
+ - symbol: "config['JSON_SORT_KEYS']"
243
+ change_type: removed
244
+ severity: low
245
+ from_version: "1.0"
246
+ to_version: "2.3"
247
+ description: "JSON_SORT_KEYS config key removed, configure on app.json provider"
248
+ replacement: "Configure via app.json provider"
249
+ has_deterministic_transform: false
250
+ notes: "Deprecated in 2.3, removed in 3.0"
251
+
252
+ - symbol: "config['JSONIFY_MIMETYPE']"
253
+ change_type: removed
254
+ severity: low
255
+ from_version: "1.0"
256
+ to_version: "2.3"
257
+ description: "JSONIFY_MIMETYPE config key removed, configure on app.json provider"
258
+ replacement: "Configure via app.json provider"
259
+ has_deterministic_transform: false
260
+ notes: "Deprecated in 2.3, removed in 3.0"
261
+
262
+ - symbol: "config['JSONIFY_PRETTYPRINT_REGULAR']"
263
+ change_type: removed
264
+ severity: low
265
+ from_version: "1.0"
266
+ to_version: "2.3"
267
+ description: "JSONIFY_PRETTYPRINT_REGULAR config key removed, configure on app.json provider"
268
+ replacement: "Configure via app.json provider"
269
+ has_deterministic_transform: false
270
+ notes: "Deprecated in 2.3, removed in 3.0"