Статьи

Настройка Trello с Ruby

Trello-значок

Trello — отличный инструмент для совместной работы. Он основан на досках, которые содержат списки карт. Как вы используете его, зависит только от вас, так как это один из тех простых инструментов с множеством применений. Хотите планировать или координировать с несколькими людьми, или просто управлять своими задачами? Просто установите доску и начинайте.

Всеми функциями Trello можно управлять через его API, и он абсолютно бесплатный, включая использование веб-приложений и мобильных приложений, а также доступ к API. С драгоценным камнем ruby-trello вы можете автоматизировать ваши доски в ruby-trello сроки.

Начиная

Зарегистрируйтесь, если вы этого еще не сделали, и получите ключи разработчика , так как они понадобятся вам для выполнения запросов API. Установите камень ruby-trello

 gem install ruby-trello 

и запросите «токен участника», который может использовать ваше новое приложение для идентификации себя

 TRELLO_DEVELOPER_PUBLIC_KEY="your key" # found at https://trello.com/1/appKey/generate puts "please visit" puts "https://trello.com/1/authorize?key=#{TRELLO_DEVELOPER_PUBLIC_KEY}&name=SitepointTutorial&expiration=never&response_type=token&scope=read,write" puts "and take note of the token" 

Теперь мы можем приступить к настройке и использованию API Trello

 require 'trello' TRELLO_DEVELOPER_PUBLIC_KEY="your key" TRELLO_MEMBER_TOKEN="the token you just got" Trello.configure do |trello| trello.developer_public_key = TRELLO_DEVELOPER_PUBLIC_KEY trello.member_token = TRELLO_MEMBER_TOKEN end Trello::Board.all.each do |board| puts "* #{board.name}" end 

Строительные блоки: доски, списки и карты

Если все прошло хорошо, вы только что увидели список ваших существующих плат Trello, всплывающих в терминале. Доски — это организационная концепция верхнего уровня в Trello, представленная экземплярами Trello :: Board в оболочке Ruby API.

Обратите внимание, что Trello::Board имеет метод класса с именем all , как и модели ActiveRecord. Это не случайно. ruby-trello использует ActiveModel под капотом, заставляя его основные классы ходить и крякать во многом как модели Rails. Это делает API знакомым для разработчиков Rails, и это означает, что вы можете использовать экземпляры Trello :: Board , Trello :: Card или Trello :: List с помощниками форм Rails. Например, все эти объекты имеют valid? метод, точно так же, как экземпляры ActiveRecord, и когда он недействителен, метод errors скажет вам, в чем проблема

Здание на вершине Трелло

Чтобы продемонстрировать использование API, мы реализуем простое «приложение» с использованием Trello в качестве пользовательского интерфейса. Представьте себе организацию, которой вы хотите следить за тем, как люди говорят о вас в Twitter. В качестве первого шага вы хотите просто посчитать количество положительных, отрицательных и нейтральных твитов. Для этого мы создадим доску с четырьмя списками. Для каждого твита карта будет отображаться в списке «Входящие». Дружелюбные сотрудники службы поддержки могут затем перетащить каждый твит в список «Позитивный», «Нейтральный» или «Негативный». В верхней части каждого списка мы добавим карту, которая подсчитывает количество добавленных карт. Время от времени мы архивируем все карты и обновляем счетчик.

Здесь вы видите наше приложение в действии, отслеживая упоминания термина «книги».

Twitter Follow-up "app" built on top of Trello

Создание доски и списков

Для начала получите ссылку на нашу доску. Если он не найден, создайте его. Trello уже добавит нам несколько списков (Todo, Done), но мы предпочитаем создавать свои собственные. Поэтому сначала закройте предоставленные Trello списки, а затем добавьте наши собственные. Наконец, добавьте карту, которая будет отслеживать счет в последние три списка.

 BOARD_NAME = 'Twitter Followup' BOARD_DESC = 'Handling mentions on Twitter' LIST_NAMES = ['Incoming', 'Positive', 'Neutral', 'Negative'] board = Trello::Board.all.detect do |board| board.name =~ BOARD_NAME end unless board board = Trello::Board.create( name: BOARD_NAME, description: BOARD_DESC ) board.lists.each(&:close!) LIST_NAMES.reverse.each do |name| Trello::List.create(name: name, board_id: board.id) end board.lists.drop(1).each do |list| Trello::Card.create(name: '[0]', list_id: list.id) end end 

Обратите внимание, как Trello :: Card и Trello :: List каждый получает id включающей сущности, соответственно, список и правление.

Для списка камень ruby-trello не дает вам больше возможностей, чем этот. Для карты вы можете стать более креативным, хотя.

 card = Trello::Card.create( name: 'card with memberd and labels', list_id: list.id, card_labels: [ :yellow, :green ], member_ids: [ Trello::Member.find('arnebrasseur').id ] ) 

Обновление атрибутов карты работает, просто устанавливая новые значения и, следовательно, вызывая card.save .

 card = board.lists[0].cards[0] card.name = 'First card in the first list, I am' card.desc += "\n\nThe end of my description, this is." card.save 

Обратите внимание, что ActiveRecord-подобный синтаксис board.lists.create(...) не работает. Чтобы добавить список к доске или карточку в список, вы должны явно получить идентификатор доски или списка и передать его новому объекту.

Бьющееся сердце

Чтобы сделать наше приложение «галочкой», нам понадобятся две разные фоновые работы. Один отвечает за размещение твитов на доске, другой отвечает за подсчет и архивирование карт, которые были отсортированы по категориям. Мы объединим оба в одном скрипте, поэтому мы можем вызвать его так:

 $ twitter_followup.rb stream sitepoint 

Чтобы получить все твиты, в которых упоминается Sitepoint, используйте потоковый API Twitter или:

 $ twitter_followup.rb process 

Для обработки карт, которые были отсортированы.

Следующий блок кода представляет собой простой способ чтения аргументов командной строки и делегирования либо методу listen_to_tweets , либо listen_to_tweets process_sorted_cards . board уже доступна для нас. Определение twitter_client выходит за рамки данной статьи, но вы можете взглянуть на полный скрипт или узнать больше об использовании драгоценного камня Twitter на Sitepoint.

 case ARGV[0] when 'stream' topics = ARGV.drop(1) listen_to_tweets(board, twitter_client, topics) when 'process' loop do process_sorted_cards(board) sleep 5 end end 

Пить из пожарного шланга Twitter

Поддержка потокового API Twitter является относительно новым дополнением к самоцвету twitter . К счастью для нас, так как это делает реализацию listen_to_tweets короткой и listen_to_tweets .

 def listen_to_tweets(board, twitter_client, topics) incoming_list = board.lists.first twitter_client.filter(:track => topics.join(",")) do |object| if object.is_a?(Twitter::Tweet) Trello::Card.create( list_id: incoming_list.id, name: object.text, desc: object.url.to_s ) end end end 

Код устанавливает текст твита как «имя» карты, то есть ту часть, которую вы видите, глядя на доску. Когда вы открываете карту, вы видите ее описание, которое используется здесь, чтобы сохранить ссылку на оригинальный твит. Мы снова извлечем эти фрагменты данных перед архивированием карты.

Добавление вещей

Для фактического шага подсчета и архивирования мы реализуем несколько вспомогательных методов. Первый возвращает экземпляры Trello::List которые требуют обработки путем циклического перемещения по спискам на доске. Использование Enumerable # find возвращает первый объект, для которого данный блок возвращает истинное значение.

 def score_lists(board) LIST_NAMES.drop(1).map do |name| board.lists.find { |list| list.name == name } end end 

Точно так же нам нужна ссылка на Trello::Card которая содержит счетчик для каждого столбца. Регулярное выражение ищет карточку только с цифрами в квадратных скобках. \A , который соответствует началу, и \z , который соответствует концу строки, являются важными якорями для предотвращения ложных срабатываний. Они обычно предпочтительнее ^ , $ , так как они будут соответствовать началу и концу любой строки в многострочной строке.

 def find_score_card(list) list.cards.find do |card| card.name =~ /\A\[\d+\]\z/ end end 

Наконец, обработайте каждую отсортированную карту, заархивируйте ее и обновите оценочную карту. Описание оценочной карты содержит список всех твитов, которые были добавлены в нее. Описания карт позволяют форматирование Markdown . Чтобы получить список маркеров, включая ссылки на оригинальные твиты, наша разметка будет выглядеть следующим образом

 * tweet text [](http://link.to.the.tweet)` * next tweet #trelloRuby [](http://link.to.the/second/tweet)` 

Метод process_card обрабатывает отдельную карту, которая готова к архивированию:

 def process_card(card, score_card) old_score = score_card.name[/\d+/].to_i new_score = old_score + 1 tweet_text = card.name tweet_link = card.desc score_card.name = "[#{new_score}]" score_card.desc = "* #{tweet_text} [](#{tweet_link}) \n" + score_card.desc card.closed = true [card, score_card].each(&:save) end 

Обратите внимание, что действие, называемое «архивация» в пользовательском интерфейсе Trello, последовательно называется «закрытием» в API. Это касается и досок, списков и карточек. Trello не позволяет ничего удалять, но есть возможность архивировать / закрывать любой объект. Это означает, что он будет отображаться дольше, если это явно не требуется. Установить closed свойство и сохранить карту (или список, доску) также можно за один шаг, например, card.close! ,

Почти готово, нам просто нужно пройти через score_lists и обработать каждую карту, кроме самой score_card :

 def process_sorted_cards(board) score_lists(board).each do |list| score_card = find_score_card(list) list.cards.each do |card| unless card.id == score_card.id process_card(card, score_card) end end end end 

Выйди и играй

У Trello приятный, чистый интерфейс, и через API можно многое сделать.

  • Расширьте наше приложение Twitter, чтобы написание комментариев автоматически отвечало на твит.
  • Интеграция с Git или Github с помощью пост-фиксации и веб-хуков, чтобы запланировать задачу проверки кода для каждого коммита.
  • Возможно, случайное добавление анимированных картинок с кошками к каждой карточке в пятницу днем ​​больше похоже на вашу вещь.

Так что бы вы хотели построить? Дайте нам знать об этом в комментариях!