Class: Lita::Handlers::GitlabMergerequests
- Inherits:
-
Handler
- Object
- Handler
- Lita::Handlers::GitlabMergerequests
- Defined in:
- lib/lita/handlers/gitlab_mergerequests.rb
Constant Summary collapse
- PROJECTS_LIST_KEY =
'gitlab_projects'
- REMINDER_SETTINGS_HASH_KEY =
'gitlab_reminder'
- SCHEDULER =
Rufus::Scheduler.new
Instance Method Summary collapse
- #add_project(response) ⇒ Object
- #configure_gitlab(_payload) ⇒ Object
- #formatted_pending_mrs ⇒ Object
- #get_reminder(response) ⇒ Object
- #list_pending_mrs(response) ⇒ Object
- #list_projects(response) ⇒ Object
- #pending_mrs ⇒ Object
- #projects ⇒ Object
- #projects_in_list ⇒ Object
- #reminder_settings ⇒ Object
- #remove_project(response) ⇒ Object
- #remove_reminder(response) ⇒ Object
- #runas(response) ⇒ Object
- #set_reminder(response) ⇒ Object
- #set_reminder_cron(_payload = nil) ⇒ Object
Instance Method Details
#add_project(response) ⇒ Object
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 104 def add_project(response) project = response.matches[0][0].strip response.reply 'Add a to be monitored project into list.' response.reply "Trying to add '#{project}'.." if projects.find { |p| p.path_with_namespace == project } response.reply "Found '#{project}'!" if redis.lrange(PROJECTS_LIST_KEY, 0, -1).include?(project) response.reply 'Project is already in list.' else response.reply "Adding project '#{project}' into list..." redis.rpush(PROJECTS_LIST_KEY, project) response.reply 'Done! :tada:' end else response.reply "'#{project}' is not found in your project(s), you may want to check the input." end end |
#configure_gitlab(_payload) ⇒ Object
136 137 138 139 140 141 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 136 def configure_gitlab(_payload) Gitlab.configure do |c| c.endpoint = config.api_endpoint c.private_token = config.personal_access_token end end |
#formatted_pending_mrs ⇒ Object
71 72 73 74 75 76 77 78 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 71 def formatted_pending_mrs formatted_pending_mrs = [] pending_mrs.each do |p_mr| formatted_pending_mrs << "In *'#{p_mr[:project]}'*" formatted_pending_mrs << p_mr[:merge_requests].map { |mr| "• #{mr.iid} <#{mr.web_url}|#{mr.title}> - #{(mr.assignee.nil? ? '_no assignee_' : mr.assignee.username)}" }.join("\n") end formatted_pending_mrs.join("\n") end |
#get_reminder(response) ⇒ Object
181 182 183 184 185 186 187 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 181 def get_reminder(response) if reminder_settings response.reply "Current reminder cron expression is '#{reminder_settings['cron']}'" else response.reply 'No reminder found.' end end |
#list_pending_mrs(response) ⇒ Object
85 86 87 88 89 90 91 92 93 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 85 def list_pending_mrs(response) response.reply 'List pending merge requests.' if projects_in_list.empty? response.reply "Mmm... you haven't add any project yet." else response.reply formatted_pending_mrs unless formatted_pending_mrs.empty? end response.reply 'Done.' end |
#list_projects(response) ⇒ Object
95 96 97 98 99 100 101 102 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 95 def list_projects(response) response.reply 'List currently monitoring projects.' if projects_in_list.empty? response.reply "Mmm... you haven't add any project yet." else response.reply(projects_in_list.map { |p| p.prepend('• ') }.join("\n")) end end |
#pending_mrs ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 57 def pending_mrs pending_mrs = [] projects_in_list.each do |p| merge_requests = Gitlab.merge_requests(p, state: 'opened', wip: 'no') next unless merge_requests.count.positive? pending_mrs << { project: p, merge_requests: merge_requests } end pending_mrs end |
#projects ⇒ Object
49 50 51 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 49 def projects Gitlab.projects(membership: true).auto_paginate end |
#projects_in_list ⇒ Object
53 54 55 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 53 def projects_in_list redis.lrange(PROJECTS_LIST_KEY, 0, -1) end |
#reminder_settings ⇒ Object
159 160 161 162 163 164 165 166 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 159 def reminder_settings reminder_settings = redis.hgetall(REMINDER_SETTINGS_HASH_KEY) # Hash if reminder_settings.empty? nil else reminder_settings end end |
#remove_project(response) ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 123 def remove_project(response) project = response.matches[0][0].strip response.reply 'Remove a currently monitoring project from list.' response.reply "Trying to remove '#{response.matches[0][0]}'.." if redis.lrange(PROJECTS_LIST_KEY, 0, -1).include?(project) response.reply 'Project is in list, removing it...' redis.lrem(PROJECTS_LIST_KEY, 0, project) response.reply 'Done! :tada:' else response.reply "#{project}' is not found in list." end end |
#remove_reminder(response) ⇒ Object
189 190 191 192 193 194 195 196 197 198 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 189 def remove_reminder(response) if reminder_settings response.reply 'Removing reminder...' redis.del(REMINDER_SETTINGS_HASH_KEY) SCHEDULER.cron_jobs.each(&:unschedule) response.reply 'Done!' else response.reply 'No reminder found.' end end |
#runas(response) ⇒ Object
80 81 82 83 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 80 def runas(response) api_user = Gitlab.client.user response.reply "Current API operator account is owned by: #{api_user.name}" end |
#set_reminder(response) ⇒ Object
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 143 def set_reminder(response) cron_expression = response.matches[0][0].strip response.reply "Setting cron expression '#{cron_expression}' for you or the current channel." begin Rufus::Scheduler.parse(cron_expression) redis.hset(REMINDER_SETTINGS_HASH_KEY, 'cron', cron_expression) redis.hset(REMINDER_SETTINGS_HASH_KEY, 'user', response..source.user.id) redis.hset(REMINDER_SETTINGS_HASH_KEY, 'room', response..source.room) set_reminder_cron rescue ArgumentError => error response.reply "Seems like you give me an invalid cron expression '#{cron_expression}' (*Error:* #{error.})" rescue StandardError => error response.reply "Oops! (*Error:* #{error.})" end end |
#set_reminder_cron(_payload = nil) ⇒ Object
168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 168 def set_reminder_cron(_payload = nil) if reminder_settings log.info "Setting reminder as cron expression '#{reminder_settings['cron']}'" SCHEDULER.cron_jobs.each(&:unschedule) SCHEDULER.cron reminder_settings['cron'] do |_job| target = Source.new(user: reminder_settings['user'], room: reminder_settings['room']) robot.(target, formatted_pending_mrs) end else log.info 'No reminder found.' end end |