jura 0.0.5 → 0.0.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/README.md +12 -1
- data/bin/jura +2 -0
- data/lib/jura/api/board.rb +12 -0
- data/lib/jura/api/issue.rb +35 -2
- data/lib/jura/api/token.rb +1 -0
- data/lib/jura/api/transition.rb +42 -0
- data/lib/jura/api.rb +1 -0
- data/lib/jura/application.rb +5 -2
- data/lib/jura/command/board/select.rb +5 -1
- data/lib/jura/command/exit.rb +1 -1
- data/lib/jura/command/help.rb +1 -1
- data/lib/jura/command/sprint/active.rb +22 -0
- data/lib/jura/command/sprint/display_submenu.rb +30 -0
- data/lib/jura/command/sprint/list.rb +1 -1
- data/lib/jura/command/sprint/show_issue.rb +15 -0
- data/lib/jura/command/sprint.rb +8 -8
- data/lib/jura/{command.rb → command_handler.rb} +7 -16
- data/lib/jura/component/issue/change_column.rb +40 -0
- data/lib/jura/component/issue/estimate.rb +20 -0
- data/lib/jura/component/issue/show.rb +10 -2
- data/lib/jura/component/issue.rb +11 -5
- data/lib/jura/component/spinner.rb +15 -0
- data/lib/jura/component/sprint/active.rb +38 -0
- data/lib/jura/component/sprint/help.rb +1 -0
- data/lib/jura/component/sprint.rb +1 -1
- data/lib/jura/component.rb +1 -0
- data/lib/jura/control/sprint.rb +34 -0
- data/lib/jura/control.rb +1 -0
- data/lib/jura/root_control.rb +44 -0
- data/lib/jura.rb +3 -1
- metadata +50 -7
- data/lib/jura/command/sprint/show.rb +0 -22
- data/lib/jura/component/sprint/show.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bdec76bb892af8be3c4d31b8682f25e2ebd8005b0a78f48e8023d5718c935fa
|
4
|
+
data.tar.gz: 82d433c2caa2963469aea9f5b27e438d28b650b3bdec7b1df88c4a5dd7196972
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b52e3cd4f98a465d7565776b3236da3d2c67ae4207148ae8614b98fb78dc508e32d354d37478c01d9f3fd58b6439824fd107f31225cda52b0eb7d8c7f9c931d1
|
7
|
+
data.tar.gz: 3087c45f8bc1b3772a030e96b63a7370ab81fe4be612272a0e678eceeb8872484df81b09f27ffadbf7eaa69aa4af944ed96ff7706fe6f4ff9d6f920a7b18ba90
|
data/README.md
CHANGED
@@ -1,2 +1,13 @@
|
|
1
|
-
#
|
1
|
+
# Jura
|
2
2
|
A simple Jira CLI app by Ruby
|
3
|
+
|
4
|
+
## Install Jura
|
5
|
+
|
6
|
+
## Contributing
|
7
|
+
|
8
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/nvh0412/jura. This project is intended to be a safe, welcoming space for collaboration.
|
9
|
+
|
10
|
+
|
11
|
+
## License
|
12
|
+
|
13
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/bin/jura
CHANGED
data/lib/jura/api/board.rb
CHANGED
@@ -15,6 +15,18 @@ module Jura
|
|
15
15
|
)['values']
|
16
16
|
end
|
17
17
|
|
18
|
+
def configuration(board_id)
|
19
|
+
options = {
|
20
|
+
headers: {
|
21
|
+
"Authorization" => "Basic #{Token.get_token}"
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
url = "/board/#{board_id}/configuration"
|
26
|
+
|
27
|
+
parse_body(Client.get(url, options).body)
|
28
|
+
end
|
29
|
+
|
18
30
|
private
|
19
31
|
|
20
32
|
def parse_body(body)
|
data/lib/jura/api/issue.rb
CHANGED
@@ -27,9 +27,42 @@ module Jura
|
|
27
27
|
}
|
28
28
|
}
|
29
29
|
|
30
|
-
url = "/issue/#{issue_id}"
|
30
|
+
url = "https://employmenthero.atlassian.net/rest/api/3/issue/#{issue_id}"
|
31
31
|
|
32
|
-
parse_body(
|
32
|
+
parse_body(HTTParty.get(url, options).body)
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_estimation(issue_id, board_id)
|
36
|
+
options = {
|
37
|
+
headers: {
|
38
|
+
"Authorization" => "Basic #{Token.get_token}"
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
url = "/issue/#{issue_id}/estimation?boardId=#{board_id}"
|
43
|
+
|
44
|
+
parse_body(
|
45
|
+
Client.get(url, options).body
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def estimate(issue_id, point)
|
50
|
+
options = {
|
51
|
+
headers: {
|
52
|
+
"Authorization" => "Basic #{Token.get_token}"
|
53
|
+
},
|
54
|
+
body: {
|
55
|
+
value: point
|
56
|
+
}.to_json
|
57
|
+
}
|
58
|
+
|
59
|
+
board_id = Jura::Configuration.instance.load_config['selected_board_id']
|
60
|
+
|
61
|
+
url = "/issue/#{issue_id}/estimation?boardId=#{board_id}"
|
62
|
+
|
63
|
+
parse_body(
|
64
|
+
Client.put(url, options).body
|
65
|
+
)
|
33
66
|
end
|
34
67
|
|
35
68
|
private
|
data/lib/jura/api/token.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Jura
|
6
|
+
module Api
|
7
|
+
module Transitions
|
8
|
+
extend self
|
9
|
+
|
10
|
+
def all(issue_id)
|
11
|
+
options = {
|
12
|
+
headers: {
|
13
|
+
"Authorization" => "Basic #{Token.get_token}"
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
url = "https://employmenthero.atlassian.net/rest/api/3/issue/#{issue_id}/transitions"
|
18
|
+
|
19
|
+
parse_body(HTTParty.get(url, options).body)['transitions']
|
20
|
+
end
|
21
|
+
|
22
|
+
def transition(issue_id, body)
|
23
|
+
options = {
|
24
|
+
headers: {
|
25
|
+
'Authorization': "Basic #{Token.get_token}",
|
26
|
+
'Accept': 'application/json',
|
27
|
+
'Content-Type': 'application/json'
|
28
|
+
},
|
29
|
+
body: body.to_json
|
30
|
+
}
|
31
|
+
|
32
|
+
url = "https://employmenthero.atlassian.net/rest/api/3/issue/#{issue_id}/transitions"
|
33
|
+
|
34
|
+
HTTParty.post(url, options)
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse_body(body)
|
38
|
+
JSON.parse(body)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/jura/api.rb
CHANGED
data/lib/jura/application.rb
CHANGED
@@ -27,15 +27,18 @@ module Jura
|
|
27
27
|
|
28
28
|
Jura::Configuration.instance.set_config(config)
|
29
29
|
|
30
|
+
Jura::RootControl.instance.config_commands
|
31
|
+
Jura::Control::Sprint.instance.config_commands
|
32
|
+
|
30
33
|
loop do
|
31
34
|
command_buffer = Readline.readline("\e[15;48;5;27m Jura Guarrr! \e[0m > ", true)
|
32
35
|
|
33
|
-
Jura::
|
36
|
+
Jura::CommandHandler.call(command_buffer.strip())
|
34
37
|
rescue IndexError, NoMethodError => _e
|
35
38
|
Command::Invalid.execute("Something went wrong, please try with another command")
|
36
39
|
end
|
37
40
|
rescue Interrupt
|
38
|
-
Command::Exit.execute
|
41
|
+
Command::Exit.execute!
|
39
42
|
end
|
40
43
|
|
41
44
|
def config_credentials(prompt)
|
@@ -6,7 +6,11 @@ module Jura
|
|
6
6
|
class Select
|
7
7
|
def self.execute
|
8
8
|
prompt = TTY::Prompt.new
|
9
|
-
|
9
|
+
|
10
|
+
boards = Jura::Component::Spinner.render do
|
11
|
+
Api::Board.all
|
12
|
+
end
|
13
|
+
|
10
14
|
board = prompt.select("Choose your board?", filter: true, per_page: 10) do |menu|
|
11
15
|
boards.each do |b|
|
12
16
|
menu.choice b['location']['displayName'], b
|
data/lib/jura/command/exit.rb
CHANGED
data/lib/jura/command/help.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jura
|
4
|
+
module Command
|
5
|
+
module Sprint
|
6
|
+
class Active < Base
|
7
|
+
def self.execute!(opts = nil)
|
8
|
+
sprints = Component::Spinner.render do
|
9
|
+
Api::Sprint.all(board_id)
|
10
|
+
end
|
11
|
+
|
12
|
+
configuration = Component::Spinner.render do
|
13
|
+
Api::Board.configuration(board_id)
|
14
|
+
end
|
15
|
+
|
16
|
+
active_sprint = sprints.detect { |sprint| sprint['state'] == 'active' }
|
17
|
+
puts Component::Sprint::Active.render(board_id, active_sprint, configuration)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jura
|
4
|
+
module Command
|
5
|
+
module Sprint
|
6
|
+
class DisplaySubmenu < Base
|
7
|
+
def self.execute!(issue)
|
8
|
+
prompt = TTY::Prompt.new
|
9
|
+
action = prompt.select("Choose your action") do |menu|
|
10
|
+
menu.choice name: "View", value: 1
|
11
|
+
menu.choice name: "Estimate the story point", value: 2
|
12
|
+
menu.choice name: "Change the status/column", value: 3
|
13
|
+
menu.choice name: "Move it back to the backlog", value: 4
|
14
|
+
menu.choice name: "Back", value: 5
|
15
|
+
end
|
16
|
+
|
17
|
+
case action
|
18
|
+
when 1
|
19
|
+
Jura::Control::Sprint.instance.execute_command("show_issue", issue)
|
20
|
+
when 2
|
21
|
+
puts Component::Issue::Estimate.render(issue)
|
22
|
+
when 3
|
23
|
+
puts Component::Issue::ChangeColumn.render(issue)
|
24
|
+
when 4
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/jura/command/sprint.rb
CHANGED
@@ -2,20 +2,20 @@
|
|
2
2
|
|
3
3
|
require 'jura/command/sprint/base'
|
4
4
|
require 'jura/command/sprint/list'
|
5
|
-
require 'jura/command/sprint/
|
5
|
+
require 'jura/command/sprint/active'
|
6
|
+
require 'jura/command/sprint/display_submenu'
|
7
|
+
require 'jura/command/sprint/show_issue'
|
6
8
|
|
7
9
|
module Jura
|
8
10
|
module Command
|
9
11
|
module Sprint
|
10
12
|
def self.execute!(sub_cmd, args)
|
11
|
-
|
12
|
-
|
13
|
-
Command::Sprint::Show.execute!(args)
|
14
|
-
when "list"
|
15
|
-
Command::Sprint::List.execute!
|
16
|
-
else
|
17
|
-
Command::Invalid.execute("Command not found: #{command.inspect}. Run #{"help".inspect} for more informations")
|
13
|
+
unless Jura::Control::Sprint.instance.support_command?(sub_cmd)
|
14
|
+
return Command::Invalid.execute("Command not found: #{sub_cmd}. Run #{"help".inspect} for more informations")
|
18
15
|
end
|
16
|
+
|
17
|
+
Jura::Control::Sprint.instance.execute_command(sub_cmd)
|
18
|
+
Jura::Control::Sprint.instance.undo_command
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -7,34 +7,24 @@ require 'jura/command/exit'
|
|
7
7
|
require 'jura/command/invalid'
|
8
8
|
|
9
9
|
module Jura
|
10
|
-
module
|
11
|
-
|
12
|
-
"board" => -> (sub_cmd, args) { Command::Board.execute!(sub_cmd, args) },
|
13
|
-
"issue" => -> (sub_cmd, args) { Command::Issue.execute!(sub_cmd, args) },
|
14
|
-
"sprint" => -> (sub_cmd, args) { Command::Sprint.execute!(sub_cmd, args) },
|
15
|
-
"help" => -> (*_args) { Command::Help.execute() },
|
16
|
-
"exit" => -> (*_args) { Command::Exit.execute() }
|
17
|
-
}
|
18
|
-
|
19
|
-
def self.execute!(cmd_buffer)
|
10
|
+
module CommandHandler
|
11
|
+
def self.call(cmd_buffer)
|
20
12
|
cmd_name, sub_cmd, *args = cmd_buffer.to_s.strip.split(" ")
|
21
13
|
|
22
14
|
if cmd_name.nil? || cmd_name.empty?
|
23
15
|
# TODO: return and execute empty command error
|
24
16
|
end
|
25
17
|
|
26
|
-
|
27
|
-
|
28
|
-
if command.nil?
|
29
|
-
return Command::Invalid.execute("Command not found: #{command.inspect}. Run #{"help".inspect} for more informations")
|
18
|
+
unless Jura::RootControl.instance.support_command?(cmd_name)
|
19
|
+
return Command::Invalid.execute("Command not found: #{cmd_name}. Run #{"help".inspect} for more informations")
|
30
20
|
end
|
31
21
|
|
32
22
|
puts '' # Empty line
|
33
|
-
|
23
|
+
Jura::RootControl.instance.execute_command(cmd_name, sub_cmd: sub_cmd, args: args)
|
34
24
|
puts '' # Empty line
|
35
25
|
rescue Command::Board::RequiredBoardIdError => _
|
36
26
|
puts 'Please select a board first!'
|
37
|
-
|
27
|
+
Jura::RootControl.execute_command('select')
|
38
28
|
end
|
39
29
|
|
40
30
|
def generate_suggestions(buffer, command_buffer)
|
@@ -46,5 +36,6 @@ module Jura
|
|
46
36
|
|
47
37
|
commands.keys.grep(/^#{Regexp.escape(buffer)}/)
|
48
38
|
end
|
39
|
+
|
49
40
|
end
|
50
41
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jura
|
4
|
+
module Component
|
5
|
+
module Issue
|
6
|
+
class ChangeColumn
|
7
|
+
def self.render(issue)
|
8
|
+
prompt = TTY::Prompt.new
|
9
|
+
|
10
|
+
transitions = Api::Transitions.all(issue['id'])
|
11
|
+
|
12
|
+
status = prompt.select("Choose the status") do |menu|
|
13
|
+
transitions.each do |t|
|
14
|
+
menu.choice t['name'], t
|
15
|
+
end
|
16
|
+
|
17
|
+
menu.choice 'Cancel', 'cancel'
|
18
|
+
end
|
19
|
+
|
20
|
+
if status == 'cancel'
|
21
|
+
Sprint::Active.display_submenu(prompt, issue)
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
unless prompt.yes?("Do you want to change the status of this issue to '#{status['name']}'?")
|
26
|
+
render(issue)
|
27
|
+
end
|
28
|
+
|
29
|
+
Spinner.render(
|
30
|
+
"Changed status of this issue from #{issue['fields']['status']['name']} to #{status['name']}!", clear: false
|
31
|
+
) do
|
32
|
+
Api::Transitions.transition(issue['id'], { transition: { id: status['id'] } })
|
33
|
+
end
|
34
|
+
|
35
|
+
puts ""
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jura
|
4
|
+
module Component
|
5
|
+
module Issue
|
6
|
+
class Estimate
|
7
|
+
def self.render(issue)
|
8
|
+
prompt = TTY::Prompt.new
|
9
|
+
point_value = prompt.ask("How many points do you want to estimate?", default: 1)
|
10
|
+
|
11
|
+
Spinner.render("Estimated this issue - #{point_value} points!", clear: false) do
|
12
|
+
Api::Issue.estimate(issue['id'], point_value)
|
13
|
+
end
|
14
|
+
|
15
|
+
puts ""
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -5,8 +5,14 @@ module Jura
|
|
5
5
|
module Issue
|
6
6
|
class Show
|
7
7
|
def self.render(issue)
|
8
|
+
board_id = Jura::Configuration.instance.load_config['selected_board_id']
|
9
|
+
estimation = Api::Issue.get_estimation(issue['id'], board_id)
|
10
|
+
|
8
11
|
issue_id = issue['key']
|
12
|
+
key = Issue.convert_key(issue)
|
13
|
+
url = URI.parse(issue['self']).host
|
9
14
|
project = issue['fields']['project']['name']
|
15
|
+
description = issue['fields']['description'] || ""
|
10
16
|
box = TTY::Box.frame(
|
11
17
|
border: :thick,
|
12
18
|
padding: [1,2],
|
@@ -16,11 +22,13 @@ module Jura
|
|
16
22
|
<<~TEMPLATE
|
17
23
|
#{Jura::Utils.format_bold(issue['fields']['summary'])}
|
18
24
|
|
19
|
-
#{Jura::Utils.format_bold('URL')}: #{
|
25
|
+
#{Jura::Utils.format_bold('URL')}: #{TTY::Link.link_to("Issue Link", "https://#{url}/browse/#{key}")}
|
26
|
+
|
27
|
+
#{Jura::Utils.format_bold('Story points:')} #{Jura::Utils.paint(estimation["value"] || 0, :green)}
|
20
28
|
|
21
29
|
#{Jura::Utils.format_bold('Description')}
|
22
30
|
|
23
|
-
#{TTY::Markdown.parse(
|
31
|
+
#{TTY::Markdown.parse(description)}
|
24
32
|
TEMPLATE
|
25
33
|
end
|
26
34
|
end
|
data/lib/jura/component/issue.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require "jura/component/issue/help"
|
4
4
|
require "jura/component/issue/show"
|
5
|
+
require "jura/component/issue/change_column"
|
6
|
+
require "jura/component/issue/estimate"
|
5
7
|
|
6
8
|
module Jura
|
7
9
|
module Component
|
@@ -12,6 +14,15 @@ module Jura
|
|
12
14
|
TEMPLATE
|
13
15
|
end
|
14
16
|
|
17
|
+
def self.render_line(issue)
|
18
|
+
render_issue(issue)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.convert_key(issue)
|
22
|
+
kws = issue['key'].split('-')
|
23
|
+
"#{kws[0]}-#{(kws[1].rjust(3, ' '))}"
|
24
|
+
end
|
25
|
+
|
15
26
|
private
|
16
27
|
|
17
28
|
def self.render_issue(issue)
|
@@ -33,11 +44,6 @@ module Jura
|
|
33
44
|
p.decorate(status,:white)
|
34
45
|
end
|
35
46
|
end
|
36
|
-
|
37
|
-
def self.convert_key(issue)
|
38
|
-
kws = issue['key'].split('-')
|
39
|
-
"#{kws[0]}-#{(kws[1].rjust(3, ' '))}"
|
40
|
-
end
|
41
47
|
end
|
42
48
|
end
|
43
49
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jura
|
4
|
+
module Component
|
5
|
+
class Spinner
|
6
|
+
def self.render(success_message = 'Loading', clear: true)
|
7
|
+
spinner = TTY::Spinner.new("[:spinner] #{success_message}", format: :pulse_2, clear: clear)
|
8
|
+
spinner.auto_spin
|
9
|
+
res = yield
|
10
|
+
success_message ? spinner.success(success_message) : spinner.stop
|
11
|
+
res
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jura
|
4
|
+
module Component
|
5
|
+
module Sprint
|
6
|
+
class Active
|
7
|
+
def self.render(board_id, sprint, config)
|
8
|
+
prompt = TTY::Prompt.new
|
9
|
+
columns = config.dig('columnConfig', 'columns')
|
10
|
+
column = prompt.select("Choose the column", filter: true, per_page: 5) do |menu|
|
11
|
+
columns.each do |c|
|
12
|
+
menu.choice c['name'], c
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
issues = Spinner.render do
|
17
|
+
Api::Sprint.show(board_id, sprint['id'])
|
18
|
+
end
|
19
|
+
|
20
|
+
selected_issues = issues.select do |i|
|
21
|
+
status = i.dig('fields','status', 'name')
|
22
|
+
|
23
|
+
column['name'].downcase == status.downcase
|
24
|
+
end
|
25
|
+
|
26
|
+
issue = prompt.select("Choose the issue", filter: true, per_page: 10) do |menu|
|
27
|
+
selected_issues.each do |i|
|
28
|
+
menu.choice Component::Issue.render_line(i), i
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Control::Sprint.instance.execute_command("display_submenu", issue)
|
33
|
+
puts ""
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/jura/component.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'byebug'
|
4
|
+
|
5
|
+
module Jura
|
6
|
+
module Control
|
7
|
+
class Sprint < Jura::RootControl
|
8
|
+
def execute_command(name, opts = nil)
|
9
|
+
commands[name].execute!(opts)
|
10
|
+
executed_commands << [commands[name], opts]
|
11
|
+
end
|
12
|
+
|
13
|
+
def undo_command
|
14
|
+
return if executed_commands.length < 2
|
15
|
+
|
16
|
+
executed_commands.pop
|
17
|
+
command, opts = executed_commands.pop
|
18
|
+
command.execute!(opts)
|
19
|
+
executed_commands << [command, opts]
|
20
|
+
end
|
21
|
+
|
22
|
+
def config_commands
|
23
|
+
set_command("list", Command::Sprint::List)
|
24
|
+
set_command("active", Command::Sprint::Active)
|
25
|
+
set_command("display_submenu", Command::Sprint::DisplaySubmenu)
|
26
|
+
set_command("show_issue", Command::Sprint::ShowIssue)
|
27
|
+
end
|
28
|
+
|
29
|
+
def executed_commands
|
30
|
+
@executed_commands ||= []
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/jura/control.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'jura/control/sprint'
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module Jura
|
5
|
+
class RootControl
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def set_command(key, command)
|
9
|
+
commands[key] = command
|
10
|
+
end
|
11
|
+
|
12
|
+
def undo_command
|
13
|
+
return if executed_commands.length.zero?
|
14
|
+
|
15
|
+
command, opts = executed_commands.pop
|
16
|
+
command.execute!(opts[:sub_cmd], opts[:args])
|
17
|
+
end
|
18
|
+
|
19
|
+
def support_command?(name)
|
20
|
+
commands.keys.include?(name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute_command(name, opts = {})
|
24
|
+
commands[name].execute!(opts[:sub_cmd], opts[:args])
|
25
|
+
executed_commands << [commands[name], opts]
|
26
|
+
end
|
27
|
+
|
28
|
+
def commands
|
29
|
+
@commands ||= {}
|
30
|
+
end
|
31
|
+
|
32
|
+
def config_commands
|
33
|
+
set_command("board", Command::Board)
|
34
|
+
set_command("issue", Command::Issue)
|
35
|
+
set_command("sprint", Command::Sprint)
|
36
|
+
set_command("help", Command::Help)
|
37
|
+
set_command("exit", Command::Exit)
|
38
|
+
end
|
39
|
+
|
40
|
+
def executed_commands
|
41
|
+
@executed_commands ||= []
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/jura.rb
CHANGED
@@ -5,6 +5,8 @@ require "jura/version"
|
|
5
5
|
require "jura/utils"
|
6
6
|
require "jura/configuration"
|
7
7
|
require "jura/api"
|
8
|
+
require "jura/root_control"
|
9
|
+
require "jura/control"
|
8
10
|
require "jura/component"
|
9
|
-
require "jura/
|
11
|
+
require "jura/command_handler"
|
10
12
|
require "jura/application"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jura
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hoa Nguyen
|
@@ -14,16 +14,22 @@ dependencies:
|
|
14
14
|
name: httparty
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.18.1
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.21.0
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: 0.18.1
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.21.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: tty-prompt
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +100,34 @@ dependencies:
|
|
94
100
|
- - "~>"
|
95
101
|
- !ruby/object:Gem::Version
|
96
102
|
version: 0.8.1
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: tty-link
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.1.1
|
110
|
+
type: :runtime
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 0.1.1
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: tty-spinner
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 0.9.3
|
124
|
+
type: :runtime
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 0.9.3
|
97
131
|
- !ruby/object:Gem::Dependency
|
98
132
|
name: pastel
|
99
133
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,8 +159,8 @@ files:
|
|
125
159
|
- lib/jura/api/issue.rb
|
126
160
|
- lib/jura/api/sprint.rb
|
127
161
|
- lib/jura/api/token.rb
|
162
|
+
- lib/jura/api/transition.rb
|
128
163
|
- lib/jura/application.rb
|
129
|
-
- lib/jura/command.rb
|
130
164
|
- lib/jura/command/board.rb
|
131
165
|
- lib/jura/command/board/select.rb
|
132
166
|
- lib/jura/command/exit.rb
|
@@ -139,21 +173,30 @@ files:
|
|
139
173
|
- lib/jura/command/issue/select.rb
|
140
174
|
- lib/jura/command/issue/show.rb
|
141
175
|
- lib/jura/command/sprint.rb
|
176
|
+
- lib/jura/command/sprint/active.rb
|
142
177
|
- lib/jura/command/sprint/base.rb
|
178
|
+
- lib/jura/command/sprint/display_submenu.rb
|
143
179
|
- lib/jura/command/sprint/list.rb
|
144
|
-
- lib/jura/command/sprint/
|
180
|
+
- lib/jura/command/sprint/show_issue.rb
|
181
|
+
- lib/jura/command_handler.rb
|
145
182
|
- lib/jura/component.rb
|
146
183
|
- lib/jura/component/board.rb
|
147
184
|
- lib/jura/component/board/help.rb
|
148
185
|
- lib/jura/component/help.rb
|
149
186
|
- lib/jura/component/issue.rb
|
187
|
+
- lib/jura/component/issue/change_column.rb
|
188
|
+
- lib/jura/component/issue/estimate.rb
|
150
189
|
- lib/jura/component/issue/help.rb
|
151
190
|
- lib/jura/component/issue/show.rb
|
152
191
|
- lib/jura/component/logo.rb
|
192
|
+
- lib/jura/component/spinner.rb
|
153
193
|
- lib/jura/component/sprint.rb
|
194
|
+
- lib/jura/component/sprint/active.rb
|
154
195
|
- lib/jura/component/sprint/help.rb
|
155
|
-
- lib/jura/component/sprint/show.rb
|
156
196
|
- lib/jura/configuration.rb
|
197
|
+
- lib/jura/control.rb
|
198
|
+
- lib/jura/control/sprint.rb
|
199
|
+
- lib/jura/root_control.rb
|
157
200
|
- lib/jura/utils.rb
|
158
201
|
- lib/jura/version.rb
|
159
202
|
homepage: https://rubygems.org/gems/jura
|
@@ -175,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
218
|
- !ruby/object:Gem::Version
|
176
219
|
version: '0'
|
177
220
|
requirements: []
|
178
|
-
rubygems_version: 3.1
|
221
|
+
rubygems_version: 3.0.3.1
|
179
222
|
signing_key:
|
180
223
|
specification_version: 4
|
181
224
|
summary: Jura Guarrr!
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jura
|
4
|
-
module Command
|
5
|
-
module Sprint
|
6
|
-
class Show < Base
|
7
|
-
def self.execute!(args)
|
8
|
-
if args.length != 1
|
9
|
-
return
|
10
|
-
end
|
11
|
-
|
12
|
-
sprint_id = args[0]
|
13
|
-
|
14
|
-
issues = Api::Sprint.show(board_id, sprint_id)
|
15
|
-
puts Component::Sprint::Show.render(issues)
|
16
|
-
rescue HTTParty::ResponseError => _e
|
17
|
-
Command::Invalid.execute("Something went wrong, please try with another command")
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jura
|
4
|
-
module Component
|
5
|
-
module Sprint
|
6
|
-
class Show
|
7
|
-
def self.render(issues)
|
8
|
-
table = TTY::Table.new(
|
9
|
-
header: [
|
10
|
-
"TO DO",
|
11
|
-
Jura::Utils.paint("IN PROGRESS", :blue),
|
12
|
-
Jura::Utils.paint("IN REVIEW", :purple),
|
13
|
-
Jura::Utils.paint("DONE", :green)
|
14
|
-
]
|
15
|
-
)
|
16
|
-
convertIssues(table, issues)
|
17
|
-
table.render :unicode, resize: true, column_widths: [25, 25, 25, 25] do |renderer|
|
18
|
-
renderer.border.separator = :each_row
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.convertIssues(table, issues)
|
23
|
-
issues.each do |issue|
|
24
|
-
state = issue['fields']['status']['name']
|
25
|
-
case state.downcase
|
26
|
-
when 'to do'
|
27
|
-
table << [render_issue(issue), '', '', '']
|
28
|
-
when 'in progress'
|
29
|
-
table << ['', render_issue(issue), '', '']
|
30
|
-
when 'in review'
|
31
|
-
table << ['', '', render_issue(issue), '']
|
32
|
-
when 'done'
|
33
|
-
table << ['', '', '', render_issue(issue)]
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.render_issue(issue)
|
39
|
-
"#{issue['key']} - #{issue['fields']['summary']}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|