Gem что такое – Что такое gem? – Ruby. Исповедь самоучки

Что такое gem? – Ruby. Исповедь самоучки

При разработке приложения на Ruby, использование gem’ов (gem – в переводе означает “драгоценный камень”, правильно читается как джем, но многие почемуто говорят “гемы”) не редкость. По факту gem – это готовый набор классов облегчающий работу программиста, иными словами “сторонняя библиотека”. Таким образом программист сосредотачивается на основных тонкостях своей писанины. Как результат – увеличивается скорость разработки, и как побочный эффект программист не изобретает велосипед.
.gem – это архив, внутри которого, помимо самой библиотеки находится файл спецификации, который помимо всего прочего включает в себя информацию:
– версия библиотеки
– зависимости от других gem’ов
– описание gem’a
Gem’ы создаются независимыми программистами, при разработки типовых задач. Устанавливаются в систему одноимённой утилитой gem (она устанавливается вместе с RVM).

Искать нужные джемы стоит на сайте проекта rubygems.org (RubyGems – менеджер пакетов (джемов)), на гитхабе и на независимом проекте ruby-toolbox.com

Раньше, до того как появился менеджер пакетов RubyGems, джемы были равномерно рассосредоточены по интернету. Нужно было найти сайт интересующего джема, найти ссылку на скачивание архива, скачать, распаковать, проанализировать все зависимости текущего джема, лезть опять в гугл, искать зависимые джемы, находить, опять качать, опять смотреть на зависимости, и при всем при этом учитывать версии каждого джема, ибо один джем зависит от другого джема конкретной версии, и не факт что он будет работать с более новой или темболее более старой версией. И после всех этих плясок с бубном, нужно было все это проинсталлировать. Короче был пиздец. И слава богам, – появился RubyGems, менеджер пакетов который автоматизировал работу с джемами.
Gemset’ы
Поскольку джемы разных версий могут конфликтовать, под каждый проект принято создавать отдельные  джемсеты, которые представляют из себя набор определенных джемов, с определенными версиями, заточенными под нужную вресию руби. Давай, специально под данный учебник создадим джемсет
samouchka
:

$ rvm use 2.0.0@samouchka --create --default

Где:
use – начать использовать указанный джемсет
2.0.0 – версия руби (мы же помним да, что RVM позволяет работать на одном сервере с разными версиями руби)
samouchka – имя джемсета
–create – создать джемсет
–default – использовать этот джемсет по умолчанию. В итоге, при каждом запуске окна терминала, только что созданный джемсет будет выбран автоматически.
проверить текущий джемсет можно командой
$ rvm current

Установка gem’ов
$ gem install sinatra

Gem sinatra – микрофреймворк
Легким движением пальцев, фрейворк sinatra установлен. По умолчанию устанавливается самая последняя версия джема.  Операция gem install скачивает архив и распаковывает его, проверяет зависимости, учитывая версии, и при необходимости скачивает и их тоже, не забыв при этом обновить для себя файлик спецификации. В состав джемов могут входить также и исполняемые файлы (я думаю bundler и rake наиболее известные). Команда gem install отлично подходит, когда к приложению подключается 1-2 джема. Но мы же не хотим плясать с бубном когда нам нужно установить 10-20 разных джемов, при всем при этом мы хотим чтобы одна часть джемов работала в окружении разработки, а другая в продакшне. На помощь приходит
bundler

Bundler и Gemfile
Bundler – это джем, который занимается установкой джемов. Файл Gemfile является неотделимым атрибутом для работы bundler’a. Gemfile представляет из себя обычную программу на Ruby,  которая описывает установщику какие джемы каких версий и для чего нам нужны.
Вот пример того, как может выглядить Gemfile:

source 'http://rubygems.org'

gem 'sinatra',  '~> 1.4.4'
gem 'mongo',    '1.9.2'
gem 'bson'      '1.9.2'
gem 'bson_ext', '1.9.2'

gem 'unicorn', :group => :production

group :development, :test do
  gem 'shotgun'
end

group :test do
    gem 'rspec', '>= 2.6'
end

Чтобы установить указанный джемы, достаточно перейти в каталог с Gemfile’ом и набрать в консоле команду
$ bundle install

Помимо установки всех джемов в одну строку, bundle разрешает все конфликты зависимостей и записывает результат работы в файл Gemfile.lock, у меня он выглядит так:
GEM
  remote: http://rubygems.org/
  specs:
    bson (1.9.2)
    bson_ext (1.9.2)
      bson (~> 1.9.2)
    kgio (2.9.2)
    mongo (1.9.2)
      bson (~> 1.9.2)
    rack (1.5.2)
    rack-protection (1.5.2)
      rack
    raindrops (0.13.0)
    shotgun (0.9)
      rack (>= 1.0)
    sinatra (1.4.4)
      rack (~> 1.4)
      rack-protection (~> 1.4)
      tilt (~> 1.3, >= 1.3.4)
    tilt (1.4.1)
    unicorn (4.8.2)
      kgio (~> 2.6)
      rack
      raindrops (~> 0.7)

PLATFORMS
  ruby

DEPENDENCIES
  bson
  bson_ext
  mongo
  shotgun
  sinatra
  unicorn


Bundle имеет еще ряд фич, таких как например установка джемов прямо из репозитария гитхаба, или групповой require. Про все это можно почитать здесь http://www.ruby-doc.org/docs/ruby-doc-bundle/

qpi2.livejournal.com

Знакомство с Gem. Часть первая / Habr

Доброго времени суток!
Введение

Каждый рубист, да и вообще программист, рано или поздно начинает задумываться о написании своих библиотек. Ему начинает надоедать перетаскивание одних и тех же кусков кода в другие проекты. В Ruby лекарством от данного заболевания являются gem‘ы. Итак, давайте познакомимся с ним поближе.
С чего начать

Для начала неплохо было бы отыскать запылившийся файлик с расширением .rb. Нашли? Ok, двигаемся дальше.
Далее нам необходимо создать файл с названием hello-world.gemspec, где, как вы, вероятно, догадались hello-world — имя вашего будущего gem’a.
Следующим нашим шагом будет заполнение этого самого файла (если так можно выразиться, файла-спецификации). Содержание его должно выглядеть следующим образом:
Gem:Specification.new do |g| g.name = 'hello-world' # имя нашего gem'a g.version = '1.0' # его текущая версия g.summary = 'This is the first gem in my life.' # описание... сами знаете чего g.files = ['lib'/helloworld.rb'] # список файлов g.author = 'krovatti' # и, разумеется, автор... как же без него... end

Отлично, но собирать то нам пока нечего! Почему? Мы забыли создать helloworld.rb. Давайте немедленно исправим нашу оплошность:
class HelloWorld
     def initialize
          puts "Hello, World!'
     end
end

Фуууух! Теперь, когда мы имеем минимальный набор файлов, мы можем приступить к сборке нашего с вами gem’a. Для его сборки мы должны использовать команду
gem build hello-world.gemspec

В случае удачного выполнения данной операции на выходе мы получим файл с название
hello-world-1.0.gem
. Всё, наш gem собран.
Постойте-ка

Вы хотите поделиться своим gem’ом с другими людьми? Если да, то вы запросто можете это сделать следующей командой:
gem push hello-world-1.0.gem

После выполнения этой команды мы должны увидеть следующее:
Pushing gem to RubyGems.org...
Successfully registered gem: hello-world (1.0)

Увы, мы этого не увидим. Знаете почему? Потому, что мы с вами ещё не зарегистрированы на RubyGems. Сделать это можно здесь.
Теперь повторите команду push и всё будет ok.
All over the world

Теперь наш gem сможет установить любой рубист (хоть из Австралии), выполнив команду
gem install hello-world

После того, как установка будет завершена напишем следующий код и выполним его:
require 'rubygems'
require 'hello-world'

inst = HelloWorld.new

В результате чего мы увидим заветное
Hello, World!
в нашей консоли.
Стопэ!

Вообще-то мы наследили на RubyGems. Вы же об этом не забыли? Удалим наш gem следующей командой:
gem yank hello-world -v 1.0

Да и из нашего списка gem’ов можно удалить. Поигрались и хватит!
gem uninstall hello-world -v 1.0
Заключение

Вот и сказочке конец, а кто слушал — молодец.
Сегодня мы с вами познакомились с поистине замечательным инструментом по имени gem. Теперь вы знаете, что если что-то случиться, gem обязательно придёт к вам на помощь. А Чип, Чип, Чип… И Дейл к нам спешат…

habr.com

RubyGems — подробно / Habr


Для начала определимся с понятиями:
RubyGems — фрэймворк для установки и запаковки Ruby библиотек и приложений.
gem — пакет(файл) с библиотекой или приложением. Имеет стандартизированный вид и расположен в хранилище в сети.
gem command tool — RubyGems предоставляет утилиту «gem» для работы с gem пакетами из командной строки. Она интегрирована с Ruby и позволяет получать доступ к установленным gem’ам как к библиотекам.

В чем же предназначение RubyGems?

До того как появилась RubyGems, для установки новой библиотеки нужно было найти, скачать её, попытаться установить, часто лишь для того, чтобы убедиться в отсутствии нужных зависимостей. Если же библиотека запакована с помощью RubyGems, достаточно попросить RubyGems сделать это за нас и получить установленную, интегрированную библиотеку со всеми нужными зависимостями. В дополнение ко всему утилита gem — платформонезависима, неважно какую ОС вы используете, везде механизм установки библиотек и приложений будет одинаков. Здорово, правда?

Под катом будут описаны:
1) Поиск, получение деталей, установка gem’s
2) Доступ документации по установленному gem

3) Использование установленных gem’s
4) Работа с версиями gem’s
5) Создание собственных gem’s

1. Поиск, получение деталей, установка gem’s


Допустим в вашем текущем проекте генерируется много XML. И где то вы слышали, что есть замечательная библиотека Jim Weirich’s Builder library, которая позволит вам создавать XML прямо в коде Ruby.
Посмотрим, доступна ли она в качестве gem:
% gem query --details --remote --name-matches build
*** REMOTE GEMS ***
AntBuilder (0.4.3)
  Author: JRuby-extras
  Homepage: jruby-extras.rubyforge.org
  AntBuilder: Use ant from JRuby. Only usable within JRuby
builder (2.1.2)
  Author: Jim Weirich
  Homepage: onestepback.org
  Builders for MarkUp.
  ...

–details — отображает детали о найденном gem
–remote — ищет на удалённом хранилище (–locale — поиск на локальной машине)
–name-matches build
— фильтрует gem’s по содержанию строки ‘build’ в имени
Номер около названия каждого gem, показывает последнюю версию.
Список всех доступных версий для определённого gem, запустим команду list с опцией –all:
% gem list --details --remote --all builder
*** REMOTE GEMS ***
builder (2.1.2, 2.1.1, 2.0.0, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.0,
1.0.0, 0.1.1, 0.1.0)
  Author: Jim Weirich
  Homepage: onestepback.org
  Builders for MarkUp.

Для установки самой последней версии:
% gem install builder #RubyGems сам выберет последнюю
По умолчанию (если вы не используете RVM), для установки gem’s используются общие системные директории, так что под Unix нужно добавлять sudo перед командой gem.
Список уже установленных на вашем компьютере gem’s:
gem list
*** LOCAL GEMS ***
builder (2.1.2)

2. Чтение документации по установленному gem


Мы установили gem builder, возникает вопрос, как с ним работать?
В большинстве случаев gem содержит документацию, она хранится в /doc директории, например:
#Узнаем путь где хранятся наши gem's
% gem environment gemdir
/usr/local/lib/ruby/gems/1.9.0

/usr/local/lib/ruby/gems/1.9.0/doc — здесь лежит документация к установленным gem’s
/usr/local/lib/ruby/gems/1.9.0/doc/builder-2.1.2/rdoc/index.html — полный путь к документации gem’а builder в моём случае

Есть 2 способа читать документацию:
1. Заходить в директорию с документацией гема и запускать файл index.html
2. Более простой способ, запустить web сервер, командой % gem server
По умолчанию он запустится на порту 8808 и будет доступен по ссылке localhost:8808
В браузере вы увидите документацию на все установленные gem’s.
Путь к директории с gem’s и порт могут быть перезаданы с помощью опций -p и -d

3. Использование установленных gem’s

После установки gem, достаточно написать команду require<имя gem>, чтобы подключить его. Т.е. работа с гемами не отличается от работы с обычными библиотеками.

# пример генерации XML с помощью установленной нами библиотеки
require 'builder'
xml = Builder::XmlMarkup.new(target: STDOUT, indent: 2)
xml.person(type: "programmer") do
  xml.name do
    xml.first "Dave"
    xml.last "Thomas"
  end
  xml.location "Texas"
  xml.preference("ruby")
end

4. Работа с версиями gem’s


Что если последняя вышедшая версия используемого вами gem не совместима с той которую вы используете сейчас?
К счастью, RubyGems позволяет нам одновременно хранить несколько версий gem. Указанные ниже команды установят обе версии builder.
% gem install builder -v 2.1.2
% gem install builder -v 1.1.0
% gem list builder
*** LOCAL GEMS ***
  builder (2.1.2, 1.1.0)
#Подключение builder v.1.1.0
gem 'builder', '= 1.1.0'
require 'builder'
xml = Builder::XmlMarkup.new(STDOUT, 2)
xml.person do
  name("Dave Thomas")
  location("Texas")
end

Тут доступны ещё несколько трюков:
gem 'builder' , '> 1' — использовать версию больше чем первую
gem 'builder' , ''>= 2.2.0', '< 3.0'' — использовать версию больше 2.2.0 и меньше 3.0
Полный список выражений:
= идентичная версия
!= неидентичная версия
> версия больше чем
< версия меньше чем
>= большая и равная версия
<= меньшая или равная версия
~> примерно больше чем (подробнее RubyGems docs)

5. Создание собственных gem’s


Тут всё довольно просто, опишу базовые шаги, подробности можно почитать здесь
  1. написание кода соответсвующего gem структуре
  2. создание файла спецификации (ourgem.gemspec)
  3. создание gem файла
    % gem build mygem.gemspec
  4. размещение созданного гема на сервере rubygems.org
    %gem push mygem.gemspec

Источники:
http://docs.rubygems.org/
Programming Ruby 1.9 3rd Edition

habr.com

gem – это… Что такое gem?

2) Компьютерная техника: Global Event Manager, Gpl Engine Manager, Graphical Environment For Multimedia, Graphical Environment For Music

3) Американизм: Government Electronic Market, Government Employees Medical

4) Спорт: Game Enhancement Module, Gaming Excellence Merit, Global Expeditions Maniac

7) Сельское хозяйство: Germplasm Enhancement Of Maize, Grain Equalization And Management

8) Шутливое выражение: Green Eyed Monster

9) Химия: Generalized Equilibrium Modelling

10) Религия: Gifts Enable Mission, Global Episcopal Mission, Great Expectations Ministries

11) Экономика: Global Emerging Market

12) Автомобильный термин: generic electronic module

13) Музыка: Gospel Entertainment Music, Great Electronic Music

14) Сокращение: GPS Embedded Module, Generic Entity Model, Global Environmental Monitoring, Global Express Mail , Global positioning system (GPS) Embedded Module, Graff Electronic Machines Ltd , Graphite Epoxy Motor, Germanic , Global Emerging Markets

15) Университет: Gamecock E Mail, Gateway To Educational Material, Graduate Education For Minorities

16) Физика: Graviton Electro Magnetic

17) Физиология: Gender Evaluation Methodology

18) Электроника: Generic Equipment Model

19) Вычислительная техника: Graphical Environment Manager, Graphics Environment Manager, расширение файлов векторной графики программных продуктов Delrina, а также Venture версий до 4.2, Graphics Environment Manager , Generalized Executive for realtime Multiprocessor applications , Giotto Extended Mission 21) Банковское дело: ипотечный кредит, платежи по которому возрастают в течение определённого периода

22) Транспорт: Global Electric Motorcar

23) Фирменный знак: Global Electric Motorcars

24) Экология: Global Environmental Multiscale

25) СМИ: Great English Magazine

26) Деловая лексика: Goal Established And Maintained, Growth and Emerging Markets

27) Образование: Gateway To Educational Materials, Gateway To English Mastery, Girls Education Movement, Going The Extra Mile, Great Educator and Mentor

29) Сетевые технологии: Global Electronic Messaging

30) Океанография: Gulf Ecosystem Monitoring

32) HR. Global Engineering Center

33) Имена и фамилии: Glenn E. Marshall

34) Общественная организация: Good Enthusiastic Member

35) Чат: Generic Electronic Mail

37) Программное обеспечение: Genealogy Extension Module, Globally Executable Mhp, Graphic Environment Manager

38) Международная торговля: Global Export Manager, Growth Enterprise Market

Универсальный англо-русский словарь. Академик.ру. 2011.

universal_en_ru.academic.ru

GEM – это… Что такое GEM?

2) Компьютерная техника: Global Event Manager, Gpl Engine Manager, Graphical Environment For Multimedia, Graphical Environment For Music

3) Американизм: Government Electronic Market, Government Employees Medical

4) Спорт: Game Enhancement Module, Gaming Excellence Merit, Global Expeditions Maniac

7) Сельское хозяйство: Germplasm Enhancement Of Maize, Grain Equalization And Management

8) Шутливое выражение: Green Eyed Monster

9) Химия: Generalized Equilibrium Modelling

10) Религия: Gifts Enable Mission, Global Episcopal Mission, Great Expectations Ministries

11) Экономика: Global Emerging Market

12) Автомобильный термин: generic electronic module

13) Музыка: Gospel Entertainment Music, Great Electronic Music

14) Сокращение: GPS Embedded Module, Generic Entity Model, Global Environmental Monitoring, Global Express Mail , Global positioning system (GPS) Embedded Module, Graff Electronic Machines Ltd , Graphite Epoxy Motor, Germanic , Global Emerging Markets

15) Университет: Gamecock E Mail, Gateway To Educational Material, Graduate Education For Minorities

16) Физика: Graviton Electro Magnetic

17) Физиология: Gender Evaluation Methodology

18) Электроника: Generic Equipment Model

19) Вычислительная техника: Graphical Environment Manager, Graphics Environment Manager, расширение файлов векторной графики программных продуктов Delrina, а также Venture версий до 4.2, Graphics Environment Manager , Generalized Executive for realtime Multiprocessor applications , Giotto Extended Mission 21) Банковское дело: ипотечный кредит, платежи по которому возрастают в течение определённого периода

22) Транспорт: Global Electric Motorcar

23) Фирменный знак: Global Electric Motorcars

24) Экология: Global Environmental Multiscale

25) СМИ: Great English Magazine

26) Деловая лексика: Goal Established And Maintained, Growth and Emerging Markets

27) Образование: Gateway To Educational Materials, Gateway To English Mastery, Girls Education Movement, Going The Extra Mile, Great Educator and Mentor

29) Сетевые технологии: Global Electronic Messaging

30) Океанография: Gulf Ecosystem Monitoring

32) HR. Global Engineering Center

33) Имена и фамилии: Glenn E. Marshall

34) Общественная организация: Good Enthusiastic Member

35) Чат: Generic Electronic Mail

37) Программное обеспечение: Genealogy Extension Module, Globally Executable Mhp, Graphic Environment Manager

38) Международная торговля: Global Export Manager, Growth Enterprise Market

Универсальный англо-русский словарь. Академик.ру. 2011.

universal_en_ru.academic.ru

Пишем API gem: что такое Hypermedia API и как с ним подружиться

В предыдущей статье мы разметили основную структуру гема, определились с библиотекой для HTTP запросов и написали метод для работы с первой API точкой – получением списка всех тикетов. После этого я планировал начать добавлять все остальные точки, но столкнулся с проблемой, которую мы и будем решать в этой статье: поддержка Hypermedia API.

Hypermedia API

Hypermedia API – относительно новая и относительно спорная концепция. Основной её смысл заключается в том, что API приложения возвращает не только данные, но и ссылки на другие, связанные с оригинальным запросом, ресурсы. Рассмотрим это на примере GrooveHQ API. Вот в каком виде он возвращает json для тикета:

{
  "ticket": {
    "assigned_group": null,
    "created_at": "2012-07-17T13:41:01Z",
    "number": 1,
    "priority": null,
    "resolution_time": null,
    "title": null,
    "updated_at":"2012-07-17T13:41:01Z",
    "href": "https://api.groovehq.com/v1/tickets/1",
    "closed_by": "[email protected]",
    "tags": ["important"],
    "links": {
      "assignee": {
        "href": "https://api.groovehq.com/v1/agents/[email protected]"
      },
      "customer": {
        "href": "https://api.groovehq.com/v1/customers/[email protected]"
      },
      "state": {
        "href": "https://api.groovehq.com/v1/tickets/1/state"
      },
      "messages": {
        "href": "https://api.groovehq.com/v1/tickets/1/messages"
      }
    }
  }
}

Видишь ключ “links”? Вот это те самые ссылки на другие ресурсы. Разработчику не нужно идти в документацию, он может исследовать возможности API путём навигации по таким вот ссылкам. Эта идея задокументирована как Hypertext Application Language и для её JSON версии даже есть формальная спецификация.

Если вас интересует моё личное мнение, то я считаю эту идею как минимум странной. Изучать API не по документации, а путём просмотра ответов от самого API? Нет, спасибо.

Первым моим позывом было отбросить эти ссылки вообще. Но потом я осознал одно преимущество: при помощи этих ссылок можно чуть облегчить написание библиотеки, так как они позволяют легко строить цепочки запросов используя лишь несколько небольших абстракций поверх обычного запроса. Этим мы сегодня и займёмся.

В комментариях подсказали ещё один плюс – изменение адресов ресурсов при использовании HAL не ломает клиенты.

Пишем Resource и Relation

Как я сказал выше, использование HAL позволит строить цепочки запросов к ресурсам. Осталось только придумать, как это реализовать. В этот момент становится очевидным, что простыми JSON хэшами нам не обойтись: понадобятся новые классы, объекты которых будут возвращаться запросами к API.

Классов этих будет всего два: GrooveHQ::Resource и GrooveHQ::Relation.

GrooveHQ::Resource – не более чем небольшая обёртка вокруг JSON данных. Помимо самих данных, объекты этого класса хранят API клиента (GrooveHQ::Client) и коллекцию ссылок на другие ресурсы. Выглядит класс вот так:


# ./lib/groovehq/resource.rb

module GrooveHQ

  class Resource
    attr_reader :rels, :data

    def initialize(client, data)
      @client = client
      @data = data
      @rels = parse_rels
    end

    def parse_rels
      @data["links"].each_with_object({}) do |(relation, value), result|
        result[relation] = Relation.new(@client, value["href"])
      end
    end

  end

end

Метод #parse_rels берёт ссылки из json ответа и для каждой ссылки строит объект класса GrooveHQ::Relation, который позволит там проводить последующие запросы к связанным ресурсам. Обрати внимание на each_with_object – если раньше не видел этот метод, то посмотри документацию к нему и используй по необходимости.

GrooveHQ::Relation так же хранит в себе объект API клиента плюс ссылку на сам ресурс. Таким образом, для реализации этого класса нам достаточно простого Struct и одного метода, который делает запрос при помощи клиента:


# ./lib/groovehq/relation.rb

module GrooveHQ

  class Relation < Struct.new(:client, :href)

    def get(options = {})
      client.get href, options
    end

  end

end

Усложняем запросы к API

Теперь, когда обёртки (wrapper), упрощающие работу с Hypermedia API написаны, нам лишь нужно использовать их при проведении запросов к API. Для этого нам нужна ещё одна обёртка, вокруг методов HTTParty. Для этого я создал новый модуль GrooveHQ::Client::Connection состоящий пока что из трёх методов: request, parse_data и get. Рассмотрим их по-отдельности:

def request(http_method, path, options)
  response = self.class.send(http_method, path, { query: options })
  data = response.parsed_response

  parse_data(data)
end

#request принимает HTTP-метод, ссылку и опции, затем использует HTTParty для проведения запроса и отправляет полученный JSON в метод #parse_data. Результат #parse_data и будет результатом любого запроса:

def parse_data(data)
  data = data.values.first
  case data
  when Hash then Resource.new(self, data)
  when Array then data.map { |hash| parse_data({resource: hash}) }
  when nil then nil
  else data
  end
end

В зависимости от типа данных мы либо сразу возвращаем объект класса Resource, либо возвращаем массив таких объектов (путём рекурсивного вызыва #parse_data), либо сразу возвращаем результат запроса.

Обрати внимание на data = data.values.first и {resource: hash}: дело в том, что GrooveHQ API всегда возвращает результат с корневым ключом, в том время как наш ресурс в этом корневом элементе не нуждается. Поэтому мы всегда отбрасываем корневой ключ и берём только сами данные. А чтобы это отбрасывание ничего не сломало при рекурсивном запросе, мы задаём свой корневой ключ в цикле.

Собираем всё вместе

Теперь нам остаётся только обновить метод #tickets и проверить, что новый код работает с цепочками запросов любой длинны! Так как я уже подключил модуль GrooveHQ::Client::Connection внутри класса GrooveHQ::Client, то я могу использовать новый метод #get внутри модуля GrooveHQ::Client::Tickets:

module GrooveHQ
  class Client

    module Tickets

      def ticket(ticket_number, options = {})
        get("/tickets/#{ticket_number}", { query: options })
      end

    end

  end
end

Теперь можно делать такие безумные вещи:

client = GrooveHQ::Client.new
puts client.ticket(1).rels["assignee"].get.rels["tickets"].get(page: 2).first.data["created_at”]

В этот момент гем действительно готов для добавления любых других API точек. Но ты, наверное, заметил один ужасный косяк: я всё ещё не написал ни единого теста! Согласен, уже пора. В следующей статье посмотрим, как покрывать гемы тестами и делать mock’и API запросов.

Коммит, кстати, здесь: 8056904. А твои комментарии и ответы на них – чуть ниже. Наверняка у тебя уже накопились вопросы, на которые я буду рад ответить.

mkdev.me

Gem – это… Что такое Gem?

2) Компьютерная техника: Global Event Manager, Gpl Engine Manager, Graphical Environment For Multimedia, Graphical Environment For Music

3) Американизм: Government Electronic Market, Government Employees Medical

4) Спорт: Game Enhancement Module, Gaming Excellence Merit, Global Expeditions Maniac

7) Сельское хозяйство: Germplasm Enhancement Of Maize, Grain Equalization And Management

8) Шутливое выражение: Green Eyed Monster

9) Химия: Generalized Equilibrium Modelling

10) Религия: Gifts Enable Mission, Global Episcopal Mission, Great Expectations Ministries

11) Экономика: Global Emerging Market

12) Автомобильный термин: generic electronic module

13) Музыка: Gospel Entertainment Music, Great Electronic Music

14) Сокращение: GPS Embedded Module, Generic Entity Model, Global Environmental Monitoring, Global Express Mail , Global positioning system (GPS) Embedded Module, Graff Electronic Machines Ltd , Graphite Epoxy Motor, Germanic , Global Emerging Markets

15) Университет: Gamecock E Mail, Gateway To Educational Material, Graduate Education For Minorities

16) Физика: Graviton Electro Magnetic

17) Физиология: Gender Evaluation Methodology

18) Электроника: Generic Equipment Model

19) Вычислительная техника: Graphical Environment Manager, Graphics Environment Manager, расширение файлов векторной графики программных продуктов Delrina, а также Venture версий до 4.2, Graphics Environment Manager , Generalized Executive for realtime Multiprocessor applications , Giotto Extended Mission 21) Банковское дело: ипотечный кредит, платежи по которому возрастают в течение определённого периода

22) Транспорт: Global Electric Motorcar

23) Фирменный знак: Global Electric Motorcars

24) Экология: Global Environmental Multiscale

25) СМИ: Great English Magazine

26) Деловая лексика: Goal Established And Maintained, Growth and Emerging Markets

27) Образование: Gateway To Educational Materials, Gateway To English Mastery, Girls Education Movement, Going The Extra Mile, Great Educator and Mentor

29) Сетевые технологии: Global Electronic Messaging

30) Океанография: Gulf Ecosystem Monitoring

32) HR. Global Engineering Center

33) Имена и фамилии: Glenn E. Marshall

34) Общественная организация: Good Enthusiastic Member

35) Чат: Generic Electronic Mail

37) Программное обеспечение: Genealogy Extension Module, Globally Executable Mhp, Graphic Environment Manager

38) Международная торговля: Global Export Manager, Growth Enterprise Market

Универсальный англо-русский словарь. Академик.ру. 2011.

universal_en_ru.academic.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *