Нахождение драгоценного камня из требуемой строки в коде - PullRequest
3 голосов
/ 23 сентября 2011

У меня в настоящее время есть установщик, который устанавливает набор скриптов ruby ​​(это необязательная установка из основной программы).Я написал скрипт, который после установки сканирует все операторы require внутри содержащихся в Ruby файлов, а затем извлекает все «требуемые» файлы.Например, он будет искать

require 'curb'
require 'rest-client'
# require etc...

в каждом файле, а затем включать их в список (удаление дубликатов), поэтому у меня есть массив, который выглядит следующим образом:

"curb", "rest-client", etc...

Для большинства драгоценных камней это прекрасно, так как имена совпадают, и я просто делаю

gem install GEMNAME

В случае, если имена не совпадают, я пытаюсь найти способ выяснитьимя драгоценного камня из требуемой строки, запрашивая сервер драгоценного камня.Например:

xml-simple содержит инструкцию require для xmlsimple, но гем является xml-simple.После долгих поисков единственное «решение», которое я могу найти, - это установить каждый драгоценный камень и проверить, содержатся ли файлы внутри с помощью

gem specification GEMNAME

. Это далеко от оптимального и на самом деле очень плохоидея, и мне было интересно, если есть способ запросить rubygems, чтобы увидеть, какие файлы содержатся внутри драгоценного камня.

1 Ответ

0 голосов
/ 24 сентября 2011

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 возвращает частичные совпадения.Я на самом деле не пробовал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...