opsask 2.1.2 → 2.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/opsask/app.rb +12 -3
- data/lib/opsask/helpers.rb +39 -5
- data/public/css/style.css +4 -0
- data/views/stats.erb +12 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e662cb4766ccb6a93e2428e0742130a31dc274d6
|
4
|
+
data.tar.gz: cf8bc915a2c4757032c025bd8fb0d2567c022c4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbc384a84a169d75259a2635f468814afe05f143456e065c3a8a19043c8840c007885120c74cccf8436defff04cce54d57c9c7e9561009b8354fc96093e06bcb
|
7
|
+
data.tar.gz: 049e50bc925daa021be1bdc3f510fc68e530efddad4088295ca970e4be1cf6350c87efb92c47ccf4fa6ab05c29907a117e08329ad62f8ed781cb9f3db69674cc
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.3
|
data/lib/opsask/app.rb
CHANGED
@@ -76,15 +76,20 @@ module OpsAsk
|
|
76
76
|
"#{settings.config[:jira_url]}/issues/?jql=#{URI::escape normalized_jql("sprint = #{id} and \"Story Points\" is empty", nil)}"
|
77
77
|
),
|
78
78
|
untracked_jiras: untracked_issues,
|
79
|
-
stragglers: straggling_issues
|
79
|
+
stragglers: straggling_issues,
|
80
|
+
outlier_stats: {
|
81
|
+
outlier_link: outlier_link(sprint, num),
|
82
|
+
outlier_issues: outlier_issues(sprint, num)
|
83
|
+
}
|
80
84
|
}
|
81
85
|
end
|
82
86
|
|
83
87
|
get '/sprint' do
|
84
88
|
num = current_sprint_num
|
85
89
|
id = current_sprint_id
|
90
|
+
sprint = current_sprint
|
86
91
|
erb :stats, locals: {
|
87
|
-
sprint:
|
92
|
+
sprint: sprint,
|
88
93
|
ask_stats: stats_for(
|
89
94
|
asks_in_current_sprint,
|
90
95
|
"#{settings.config[:jira_url]}/issues/?jql=#{URI::escape normalized_jql("labels in (#{sprint_label_prefix}#{num}) and resolution is not empty", nil)}",
|
@@ -98,7 +103,11 @@ module OpsAsk
|
|
98
103
|
"#{settings.config[:jira_url]}/issues/?jql=#{URI::escape normalized_jql("sprint = #{id} and \"Story Points\" is empty", nil)}"
|
99
104
|
),
|
100
105
|
untracked_jiras: untracked_issues,
|
101
|
-
stragglers: straggling_issues
|
106
|
+
stragglers: straggling_issues,
|
107
|
+
outlier_stats: {
|
108
|
+
outlier_link: outlier_link(sprint, num),
|
109
|
+
outlier_issues: outlier_issues(sprint, num)
|
110
|
+
}
|
102
111
|
}
|
103
112
|
end
|
104
113
|
|
data/lib/opsask/helpers.rb
CHANGED
@@ -73,6 +73,25 @@ module OpsAsk
|
|
73
73
|
}
|
74
74
|
end
|
75
75
|
|
76
|
+
def outlier_query sprint, num
|
77
|
+
starts = current_sprint_starts sprint
|
78
|
+
ends = current_sprint_ends sprint
|
79
|
+
normalized_jql("(sprint != #{sprint['id']} or sprint is empty) and (labels != \"#{sprint_label_prefix}#{num}\" OR labels is empty) and resolved >= \"#{starts}\" and resolved <= \"#{ends}\"")
|
80
|
+
end
|
81
|
+
|
82
|
+
def outlier_link sprint, num
|
83
|
+
"#{settings.config[:jira_url]}/issues/?jql=#{URI::escape outlier_query(sprint, num)}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def outlier_issues sprint, num
|
87
|
+
return [] unless logged_in?
|
88
|
+
issues = []
|
89
|
+
@jira_client.Issue.jql(outlier_query(sprint, num), max_results: 500).each do |i|
|
90
|
+
issues << i.attrs
|
91
|
+
end
|
92
|
+
return issues
|
93
|
+
end
|
94
|
+
|
76
95
|
def items_in_current_sprint
|
77
96
|
items_in_sprint current_sprint_num
|
78
97
|
end
|
@@ -131,9 +150,11 @@ module OpsAsk
|
|
131
150
|
sprint_prefix.gsub(/\s+/, '')
|
132
151
|
end
|
133
152
|
|
134
|
-
def get_sprint num
|
135
|
-
|
136
|
-
|
153
|
+
def get_sprint num, id=nil
|
154
|
+
unless sprint_id = id
|
155
|
+
sprint = sprints.select { |s| s['name'] == "#{sprint_prefix} #{num}" }
|
156
|
+
sprint_id = sprint.first['id']
|
157
|
+
end
|
137
158
|
url = "#{settings.config[:jira_url]}/rest/greenhopper/1.0/rapid/charts/sprintreport?rapidViewId=#{settings.config[:agile_board]}&sprintId=#{sprint_id}"
|
138
159
|
curl_request = Curl::Easy.http_get(url) do |curl|
|
139
160
|
curl.headers['Accept'] = 'application/json'
|
@@ -156,6 +177,20 @@ module OpsAsk
|
|
156
177
|
return {}
|
157
178
|
end
|
158
179
|
|
180
|
+
def current_sprint_starts sprint=current_sprint
|
181
|
+
if starts = sprint['startDate']
|
182
|
+
starts = DateTime.strptime(starts, '%d/%b/%y %l:%M %p')
|
183
|
+
starts.strftime('%Y/%m/%d')
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def current_sprint_ends sprint=current_sprint
|
188
|
+
if ends = sprint['endDate']
|
189
|
+
ends = DateTime.strptime(ends, '%d/%b/%y %l:%M %p')
|
190
|
+
ends.strftime('%Y/%m/%d')
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
159
194
|
def current_sprint_name sprint=current_sprint
|
160
195
|
sprint.nil? ? nil : sprint['name'].gsub(/\s+/, '')
|
161
196
|
end
|
@@ -187,8 +222,7 @@ module OpsAsk
|
|
187
222
|
rescue
|
188
223
|
$stderr.puts "Failed to parse response from JIRA: #{raw_response}"
|
189
224
|
end
|
190
|
-
|
191
|
-
return sprints.last
|
225
|
+
get_sprint(nil, sprints.last['id'])
|
192
226
|
end
|
193
227
|
|
194
228
|
def today offset=0
|
data/public/css/style.css
CHANGED
data/views/stats.erb
CHANGED
@@ -49,4 +49,15 @@
|
|
49
49
|
</div>
|
50
50
|
</div>
|
51
51
|
</div>
|
52
|
-
</div>
|
52
|
+
</div>
|
53
|
+
<!-- <%= outlier_stats[:outlier_link] %> -->
|
54
|
+
<% unless outlier_stats[:outlier_issues].empty? %>
|
55
|
+
<div class="row" id="more-stats">
|
56
|
+
<div class="small-10 columns">
|
57
|
+
<div class="small-10 small-offset-2 columns">
|
58
|
+
<a href="<%= outlier_stats[:outlier_link] %>">There <%= outlier_stats[:outlier_issues].length > 0 ? 'were' : 'was' %>
|
59
|
+
<%= pluralize outlier_stats[:outlier_issues].length, 'issues' %> unaccounted for during this sprint</a>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
<% end %>
|