Программа урока
- Понятие, назначение и использование гемов
- Rubygems и аналоги
- Структура гема на примере https://github.com/kaize/configus
- Создание гема. Полезные команды
Работа с гемами
# Установка гема
gem install rails
# Установить определенную версию библиотеки
gem install rails --version 5.0
# Поиск среди доступных гемов
gem search -r rails
# Для просмотра всех локально установленных гемов:
gem list
# Чтобы получить (очень длинный) список всех гемов, доступных на RubyGems.org:
gem list -r
# Документация
gem help
Bundler
# Инициализация
bundle init
# Установка
bundle install # bundle install --without development test
# Запуск определенных зависимостей
bundle exec rails -v
# Создавая gemset, вы создаете новую папку, в которую можно складывать новые gem'ы,
# будучи абсолютно уверенным, что они изолированы от ранее установленных.
gemset
Создание гема
gem install bundler
bundle -v
bundle gem test_gem
gem build
gem install
gem push
Утилита gem
# gem — пакет(архив) с библиотекой или приложением
# RubyGems — менеджер пакетов с утилитой gem для командной
# строки для установки и запаковки Ruby библиотек и приложений
# Gemfile
source :rubygems
gem "nokogiri", "1.5.0"
gem "sinatra", "~> 1.2.6"
gem "wirble", :group => :development
group :test do
gem "rspec", ">= 2.6"
gem "ffaker", ">= 1.7"
end
# Разрешение конфликтов
require 'bundler/setup'
Gemfile.lock
# Установка напрямую из GIT
gem 'rails', git: 'https://github.com/rails/rails.git'
# Установка гема, который установлен локально
gem 'rubocop', path: '../gems/rubocop'
Bundler.require(:default, Rails.env)
Самостоятельная работа
В этом задании нужно реализовать гем, который работает с сервисом ip-api.com.
Сервис ip-api.com позволяет получать информацию по IP — например, страну, город, координаты. Так это выглядит на практике:
$ curl "http://ip-api.com/xml/83.169.216.199"
# <?xml version="1.0" encoding="UTF-8"?>
# <query>
# <status>success</status>
# <country>United States</country>
# <countryCode>US</countryCode>
# <region>VA</region>
# <regionName>Virginia</regionName>
# <city>Ashburn</city>
# <zip>20149</zip>
# <lat>39.03</lat>
# <lon>-77.5</lon>
# <timezone>America/New_York</timezone>
# <isp>Google LLC</isp>
# <org>Google Public DNS</org>
# <as>AS15169 Google LLC</as>
# <query>8.8.8.8</query>
# </query>
Ipgeobase
Реализуйте гем Ipgeobase, который возвращает метаданные об IP. Этот гем содержит метод lookup('8.8.8.8')
, который принимает IP-адрес и возвращает объект метаданных.
В метаданных содержатся следующие поля:
city
— городcountry
— странаcountryCode
— код страныlat
— ширинаlon
— долгота
Посмотрим на примере:
ip_meta = Ipgeobase.lookup('8.8.8.8')
ip_meta.city # Ashburn
ip_meta.country # United States
ip_meta.countryCode # US
ip_meta.lat # 39.03
ip_meta.lon # -77.5
Задачи
- Создайте базовую структуру гема командой:
bash bundle gem ipgeobase --test=minitest --ci=github --no-mit --no-coc
- Создайте репозиторий на GitHub для будущего гема
- В файле ipgeobase.gemspec измените содержимое так, как показано в sample_gem. Откройте созданный репозиторий на Github и укажите себя как автора
- Реализуйте тесты приложения. Для мока запросов используйте библиотеку Webmock
- Добавьте подсчет покрытия тестами с помощью гема simplecov
- Реализуйте необходимую логику для работы гема
- Запушьте получившийся гем в репозиторий на Github. Убедитесь, что проверки линтера и тесты в Github Actions успешно выполняются
- Добавьте в файл README.md бейдж на Github Action
Подсказки
- Пример настроенного гема — sample_gem
- Гем для преобразования xml в свойства класса — Happymapper
- Гем для формирования URL-адреса запроса — Addressable
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.