') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); [Core] Add deprecation module with decorator and custom warnings by kacpermuda · Pull Request #36952 · apache/airflow · GitHub
Skip to content

[Core] Add deprecation module with decorator and custom warnings - #36952

Closed
kacpermuda wants to merge 1 commit into
apache:mainfrom
kacpermuda:feat/add-deprecation-module
Closed

[Core] Add deprecation module with decorator and custom warnings#36952
kacpermuda wants to merge 1 commit into
apache:mainfrom
kacpermuda:feat/add-deprecation-module

Conversation

@kacpermuda

@kacpermudakacpermuda commented Jan 22, 2024

Copy link
Copy Markdown
Collaborator

Rationale

This is a step number 2 of the process described in #36876, please refer to it for the rationale and in depth description. Possibly, it can also replace part of the mechanism described in #31830.

TLDR

See the tests i wrote, for the demo of how it works (look at the end of the file).

I want to add a decorator (for now only for classes, functions, methods etc.) that we can use for deprecations in the entire codebase (core and providers). By defining a custom function, we can have the most common information (now included in deprecation message) as separate arguments, so it's easier to parse it and use in CI, docs etc.

To do in next PRs

  • Possibly some changes in the documentation will be required, to describe how the developers should deprecate things and what are the options.
  • We can probably remove the warnings from current location (airflow.exceptions.py) and only keep them in airflow.deprecation.py, but this requires some time to migrate etc. so I am not sure how do properly do it.

Questions

This is my first PR that touches the core airflow, so let me know if anything needs to be changed 😄 I also have some questions to the functionality itself:

  1. Are there any more arguments that we can define in the deprecation decorator? Some ideas?
  2. Is it a good place (deprecation module in core) to have helper functions like: get_callable_full_path or validate_release_string. We can just make them private.
  3. Should we define separate provider_deprecated decorator that will have a default category set to AirflowProviderDeprecationWarning ?
  4. Should we allow passing a different Adapter, so that You can alter the deprecation message or we want to enforce standardization in the whole codebase and remove that option for the end user?

^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@kacpermuda
kacpermudaforce-pushed the feat/add-deprecation-module branch from 9b1109b to 003f494CompareJanuary 22, 2024 16:12
@kacpermuda
kacpermuda marked this pull request as draft January 22, 2024 16:21
@kacpermuda
kacpermudaforce-pushed the feat/add-deprecation-module branch 3 times, most recently from 69d6239 to 76295b7CompareJanuary 25, 2024 08:54
@kacpermuda
kacpermuda marked this pull request as ready for review January 25, 2024 08:56
@mobuchowskimobuchowski added kind:documentation type:improvement Changelog: Improvements kind:feature Feature Requests labels Jan 25, 2024
@kacpermuda
kacpermudaforce-pushed the feat/add-deprecation-module branch from 76295b7 to 15e0698CompareJanuary 29, 2024 17:00
@kacpermuda
kacpermuda marked this pull request as draft February 15, 2024 16:00
@github-actions

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 5 days if no further activity occurs. Thank you for your contributions.

@github-actionsgithub-actionsBot added the stale Stale PRs per the .github/workflows/stale.yml policy file label Apr 1, 2024
@kacpermuda

Copy link
Copy Markdown
CollaboratorAuthor

Will reopen when i have time to do this.

@Taragolis

Copy link
Copy Markdown
Contributor

If you have a time also worthwhile to check PEP-702 – Marking deprecations using the type system (and discussion) and maybe it is possible to adopt it to use it, in python before 3.13 it back-ported in typing_extensions

Some upstream PEP-702 related issues/feature requests

@kacpermuda

Copy link
Copy Markdown
CollaboratorAuthor

Adding another example of deprecations from Ray: https://github.com/ray-project/ray/blob/master/python/ray/_private/utils.py#L1090

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind:documentationkind:featureFeature RequestsstaleStale PRs per the .github/workflows/stale.yml policy filetype:improvementChangelog: Improvements

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kacpermuda@Taragolis@mobuchowski