| |   |
| 172 | 172 | |
| 173 | 173 | operation :status, "Show project status", :maybe_release |
| 174 | 174 | def status project, config, releases |
| 175 | | releases.each do |r, groups| |
| 176 | | issues = groups.map { |_,g| g }.flatten |
| 177 | | title = r ? r.name : "unassigned" |
| 175 | if releases.empty? |
| 176 | puts "No releases." |
| 177 | return |
| 178 | end |
| 179 | |
| 180 | ## TODO: remove weird and deprecated :maybe_release semantics |
| 181 | releases = releases.map { |r, groups| r } |
| 182 | |
| 183 | entries = releases.map do |r| |
| 184 | title, issues = if r |
| 185 | [r.name, project.issues_for_release(r)] |
| 186 | else |
| 187 | ["unassigned", project.unassigned_issues] |
| 188 | end |
| 178 | 189 | |
| 179 | | groups = groups.map do |t,g| |
| 180 | | nc = g.count_of { |i| i.closed? } |
| 181 | | pc = 100.0 * (g.empty? ? 1.0 : nc.to_f / g.size) |
| 182 | | [t, g, nc, pc] |
| 190 | middle = Issue::TYPES.map do |type| |
| 191 | type_issues = issues.select { |i| i.type == type } |
| 192 | num = type_issues.size |
| 193 | nc = type_issues.count_of { |i| i.closed? } |
| 194 | pc = 100.0 * (type_issues.empty? ? 1.0 : nc.to_f / num) |
| 195 | "%2d/%2d %s" % [nc, num, type.to_s.pluralize(num, false)] |
| 183 | 196 | end |
| 184 | 197 | |
| 185 | | special = if r && r.released? |
| 198 | bar = if r && r.released? |
| 186 | 199 | "(released)" |
| 187 | | elsif groups.empty? |
| 200 | elsif issues.empty? |
| 188 | 201 | "(no issues)" |
| 189 | 202 | elsif issues.all? { |i| i.closed? } |
| 190 | 203 | "(ready for release)" |
| … | … | |
| 205 | 205 | status_bar_for(issues) |
| 206 | 206 | end |
| 207 | 207 | |
| 208 | | middle = groups.map do |(t,g,nc,pc)| |
| 209 | | "%2d/%2d (%3.0f%%) %s" % [nc, g.size, pc, t.to_s.pluralize(g.size, false)] |
| 210 | | end.join(', ') |
| 211 | | printf "%-10s %s %s\n", title, middle, special |
| 208 | [title, middle, bar] |
| 212 | 209 | end |
| 213 | 210 | |
| 214 | | if project.releases.empty? |
| 215 | | puts "No releases." |
| 216 | | return |
| 211 | title_size = 0 |
| 212 | middle_sizes = [] |
| 213 | |
| 214 | entries.each do |title, middle, bar| |
| 215 | title_size = [title_size, title.length].max |
| 216 | middle_sizes = middle.zip(middle_sizes).map do |e, s| |
| 217 | [s || 0, e.length].max |
| 218 | end |
| 219 | end |
| 220 | |
| 221 | entries.each do |title, middle, bar| |
| 222 | printf "%#{title_size}-s ", title |
| 223 | middle.zip(middle_sizes).each_with_index do |(e, s), i| |
| 224 | sep = i < middle.size - 1 ? "," : "" |
| 225 | printf "%#{s + sep.length}-s ", e + sep |
| 226 | end |
| 227 | puts bar |
| 217 | 228 | end |
| 218 | 229 | end |
| 219 | 230 | |
| toggle raw diff |
--- a/lib/operator.rb
+++ b/lib/operator.rb
@@ -172,19 +172,32 @@ EOS
operation :status, "Show project status", :maybe_release
def status project, config, releases
- releases.each do |r, groups|
- issues = groups.map { |_,g| g }.flatten
- title = r ? r.name : "unassigned"
+ if releases.empty?
+ puts "No releases."
+ return
+ end
+
+ ## TODO: remove weird and deprecated :maybe_release semantics
+ releases = releases.map { |r, groups| r }
+
+ entries = releases.map do |r|
+ title, issues = if r
+ [r.name, project.issues_for_release(r)]
+ else
+ ["unassigned", project.unassigned_issues]
+ end
- groups = groups.map do |t,g|
- nc = g.count_of { |i| i.closed? }
- pc = 100.0 * (g.empty? ? 1.0 : nc.to_f / g.size)
- [t, g, nc, pc]
+ middle = Issue::TYPES.map do |type|
+ type_issues = issues.select { |i| i.type == type }
+ num = type_issues.size
+ nc = type_issues.count_of { |i| i.closed? }
+ pc = 100.0 * (type_issues.empty? ? 1.0 : nc.to_f / num)
+ "%2d/%2d %s" % [nc, num, type.to_s.pluralize(num, false)]
end
- special = if r && r.released?
+ bar = if r && r.released?
"(released)"
- elsif groups.empty?
+ elsif issues.empty?
"(no issues)"
elsif issues.all? { |i| i.closed? }
"(ready for release)"
@@ -192,15 +205,26 @@ EOS
status_bar_for(issues)
end
- middle = groups.map do |(t,g,nc,pc)|
- "%2d/%2d (%3.0f%%) %s" % [nc, g.size, pc, t.to_s.pluralize(g.size, false)]
- end.join(', ')
- printf "%-10s %s %s\n", title, middle, special
+ [title, middle, bar]
end
- if project.releases.empty?
- puts "No releases."
- return
+ title_size = 0
+ middle_sizes = []
+
+ entries.each do |title, middle, bar|
+ title_size = [title_size, title.length].max
+ middle_sizes = middle.zip(middle_sizes).map do |e, s|
+ [s || 0, e.length].max
+ end
+ end
+
+ entries.each do |title, middle, bar|
+ printf "%#{title_size}-s ", title
+ middle.zip(middle_sizes).each_with_index do |(e, s), i|
+ sep = i < middle.size - 1 ? "," : ""
+ printf "%#{s + sep.length}-s ", e + sep
+ end
+ puts bar
end
end
|