pivotoolz 1.2.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +27 -25
- data/README.md +10 -2
- data/exe/get-story-info-from-jira-id +62 -0
- data/exe/jira-stories-deployed +107 -0
- data/exe/jira-story-ids-deployed +25 -0
- data/exe/post-slack-message +21 -36
- data/exe/pv-git-branch +3 -2
- data/lib/pivotoolz/git_branch.rb +20 -11
- data/lib/pivotoolz/post_slack_message.rb +51 -0
- data/lib/pivotoolz/version.rb +1 -1
- data/pivotoolz.gemspec +4 -4
- metadata +21 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94e90398170d1e718943d5deed60a7d79d8a61b9b5a365a56497a3c69058eb2a
|
4
|
+
data.tar.gz: d9eba00b2fca976d49f35cfc20dad9ad96c8b59dbc75edf6a682e0826be92839
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95c19644a4959d37793779391d3340bb5fa7cae45447b8022e0b7a7cf0582229f327a355c8f4c32c0714751903e3ab17c98c326d10b85ee1212c882d711dc6ef
|
7
|
+
data.tar.gz: 78215c1d296e66a10702b9cbf81bd590cd0b9a46f7648f3506a88fe8930fde15559a45d7ab41adb7c0cea3cced68ee5a9c8dbbf7987d9a6b4e7e37e38f6af2a3
|
data/Gemfile.lock
CHANGED
@@ -1,51 +1,53 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pivotoolz (
|
5
|
-
rest-client (~> 2.
|
4
|
+
pivotoolz (2.2.0)
|
5
|
+
rest-client (~> 2.1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
diff-lcs (1.
|
11
|
-
domain_name (0.5.
|
10
|
+
diff-lcs (1.4.4)
|
11
|
+
domain_name (0.5.20190701)
|
12
12
|
unf (>= 0.0.5, < 1.0.0)
|
13
|
-
http-
|
13
|
+
http-accept (1.7.0)
|
14
|
+
http-cookie (1.0.4)
|
14
15
|
domain_name (~> 0.5)
|
15
|
-
mime-types (3.1)
|
16
|
+
mime-types (3.3.1)
|
16
17
|
mime-types-data (~> 3.2015)
|
17
|
-
mime-types-data (3.
|
18
|
+
mime-types-data (3.2021.0901)
|
18
19
|
netrc (0.11.0)
|
19
|
-
rake (
|
20
|
-
rest-client (2.0
|
20
|
+
rake (13.0.6)
|
21
|
+
rest-client (2.1.0)
|
22
|
+
http-accept (>= 1.7.0, < 2.0)
|
21
23
|
http-cookie (>= 1.0.2, < 2.0)
|
22
24
|
mime-types (>= 1.16, < 4.0)
|
23
25
|
netrc (~> 0.8)
|
24
|
-
rspec (3.
|
25
|
-
rspec-core (~> 3.
|
26
|
-
rspec-expectations (~> 3.
|
27
|
-
rspec-mocks (~> 3.
|
28
|
-
rspec-core (3.
|
29
|
-
rspec-support (~> 3.
|
30
|
-
rspec-expectations (3.
|
26
|
+
rspec (3.10.0)
|
27
|
+
rspec-core (~> 3.10.0)
|
28
|
+
rspec-expectations (~> 3.10.0)
|
29
|
+
rspec-mocks (~> 3.10.0)
|
30
|
+
rspec-core (3.10.1)
|
31
|
+
rspec-support (~> 3.10.0)
|
32
|
+
rspec-expectations (3.10.1)
|
31
33
|
diff-lcs (>= 1.2.0, < 2.0)
|
32
|
-
rspec-support (~> 3.
|
33
|
-
rspec-mocks (3.
|
34
|
+
rspec-support (~> 3.10.0)
|
35
|
+
rspec-mocks (3.10.2)
|
34
36
|
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
-
rspec-support (~> 3.
|
36
|
-
rspec-support (3.
|
37
|
+
rspec-support (~> 3.10.0)
|
38
|
+
rspec-support (3.10.2)
|
37
39
|
unf (0.1.4)
|
38
40
|
unf_ext
|
39
|
-
unf_ext (0.0.
|
41
|
+
unf_ext (0.0.8)
|
40
42
|
|
41
43
|
PLATFORMS
|
42
44
|
ruby
|
43
45
|
|
44
46
|
DEPENDENCIES
|
45
|
-
bundler (~>
|
47
|
+
bundler (~> 2.2)
|
46
48
|
pivotoolz!
|
47
|
-
rake (~>
|
48
|
-
rspec (~> 3.
|
49
|
+
rake (~> 13.0)
|
50
|
+
rspec (~> 3.10)
|
49
51
|
|
50
52
|
BUNDLED WITH
|
51
|
-
|
53
|
+
2.2.27
|
data/README.md
CHANGED
@@ -189,11 +189,19 @@ Be sure to set your `PIVOTAL_TRACKER_API_TOKEN` env variable in your `.bashrc` f
|
|
189
189
|
set your git config user initials like this: `git config --add user.initials af`. Otherwise it
|
190
190
|
will take your `git config user.name` or `whoami` information.
|
191
191
|
|
192
|
-
Example:
|
192
|
+
Example 1:
|
193
193
|
```bash
|
194
194
|
pv-git-branch "#111222333"
|
195
195
|
```
|
196
|
-
This would create and checkout a new branch:
|
196
|
+
This would create and checkout a new branch:
|
197
|
+
`af/features/building-someting-great-111222333`.
|
198
|
+
|
199
|
+
Example 2 (appending values):
|
200
|
+
```bash
|
201
|
+
pv-git-branch 12345678 version2 backend only
|
202
|
+
```
|
203
|
+
This would create and checkout a new branch:
|
204
|
+
`af/features/building-something-awesome-12345678-version2-backend-only`
|
197
205
|
|
198
206
|
If the branch had already been created, the command will automatically check out existing branch.
|
199
207
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
BASE_URL = ENV['JIRA_API_BASE_URL']
|
7
|
+
|
8
|
+
def get_story_info(story_id, flags = [], subdomain)
|
9
|
+
return nil if story_id.empty?
|
10
|
+
|
11
|
+
begin
|
12
|
+
include_owner_names = flags.any? { |f| f == '--owners' || f == '-O' }
|
13
|
+
url = BASE_URL + "#{story_id}" + "/#{include_owner_names ? '?fields=:default,owners' : ''}"
|
14
|
+
open(
|
15
|
+
url,
|
16
|
+
'Authorization' => "Basic #{ENV['JIRA_API_BASIC_AUTH_BASE64_ENCODED']}"
|
17
|
+
).read
|
18
|
+
rescue StandardError => e
|
19
|
+
story_link = "https://#{subdomain}.atlassian.net/browse/#{story_id}"
|
20
|
+
|
21
|
+
JSON.generate({
|
22
|
+
error: "Could not get story info for story #{story_id}: #{e.message}\n\nStory info may be available at #{story_link}",
|
23
|
+
story_link: story_link
|
24
|
+
})
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if BASE_URL.nil? || BASE_URL.empty?
|
29
|
+
puts "Please set JIRA_API_BASE_URL. It looks something like 'https://YOUR-COMPANY.atlassian.net/rest/api/2/issue/'"
|
30
|
+
exit 1
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
subdomain = URI.parse(BASE_URL).host.split('.atlassian.net').first
|
35
|
+
rescue => e
|
36
|
+
puts "Error determining your Jira subdomain. Please check your JIRA_API_BASE_URL environment variable"
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
|
40
|
+
flags = ARGV.reduce([]) do |reduced, a|
|
41
|
+
reduced << a if a.include?('--') || a.include?('-')
|
42
|
+
reduced
|
43
|
+
end
|
44
|
+
|
45
|
+
flags.each { |f| ARGV.delete f }
|
46
|
+
|
47
|
+
stream = ARGV.any? ? ARGV : ARGF
|
48
|
+
|
49
|
+
if stream == ARGF && $stdin.tty?
|
50
|
+
puts "Usage:\nget-story-info-from-jira-id STORY_ID\n"
|
51
|
+
puts " OR\n"
|
52
|
+
puts "echo STORY_ID | get-story-info-from-id"
|
53
|
+
puts " OR\n"
|
54
|
+
exit 1
|
55
|
+
end
|
56
|
+
|
57
|
+
infos = stream.reduce([]) do |reduced, story_id|
|
58
|
+
next reduced unless story_id && story_id =~ /\d+/
|
59
|
+
reduced << get_story_info(story_id.strip, flags, subdomain)
|
60
|
+
end
|
61
|
+
|
62
|
+
puts infos.join("\n")
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
BASE_URL = ENV['JIRA_API_BASE_URL']
|
7
|
+
|
8
|
+
if BASE_URL.nil? || BASE_URL.empty?
|
9
|
+
puts "Please set JIRA_API_BASE_URL. It looks something like 'https://YOUR-COMPANY.atlassian.net/rest/api/2/issue/'"
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
subdomain = URI.parse(BASE_URL).host.split('.atlassian.net').first
|
15
|
+
rescue => e
|
16
|
+
puts "Error determining your Jira subdomain. Please check your JIRA_API_BASE_URL environment variable"
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
environment_tag = ARGV[0]&.strip
|
21
|
+
if environment_tag.nil? || environment_tag.empty?
|
22
|
+
puts "Usage: stories-deployed ENVIRONMENT"
|
23
|
+
exit 1
|
24
|
+
end
|
25
|
+
|
26
|
+
flags = ARGV.select { |a| a.include?('--') || a.include?('-') }
|
27
|
+
|
28
|
+
include_owners = flags
|
29
|
+
.any? { |f| f == '--owners' || f == '-O' }
|
30
|
+
|
31
|
+
format_as_json = flags
|
32
|
+
.any? { |f| f == '--json' || f == '-j' }
|
33
|
+
|
34
|
+
deployed_story_infos = `jira-story-ids-deployed #{environment_tag} | get-story-info-from-jira-id #{flags.join(' ')}`
|
35
|
+
|
36
|
+
def as_json(story, include_owners, flags, subdomain)
|
37
|
+
if story.error
|
38
|
+
return {
|
39
|
+
title: story.error,
|
40
|
+
title_link: story.story_link
|
41
|
+
}.to_json
|
42
|
+
end
|
43
|
+
|
44
|
+
json = {
|
45
|
+
title: story.fields['summary']&.strip,
|
46
|
+
title_link: "https://#{subdomain}.atlassian.net/browse/#{story.key}",
|
47
|
+
mrkdwn_in: ["text", "pretext", "footer"]
|
48
|
+
}
|
49
|
+
|
50
|
+
if include_owners
|
51
|
+
if flags.include? '--owners-footer'
|
52
|
+
json.merge!(
|
53
|
+
footer: "\n\nBrought to you by: #{story_owner_names(story, flags)}"
|
54
|
+
)
|
55
|
+
else
|
56
|
+
json.merge!(
|
57
|
+
text: "\n\nBrought to you by: #{story_owner_names(story, flags)}"
|
58
|
+
)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
json.to_json
|
63
|
+
end
|
64
|
+
|
65
|
+
def story_owner_names(story, flags)
|
66
|
+
owners = story
|
67
|
+
.owners
|
68
|
+
.compact
|
69
|
+
.map { |o| OpenStruct.new(o).name }
|
70
|
+
|
71
|
+
if flags.include? '--bold-owners'
|
72
|
+
return to_sentence(owners.map { |o| "*#{o}*" })
|
73
|
+
end
|
74
|
+
|
75
|
+
to_sentence(owners)
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_sentence(array)
|
79
|
+
array.size > 2 ?
|
80
|
+
"#{array[0..-2].join(', ')} and #{array.last}" :
|
81
|
+
array.join(' and ')
|
82
|
+
end
|
83
|
+
|
84
|
+
stories_deployed = deployed_story_infos
|
85
|
+
.split("\n")
|
86
|
+
.compact
|
87
|
+
.reduce([]) do |reduced, story_info|
|
88
|
+
story = OpenStruct.new(JSON.parse(story_info))
|
89
|
+
|
90
|
+
if format_as_json
|
91
|
+
reduced << as_json(story, include_owners, flags, subdomain)
|
92
|
+
next reduced
|
93
|
+
end
|
94
|
+
|
95
|
+
reduced << "#{story.error}"
|
96
|
+
next reduced if story.error
|
97
|
+
|
98
|
+
reduced << "#{story.name&.strip}:\n#{story.url}"
|
99
|
+
|
100
|
+
if include_owners
|
101
|
+
reduced << "\nBrought to you by: #{story_owner_names(story, flags)}"
|
102
|
+
end
|
103
|
+
|
104
|
+
reduced
|
105
|
+
end
|
106
|
+
|
107
|
+
puts stories_deployed
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
environment_tag = ARGV[0]&.strip
|
4
|
+
|
5
|
+
if environment_tag.nil? || environment_tag.empty?
|
6
|
+
puts "Usage: story-ids-deployed ENVIRONMENT"
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
|
10
|
+
commit_range = `git tag -l #{environment_tag}* | tail -n 2 | tr '\n' ' ' | sed -e 's/ /../'`.strip
|
11
|
+
|
12
|
+
if commit_range.nil? || commit_range.empty?
|
13
|
+
puts "Empty commit range! Are there any commits tagged with #{environment_tag}?"
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
|
17
|
+
commit_message_bodies = `git log --pretty="%h %s" #{commit_range}`.strip
|
18
|
+
story_ids = commit_message_bodies.
|
19
|
+
# TODO: Make this configurable
|
20
|
+
scan(/(DI-\d+|ST-\d+)/).
|
21
|
+
flatten.
|
22
|
+
compact.
|
23
|
+
uniq
|
24
|
+
|
25
|
+
puts story_ids.join("\n")
|
data/exe/post-slack-message
CHANGED
@@ -2,47 +2,32 @@
|
|
2
2
|
|
3
3
|
require 'rest-client'
|
4
4
|
require 'json'
|
5
|
+
require_relative '../lib/pivotoolz/post_slack_message'
|
5
6
|
|
6
|
-
URL = ENV
|
7
|
+
URL = ENV.fetch('SLACK_WEBHOOK_URL') { '' }
|
8
|
+
CHANNEL_URL_MAP = ENV.fetch('SLACK_WEBHOOK_CHANNEL_URLS') { {} }
|
9
|
+
|
10
|
+
if URL.empty? && CHANNEL_URL_MAP.empty?
|
11
|
+
puts "Need either SLACK_WEBHOOK_URL or SLACK_WEBHOOK_CHANNEL_URLS to be defined!"
|
12
|
+
exit 0
|
13
|
+
end
|
7
14
|
|
8
15
|
channel = ARGV.shift
|
16
|
+
if channel.to_s.empty?
|
17
|
+
puts "Channel to post to is required!!"
|
18
|
+
exit 0
|
19
|
+
end
|
20
|
+
|
9
21
|
content = ARGV.empty? ? ARGF.read : StringIO.new(ARGV.join("\n")).read
|
10
22
|
exit 0 if content.strip.empty?
|
11
23
|
|
12
|
-
|
13
|
-
|
14
|
-
"[#{content.split("\n").slice(1..-1).join(",")}]"
|
15
|
-
)
|
16
|
-
begin
|
17
|
-
RestClient.post(
|
18
|
-
URL,
|
19
|
-
payload: {
|
20
|
-
username: ENV['SLACKBOT_USERNAME'] || 'slackbot',
|
21
|
-
channel: channel,
|
22
|
-
text: content.split("\n")&.first || '',
|
23
|
-
attachments: attachments,
|
24
|
-
icon_emoji: ":ghost:"
|
25
|
-
}.to_json
|
26
|
-
)
|
27
|
-
rescue RestClient::Exceptions => e
|
28
|
-
puts "Error posting to slack #{e.message}:\n#{e.backtrace}"
|
29
|
-
end
|
30
|
-
|
31
|
-
exit 0
|
32
|
-
end
|
33
|
-
rescue JSON::ParserError => e
|
34
|
-
end
|
24
|
+
psm = PostSlackMessage.new
|
25
|
+
webhook_url = psm.select_webhook_url(URL, CHANNEL_URL_MAP, channel)
|
35
26
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
payload: {
|
40
|
-
username: ENV['SLACKBOT_USERNAME'] || 'slackbot',
|
41
|
-
channel: channel,
|
42
|
-
text: content,
|
43
|
-
icon_emoji: ":ghost:"
|
44
|
-
}.to_json
|
45
|
-
)
|
46
|
-
rescue RestClient::Exceptions => e
|
47
|
-
puts "Error posting to slack #{e.message}:\n#{e.backtrace}"
|
27
|
+
if webhook_url.nil?
|
28
|
+
puts "Channel '#{channel}' webhook url not found! Please define it in SLACK_WEBHOOK_CHANNEL_URLS environment variable"
|
29
|
+
exit 0
|
48
30
|
end
|
31
|
+
|
32
|
+
result = psm.post_message(webhook_url, channel, content)
|
33
|
+
puts result if !result.empty?
|
data/exe/pv-git-branch
CHANGED
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
require_relative '../lib/pivotoolz/git_branch'
|
4
4
|
|
5
|
-
if ARGV.length
|
5
|
+
if ARGV.length < 1
|
6
6
|
puts "#{GitBranch.usage_message}"
|
7
7
|
exit
|
8
8
|
end
|
9
|
-
|
9
|
+
first_arg, *the_rest = ARGV
|
10
|
+
puts GitBranch.new.generate(first_arg, the_rest)
|
data/lib/pivotoolz/git_branch.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
class GitBranch
|
4
|
-
def generate(story_id)
|
4
|
+
def generate(story_id, *append)
|
5
5
|
if !story_id
|
6
6
|
puts "#{GitBranch.usage_message}"
|
7
7
|
exit
|
@@ -13,8 +13,9 @@ class GitBranch
|
|
13
13
|
category = set_category(story['story_type'])
|
14
14
|
description = set_description(story['name'])
|
15
15
|
pivotal_id = story['id']
|
16
|
+
append = set_append_values(append)
|
16
17
|
|
17
|
-
create_branch("#{author}/#{category}/#{description}-#{pivotal_id}")
|
18
|
+
create_branch("#{author}/#{category}/#{description}-#{pivotal_id}#{append}")
|
18
19
|
end
|
19
20
|
|
20
21
|
private
|
@@ -38,9 +39,7 @@ class GitBranch
|
|
38
39
|
|
39
40
|
def set_author
|
40
41
|
author_name = get_author_initials || get_author_name || get_whoami || 'unknown'
|
41
|
-
author_name
|
42
|
-
author_name.tr!('.@!#$%^\&*()', '')
|
43
|
-
author_name.tr(' ', '+')
|
42
|
+
clean_text(author_name)
|
44
43
|
end
|
45
44
|
|
46
45
|
def get_author_initials
|
@@ -63,14 +62,24 @@ class GitBranch
|
|
63
62
|
end
|
64
63
|
|
65
64
|
def set_description(description)
|
66
|
-
description
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
clean_text(description)
|
66
|
+
end
|
67
|
+
|
68
|
+
def set_append_values(appendings)
|
69
|
+
return '' if appendings.empty?
|
70
|
+
clean_appendings = appendings.map{|appending| clean_text(appending) }
|
71
|
+
"-#{clean_appendings.join('-')}"
|
72
|
+
end
|
73
|
+
|
74
|
+
def clean_text(string_value)
|
75
|
+
string_value.tr!(':_,/.&!@#$%^*()[]\'`<>"', '') # remove unwanted punctuation
|
76
|
+
string_value.tr!('-', ' ') # replace dashes with space
|
77
|
+
string_value.downcase! # convert to lowercase
|
78
|
+
string_value.gsub!(/ +/,'-') # collapse spacing and replace spaces with dashes
|
79
|
+
string_value[0 .. 35].gsub(/-$/, '') # limit to 45 chars
|
71
80
|
end
|
72
81
|
|
73
82
|
def self.usage_message
|
74
|
-
"Usage : pv-git-branch '[
|
83
|
+
"Usage : pv-git-branch '<pivotal_story_id>' '[<appended_branchname_values>...]'"
|
75
84
|
end
|
76
85
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class PostSlackMessage
|
2
|
+
def select_webhook_url(url, channel_map, channel)
|
3
|
+
return url if channel_map.empty?
|
4
|
+
|
5
|
+
channel_webhook_map = channel_map.split(',').reduce({}) do |reduced, channel_map_string|
|
6
|
+
c, url = channel_map_string.split('->')
|
7
|
+
reduced[c] = url
|
8
|
+
reduced["@#{c}"] = url if !c.start_with?('@')
|
9
|
+
reduced["##{c}"] = url if !c.start_with?('#')
|
10
|
+
reduced
|
11
|
+
end
|
12
|
+
|
13
|
+
channel_webhook_map[channel]
|
14
|
+
end
|
15
|
+
|
16
|
+
def post_message(url, channel, content)
|
17
|
+
begin
|
18
|
+
text, *json = content.split("\n")
|
19
|
+
return post_basic_message(url, channel, content) if json.empty?
|
20
|
+
|
21
|
+
post_data = json.any? { |s| s.include? 'blocks' } ? JSON.parse(json.first) : {attachments: json.map { |j| JSON.parse(j) }}
|
22
|
+
begin
|
23
|
+
RestClient.post(
|
24
|
+
url,
|
25
|
+
post_data.merge({text: text || ''}).to_json,
|
26
|
+
{content_type: :json, accept: :json}
|
27
|
+
)
|
28
|
+
rescue RestClient::Exceptions => e
|
29
|
+
return "Error posting to slack #{e.message}:\n#{e.backtrace}"
|
30
|
+
end
|
31
|
+
rescue JSON::ParserError => e
|
32
|
+
"Error parsing json: #{e}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def post_basic_message(url, channel, content)
|
37
|
+
begin
|
38
|
+
RestClient.post(
|
39
|
+
url,
|
40
|
+
payload: {
|
41
|
+
username: ENV['SLACKBOT_USERNAME'] || 'slackbot',
|
42
|
+
channel: channel,
|
43
|
+
text: content,
|
44
|
+
icon_emoji: ":ghost:"
|
45
|
+
}.to_json
|
46
|
+
)
|
47
|
+
rescue RestClient::Exceptions => e
|
48
|
+
puts "Error posting to slack #{e.message}:\n#{e.backtrace}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/pivotoolz/version.rb
CHANGED
data/pivotoolz.gemspec
CHANGED
@@ -28,9 +28,9 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
29
29
|
spec.require_paths = ["lib"]
|
30
30
|
|
31
|
-
spec.add_dependency 'rest-client', "~> 2.
|
31
|
+
spec.add_dependency 'rest-client', "~> 2.1"
|
32
32
|
|
33
|
-
spec.add_development_dependency "bundler", "~>
|
34
|
-
spec.add_development_dependency "rake", "~>
|
35
|
-
spec.add_development_dependency "rspec", "~> 3.
|
33
|
+
spec.add_development_dependency "bundler", "~> 2.2"
|
34
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
35
|
+
spec.add_development_dependency "rspec", "~> 3.10"
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pivotoolz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sufyan Adam
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-09-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -16,56 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: '2.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.2'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '13.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '13.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
61
|
+
version: '3.10'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
68
|
+
version: '3.10'
|
69
69
|
description: Auto-deliver your finished stories upon successful deployment, find out
|
70
70
|
which stories went out in the last deployment, get a list of pivotal tracker story
|
71
71
|
ids that went out in the last deployment.
|
@@ -75,6 +75,9 @@ executables:
|
|
75
75
|
- deliver-deployed-stories
|
76
76
|
- deliver-story
|
77
77
|
- get-story-info-from-id
|
78
|
+
- get-story-info-from-jira-id
|
79
|
+
- jira-stories-deployed
|
80
|
+
- jira-story-ids-deployed
|
78
81
|
- merge
|
79
82
|
- post-slack-message
|
80
83
|
- pv-git-branch
|
@@ -104,6 +107,9 @@ files:
|
|
104
107
|
- exe/deliver-deployed-stories
|
105
108
|
- exe/deliver-story
|
106
109
|
- exe/get-story-info-from-id
|
110
|
+
- exe/get-story-info-from-jira-id
|
111
|
+
- exe/jira-stories-deployed
|
112
|
+
- exe/jira-story-ids-deployed
|
107
113
|
- exe/merge
|
108
114
|
- exe/post-slack-message
|
109
115
|
- exe/pv-git-branch
|
@@ -112,6 +118,7 @@ files:
|
|
112
118
|
- exe/tag-it
|
113
119
|
- lib/pivotoolz.rb
|
114
120
|
- lib/pivotoolz/git_branch.rb
|
121
|
+
- lib/pivotoolz/post_slack_message.rb
|
115
122
|
- lib/pivotoolz/version.rb
|
116
123
|
- pivotoolz.gemspec
|
117
124
|
homepage: https://github.com/sufyanadam/pivotoolz
|
@@ -119,7 +126,7 @@ licenses:
|
|
119
126
|
- MIT
|
120
127
|
metadata:
|
121
128
|
allowed_push_host: https://rubygems.org
|
122
|
-
post_install_message:
|
129
|
+
post_install_message:
|
123
130
|
rdoc_options: []
|
124
131
|
require_paths:
|
125
132
|
- lib
|
@@ -134,9 +141,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
141
|
- !ruby/object:Gem::Version
|
135
142
|
version: '0'
|
136
143
|
requirements: []
|
137
|
-
|
138
|
-
|
139
|
-
signing_key:
|
144
|
+
rubygems_version: 3.2.3
|
145
|
+
signing_key:
|
140
146
|
specification_version: 4
|
141
147
|
summary: Tools to save you time when working with Pivotal Tracker stories
|
142
148
|
test_files: []
|