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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +18 -28
  3. data/bin/jira +3 -1
  4. data/lib/jira.rb +12 -6
  5. data/lib/jira/api.rb +10 -5
  6. data/lib/jira/auth_api.rb +11 -0
  7. data/lib/jira/command.rb +21 -1
  8. data/lib/jira/commands/all.rb +2 -2
  9. data/lib/jira/commands/assign.rb +2 -2
  10. data/lib/jira/commands/comment.rb +8 -98
  11. data/lib/jira/commands/comment/add.rb +46 -0
  12. data/lib/jira/commands/comment/delete.rb +80 -0
  13. data/lib/jira/commands/comment/list.rb +69 -0
  14. data/lib/jira/commands/comment/update.rb +88 -0
  15. data/lib/jira/commands/delete.rb +0 -2
  16. data/lib/jira/commands/describe.rb +0 -2
  17. data/lib/jira/commands/install.rb +39 -17
  18. data/lib/jira/commands/link.rb +4 -3
  19. data/lib/jira/commands/log.rb +7 -72
  20. data/lib/jira/commands/log/add.rb +50 -0
  21. data/lib/jira/commands/log/delete.rb +80 -0
  22. data/lib/jira/commands/log/list.rb +69 -0
  23. data/lib/jira/commands/log/update.rb +89 -0
  24. data/lib/jira/commands/new.rb +4 -6
  25. data/lib/jira/commands/rename.rb +0 -2
  26. data/lib/jira/commands/sprint.rb +3 -3
  27. data/lib/jira/commands/tickets.rb +0 -2
  28. data/lib/jira/commands/transition.rb +0 -2
  29. data/lib/jira/commands/vote.rb +5 -107
  30. data/lib/jira/commands/vote/add.rb +43 -0
  31. data/lib/jira/commands/vote/delete.rb +46 -0
  32. data/lib/jira/commands/vote/list.rb +59 -0
  33. data/lib/jira/commands/watch.rb +5 -108
  34. data/lib/jira/commands/watch/add.rb +43 -0
  35. data/lib/jira/commands/watch/delete.rb +46 -0
  36. data/lib/jira/commands/watch/list.rb +59 -0
  37. data/lib/jira/constants.rb +1 -1
  38. data/lib/jira/core.rb +9 -1
  39. data/lib/jira/sprint_api.rb +2 -18
  40. metadata +17 -5
  41. data/lib/jira/commands/commit.rb +0 -14
  42. data/lib/jira/legacy_api.rb +0 -102
  43. data/lib/jira/mixins.rb +0 -56
@@ -1,115 +1,12 @@
1
- require_relative '../command'
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 "watch", "Watch against the input ticket"
7
- def watch(ticket=Jira::Core.ticket)
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
@@ -1,5 +1,5 @@
1
1
  module Jira
2
2
 
3
- VERSION = '0.2.2'
3
+ VERSION = '0.3.0'
4
4
 
5
5
  end
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'] || self.read(self.cli_path)[:global]['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
  #
@@ -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
- private
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.2.2
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-01-29 00:00:00.000000000 Z
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/commit.rb
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:
@@ -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
@@ -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