Also.. For those interested why this "seemingly simple" case is not that
simple - one more small comment and context.

While you might think it's stupid and simple, there is a reason why we
"want" to do a hand-holding - or at least guide-railing here. The thing is
that the simple and obvious:

if Version(_version) >= Version("2.3.0"):

is unfortunately (and non-obviously) wrong.

Simply because we have pre-release versions and Python version PEP set some
"obvious" and "correct" rules for comparison of versions in PEP 440
https://peps.python.org/pep-0440/, but they made it useless for very needed
use-case including pre-release version.

> Within a numeric release (1.0, 2.7.3), the following suffixes are
permitted and MUST be ordered as shown:
> .devN, aN, bN, rcN, <no suffix>, .postN

This means that - effectively - 2.3.0rc1 is NOT >= Version("2.3.0") when
you use sorting order defined in PEP 440.  And in case when we want to
include pre-releases in our comparison whether there is a new feature we
need to do this double Version snippet of code which is far from obvious.

There is a long recent discussion in `pip` -
https://github.com/pypa/pip/issues/13089. where I took part and advocated
for having a feature in `pip` that would help us with making it easier to
specify package requirements (currently we have to dynamically modify our
requirements during building in order to overcome this limitation where
pre-release packages are involved. But I agree with `pip` maintainers, that
having a possibility of built-in different comparison in "packaging"
requires really a whole new PEP, then implementation in packaging and only
then making it usable in `pip` (and our code).

So this is one more reason why we should make it easy and consistent to
make those "feature availability" comparisons - because when we have 6
different versions of it, someone will get confused and will start maybe
using the 7th (Version(_version) >= Version("2.3.0") - which will look
right, but will be wrong when we attempt to make a release.

So I'd say, it's a real issue to address.

J.





On Sat, Dec 7, 2024 at 11:52 AM Jarek Potiuk <ja...@potiuk.com> wrote:

> > Yes we will have to wait some time before all providers can use such a
> helper, but time flies, and there's no emergency here.
>
> I think that's the key. This is not a question of emergency but having
> confusion, mistakes for the next at least 8 months. I like the
> https://github.com/apache/airflow/pull/44607 better because it is
> simpler. And maybe this is a good one as long as we work out strategy how
> to get there.
>
> One could argue that adding such a solution in Airflow will add **MORE**
> possibilities to make mistakes. What happens if someone starts using this
> method in their provider between now and 8 months from now? That will -
> accidentally - make such a provider not work on Airflow 2.8, 2.9, 2.10.
> Only 2.11 will work (as long as we back-port it to v2-10-test/
>
> Luckily, we have the back compatibility tests that **should** catch
> it, but I can imagine the case that someone adds this if and it will not be
> covered by tests. Then - having it in airflow will add more possibilities
> of introducing issues.
>
> So ... ideally if we introduce this one, we should also somehow (yet
> another pre-commit?) that it is **not used** till 8 months pass (or
> generally till min-airflow-version will be 2.11). If we do it, I am all for
> it as additional solution - then we will be able to remove whatever we come
> up with for the next 8 months.
>
> J.
>
>
>
>
>
>
> On Fri, Dec 6, 2024 at 8:48 PM Daniel Standish
> <daniel.stand...@astronomer.io.invalid> wrote:
>
>> There are multiple different issues implicated here but the only one I am
>> interested in is these version constants.  And that's what I'll address
>> here.
>>
>> My take is that adding constants like this in ... all? ... providers is
>> unnecessary and overkill and very bloaty.
>>
>> PROVIDERS_{{ PROVIDER_CONSTANT_PREFIX }}_AIRFLOW_IS_2_9_PLUS
>>
>> All we're really after is, "what is the airflow version?"
>>
>> The context here is when providers are implementing conditional logic
>> based
>> on airflow core version.  Let's also remember that there will soon be a
>> SDK... shall we add constants for that too?
>>
>> I think we're better off if we simply provide a simple way to answer the
>> question, "what is the core version?"
>>
>> We can do this in one place instead of many.
>>
>> I have offered two ways we could do that.
>>
>> One is #44607 <https://github.com/apache/airflow/pull/44607> which adds a
>> get version function that gives the base version, which is what all of
>> these comparisons use.
>>
>> Usage example:
>>
>> if get_airflow_version() > Version("3.0.0"):
>>     do_something()
>>
>> Another, which I think I like better is, #44743
>> <https://github.com/apache/airflow/pull/44743>, which returns an
>> AIRFLOW_BASE_VERSION constant that can be compared both with Version
>> objects and with strings.
>>
>> Usage example:
>>
>> if AIRFLOW_BASE_VERSION >= "2.10.0":
>>     do_something()
>>
>> This way we don't need to add such constants in every provider, for every
>> version, for both "greater equals" and "greater than".
>>
>> You just give the info and the call site does the evaluation.
>>
>> Yes we will have to wait some time before all providers can use such a
>> helper, but time flies, and there's no emergency here.
>>
>> The other issue, overwriting the autogen file has now already been fixed,
>> thanks to Jarek.  And the cross provider import thing, I will leave that
>> for others to debate.
>>
>

Reply via email to