jira-cli 0.2.2 → 0.3.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/README.md +18 -28
- data/bin/jira +3 -1
- data/lib/jira.rb +12 -6
- data/lib/jira/api.rb +10 -5
- data/lib/jira/auth_api.rb +11 -0
- data/lib/jira/command.rb +21 -1
- data/lib/jira/commands/all.rb +2 -2
- data/lib/jira/commands/assign.rb +2 -2
- data/lib/jira/commands/comment.rb +8 -98
- data/lib/jira/commands/comment/add.rb +46 -0
- data/lib/jira/commands/comment/delete.rb +80 -0
- data/lib/jira/commands/comment/list.rb +69 -0
- data/lib/jira/commands/comment/update.rb +88 -0
- data/lib/jira/commands/delete.rb +0 -2
- data/lib/jira/commands/describe.rb +0 -2
- data/lib/jira/commands/install.rb +39 -17
- data/lib/jira/commands/link.rb +4 -3
- data/lib/jira/commands/log.rb +7 -72
- data/lib/jira/commands/log/add.rb +50 -0
- data/lib/jira/commands/log/delete.rb +80 -0
- data/lib/jira/commands/log/list.rb +69 -0
- data/lib/jira/commands/log/update.rb +89 -0
- data/lib/jira/commands/new.rb +4 -6
- data/lib/jira/commands/rename.rb +0 -2
- data/lib/jira/commands/sprint.rb +3 -3
- data/lib/jira/commands/tickets.rb +0 -2
- data/lib/jira/commands/transition.rb +0 -2
- data/lib/jira/commands/vote.rb +5 -107
- data/lib/jira/commands/vote/add.rb +43 -0
- data/lib/jira/commands/vote/delete.rb +46 -0
- data/lib/jira/commands/vote/list.rb +59 -0
- data/lib/jira/commands/watch.rb +5 -108
- data/lib/jira/commands/watch/add.rb +43 -0
- data/lib/jira/commands/watch/delete.rb +46 -0
- data/lib/jira/commands/watch/list.rb +59 -0
- data/lib/jira/constants.rb +1 -1
- data/lib/jira/core.rb +9 -1
- data/lib/jira/sprint_api.rb +2 -18
- metadata +17 -5
- data/lib/jira/commands/commit.rb +0 -14
- data/lib/jira/legacy_api.rb +0 -102
- data/lib/jira/mixins.rb +0 -56
data/lib/jira/commands/watch.rb
CHANGED
@@ -1,115 +1,12 @@
|
|
1
|
-
|
1
|
+
require 'jira/commands/watch/add'
|
2
|
+
require 'jira/commands/watch/delete'
|
3
|
+
require 'jira/commands/watch/list'
|
2
4
|
|
3
5
|
module Jira
|
4
6
|
class CLI < Thor
|
5
7
|
|
6
|
-
desc
|
7
|
-
|
8
|
-
Command::Watch.new(ticket).run
|
9
|
-
end
|
8
|
+
desc 'watch <command>', 'Commands for watching tickets in JIRA'
|
9
|
+
subcommand 'watch', Watch
|
10
10
|
|
11
|
-
desc "watchers", "List the watchers of the input ticket"
|
12
|
-
def watchers(ticket=Jira::Core.ticket)
|
13
|
-
Command::Watchers.new(ticket).run
|
14
|
-
end
|
15
|
-
|
16
|
-
desc "unwatch", "Unwatch against the input ticket"
|
17
|
-
def unwatch(ticket=Jira::Core.ticket)
|
18
|
-
Command::Unwatch.new(ticket).run
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
module Command
|
24
|
-
class Watch < Base
|
25
|
-
|
26
|
-
attr_accessor :ticket
|
27
|
-
|
28
|
-
def initialize(ticket)
|
29
|
-
self.ticket = ticket
|
30
|
-
end
|
31
|
-
|
32
|
-
def run
|
33
|
-
return if ticket.empty?
|
34
|
-
|
35
|
-
api.post "issue/#{ticket}/watchers",
|
36
|
-
params: Jira::Core.username,
|
37
|
-
success: on_success,
|
38
|
-
failure: on_failure
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def on_success
|
44
|
-
->{ puts "Now watching ticket #{ticket}" }
|
45
|
-
end
|
46
|
-
|
47
|
-
def on_failure
|
48
|
-
->{ puts "No watch." }
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
class Watchers < Base
|
55
|
-
|
56
|
-
attr_accessor :ticket
|
57
|
-
|
58
|
-
def initialize(ticket)
|
59
|
-
self.ticket = ticket
|
60
|
-
end
|
61
|
-
|
62
|
-
def run
|
63
|
-
return if ticket.empty?
|
64
|
-
return if metadata.empty?
|
65
|
-
|
66
|
-
watchers = metadata['watchers']
|
67
|
-
if !watchers.nil? and watchers.count > 0
|
68
|
-
watchers.each do |watcher|
|
69
|
-
displayName = watcher['displayName']
|
70
|
-
|
71
|
-
printf "[%2d]", watchers.index(watcher)
|
72
|
-
puts " #{Jira::Format.user(displayName)}"
|
73
|
-
end
|
74
|
-
else
|
75
|
-
puts "There are no watchers on ticket #{ticket}."
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
|
81
|
-
def metadata
|
82
|
-
@metadata ||= api.get("issue/#{ticket}/watchers")
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
class Unwatch < Base
|
87
|
-
|
88
|
-
attr_accessor :ticket
|
89
|
-
|
90
|
-
def initialize(ticket)
|
91
|
-
self.ticket = ticket
|
92
|
-
end
|
93
|
-
|
94
|
-
def run
|
95
|
-
return if ticket.empty?
|
96
|
-
|
97
|
-
username = Jira::Core.username
|
98
|
-
api.delete "issue/#{ticket}/watchers?username=#{username}",
|
99
|
-
success: on_success,
|
100
|
-
failure: on_failure
|
101
|
-
end
|
102
|
-
|
103
|
-
private
|
104
|
-
|
105
|
-
def on_success
|
106
|
-
->{ puts "Stopped watching ticket #{ticket}" }
|
107
|
-
end
|
108
|
-
|
109
|
-
def on_failure
|
110
|
-
->{ puts "No unwatch." }
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
114
11
|
end
|
115
12
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Jira
|
2
|
+
class Watch < Thor
|
3
|
+
|
4
|
+
desc 'add', 'Watch the input ticket'
|
5
|
+
def add(ticket=Jira::Core.ticket)
|
6
|
+
Command::Watch::Add.new(ticket).run
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
module Command
|
12
|
+
module Watch
|
13
|
+
class Add < Base
|
14
|
+
|
15
|
+
attr_accessor :ticket
|
16
|
+
|
17
|
+
def initialize(ticket)
|
18
|
+
self.ticket = ticket
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
return if ticket.empty?
|
23
|
+
|
24
|
+
api.post "issue/#{ticket}/watchers",
|
25
|
+
params: "\"#{Jira::Core.username}\"",
|
26
|
+
success: on_success,
|
27
|
+
failure: on_failure
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def on_success
|
33
|
+
->{ puts "Now watching ticket #{ticket}" }
|
34
|
+
end
|
35
|
+
|
36
|
+
def on_failure
|
37
|
+
->{ puts "No watch." }
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Jira
|
2
|
+
class Watch < Thor
|
3
|
+
|
4
|
+
desc 'delete', 'Stop watching the input ticket'
|
5
|
+
def delete(ticket=Jira::Core.ticket)
|
6
|
+
Command::Watch::Delete.new(ticket).run
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
module Command
|
12
|
+
module Watch
|
13
|
+
class Delete < Base
|
14
|
+
|
15
|
+
attr_accessor :ticket
|
16
|
+
|
17
|
+
def initialize(ticket)
|
18
|
+
self.ticket = ticket
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
return if ticket.empty?
|
23
|
+
|
24
|
+
api.delete endpoint,
|
25
|
+
success: on_success,
|
26
|
+
failure: on_failure
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def endpoint
|
32
|
+
"issue/#{ticket}/watchers?username=#{Jira::Core.username}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def on_success
|
36
|
+
->{ puts "Stopped watching ticket #{ticket}" }
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_failure
|
40
|
+
->{ puts "Did not stop watching ticket." }
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Jira
|
2
|
+
class Watch < Thor
|
3
|
+
|
4
|
+
desc 'list', 'Lists the watchers of the input ticket'
|
5
|
+
def list(ticket=Jira::Core.ticket)
|
6
|
+
Command::Watch::List.new(ticket).run
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
module Command
|
12
|
+
module Watch
|
13
|
+
class List < Base
|
14
|
+
|
15
|
+
attr_accessor :ticket
|
16
|
+
|
17
|
+
def initialize(ticket)
|
18
|
+
self.ticket = ticket
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
return if ticket.empty?
|
23
|
+
return if watchers.nil?
|
24
|
+
return if no_watchers?
|
25
|
+
|
26
|
+
watchers.each do |watcher|
|
27
|
+
self.watcher = watcher
|
28
|
+
display_watcher
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_accessor :watcher
|
35
|
+
|
36
|
+
def no_watchers?
|
37
|
+
if watchers.count == 0
|
38
|
+
puts "Ticket #{ticket} has no watchers."
|
39
|
+
return true
|
40
|
+
end
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
def display_watcher
|
45
|
+
puts "[#{watchers.index(watcher).to_s.rjust(2)}] #{display_name}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def display_name
|
49
|
+
Jira::Format.user(watcher['displayName'])
|
50
|
+
end
|
51
|
+
|
52
|
+
def watchers
|
53
|
+
@watchers ||= api.get("issue/#{ticket}/watchers")['watchers']
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/jira/constants.rb
CHANGED
data/lib/jira/core.rb
CHANGED
@@ -27,7 +27,15 @@ module Jira
|
|
27
27
|
# @return [String] JIRA token
|
28
28
|
#
|
29
29
|
def token
|
30
|
-
@token ||= ENV['JIRA_TOKEN'] ||
|
30
|
+
@token ||= ENV['JIRA_TOKEN'] || config[:global]['token']
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# @return [Hash] JIRA cookie
|
35
|
+
#
|
36
|
+
def cookie
|
37
|
+
return {} if config[:cookie].nil? || config[:cookie].empty?
|
38
|
+
{ name: config[:cookie]['name'], value: config[:cookie]['value'] }
|
31
39
|
end
|
32
40
|
|
33
41
|
#
|
data/lib/jira/sprint_api.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'faraday_middleware'
|
3
|
-
|
4
1
|
module Jira
|
5
|
-
class SprintAPI
|
2
|
+
class SprintAPI < API
|
6
3
|
|
7
4
|
def sprint(rapid_view_id, sprint_id)
|
8
5
|
response = client.get(
|
@@ -26,24 +23,11 @@ module Jira
|
|
26
23
|
[]
|
27
24
|
end
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
def client
|
32
|
-
@client ||= Faraday.new(endpoint) do |faraday|
|
33
|
-
faraday.request :basic_auth, Jira::Core.username, Jira::Core.password
|
34
|
-
faraday.request :json
|
35
|
-
faraday.response :json
|
36
|
-
faraday.adapter :net_http
|
37
|
-
end
|
38
|
-
end
|
26
|
+
protected
|
39
27
|
|
40
28
|
def endpoint
|
41
29
|
"#{Jira::Core.url}/rest/greenhopper/latest"
|
42
30
|
end
|
43
31
|
|
44
|
-
def headers
|
45
|
-
{ 'Content-Type' => 'application/json' }
|
46
|
-
end
|
47
|
-
|
48
32
|
end
|
49
33
|
end
|
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.
|
4
|
+
version: 0.3.0
|
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-
|
11
|
+
date: 2016-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -149,17 +149,25 @@ files:
|
|
149
149
|
- bin/jira
|
150
150
|
- lib/jira.rb
|
151
151
|
- lib/jira/api.rb
|
152
|
+
- lib/jira/auth_api.rb
|
152
153
|
- lib/jira/command.rb
|
153
154
|
- lib/jira/commands/all.rb
|
154
155
|
- lib/jira/commands/assign.rb
|
155
156
|
- lib/jira/commands/attachments.rb
|
156
157
|
- lib/jira/commands/comment.rb
|
157
|
-
- lib/jira/commands/
|
158
|
+
- lib/jira/commands/comment/add.rb
|
159
|
+
- lib/jira/commands/comment/delete.rb
|
160
|
+
- lib/jira/commands/comment/list.rb
|
161
|
+
- lib/jira/commands/comment/update.rb
|
158
162
|
- lib/jira/commands/delete.rb
|
159
163
|
- lib/jira/commands/describe.rb
|
160
164
|
- lib/jira/commands/install.rb
|
161
165
|
- lib/jira/commands/link.rb
|
162
166
|
- lib/jira/commands/log.rb
|
167
|
+
- lib/jira/commands/log/add.rb
|
168
|
+
- lib/jira/commands/log/delete.rb
|
169
|
+
- lib/jira/commands/log/list.rb
|
170
|
+
- lib/jira/commands/log/update.rb
|
163
171
|
- lib/jira/commands/new.rb
|
164
172
|
- lib/jira/commands/rename.rb
|
165
173
|
- lib/jira/commands/sprint.rb
|
@@ -167,13 +175,17 @@ files:
|
|
167
175
|
- lib/jira/commands/transition.rb
|
168
176
|
- lib/jira/commands/version.rb
|
169
177
|
- lib/jira/commands/vote.rb
|
178
|
+
- lib/jira/commands/vote/add.rb
|
179
|
+
- lib/jira/commands/vote/delete.rb
|
180
|
+
- lib/jira/commands/vote/list.rb
|
170
181
|
- lib/jira/commands/watch.rb
|
182
|
+
- lib/jira/commands/watch/add.rb
|
183
|
+
- lib/jira/commands/watch/delete.rb
|
184
|
+
- lib/jira/commands/watch/list.rb
|
171
185
|
- lib/jira/constants.rb
|
172
186
|
- lib/jira/core.rb
|
173
187
|
- lib/jira/exceptions.rb
|
174
188
|
- lib/jira/format.rb
|
175
|
-
- lib/jira/legacy_api.rb
|
176
|
-
- lib/jira/mixins.rb
|
177
189
|
- lib/jira/sprint_api.rb
|
178
190
|
homepage: https://github.com/drn/jira-cli
|
179
191
|
licenses:
|
data/lib/jira/commands/commit.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module Jira
|
2
|
-
class CLI < Thor
|
3
|
-
|
4
|
-
desc "commit", "Commits uncommitted work with the ticket name and summary."
|
5
|
-
def commit(ticket=Jira::Core.ticket)
|
6
|
-
if Jira::Core.ticket?(ticket)
|
7
|
-
self.api.get("issue/#{ticket}") do |json|
|
8
|
-
`git commit -m '#{ticket}. #{json['fields']['summary'].periodize}'`
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
data/lib/jira/legacy_api.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
|
3
|
-
module Jira
|
4
|
-
class LegacyAPI
|
5
|
-
|
6
|
-
TYPES = [
|
7
|
-
:rest,
|
8
|
-
:agile
|
9
|
-
].freeze
|
10
|
-
|
11
|
-
ENDPOINTS = {
|
12
|
-
rest: 'rest/api/2',
|
13
|
-
agile: 'rest/greenhopper/latest'
|
14
|
-
}.freeze
|
15
|
-
|
16
|
-
#
|
17
|
-
# Initialize Jira::API
|
18
|
-
#
|
19
|
-
# @param type [Symbol]
|
20
|
-
#
|
21
|
-
def initialize(type)
|
22
|
-
@type = type
|
23
|
-
@client = Faraday.new
|
24
|
-
@client.basic_auth(Jira::Core.username, Jira::Core.password)
|
25
|
-
|
26
|
-
self.define_actions
|
27
|
-
end
|
28
|
-
|
29
|
-
protected
|
30
|
-
|
31
|
-
#
|
32
|
-
# Defines the API DELETE, GET, POST, PUT interaction methods
|
33
|
-
#
|
34
|
-
def define_actions
|
35
|
-
#
|
36
|
-
# def method(path, params={})
|
37
|
-
#
|
38
|
-
# Issue an API DELETE, GET, POST, or PUT request and return parse JSON
|
39
|
-
#
|
40
|
-
# @param path [String] API path
|
41
|
-
# @param params [Hash] params to send
|
42
|
-
#
|
43
|
-
# @yield(Hash) yields to a success block
|
44
|
-
#
|
45
|
-
# @return [JSON] parased API response
|
46
|
-
#
|
47
|
-
[:delete, :get, :post, :put].each do |method|
|
48
|
-
self.class.send(:define_method, method) do |path, params=nil, verbose=true, &block|
|
49
|
-
params = params.to_json if !params.nil?
|
50
|
-
response = @client.send(
|
51
|
-
method,
|
52
|
-
self.endpoint(path),
|
53
|
-
params,
|
54
|
-
self.headers
|
55
|
-
)
|
56
|
-
json = response.body.to_s.from_json
|
57
|
-
if self.errorless?(json, verbose)
|
58
|
-
block.call(json)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
#
|
65
|
-
# If any, outputs all API errors described by the input JSON
|
66
|
-
#
|
67
|
-
# @param json [Hash] API response JSON
|
68
|
-
# @param verbose [Boolean] true if errors should be output
|
69
|
-
#
|
70
|
-
# @return [Boolean] true if no errors exist
|
71
|
-
#
|
72
|
-
def errorless?(json, verbose=true)
|
73
|
-
errors = json['errorMessages']
|
74
|
-
if !errors.nil?
|
75
|
-
puts errors.join('. ') if verbose
|
76
|
-
return false
|
77
|
-
end
|
78
|
-
return true
|
79
|
-
end
|
80
|
-
|
81
|
-
#
|
82
|
-
# Returns the full JIRA REST API endpoint
|
83
|
-
#
|
84
|
-
# @param path [String] API path
|
85
|
-
#
|
86
|
-
# @return [String] API endpoint
|
87
|
-
#
|
88
|
-
def endpoint(path)
|
89
|
-
"#{Jira::Core.url}/#{ENDPOINTS[@type]}/#{path}"
|
90
|
-
end
|
91
|
-
|
92
|
-
#
|
93
|
-
# Returns the default API headers
|
94
|
-
#
|
95
|
-
# @return [Hash] API headers
|
96
|
-
#
|
97
|
-
def headers
|
98
|
-
{ 'Content-Type' => 'application/json' }
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
end
|