2018-11-20 20:47:30 +05:30
# frozen_string_literal: true
2015-04-26 12:48:37 +05:30
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-07-31 22:56:46 +05:30
s_ ( 'AsanaService|Asana - Teamwork without email' )
2015-04-26 12:48:37 +05:30
end
def help
' 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 .
You can also close a task with a message containing : ` fix # 123456 ` .
2016-01-14 18:37:52 +05:30
You can create a Personal Access Token here :
2020-01-01 13:55:28 +05:30
https : / / app . asana . com / 0 / developer - console '
2015-04-26 12:48:37 +05:30
end
2017-08-17 22:00:37 +05:30
def self . to_param
2015-04-26 12:48:37 +05:30
'asana'
end
def fields
[
{
type : 'text' ,
name : 'api_key' ,
2019-07-31 22:56:46 +05:30
placeholder : s_ ( 'AsanaService|User Personal Access Token. User must have access to task, all comments will be attributed to this user.' ) ,
2017-09-10 17:25:29 +05:30
required : true
2015-04-26 12:48:37 +05:30
} ,
{
type : 'text' ,
name : 'restrict_to_branch' ,
2019-07-31 22:56:46 +05:30
placeholder : s_ ( 'AsanaService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.' )
2015-04-26 12:48:37 +05:30
}
]
end
2017-08-17 22:00:37 +05:30
def self . supported_events
2015-04-26 12:48:37 +05:30
%w( push )
end
2016-01-14 18:37:52 +05:30
def client
@_client || = begin
Asana :: Client . new do | c |
c . authentication :access_token , api_key
end
end
end
2015-04-26 12:48:37 +05:30
def execute ( data )
return unless supported_events . include? ( data [ :object_kind ] )
2016-01-14 18:37:52 +05:30
# check the branch restriction is poplulated and branch is not included
2015-04-26 12:48:37 +05:30
branch = Gitlab :: Git . ref_name ( data [ :ref ] )
branch_restriction = restrict_to_branch . to_s
2018-12-05 23:21:45 +05:30
if branch_restriction . present? && branch_restriction . index ( branch ) . nil?
2015-04-26 12:48:37 +05:30
return
end
2016-01-14 18:37:52 +05:30
user = data [ :user_name ]
2018-03-27 19:54:05 +05:30
project_name = project . full_name
2015-04-26 12:48:37 +05:30
data [ :commits ] . each do | commit |
2019-07-31 22:56:46 +05:30
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 ] }
2016-01-14 18:37:52 +05:30
check_commit ( commit [ :message ] , push_msg )
2015-04-26 12:48:37 +05:30
end
end
def check_commit ( message , push_msg )
2016-01-14 18:37:52 +05:30
# matches either:
# - #1234
2020-01-01 13:55:28 +05:30
# - https://app.asana.com/0/{project_gid}/{task_gid}
2016-01-14 18:37:52 +05:30
# optionally preceded with:
# - fix/ed/es/ing
# - close/s/d
# - closing
2020-01-01 13:55:28 +05:30
issue_finder = %r{ (fix \ w*|clos[ei] \ w*+)? \ W*(?:https://app \ .asana \ .com/ \ d+/ \ w+/( \ w+)| # ( \ w+)) }i
2016-01-14 18:37:52 +05:30
message . scan ( issue_finder ) . each do | tuple |
# tuple will be
# [ 'fix', 'id_from_url', 'id_from_pound' ]
taskid = tuple [ 2 ] || tuple [ 1 ]
begin
2020-01-01 13:55:28 +05:30
task = Asana :: Resources :: Task . find_by_id ( client , taskid )
2016-01-14 18:37:52 +05:30
task . add_comment ( text : " #{ push_msg } #{ message } " )
if tuple [ 0 ]
task . update ( completed : true )
end
rescue = > e
2018-11-20 20:47:30 +05:30
log_error ( e . message )
2016-01-14 18:37:52 +05:30
next
2015-04-26 12:48:37 +05:30
end
end
end
end