From 6a9eb4b231fc7e563b9c3551dafc5d1bfdc959b3 Mon Sep 17 00:00:00 2001 From: Federico Ravasio Date: Sun, 6 Apr 2014 11:57:48 +0200 Subject: [PATCH] Improved Slack integration with message attachments. --- app/models/project_services/slack_message.rb | 25 ++++++++++++++++---- app/models/project_services/slack_service.rb | 2 +- spec/models/slack_message_spec.rb | 25 +++++++++++++------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/app/models/project_services/slack_message.rb b/app/models/project_services/slack_message.rb index b2b8d6fed7a..28204e5ea60 100644 --- a/app/models/project_services/slack_message.rb +++ b/app/models/project_services/slack_message.rb @@ -11,10 +11,16 @@ class SlackMessage @username = params.fetch(:user_name) end - def compose + def pretext format(message) end + def attachments + return [] if new_branch? || removed_branch? + + commit_message_attachments + end + private attr_reader :after @@ -31,7 +37,7 @@ class SlackMessage elsif removed_branch? removed_branch_message else - push_message << commit_messages + push_message end end @@ -54,15 +60,20 @@ class SlackMessage def commit_messages commits.each_with_object('') do |commit, str| str << compose_commit_message(commit) - end + end.chomp + end + + def commit_message_attachments + [{ text: format(commit_messages), color: attachment_color }] end def compose_commit_message(commit) - id = commit.fetch(:id)[0..5] + author = commit.fetch(:author).fetch(:name) + id = commit.fetch(:id)[0..8] message = commit.fetch(:message) url = commit.fetch(:url) - "\n - #{message} ([#{id}](#{url}))" + "[#{id}](#{url}): #{message} - #{author}\n" end def new_branch? @@ -92,4 +103,8 @@ class SlackMessage def compare_link "[Compare changes](#{compare_url})" end + + def attachment_color + '#345' + end end diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb index 410dda22d47..a3697b31352 100644 --- a/app/models/project_services/slack_service.rb +++ b/app/models/project_services/slack_service.rb @@ -53,7 +53,7 @@ class SlackService < Service notifier = Slack::Notifier.new(subdomain, token) notifier.channel = room notifier.username = 'GitLab' - notifier.ping(message.compose) + notifier.ping(message.pretext, attachments: message.attachments) end private diff --git a/spec/models/slack_message_spec.rb b/spec/models/slack_message_spec.rb index b39cd4edf82..1cd58534702 100644 --- a/spec/models/slack_message_spec.rb +++ b/spec/models/slack_message_spec.rb @@ -14,20 +14,27 @@ describe SlackMessage do } } + let(:color) { '#345' } + context 'push' do before do args[:commits] = [ - { message: 'message1', url: 'url1', id: 'abcdefghi' }, - { message: 'message2', url: 'url2', id: '123456789' }, + { message: 'message1', url: 'url1', id: 'abcdefghijkl', author: { name: 'author1' } }, + { message: 'message2', url: 'url2', id: '123456789012', author: { name: 'author2' } }, ] end it 'returns a message regarding pushes' do - subject.compose.should == + subject.pretext.should == 'user_name pushed to branch of ' << - ' ()' << - "\n - message1 ()" << - "\n - message2 ()" + ' ()' + subject.attachments.should == [ + { + text: ": message1 - author1\n" << + ": message2 - author2", + color: color, + } + ] end end @@ -37,9 +44,10 @@ describe SlackMessage do end it 'returns a message regarding a new branch' do - subject.compose.should == + subject.pretext.should == 'user_name pushed new branch to ' << '' + subject.attachments.should be_empty end end @@ -49,8 +57,9 @@ describe SlackMessage do end it 'returns a message regarding a removed branch' do - subject.compose.should == + subject.pretext.should == 'user_name removed branch master from ' + subject.attachments.should be_empty end end end