2018-08-10 02:45:01 -04:00
# frozen_string_literal: true
2014-07-29 11:41:55 -04:00
require 'asana'
class AsanaService < Service
prop_accessor :api_key , :restrict_to_branch
validates :api_key , presence : true , if : :activated?
def title
'Asana'
end
def description
2019-04-12 08:28:07 -04:00
s_ ( 'AsanaService|Asana - Teamwork without email' )
2014-07-29 11:41:55 -04:00
end
def help
2015-01-25 04:35:16 -05:00
' This service adds commit messages as comments to Asana tasks .
Once enabled , commit messages are checked for Asana task URLs
( for example , ` https://app.asana.com/0/123456/987654 ` ) or task IDs
starting with # (for example, `#987654`). Every task ID found will
get the commit comment added to it .
2014-07-29 11:41:55 -04:00
You can also close a task with a message containing : ` fix # 123456 ` .
2015-12-29 23:51:05 -05:00
You can create a Personal Access Token here :
http : / / app . asana . com / - / account_api '
2014-07-29 11:41:55 -04:00
end
2016-12-27 07:44:24 -05:00
def self . to_param
2014-07-29 11:41:55 -04:00
'asana'
end
def fields
[
2015-01-25 04:35:16 -05:00
{
type : 'text' ,
name : 'api_key' ,
2019-04-12 08:28:07 -04:00
placeholder : s_ ( 'AsanaService|User Personal Access Token. User must have access to task, all comments will be attributed to this user.' ) ,
2017-05-22 06:07:12 -04:00
required : true
2015-01-25 04:35:16 -05:00
} ,
{
type : 'text' ,
name : 'restrict_to_branch' ,
2019-04-12 08:28:07 -04:00
placeholder : s_ ( 'AsanaService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.' )
2015-01-25 04:35:16 -05:00
}
2014-07-29 11:41:55 -04:00
]
end
2016-12-27 07:44:24 -05:00
def self . supported_events
2015-02-28 11:33:18 -05:00
%w( push )
end
2015-12-29 14:39:58 -05:00
def client
@_client || = begin
Asana :: Client . new do | c |
c . authentication :access_token , api_key
end
end
end
2015-02-20 08:49:26 -05:00
def execute ( data )
2015-02-28 11:33:18 -05:00
return unless supported_events . include? ( data [ :object_kind ] )
2015-02-19 00:02:57 -05:00
2015-12-29 14:39:58 -05:00
# check the branch restriction is poplulated and branch is not included
2015-03-10 06:51:36 -04:00
branch = Gitlab :: Git . ref_name ( data [ :ref ] )
2014-07-29 11:41:55 -04:00
branch_restriction = restrict_to_branch . to_s
2018-09-18 03:36:24 -04:00
if branch_restriction . present? && branch_restriction . index ( branch ) . nil?
2014-07-29 11:41:55 -04:00
return
end
2015-12-29 14:39:58 -05:00
user = data [ :user_name ]
2018-03-05 09:15:26 -05:00
project_name = project . full_name
2014-07-29 11:41:55 -04:00
2015-02-20 08:49:26 -05:00
data [ :commits ] . each do | commit |
2019-04-12 08:28:07 -04:00
push_msg = s_ ( " AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ): " ) % { user : user , branch : branch , project_name : project_name , commit_url : commit [ :url ] }
2015-12-29 14:39:58 -05:00
check_commit ( commit [ :message ] , push_msg )
2014-07-29 11:41:55 -04:00
end
end
def check_commit ( message , push_msg )
2015-12-16 09:08:05 -05:00
# matches either:
# - #1234
# - https://app.asana.com/0/0/1234
# optionally preceded with:
# - fix/ed/es/ing
# - close/s/d
# - closing
2018-01-27 00:35:53 -05:00
issue_finder = %r{ (fix \ w*|clos[ei] \ w*+)? \ W*(?:https://app \ .asana \ .com/ \ d+/ \ d+/( \ d+)| # ( \ d+)) }i
2015-12-16 09:08:05 -05:00
message . scan ( issue_finder ) . each do | tuple |
# tuple will be
# [ 'fix', 'id_from_url', 'id_from_pound' ]
taskid = tuple [ 2 ] || tuple [ 1 ]
2014-07-29 11:41:55 -04:00
2015-12-29 14:39:58 -05:00
begin
task = Asana :: Task . find_by_id ( client , taskid )
2015-12-29 23:52:56 -05:00
task . add_comment ( text : " #{ push_msg } #{ message } " )
if tuple [ 0 ]
task . update ( completed : true )
end
rescue = > e
2018-08-20 14:34:07 -04:00
log_error ( e . message )
2015-12-29 14:39:58 -05:00
next
2014-07-29 11:41:55 -04:00
end
end
end
end