Почему оператор семантического управления версиями Gemfile (~›) дает противоречивые результаты с одним числом?

Семантический оператор управления версиями gemspec ~> (также известный как twiddle-wakka, также известный как пессимистический оператор) позволяет ограничить версию gem, но разрешить некоторые обновления.

Я часто видел, что это можно прочитать как:

 "~> 3.1"   => "Any version 3.x, but at least 3.1"
 "~> 3.1.1" => "Any version 3.1.x, but at least 3.1.1"

Но с одним номером это правило нарушается:

 "~> 3"     => "Any version x, but at least 3"   *NOT TRUE!*
 "~> 3"     => "Any version 3.x"                 *True. But why?*

Если бы я хотел «Любая версия 3.x», я мог бы просто использовать «~> 3.0», что соответствует. В нынешнем виде это изменение операции на одном номере непоследовательно и недокументировано.

Более того, если бы я хотел сказать «Любая версия выше или равна 3» (например, 3.x, 4.x и т. д.), у меня возникло бы искушение использовать оператор «>=», о котором нам говорят это зло.

Есть ли причина такого поведения?

РЕДАКТИРОВАТЬ:

Я отдаю это Дэвиду за то, что он нашел файл преступника в rubygems. Существует «функция», которая автоматически расширяет «3» до «3.0» (Строка 148 в файле version.rb: "одноразрядные версии автоматически дополняются нулем для получения разумного результата".)

Должен сказать, что я не согласен с тем, что результат разумен, поскольку он нарушает ожидаемую последовательность и не позволяет сказать «Любая версия x, но не менее 3» с этим оператором. Таким образом, мы вынуждены использовать >=, который guide.rubygems.org предупреждает нас не использовать. Так или иначе. Может быть, этот пост послужит документацией, которую я искал...


person hlascelles    schedule 09.06.2014    source источник
comment
Если бы вы хотели 3.0, вы бы попросили "~> 3.0". Точность имеет значение.   -  person tadman    schedule 09.06.2014
comment
Нет, ~› 3.0 было бы неправильно, так как это дало бы мне 3.1, 3.2 и т. д. Для 3.0 мне пришлось бы использовать = 3.0.   -  person hlascelles    schedule 09.06.2014


Ответы (1)


Заглянув в исходники rubygems (особенно require.rb, version.rb), пессимистическому оператору нужно по крайней мере два сегмента управления версиями.

Это также имеет смысл. Поскольку ~> v.r — это просто синтаксический сахар для неравенства

v.r <= current_version.current_release < (v+1).0

какова будет верхняя граница, если есть только один номер версии? Да, ∞ (бесконечность), поэтому нет смысла, почему это должно работать. Вы можете просто написать это как >= v .

person David Unric    schedule 09.06.2014
comment
Это уравнение имеет больше смысла, чем другие сообщения в блогах или документация, которые я видел. Наверняка никто не ссылается на автопреобразование 3 в 3.0. Престижность за погружение в код (в частности, строка 148 в version.rb: однозначные версии автоматически дополняются нулем, чтобы дать разумный результат). - person hlascelles; 09.06.2014
comment
@hlascelles Хорошая находка. Он дополняет утверждение о необходимости двух сегментов версий для оператора ~>. Я также согласен с тем, что автоматическое преобразование не слишком интуитивно понятно. - person David Unric; 10.06.2014