jirify 0.1.7 → 0.1.8
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/lib/jirify/cli/issue.rb +1 -1
- data/lib/jirify/cli/project.rb +7 -1
- data/lib/jirify/cli/sprint.rb +11 -2
- data/lib/jirify/models/base_list.rb +13 -0
- data/lib/jirify/models/issue.rb +4 -3
- data/lib/jirify/models/project.rb +0 -5
- data/lib/jirify/models/project_list.rb +27 -0
- data/lib/jirify/models/transition.rb +6 -0
- data/lib/jirify/models/transition_list.rb +4 -6
- data/lib/jirify/ui/sprint_cell.rb +48 -23
- data/lib/jirify/ui/sprint_table.rb +19 -8
- data/lib/jirify/version.rb +1 -1
- data/lib/jirify.rb +4 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fa6f6e12d2dc9625fc0d7feff7a43bc6317bdfa3e65399183520fc1abaaf79a
|
4
|
+
data.tar.gz: e1b7cad8d84ca28e4c4a2f08eabbb37a14fbc519ca6c715e0b4aa075ad24b07b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 315d6b7ad7ec9d2a32f3b25ffb02836d80cb49fdbef0013715e63468bad235b371907ca7ba94bd4bd79f37c53820a32cdd98aa61d4f8ab27fb86e1b31046f4a0
|
7
|
+
data.tar.gz: 743c5029ad03b45ecb4d36a24035db2ba6e34d9163a8983e5db1dd62b37887a99257789e6d0ebea39488c2ea8ddae7c1efba7a42aed6470302242d41358bec42
|
data/lib/jirify/cli/issue.rb
CHANGED
data/lib/jirify/cli/project.rb
CHANGED
@@ -5,7 +5,13 @@ module Jirify
|
|
5
5
|
|
6
6
|
desc 'list', 'List all projects'
|
7
7
|
def list
|
8
|
-
Models::
|
8
|
+
projects = Models::ProjectList.all
|
9
|
+
longest_key = projects.keys.map(&:size).max
|
10
|
+
|
11
|
+
projects.each do |project|
|
12
|
+
key = "#{project.key}:".ljust(longest_key + 1)
|
13
|
+
say "#{key} #{project.name}"
|
14
|
+
end
|
9
15
|
end
|
10
16
|
end
|
11
17
|
end
|
data/lib/jirify/cli/sprint.rb
CHANGED
@@ -2,12 +2,21 @@ module Jirify
|
|
2
2
|
class CLI < Thor
|
3
3
|
desc 'sprint', 'Show the current sprint table'
|
4
4
|
method_option :mine, type: :boolean, aliases: '-m', desc: 'Show only issues assigned to me'
|
5
|
-
method_option :all_columns, type: :boolean, aliases: '-
|
5
|
+
method_option :all_columns, type: :boolean, aliases: '-c', default: true, desc: 'Show all columns'
|
6
|
+
method_option :assignee, type: :boolean, aliases: '-a', desc: 'Show issue assignee'
|
7
|
+
method_option :summary, type: :boolean, aliases: '-s', desc: 'Show issue summary'
|
8
|
+
method_option :url, type: :boolean, aliases: '-u', desc: 'Show issue url'
|
6
9
|
def sprint
|
7
10
|
verbose = Config.always_verbose || options[:verbose]
|
8
11
|
issues = Models::Sprint.issues_in_current_sprint(options[:mine])
|
9
12
|
|
10
|
-
|
13
|
+
duplicate_options = options.dup
|
14
|
+
if verbose
|
15
|
+
duplicate_options[:assignee] = true
|
16
|
+
duplicate_options[:url] = true
|
17
|
+
duplicate_options[:summary] = true
|
18
|
+
end
|
19
|
+
say UI::SprintTable.new(issues).to_table(duplicate_options)
|
11
20
|
rescue UI::WindowTooNarrow
|
12
21
|
say 'ERROR: Your terminal window is too narrow to print the sprint table!'.red
|
13
22
|
end
|
data/lib/jirify/models/issue.rb
CHANGED
@@ -53,12 +53,13 @@ module Jirify
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def to_s(verbose)
|
56
|
-
url = "#{Config.issue_browse_url}#{key}".blue
|
56
|
+
url = ColorizedString["#{Config.issue_browse_url}#{key}"].blue.underline
|
57
|
+
bold_key = ColorizedString["#{key.ljust(7)}:"].bold
|
57
58
|
|
58
59
|
if verbose
|
59
|
-
"#{status.pretty_name} #{
|
60
|
+
"#{status.pretty_name} #{bold_key} #{summary} (#{url})"
|
60
61
|
else
|
61
|
-
"#{
|
62
|
+
"#{bold_key} #{url}"
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Jirify
|
2
|
+
module Models
|
3
|
+
class ProjectList < BaseList
|
4
|
+
def initialize(list)
|
5
|
+
@list = list.map { |project| Project.new project }
|
6
|
+
end
|
7
|
+
|
8
|
+
def find_by_name(name)
|
9
|
+
find { |project| project.name == name }
|
10
|
+
end
|
11
|
+
|
12
|
+
def keys
|
13
|
+
map(&:key)
|
14
|
+
end
|
15
|
+
|
16
|
+
def names
|
17
|
+
map(&:name)
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def all
|
22
|
+
ProjectList.new client.Project.all
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,18 +1,16 @@
|
|
1
1
|
module Jirify
|
2
2
|
module Models
|
3
|
-
class TransitionList <
|
4
|
-
attr_accessor :list
|
5
|
-
|
3
|
+
class TransitionList < BaseList
|
6
4
|
def initialize(list)
|
7
|
-
@list = list
|
5
|
+
@list = list.map { |transition| Transition.new transition }
|
8
6
|
end
|
9
7
|
|
10
8
|
def find_by_name(name)
|
11
|
-
|
9
|
+
find { |transition| transition.name == name }
|
12
10
|
end
|
13
11
|
|
14
12
|
def names
|
15
|
-
|
13
|
+
map(&:name)
|
16
14
|
end
|
17
15
|
|
18
16
|
Config.transitions.keys.each do |transition_name|
|
@@ -10,6 +10,18 @@ module Jirify
|
|
10
10
|
@max_cell_length = max_cell_length
|
11
11
|
end
|
12
12
|
|
13
|
+
def to_s(options)
|
14
|
+
raise UI::WindowTooNarrow, 'The terminal window is too narrow.' if max_cell_length <= key.size
|
15
|
+
|
16
|
+
row = ''
|
17
|
+
row << key_and_summary_lines(options, max_cell_length)
|
18
|
+
row << "\n#{ColorizedString[url].blue.underline}" if display_url?(options)
|
19
|
+
row << assignee_line(max_cell_length) if show_assignee?(options)
|
20
|
+
row
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
13
25
|
def key
|
14
26
|
issue.key
|
15
27
|
end
|
@@ -18,45 +30,58 @@ module Jirify
|
|
18
30
|
issue.summary
|
19
31
|
end
|
20
32
|
|
33
|
+
def show_assignee?(options)
|
34
|
+
options[:assignee] && !options[:mine]
|
35
|
+
end
|
36
|
+
|
37
|
+
def assignee
|
38
|
+
if issue.assignee.nil?
|
39
|
+
'Unassigned'
|
40
|
+
else
|
41
|
+
issue.assignee.displayName
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
21
45
|
def url
|
22
46
|
"#{Config.issue_browse_url}#{issue.key}"
|
23
47
|
end
|
24
48
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
verbose ? to_verbose_cell : to_short_cell
|
49
|
+
def display_url?(options)
|
50
|
+
url.size <= max_cell_length && options[:url]
|
29
51
|
end
|
30
52
|
|
31
|
-
|
53
|
+
def wrap(string, columns, character = "\n")
|
54
|
+
start_pos = columns
|
55
|
+
while start_pos < string.length
|
56
|
+
space = string.rindex(' ', start_pos)
|
57
|
+
string.slice!(space)
|
58
|
+
string.insert(space, character)
|
59
|
+
start_pos = space + columns + 1
|
60
|
+
end
|
32
61
|
|
33
|
-
|
34
|
-
url.size <= max_cell_length
|
62
|
+
string
|
35
63
|
end
|
36
64
|
|
37
|
-
def
|
38
|
-
|
65
|
+
def key_and_summary_lines(options, max_cell_length)
|
66
|
+
bold_key = ColorizedString[key].bold
|
67
|
+
return bold_key unless options[:summary]
|
68
|
+
|
69
|
+
key_and_summary = "#{bold_key}: #{summary}"
|
39
70
|
|
40
71
|
if key_and_summary.size <= max_cell_length
|
41
|
-
|
72
|
+
key_and_summary
|
42
73
|
else
|
43
|
-
row = "#{
|
74
|
+
row = "#{bold_key}\n"
|
75
|
+
row << wrap(summary.strip, max_cell_length)
|
76
|
+
row
|
44
77
|
end
|
45
|
-
|
46
|
-
row << "\n#{url.blue}" if display_url?
|
47
|
-
row
|
48
78
|
end
|
49
79
|
|
50
|
-
def
|
51
|
-
|
52
|
-
|
53
|
-
single_row = "#{key}: #{url}"
|
80
|
+
def assignee_line(max_cell_length)
|
81
|
+
assignee_line = assignee
|
82
|
+
assignee_line = "#{assignee[0...max_cell_length - 3]}..." if assignee_line.size >= max_cell_length
|
54
83
|
|
55
|
-
|
56
|
-
"#{key}: #{url.blue}"
|
57
|
-
else
|
58
|
-
"#{key}\n#{url.blue}"
|
59
|
-
end
|
84
|
+
"\n#{assignee_line.magenta}"
|
60
85
|
end
|
61
86
|
end
|
62
87
|
end
|
@@ -9,12 +9,12 @@ module Jirify
|
|
9
9
|
@issues = issues
|
10
10
|
end
|
11
11
|
|
12
|
-
def to_table(
|
12
|
+
def to_table(options)
|
13
13
|
grouped_issues = issues.group_by do |issue|
|
14
|
-
all_columns ? issue.status.name : issue.status.statusCategory['name']
|
14
|
+
options[:all_columns] ? issue.status.name : issue.status.statusCategory['name']
|
15
15
|
end
|
16
16
|
|
17
|
-
grouped_issues_as_table(grouped_issues,
|
17
|
+
grouped_issues_as_table(grouped_issues, options)
|
18
18
|
end
|
19
19
|
|
20
20
|
protected
|
@@ -28,7 +28,7 @@ module Jirify
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def headings(grouped_issues)
|
31
|
-
grouped_issues.keys.sort_by do |name|
|
31
|
+
sorted_headings = grouped_issues.keys.sort_by do |name|
|
32
32
|
status_index = Models::Status.status_order.index(name)
|
33
33
|
if status_index.nil?
|
34
34
|
grouped_issues.keys.length
|
@@ -36,10 +36,21 @@ module Jirify
|
|
36
36
|
status_index
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
sorted_headings.map! do |name|
|
41
|
+
case name
|
42
|
+
when Config.statuses['todo'] then ColorizedString[name].white.on_black.bold
|
43
|
+
when Config.statuses['in_progress'] then ColorizedString[name].white.on_blue.bold
|
44
|
+
when Config.statuses['in_review'] then ColorizedString[name].white.on_yellow.bold
|
45
|
+
when Config.statuses['blocked'] then ColorizedString[name].white.on_red.bold
|
46
|
+
when Config.statuses['done'] then ColorizedString[name].white.on_green.bold
|
47
|
+
else ColorizedString[name].white.on_green.bold
|
48
|
+
end
|
49
|
+
end
|
39
50
|
end
|
40
51
|
|
41
|
-
def grouped_issues_as_table(grouped_issues,
|
42
|
-
transposed = transpose(grouped_issues.values,
|
52
|
+
def grouped_issues_as_table(grouped_issues, options)
|
53
|
+
transposed = transpose(grouped_issues.values, options)
|
43
54
|
return nil if transposed.empty?
|
44
55
|
|
45
56
|
Terminal::Table.new(
|
@@ -49,7 +60,7 @@ module Jirify
|
|
49
60
|
)
|
50
61
|
end
|
51
62
|
|
52
|
-
def transpose(grouped_issues,
|
63
|
+
def transpose(grouped_issues, options)
|
53
64
|
col_padding_per_row = grouped_issues.size * 4
|
54
65
|
max_cell_length = (terminal_width - col_padding_per_row) / grouped_issues.size
|
55
66
|
|
@@ -67,7 +78,7 @@ module Jirify
|
|
67
78
|
transposed.map! do |row|
|
68
79
|
row.map do |issue|
|
69
80
|
next if issue.nil?
|
70
|
-
SprintCell.new(issue, max_cell_length).to_s(
|
81
|
+
SprintCell.new(issue, max_cell_length).to_s(options)
|
71
82
|
end
|
72
83
|
end
|
73
84
|
|
data/lib/jirify/version.rb
CHANGED
data/lib/jirify.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
1
|
require 'jira-ruby'
|
2
2
|
require 'thor'
|
3
3
|
require 'colorize'
|
4
|
+
require 'colorized_string'
|
4
5
|
|
5
6
|
require 'jirify/version'
|
6
7
|
require 'jirify/config'
|
7
8
|
require 'jirify/monkey_patches/jira_issue'
|
8
9
|
|
9
10
|
require 'jirify/models/base'
|
11
|
+
require 'jirify/models/base_list'
|
10
12
|
require 'jirify/models/status'
|
13
|
+
require 'jirify/models/transition'
|
11
14
|
require 'jirify/models/transition_list'
|
12
15
|
require 'jirify/models/issue'
|
13
16
|
require 'jirify/models/sprint'
|
14
17
|
require 'jirify/models/project'
|
18
|
+
require 'jirify/models/project_list'
|
15
19
|
|
16
20
|
require 'jirify/ui/sprint_cell'
|
17
21
|
require 'jirify/ui/sprint_table'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jirify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Georgi Gardev
|
@@ -271,10 +271,13 @@ files:
|
|
271
271
|
- lib/jirify/cli/sprint.rb
|
272
272
|
- lib/jirify/config.rb
|
273
273
|
- lib/jirify/models/base.rb
|
274
|
+
- lib/jirify/models/base_list.rb
|
274
275
|
- lib/jirify/models/issue.rb
|
275
276
|
- lib/jirify/models/project.rb
|
277
|
+
- lib/jirify/models/project_list.rb
|
276
278
|
- lib/jirify/models/sprint.rb
|
277
279
|
- lib/jirify/models/status.rb
|
280
|
+
- lib/jirify/models/transition.rb
|
278
281
|
- lib/jirify/models/transition_list.rb
|
279
282
|
- lib/jirify/monkey_patches/jira_issue.rb
|
280
283
|
- lib/jirify/ui/sprint_cell.rb
|