Передача данных из массива хэшей в сообщение Slack - PullRequest
0 голосов
/ 05 февраля 2020

Я работаю над слабым ботом, который отправляет прямое сообщение пользователям из проекта Jira с назначенными им задачами, которые еще предстоит выполнить. Я использую Jira- Ruby gem для извлечения всех данных из Jira.

В соответствии с документами gem я настроил соединение Jira:

def project_board(project_key)
  client = JIRA::Client.new(options)
  client.Project.find(project_key)
end

И я создал метод для получения только назначенных билетов, которые не имеют done статуса

def fetch_data
  project = project_board
  project.issues.map do |issue|
    next unless issue.fields.dig('status', 'name') != 'Done' && !issue.fields.dig('assignee', 'name').nil?

    {
      key: issue.key,
      name: issue.fields.dig('assignee', 'name'),
      status: issue.fields.dig('status', 'name')
    }
  end.compact
end

, который дал мне массив хэшей:

=> [{:key=>"48", :name=>"john.john1", :status=>"Waiting for DevOps"},
 {:key=>"46", :name=>"john.john3", :status=>"In Progress"},
 {:key=>"45", :name=>"eric.forman", :status=>"Waiting for DevOps"},
 {:key=>"42", :name=>"john.john3", :status=>"Waiting for DevOps"},
 {:key=>"40", :name=>"john.john3", :status=>"Waiting for DevOps"},
 {:key=>"39", :name=>"eric.forman", :status=>"Waiting for DevOps"}]

Как передать эти данные к слабому сообщению, чтобы оно выглядело как ниже?

message to john.john1

"Hi john.john1, here is the list of your today tasks:
-------------------------------------------
48 - With status: Waiting for DevOps
link https://company_name.atlassian.net/48
"

message to eric.forman:

"Hi eric.forman, here is the list of your today tasks:
-------------------------------------------
id: 45
status: Waiting for DevOps
link: https://company_name.atlassian.net/45
-------
id: 39
status: Waiting for DevOps
link: https://company_name.atlassian.net/45
"

et c.

1 Ответ

1 голос
/ 06 февраля 2020

Я бы предложил, чтобы перед форматированием вы изменили возвращаемое значение fetch_data на что-то вроде:

def fetch_data
  # Redacted for brevity ...
  end.compact.group_by { |task| task[:name] }
end

это вернет га sh как

{
 "john.john1"=>[
   {:key=>"48", :name=>"john.john1", :status=>"Waiting for DevOps"}
 ], 
 "john.john3"=>[
   {:key=>"46", :name=>"john.john3", :status=>"In Progress"}, 
   {:key=>"42", :name=>"john.john3", :status=>"Waiting for DevOps"}, 
   {:key=>"40", :name=>"john.john3", :status=>"Waiting for DevOps"}
 ], 
 "eric.forman"=>[
   {:key=>"45", :name=>"eric.forman", :status=>"Waiting for DevOps"},
   {:key=>"39", :name=>"eric.forman", :status=>"Waiting for DevOps"}
 ]
}

что должно упростить итерации для каждого пользователя:

fetch_data.each do |user, task_list|
  messages = []
  messages << "Hi #{user}, here is the list of your tasks:"
  messages << "-------------------------------------------"
  task_list.each do |task|
  # format each task line
  end

  method_to_send_to_slack(messagges.join("\n"))
end
...