jira-cli 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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