Rubygems имеет API с конечной точкой поиска:
/api/v1/search.(json|xml|yaml)?query=[YOUR QUERY]
Конечная точка поиска указана в Методы самоцвета .Я уверен, что этот поиск можно использовать, чтобы делать то, что вы хотите, возможно, предоставив частичное имя и используя регулярное выражение для фильтрации совпадений закрытия.
Редактировать: Это также может быть работа с просмотром самого камня Bundler , поскольку они иногда рекомендуют камни, когда вы делаете опечатку, если я правильно помню.
Обновление:
Я бы следил за рабочим процессом, подобным этому:
Попробуйте установить гемы только тогда, когда они необходимы.
Если есть ошибка, выберитенесколько сегментов имени гема, скажем, gem_name_str[0..5]
, gem_name_str[0..4]
и gem_name_str[0..3]
.
Запрос API к этим строкам.
Удаление дубликатов
Проверка значенийвозвращается с динамически сгенерированным регулярным выражением.Что-то вроде:
#given @param name = string from 'require' statement
values_returned_from_api.each do |value|
split_name = name.split(//)
split_value = value.split(//)
high_mark = 0
#this will find the index of the last character which is the same in both strings
for (i in 0..split_name.length) do
if split_name[i] == split_value[i]
high_mark = i
else
break
end
end
#this regex will tell you if the names differ by only one character
#at the point where they stopped matching. In my experience, this has
#been the only way gem names differ from their require statement.
#such as 'active_record'/'activerecord', 'xml-simple'/'xmlsimple' etc...
#get the shorter name of the two
regex_str = split_name.length < split_value.length ? split_name : split_value
#get the longer name of the two
comparison_str = split_name.length < split_value.length ? value : name
#build the regex
regex_str.insert((high_mark + 1), '.') #insert a dot where the two strings differ
regex = /#{regex_str.join('')}/
return name if comparison_str =~ regex
end
Примечание: этот код не проверен.Это просто для иллюстрации.Возможно, его также можно оптимизировать и сжать.
Я предполагаю, что API возвращает частичные совпадения.Я на самом деле не пробовал это.