jira-cli 0.3.3 → 0.3.4
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/README.md +1 -0
- data/lib/jira/command.rb +2 -2
- data/lib/jira/commands/assign.rb +6 -4
- data/lib/jira/commands/attachments.rb +1 -1
- data/lib/jira/commands/checkout.rb +87 -0
- data/lib/jira/commands/comment/add.rb +11 -5
- data/lib/jira/commands/log/add.rb +6 -4
- data/lib/jira/commands/new.rb +35 -13
- data/lib/jira/commands/rename.rb +6 -4
- data/lib/jira/commands/transition.rb +7 -5
- data/lib/jira/constants.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98c9095d9dabba5b2edb2df0aba0d887448af1df
|
4
|
+
data.tar.gz: dd2ebf4eb6bfcead3fa14b3f1e810c055f29a212
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 702a29b1122007deb53f149417ff354fcfc9b21c38ecec14d365a22380a277e00fd3ebcdaa7f7380d64867eab74f5ba02e7a809d36db85dd5b32261ac649f945
|
7
|
+
data.tar.gz: ddb3495e48300b0e7c09d60ad30b5008829ee414b615f612aa070c7bed1d2dbfd5188788b11527613c76f8cfbf3b5f47072a961faa81c6c3c0a87caf6dc60c15
|
data/README.md
CHANGED
@@ -13,6 +13,7 @@ Ruby gem CLI tool used to manage JIRA workflows leveraging git
|
|
13
13
|
jira all # Describes all local branches that match JIRA ticketing syntax
|
14
14
|
jira assign # Assign a ticket to a user
|
15
15
|
jira attachments # View ticket attachments
|
16
|
+
jira checkout <ticket> # Checks out a ticket from JIRA in the git branch
|
16
17
|
jira comment <command> # Commands for comment operations in JIRA
|
17
18
|
jira delete # Deletes a ticket in JIRA and the git branch
|
18
19
|
jira describe # Describes the input ticket
|
data/lib/jira/command.rb
CHANGED
@@ -26,9 +26,9 @@ module Jira
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# TODO: Move this to relevant subcommand Base
|
29
|
-
def body
|
29
|
+
def body(text=nil)
|
30
30
|
@body ||= (
|
31
|
-
comment = io.ask("Leave a comment for ticket #{ticket}:", default: 'Empty comment').strip
|
31
|
+
comment = text || io.ask("Leave a comment for ticket #{ticket}:", default: 'Empty comment').strip
|
32
32
|
comment = comment.gsub(/\@[a-zA-Z]+/, '[~\0]') || comment
|
33
33
|
comment.gsub('[~@', '[~') || comment
|
34
34
|
)
|
data/lib/jira/commands/assign.rb
CHANGED
@@ -2,8 +2,9 @@ module Jira
|
|
2
2
|
class CLI < Thor
|
3
3
|
|
4
4
|
desc "assign", "Assign a ticket to a user"
|
5
|
+
method_option :assignee, aliases: "-a", type: :string, default: nil, lazy_default: "auto", banner: "ASSIGNEE"
|
5
6
|
def assign(ticket=Jira::Core.ticket)
|
6
|
-
Command::Assign.new(ticket).run
|
7
|
+
Command::Assign.new(ticket, options).run
|
7
8
|
end
|
8
9
|
|
9
10
|
end
|
@@ -11,10 +12,11 @@ module Jira
|
|
11
12
|
module Command
|
12
13
|
class Assign < Base
|
13
14
|
|
14
|
-
attr_accessor :ticket
|
15
|
+
attr_accessor :ticket, :options
|
15
16
|
|
16
|
-
def initialize(ticket)
|
17
|
+
def initialize(ticket, options={})
|
17
18
|
self.ticket = ticket
|
19
|
+
self.options = options
|
18
20
|
end
|
19
21
|
|
20
22
|
def run
|
@@ -53,7 +55,7 @@ module Jira
|
|
53
55
|
|
54
56
|
def assignee
|
55
57
|
@assignee ||= (
|
56
|
-
assignee = io.ask('Assignee?', default: 'auto')
|
58
|
+
assignee = options['assignee'] || io.ask('Assignee?', default: 'auto')
|
57
59
|
assignee == 'auto' ? '-1' : assignee
|
58
60
|
)
|
59
61
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Jira
|
2
|
+
class CLI < Thor
|
3
|
+
|
4
|
+
desc "checkout <ticket>", "Checks out a ticket from JIRA in the git branch"
|
5
|
+
method_option :remote, aliases: "-r", type: :string, default: nil, lazy_default: "", banner: "REMOTE"
|
6
|
+
def checkout(ticket)
|
7
|
+
Command::Checkout.new(ticket, options).run
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
module Command
|
13
|
+
class Checkout < Base
|
14
|
+
|
15
|
+
attr_accessor :ticket, :options
|
16
|
+
|
17
|
+
def initialize(ticket, options)
|
18
|
+
self.ticket = ticket
|
19
|
+
self.options = options
|
20
|
+
end
|
21
|
+
|
22
|
+
def run
|
23
|
+
return unless Jira::Core.ticket?(ticket)
|
24
|
+
return if metadata.empty?
|
25
|
+
unless metadata['errorMessages'].nil?
|
26
|
+
on_failure
|
27
|
+
return
|
28
|
+
end
|
29
|
+
unless remote?
|
30
|
+
on_failure
|
31
|
+
return
|
32
|
+
end
|
33
|
+
|
34
|
+
create_branch unless branches.include?(ticket)
|
35
|
+
checkout_branch
|
36
|
+
reset_branch unless branches.include?(ticket)
|
37
|
+
on_success
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def on_success
|
43
|
+
puts "Ticket #{ticket} checked out."
|
44
|
+
end
|
45
|
+
|
46
|
+
def on_failure
|
47
|
+
puts "No ticket checked out."
|
48
|
+
end
|
49
|
+
|
50
|
+
def branches
|
51
|
+
@branches ||= `git branch --list 2> /dev/null`.split(' ')
|
52
|
+
@branches.delete("*")
|
53
|
+
@branches
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_branch
|
57
|
+
`git branch #{ticket} 2> /dev/null`
|
58
|
+
end
|
59
|
+
|
60
|
+
def checkout_branch
|
61
|
+
`git checkout #{ticket} 2> /dev/null`
|
62
|
+
end
|
63
|
+
|
64
|
+
def metadata
|
65
|
+
@metadata ||= api.get("issue/#{ticket}")
|
66
|
+
end
|
67
|
+
|
68
|
+
def remote
|
69
|
+
@remote ||= options['remote'] || io.select('Remote?', remotes)
|
70
|
+
end
|
71
|
+
|
72
|
+
def remotes
|
73
|
+
@remotes ||= `git remote 2> /dev/null`.split(' ')
|
74
|
+
end
|
75
|
+
|
76
|
+
def remote?
|
77
|
+
return true if remotes.include?(remote)
|
78
|
+
false
|
79
|
+
end
|
80
|
+
|
81
|
+
def reset_branch
|
82
|
+
`git reset --hard #{remote} 2> /dev/null`
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -2,8 +2,9 @@ module Jira
|
|
2
2
|
class Comment < Thor
|
3
3
|
|
4
4
|
desc 'add', 'Add a comment to the input ticket'
|
5
|
+
method_option :text, aliases: "-t", type: :string, default: nil, lazy_default: "", banner: "TEXT"
|
5
6
|
def add(ticket=Jira::Core.ticket)
|
6
|
-
Command::Comment::Add.new(ticket).run
|
7
|
+
Command::Comment::Add.new(ticket, options).run
|
7
8
|
end
|
8
9
|
|
9
10
|
end
|
@@ -12,14 +13,15 @@ module Jira
|
|
12
13
|
module Comment
|
13
14
|
class Add < Base
|
14
15
|
|
15
|
-
attr_accessor :ticket
|
16
|
+
attr_accessor :ticket, :options
|
16
17
|
|
17
|
-
def initialize(ticket)
|
18
|
+
def initialize(ticket, options)
|
18
19
|
self.ticket = ticket
|
20
|
+
self.options = options
|
19
21
|
end
|
20
22
|
|
21
23
|
def run
|
22
|
-
return if
|
24
|
+
return if text.empty?
|
23
25
|
api.post "issue/#{ticket}/comment",
|
24
26
|
params: params,
|
25
27
|
success: on_success,
|
@@ -29,7 +31,11 @@ module Jira
|
|
29
31
|
private
|
30
32
|
|
31
33
|
def params
|
32
|
-
{ body:
|
34
|
+
{ body: text }
|
35
|
+
end
|
36
|
+
|
37
|
+
def text
|
38
|
+
body(options['text'])
|
33
39
|
end
|
34
40
|
|
35
41
|
def on_success
|
@@ -2,8 +2,9 @@ module Jira
|
|
2
2
|
class Log < Thor
|
3
3
|
|
4
4
|
desc 'add', 'Logs work against the input ticket'
|
5
|
+
method_option :time, aliases: "-t", type: :string, default: nil, lazy_default: "", banner: "TIME"
|
5
6
|
def add(ticket=Jira::Core.ticket)
|
6
|
-
Command::Log::Add.new(ticket).run
|
7
|
+
Command::Log::Add.new(ticket, options).run
|
7
8
|
end
|
8
9
|
|
9
10
|
end
|
@@ -12,10 +13,11 @@ module Jira
|
|
12
13
|
module Log
|
13
14
|
class Add < Base
|
14
15
|
|
15
|
-
attr_accessor :ticket
|
16
|
+
attr_accessor :ticket, :options
|
16
17
|
|
17
|
-
def initialize(ticket)
|
18
|
+
def initialize(ticket, options)
|
18
19
|
self.ticket = ticket
|
20
|
+
self.options = options
|
19
21
|
end
|
20
22
|
|
21
23
|
def run
|
@@ -33,7 +35,7 @@ module Jira
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def time_spent
|
36
|
-
@time_spent ||= io.ask("Time spent on ticket #{ticket}:")
|
38
|
+
@time_spent ||= options['time'] || io.ask("Time spent on ticket #{ticket}:")
|
37
39
|
end
|
38
40
|
|
39
41
|
def on_success
|
data/lib/jira/commands/new.rb
CHANGED
@@ -2,8 +2,15 @@ module Jira
|
|
2
2
|
class CLI < Thor
|
3
3
|
|
4
4
|
desc "new", "Creates a new ticket in JIRA and checks out the git branch"
|
5
|
+
method_option :project, aliases: "-p", type: :string, default: nil, banner: "PROJECT"
|
6
|
+
method_option :components, aliases: "-c", type: :array, default: nil, lazy_default: [], banner: "COMPONENTS"
|
7
|
+
method_option :issuetype, aliases: "-i", type: :string, default: nil, banner: "ISSUETYPE"
|
8
|
+
method_option :parent, type: :string, default: nil, lazy_default: "", banner: "PARENT"
|
9
|
+
method_option :summary, aliases: "-s", type: :string, default: nil, banner: "SUMMARY"
|
10
|
+
method_option :description, aliases: "-d", type: :string, default: nil, lazy_default: "", banner: "DESCRIPTION"
|
11
|
+
method_option :assignee, aliases: "-a", type: :string, default: nil, lazy_default: "auto", banner: "ASSIGNEE"
|
5
12
|
def new
|
6
|
-
Command::New.new.run
|
13
|
+
Command::New.new(options).run
|
7
14
|
end
|
8
15
|
|
9
16
|
end
|
@@ -11,12 +18,18 @@ module Jira
|
|
11
18
|
module Command
|
12
19
|
class New < Base
|
13
20
|
|
21
|
+
attr_accessor :options
|
22
|
+
|
23
|
+
def initialize(options)
|
24
|
+
self.options = options
|
25
|
+
end
|
26
|
+
|
14
27
|
def run
|
15
28
|
return if metadata.empty?
|
16
|
-
return if project.empty?
|
29
|
+
return if project.nil? || project.empty?
|
17
30
|
return if project_metadata.empty?
|
18
31
|
components # Select components if any after a project
|
19
|
-
return if issue_type.empty?
|
32
|
+
return if issue_type.nil? || issue_type.empty?
|
20
33
|
return if assign_parent? && parent.empty?
|
21
34
|
return if summary.empty?
|
22
35
|
|
@@ -47,13 +60,13 @@ module Jira
|
|
47
60
|
->(json) do
|
48
61
|
self.ticket = json['key']
|
49
62
|
io.say("Ticket #{ticket} created.")
|
50
|
-
assign?
|
51
|
-
create_branch? && checkout_branch?
|
63
|
+
assign? if options.empty? || !options['assignee'].nil?
|
64
|
+
create_branch? && checkout_branch? if options.empty?
|
52
65
|
end
|
53
66
|
end
|
54
67
|
|
55
68
|
def assign?
|
56
|
-
Command::Assign.new(ticket).run if io.yes?('Assign?')
|
69
|
+
Command::Assign.new(ticket, options).run if !options['assignee'].nil? || io.yes?('Assign?')
|
57
70
|
end
|
58
71
|
|
59
72
|
def create_branch?
|
@@ -79,7 +92,7 @@ module Jira
|
|
79
92
|
|
80
93
|
def project
|
81
94
|
@project ||= projects[
|
82
|
-
io.select("Select a project:", projects.keys)
|
95
|
+
options['project'] || io.select("Select a project:", projects.keys)
|
83
96
|
]
|
84
97
|
end
|
85
98
|
|
@@ -108,24 +121,30 @@ module Jira
|
|
108
121
|
components[component['name']] = { 'id' => component['id'] }
|
109
122
|
end
|
110
123
|
unless components.empty?
|
111
|
-
|
124
|
+
if options['components'].nil?
|
125
|
+
components = io.multi_select("Select component(s):", components)
|
126
|
+
else
|
127
|
+
components.select! { |k| options['components'].include?(k) }
|
128
|
+
components = components.values
|
129
|
+
end
|
112
130
|
end
|
131
|
+
components.to_a
|
113
132
|
)
|
114
133
|
end
|
115
134
|
|
116
135
|
def assign_parent?
|
117
136
|
return false unless issue_type['subtask']
|
118
|
-
return false if io.no?('Set parent of subtask?')
|
137
|
+
return false if options['parent'].nil? && io.no?('Set parent of subtask?')
|
119
138
|
true
|
120
139
|
end
|
121
140
|
|
122
141
|
def parent
|
123
|
-
@parent ||= io.ask('Subtask parent:', default: Jira::Core.ticket)
|
142
|
+
@parent ||= options['parent'] || io.ask('Subtask parent:', default: Jira::Core.ticket)
|
124
143
|
end
|
125
144
|
|
126
145
|
def issue_type
|
127
146
|
@issue_type ||= issue_types[
|
128
|
-
|
147
|
+
options['issuetype'] || io.select("Select an issue type:", issue_types.keys)
|
129
148
|
]
|
130
149
|
end
|
131
150
|
|
@@ -140,11 +159,14 @@ module Jira
|
|
140
159
|
end
|
141
160
|
|
142
161
|
def summary
|
143
|
-
@summary ||= io.ask("Summary:", default: '')
|
162
|
+
@summary ||= options['summary'] || io.ask("Summary:", default: '')
|
144
163
|
end
|
145
164
|
|
146
165
|
def description
|
147
|
-
@description ||=
|
166
|
+
@description ||= (
|
167
|
+
description = options['description'] || (io.ask("Description:", default: '') if options['summary'].nil?)
|
168
|
+
description ||= ""
|
169
|
+
)
|
148
170
|
end
|
149
171
|
|
150
172
|
end
|
data/lib/jira/commands/rename.rb
CHANGED
@@ -2,8 +2,9 @@ module Jira
|
|
2
2
|
class CLI < Thor
|
3
3
|
|
4
4
|
desc "rename", "Updates the summary of the input ticket"
|
5
|
+
method_option :summary, aliases: "-s", type: :string, default: nil, lazy_default: "", banner: "SUMMARY"
|
5
6
|
def rename(ticket=Jira::Core.ticket)
|
6
|
-
Command::Rename.new(ticket).run
|
7
|
+
Command::Rename.new(ticket, options).run
|
7
8
|
end
|
8
9
|
|
9
10
|
end
|
@@ -11,10 +12,11 @@ module Jira
|
|
11
12
|
module Command
|
12
13
|
class Rename < Base
|
13
14
|
|
14
|
-
attr_accessor :ticket
|
15
|
+
attr_accessor :ticket, :options
|
15
16
|
|
16
|
-
def initialize(ticket)
|
17
|
+
def initialize(ticket, options)
|
17
18
|
self.ticket = ticket
|
19
|
+
self.options = options
|
18
20
|
end
|
19
21
|
|
20
22
|
def run
|
@@ -43,7 +45,7 @@ module Jira
|
|
43
45
|
end
|
44
46
|
|
45
47
|
def summary
|
46
|
-
@summary ||= io.ask("New summary for ticket #{ticket}:", default: '')
|
48
|
+
@summary ||= options['summary'] || io.ask("New summary for ticket #{ticket}:", default: '')
|
47
49
|
end
|
48
50
|
|
49
51
|
end
|
@@ -2,8 +2,9 @@ module Jira
|
|
2
2
|
class CLI < Thor
|
3
3
|
|
4
4
|
desc "transition", "Transitions the input ticket to the next state"
|
5
|
+
method_option :transition, aliases: "-t", type: :string, default: nil, lazy_default: "", banner: "TRANSITION"
|
5
6
|
def transition(ticket=Jira::Core.ticket)
|
6
|
-
Command::Transition.new(ticket).run
|
7
|
+
Command::Transition.new(ticket, options).run
|
7
8
|
end
|
8
9
|
|
9
10
|
end
|
@@ -11,17 +12,18 @@ module Jira
|
|
11
12
|
module Command
|
12
13
|
class Transition < Base
|
13
14
|
|
14
|
-
attr_accessor :ticket
|
15
|
+
attr_accessor :ticket, :options
|
15
16
|
|
16
|
-
def initialize(ticket)
|
17
|
+
def initialize(ticket, options)
|
17
18
|
self.ticket = ticket
|
19
|
+
self.options = options
|
18
20
|
end
|
19
21
|
|
20
22
|
def run
|
21
23
|
return if ticket.empty?
|
22
24
|
return if metadata.empty?
|
23
25
|
return unless metadata['errorMessages'].nil?
|
24
|
-
return if transition.empty?
|
26
|
+
return if transition.nil? || transition.empty?
|
25
27
|
api.post "issue/#{ticket}/transitions",
|
26
28
|
params: params,
|
27
29
|
success: on_success,
|
@@ -48,7 +50,7 @@ module Jira
|
|
48
50
|
|
49
51
|
def transition
|
50
52
|
@transition ||= transitions[
|
51
|
-
io.select("Transition #{ticket} to:", transitions.keys)
|
53
|
+
options['transition'] || io.select("Transition #{ticket} to:", transitions.keys)
|
52
54
|
]
|
53
55
|
end
|
54
56
|
|
data/lib/jira/constants.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jira-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darren Cheng
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -140,6 +140,7 @@ files:
|
|
140
140
|
- lib/jira/commands/all.rb
|
141
141
|
- lib/jira/commands/assign.rb
|
142
142
|
- lib/jira/commands/attachments.rb
|
143
|
+
- lib/jira/commands/checkout.rb
|
143
144
|
- lib/jira/commands/comment.rb
|
144
145
|
- lib/jira/commands/comment/add.rb
|
145
146
|
- lib/jira/commands/comment/delete.rb
|