В предыдущей статье мы написали небольшой гем для вычисления чисел Фибоначчи. В этой статье мы доработаем его в CLI приложение, немного доработаем исходный код, чтобы ускорить подсчет чисел Фибоначчи и опубликуем все это дело на rubygems.
Для начала в корневой папке гема создадим новую папку. Назовем её exe. В этой папке создадим файл для вызова из консоли, обычно имя файла совпадает с именем гема.
Предоставим этому файлу права на исполнение, чтобы мы смогли запускать его:
chmod +x exe/fib
В файле описываем что должно происходить при вызове нашей утилиты:
#!/usr/bin/env ruby # указываем консоли, что используем интерпретатор руби
require 'fib'
# ARGV - массив параметров, берем первый аргумент
puts Fib.number(ARGV[0].to_i)
Дальше собираем гем командой:
rake install
Теперь, когда гем собран и установлен в систему, перезапустим терминал и попробуем запустить утилиту:
Использование гема в CLI режиме
Теперь допишем пару тестов, в ходе тестирования выяснилось, что в CLI режиме результат возвращается в виде строки с символом переноса строки, поэтому тест выглядит так:
it “CLI Fib 32th number equal 2178309” do
expect(%x{Fib 32}).to eq(“2178309\n”)
end
Запустим тесты, убедимся, что все работает:
Рекурсия это, конечно, хорошо, но в нашем алгоритме есть как минимум две проблемы. Во-первых, мы рискуем получить ошибку переполнения стека вызовов, а во-вторых, мы расходуем больше памяти и увеличиваем время выполнения нашей программы. Давайте доработаем алгоритм и убедимся, что логика не изменилась, что все тесты выполняются успешно.
def number(n)
(0..n-2).reduce([0,1]) do |acc, n|
acc = [acc.last, acc.sum]
end.last
end
Переходим на страницу регистрации, вводим учетные данные, жмём Sign up и готово!
Перед публикацией гема необходимо внести пару правок в файле fib.gemspec:
-
Необходимо проверить, существует ли гем с таким же именем, как у вашего. Если да, то вы не сможете опубликовать свой, пока не измените его имя в параметре spec.name
-
В файле спецификации существует заглушка, которая не позволит опубликовать гем в каким-либо репозитории.
Необходимо указать доменное имя нужного репозитория, либо удалить этот блок кода для публикации в различных репозиториях.
Гем с именем fib занят, поэтому я переименовал его в fib_test, чтобы люди понимали, что это тестовый/учебный гем, и устанавливать его не стоит
Сначала необходимо собрать гем с обновленной спецификацией, делаем это командой rake build
rake build
# => fib_test 0.2.0 built to pkg/fib_test-0.2.0.gem.
Дальше командой gem push мы опубликуем его на rubygems.
Во время выполнения надо будет ввести почту и пароль, указанную при регистрации
gem push pkg/fib_test-0.2.0.gem
Enter your RubyGems.org credentials.
Don’t have an account yet? Create one at [https://rubygems.org/sign_up](https://rubygems.org/sign_up)
Email: [email protected]
Password: **************
Signed in.
Pushing gem to [https://rubygems.org...](https://rubygems.org...)
Successfully registered gem: fib_test (0.2.0)
Теперь гем доступен по ссылке: https://rubygems.org/gems/fib_test