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. В качестве первого шага вы хотите просто посчитать количество положительных, отрицательных и нейтральных твитов. Для этого мы создадим доску с четырьмя списками. Для каждого твита карта будет отображаться в списке «Входящие». Дружелюбные сотрудники службы поддержки могут затем перетащить каждый твит в список «Позитивный», «Нейтральный» или «Негативный». В верхней части каждого списка мы добавим карту, которая подсчитывает количество добавленных карт. Время от времени мы архивируем все карты и обновляем счетчик.
Здесь вы видите наше приложение в действии, отслеживая упоминания термина «книги».
Создание доски и списков
Для начала получите ссылку на нашу доску. Если он не найден, создайте его. 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 с помощью пост-фиксации и веб-хуков, чтобы запланировать задачу проверки кода для каждого коммита.
- Возможно, случайное добавление анимированных картинок с кошками к каждой карточке в пятницу днем больше похоже на вашу вещь.
Так что бы вы хотели построить? Дайте нам знать об этом в комментариях!