hubot-jira-issue-fetcher
Advanced tools
Comparing version 1.4.1 to 1.4.2
@@ -0,0 +0,0 @@ module.exports = function(grunt) { |
87
index.js
@@ -1,1 +0,86 @@ | ||
module.exports = require('./hubot').default | ||
const jira = require('./lib/jira'); | ||
const messageParser = require('./lib/messageParser'); | ||
const messageFormatter = require('./lib/messageFormatter'); | ||
const slackUtils = require('./lib/slackUtils'); | ||
const configuration = { | ||
jiraHost: process.env.JIRA_HOST, | ||
projectsKeys: process.env.JIRA_PROJECTS_KEYS.split(','), | ||
jiraUser: process.env.JIRA_USER, | ||
jiraPwd: process.env.JIRA_PWD, | ||
}, | ||
jiraApi = jira(configuration), | ||
parser = messageParser(configuration), | ||
formatter = messageFormatter(configuration), | ||
JIRA_KEY_MATCHER = /[A-Z0-9]*-\d+/i; | ||
let bot; | ||
module.exports = (robot) => { | ||
bot = robot; | ||
bot.hear(JIRA_KEY_MATCHER, (res) => { | ||
if (slackUtils.isBotMessage(res.message)) { | ||
return; | ||
} | ||
let message = { | ||
room: res.message.user.room, | ||
text: res.message.text, | ||
needDetailedInfo: slackUtils.isDirectMessage(res.message.text, robot.name), | ||
thread_ts: res.message.thread_ts, | ||
}; | ||
getIssues(parser.extractIssueKeys(message)) | ||
.then(computeInfoLevel) | ||
.then(buildResponseMessage) | ||
.then(sendResponseMessage) | ||
.catch((err) => handleError(err, message)); | ||
}); | ||
}; | ||
function getIssues(message) { | ||
message.issues = []; | ||
if (message.issueKeys.length) { | ||
return jiraApi.getIssuesByKeys(message.issueKeys).then((issues) => { | ||
message.issues = issues; | ||
return message; | ||
}); | ||
} | ||
return Promise.resolve(message); | ||
} | ||
function computeInfoLevel(message) { | ||
const messageChunks = message.text ? message.text.split(' ') : []; | ||
message.needDetailedInfo |= messageChunks.length === message.issueKeys.length; | ||
return message; | ||
} | ||
function buildResponseMessage(message) { | ||
if (message.needDetailedInfo) { | ||
message.response = formatter.buildDetailedMessages(message.issues); | ||
} else { | ||
message.response = formatter.buildMessages(message.issues); | ||
} | ||
return message; | ||
} | ||
function sendResponseMessage(message) { | ||
if (message.response) { | ||
postMessage(message.room, null, { | ||
as_user: true, | ||
attachments: message.response, | ||
thread_ts: message.thread_ts, | ||
}); | ||
} | ||
} | ||
function handleError(err, message) { | ||
bot.logger.error('hubot-jira-issue-fetcher:', err.stack); | ||
postMessage(message.room, formatter.buildErrorMessage(err.response.body), { as_user: true }); | ||
} | ||
function postMessage(room, text, options) { | ||
bot.adapter.client.web.chat.postMessage(room, text, options); | ||
} |
@@ -1,9 +0,5 @@ | ||
'use strict'; | ||
const JiraApi = require('jira-client'); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.default = function (config) { | ||
var jira = new _jiraClient2.default({ | ||
module.exports = function(config) { | ||
const jira = new JiraApi({ | ||
protocol: 'https', | ||
@@ -17,19 +13,9 @@ host: config.jiraHost, | ||
function _getIssuesByKeys(keys) { | ||
return jira.searchJira('key in (' + keys.join(',') + ')').then(function (res) { | ||
return res.issues; | ||
}); | ||
function getIssuesByKeys(keys) { | ||
return jira.searchJira(`key in (${keys.join(',')})`).then(res => res.issues); | ||
} | ||
return { | ||
getIssuesByKeys: function getIssuesByKeys(keys) { | ||
return _getIssuesByKeys(keys); | ||
} | ||
getIssuesByKeys: keys => getIssuesByKeys(keys) | ||
}; | ||
}; | ||
var _jiraClient = require('jira-client'); | ||
var _jiraClient2 = _interopRequireDefault(_jiraClient); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
@@ -1,28 +0,12 @@ | ||
'use strict'; | ||
const _ = require('lodash'); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
let config; | ||
var _lodash = require('lodash'); | ||
var _lodash2 = _interopRequireDefault(_lodash); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var config = void 0; | ||
exports.default = function (configuration) { | ||
module.exports = configuration => { | ||
config = configuration; | ||
return { | ||
buildDetailedMessages: function buildDetailedMessages(issues) { | ||
return _lodash2.default.map(issues, buildDetailedMessage); | ||
}, | ||
buildMessages: function buildMessages(issues) { | ||
return _lodash2.default.map(issues, buildMessage); | ||
}, | ||
buildErrorMessage: function buildErrorMessage(error) { | ||
return _buildErrorMessage(error); | ||
} | ||
buildDetailedMessages: issues => _.map(issues, buildDetailedMessage), | ||
buildMessages: issues => _.map(issues, buildMessage), | ||
buildErrorMessage: error => buildErrorMessage(error) | ||
}; | ||
@@ -37,9 +21,11 @@ }; | ||
author_icon: issue.fields.assignee ? issue.fields.assignee.avatarUrls['16x16'] : null, | ||
title: issue.key + ': ' + issue.fields.summary, | ||
title_link: 'https://' + config.jiraHost + '/browse/' + issue.key, | ||
title: `${issue.key}: ${issue.fields.summary}`, | ||
title_link: `https://${config.jiraHost}/browse/${issue.key}`, | ||
text: issue.fields.description, | ||
fields: [{ | ||
title: 'Status', | ||
value: issue.fields.status.name | ||
}] | ||
fields: [ | ||
{ | ||
title: 'Status', | ||
value: issue.fields.status.name | ||
} | ||
] | ||
}; | ||
@@ -54,3 +40,5 @@ } | ||
author_icon: issue.fields.assignee ? issue.fields.assignee.avatarUrls['16x16'] : null, | ||
text: '<https://' + config.jiraHost + '/browse/' + issue.key + '|' + issue.key + '> `' + issue.fields.status.name + '` ' + issue.fields.summary, | ||
text: `<https://${config.jiraHost}/browse/${issue.key}|${issue.key}> \`${issue.fields.status.name}\` ${ | ||
issue.fields.summary | ||
}`, | ||
mrkdwn_in: ['text'] | ||
@@ -83,12 +71,12 @@ }; | ||
function _buildErrorMessage(error) { | ||
var message = 'Hmmm... something went wrong :thinking_face:', | ||
errorMessage = _lodash2.default.get(error, 'errorMessages[0]'); | ||
function buildErrorMessage(error) { | ||
let message = 'Hmmm... something went wrong :thinking_face:', | ||
errorMessage = _.get(error, 'errorMessages[0]'); | ||
if (isUnknownKeyError(errorMessage)) { | ||
var chunks = errorMessage.split('\''); | ||
message = ':exclamation: `' + chunks[1] + '` cannot be found'; | ||
const chunks = errorMessage.split("'"); | ||
message = `:exclamation: \`${chunks[1]}\` cannot be found`; | ||
} | ||
return message; | ||
} | ||
} |
@@ -1,27 +0,15 @@ | ||
'use strict'; | ||
const _ = require('lodash'); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
const ALL_JIRA_KEY_MATCHER = /[A-Z0-9]*-\d+/g; | ||
var _lodash = require('lodash'); | ||
module.exports = configuration => { | ||
return { | ||
extractIssueKeys: message => { | ||
let keys = message.text.toUpperCase().match(ALL_JIRA_KEY_MATCHER); | ||
keys = _.filter(keys, issueKey => _.includes(configuration.projectsKeys, issueKey.split('-')[0])); | ||
message.issueKeys = keys; | ||
var _lodash2 = _interopRequireDefault(_lodash); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var ALL_JIRA_KEY_MATCHER = /[A-Z0-9]*-\d+/g; | ||
exports.default = function (configuration) { | ||
return { | ||
extractIssueKeys: function extractIssueKeys(message) { | ||
var keys = message.text.toUpperCase().match(ALL_JIRA_KEY_MATCHER); | ||
keys = _lodash2.default.filter(keys, function (issueKey) { | ||
return _lodash2.default.includes(configuration.projectsKeys, issueKey.split('-')[0]); | ||
}); | ||
message.issueKeys = keys; | ||
return message; | ||
} | ||
}; | ||
}; | ||
return message; | ||
} | ||
}; | ||
}; |
{ | ||
"name": "hubot-jira-issue-fetcher", | ||
"version": "1.4.1", | ||
"version": "1.4.2", | ||
"description": "Bot fetching JIRA issue details", | ||
@@ -10,5 +10,3 @@ "main": "index.js", | ||
"start": "node index.js", | ||
"build": "babel src -d .", | ||
"prepublish": "npm run build", | ||
"test": "npm run build && ava" | ||
"test": "ava" | ||
}, | ||
@@ -21,6 +19,3 @@ "dependencies": { | ||
"devDependencies": { | ||
"ava": "^0.17.0", | ||
"babel-cli": "^6.18.0", | ||
"babel-polyfill": "^6.20.0", | ||
"babel-preset-latest": "^6.16.0", | ||
"ava": "^1.4.1", | ||
"eslint": "^3.14.0", | ||
@@ -27,0 +22,0 @@ "grunt": "^1.0.1", |
@@ -1,17 +0,17 @@ | ||
hubot-jira-issue-fetcher | ||
======================== | ||
# hubot-jira-issue-fetcher | ||
> Hubot script that detects JIRA issue keys in messages, fetch corresponding details and display them | ||
[![Build Status](https://travis-ci.org/AirVantage/hubot-jira-issue-fetcher.svg?branch=master)](https://travis-ci.org/AirVantage/hubot-jira-issue-fetcher) | ||
## Usage | ||
Requires the following environment variables to be set: | ||
- `JIRA_HOST` | ||
+ e.g: `issues.sierrawireless.com` | ||
- `JIRA_PROJECTS_KEYS` | ||
+ e.g: `PLTFRS,OPE` | ||
- `JIRA_USER` | ||
- `JIRA_PWD` | ||
- `JIRA_HOST` | ||
- e.g: `issues.sierrawireless.com` | ||
- `JIRA_PROJECTS_KEYS` | ||
- e.g: `PLTFRS,OPE` | ||
- `JIRA_USER` | ||
- `JIRA_PWD` | ||
@@ -24,5 +24,5 @@ ## Features | ||
- Key (link) | ||
- Status | ||
- Summary | ||
- Key (link) | ||
- Status | ||
- Summary | ||
@@ -33,9 +33,9 @@ ### Detailed display | ||
- Assignee (name + avatar) | ||
- Key + Summary (link) | ||
- Description | ||
- Status | ||
- Assignee (name + avatar) | ||
- Key + Summary (link) | ||
- Description | ||
- Status | ||
## Development | ||
Written in ES7 it uses babeljs and requires to be built using `npm run build` before getting started. | ||
See https://github.com/AirVantage/ccbot#development-setup |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
251504
4
6860
12
1