troo 0.0.1 → 0.0.2
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/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/Gemfile +0 -1
- data/Guardfile +6 -0
- data/LICENSE.txt +1 -0
- data/README.md +46 -3
- data/Rakefile +11 -0
- data/bin/troo +12 -0
- data/configuration.yml.example +7 -0
- data/features/add_board.feature +1 -0
- data/features/add_card.feature +1 -0
- data/features/add_comment.feature +1 -0
- data/features/add_list.feature +1 -0
- data/features/cleanup.feature +0 -0
- data/features/move_card_to_list.feature +1 -0
- data/features/refresh.feature +1 -0
- data/features/set_default.feature +7 -0
- data/features/show_board.feature +1 -0
- data/features/show_boards.feature +1 -0
- data/features/show_card.feature +1 -0
- data/features/show_comments.feature +1 -0
- data/features/show_list.feature +1 -0
- data/features/status.feature +1 -0
- data/features/step_definitions/troo_steps.rb +0 -0
- data/features/support/env.rb +31 -0
- data/features/troo.feature +1 -0
- data/features/version.feature +8 -0
- data/lib/troo.rb +24 -2
- data/lib/troo/actions/create_board.rb +43 -0
- data/lib/troo/actions/create_card.rb +43 -0
- data/lib/troo/actions/create_comment.rb +44 -0
- data/lib/troo/actions/create_list.rb +41 -0
- data/lib/troo/actions/move_card.rb +36 -0
- data/lib/troo/actions/refresh_all.rb +79 -0
- data/lib/troo/actions/set_default.rb +35 -0
- data/lib/troo/cli/add_cli.rb +83 -0
- data/lib/troo/cli/default_cli.rb +37 -0
- data/lib/troo/cli/main_cli.rb +130 -0
- data/lib/troo/cli/show_cli.rb +83 -0
- data/lib/troo/cli/thor_fixes.rb +9 -0
- data/lib/troo/display/board_decorator.rb +58 -0
- data/lib/troo/display/board_presenter.rb +65 -0
- data/lib/troo/display/card_decorator.rb +105 -0
- data/lib/troo/display/card_presenter.rb +27 -0
- data/lib/troo/display/comment_decorator.rb +32 -0
- data/lib/troo/display/comment_presenter.rb +35 -0
- data/lib/troo/display/decorator_helpers.rb +76 -0
- data/lib/troo/display/list_decorator.rb +53 -0
- data/lib/troo/display/list_presenter.rb +43 -0
- data/lib/troo/display/member_decorator.rb +24 -0
- data/lib/troo/display/member_presenter.rb +59 -0
- data/lib/troo/external/board.rb +49 -0
- data/lib/troo/external/board_adaptor.rb +43 -0
- data/lib/troo/external/card.rb +70 -0
- data/lib/troo/external/card_adaptor.rb +78 -0
- data/lib/troo/external/comment.rb +64 -0
- data/lib/troo/external/comment_adaptor.rb +53 -0
- data/lib/troo/external/list.rb +58 -0
- data/lib/troo/external/list_adaptor.rb +48 -0
- data/lib/troo/external/member.rb +52 -0
- data/lib/troo/external/member_adaptor.rb +63 -0
- data/lib/troo/models/board.rb +26 -0
- data/lib/troo/models/board_persistence.rb +53 -0
- data/lib/troo/models/board_retrieval.rb +45 -0
- data/lib/troo/models/card.rb +54 -0
- data/lib/troo/models/card_persistence.rb +53 -0
- data/lib/troo/models/card_retrieval.rb +49 -0
- data/lib/troo/models/comment.rb +32 -0
- data/lib/troo/models/comment_persistence.rb +53 -0
- data/lib/troo/models/comment_retrieval.rb +32 -0
- data/lib/troo/models/list.rb +27 -0
- data/lib/troo/models/list_persistence.rb +53 -0
- data/lib/troo/models/list_retrieval.rb +45 -0
- data/lib/troo/models/member.rb +18 -0
- data/lib/troo/models/member_persistence.rb +53 -0
- data/lib/troo/models/member_retrieval.rb +36 -0
- data/lib/troo/models/model_helpers.rb +32 -0
- data/lib/troo/models/refresh.rb +23 -0
- data/lib/troo/presentation/template.rb +31 -0
- data/lib/troo/troo.rb +69 -0
- data/lib/troo/version.rb +2 -1
- data/lib/troo/views/card.erb +17 -0
- data/lib/troo/views/comment.erb +3 -0
- data/logs/.gitkeep +0 -0
- data/test/cassettes/board_by_id.yml +59 -0
- data/test/cassettes/boards_all.yml +118 -0
- data/test/cassettes/card_by_card_id.yml +58 -0
- data/test/cassettes/cards_by_board_id.yml +117 -0
- data/test/cassettes/cards_by_list_id.yml +114 -0
- data/test/cassettes/comments_by_board_id.yml +122 -0
- data/test/cassettes/comments_by_card_id.yml +114 -0
- data/test/cassettes/comments_by_list_id.yml +109 -0
- data/test/cassettes/create_board.yml +62 -0
- data/test/cassettes/create_card.yml +63 -0
- data/test/cassettes/create_comment.yml +67 -0
- data/test/cassettes/create_list.yml +60 -0
- data/test/cassettes/list_by_list_id.yml +56 -0
- data/test/cassettes/lists_by_board_id.yml +118 -0
- data/test/cassettes/member_by_member_id.yml +60 -0
- data/test/cassettes/members_by_board_id.yml +109 -0
- data/test/cassettes/move_card.yml +61 -0
- data/test/lib/troo/actions/create_board_test.rb +47 -0
- data/test/lib/troo/actions/create_card_test.rb +54 -0
- data/test/lib/troo/actions/create_comment_test.rb +49 -0
- data/test/lib/troo/actions/create_list_test.rb +49 -0
- data/test/lib/troo/actions/move_card_test.rb +46 -0
- data/test/lib/troo/actions/refresh_all_test.rb +68 -0
- data/test/lib/troo/actions/set_default_test.rb +44 -0
- data/test/lib/troo/cli/add_cli_test.rb +216 -0
- data/test/lib/troo/cli/default_cli_test.rb +79 -0
- data/test/lib/troo/cli/main_cli_test.rb +232 -0
- data/test/lib/troo/cli/show_cli_test.rb +221 -0
- data/test/lib/troo/cli/thor_fixes_test.rb +21 -0
- data/test/lib/troo/display/board_decorator_test.rb +126 -0
- data/test/lib/troo/display/board_presenter_test.rb +77 -0
- data/test/lib/troo/display/card_decorator_test.rb +221 -0
- data/test/lib/troo/display/card_presenter_test.rb +38 -0
- data/test/lib/troo/display/comment_decorator_test.rb +65 -0
- data/test/lib/troo/display/comment_presenter_test.rb +47 -0
- data/test/lib/troo/display/decorator_helpers_test.rb +7 -0
- data/test/lib/troo/display/list_decorator_test.rb +98 -0
- data/test/lib/troo/display/list_presenter_test.rb +48 -0
- data/test/lib/troo/display/member_decorator_test.rb +42 -0
- data/test/lib/troo/display/member_presenter_test.rb +70 -0
- data/test/lib/troo/external/board_adaptor_test.rb +36 -0
- data/test/lib/troo/external/board_test.rb +69 -0
- data/test/lib/troo/external/card_adaptor_test.rb +50 -0
- data/test/lib/troo/external/card_test.rb +108 -0
- data/test/lib/troo/external/comment_adaptor_test.rb +41 -0
- data/test/lib/troo/external/comment_test.rb +88 -0
- data/test/lib/troo/external/list_adaptor_test.rb +38 -0
- data/test/lib/troo/external/list_test.rb +65 -0
- data/test/lib/troo/external/member_adaptor_test.rb +44 -0
- data/test/lib/troo/external/member_test.rb +65 -0
- data/test/lib/troo/models/board_persistence_test.rb +61 -0
- data/test/lib/troo/models/board_retrieval_test.rb +93 -0
- data/test/lib/troo/models/board_test.rb +50 -0
- data/test/lib/troo/models/card_persistence_test.rb +60 -0
- data/test/lib/troo/models/card_retrieval_test.rb +101 -0
- data/test/lib/troo/models/card_test.rb +102 -0
- data/test/lib/troo/models/comment_persistence_test.rb +65 -0
- data/test/lib/troo/models/comment_retrieval_test.rb +46 -0
- data/test/lib/troo/models/comment_test.rb +59 -0
- data/test/lib/troo/models/list_persistence_test.rb +60 -0
- data/test/lib/troo/models/list_retrieval_test.rb +93 -0
- data/test/lib/troo/models/list_test.rb +53 -0
- data/test/lib/troo/models/member_persistence_test.rb +59 -0
- data/test/lib/troo/models/member_retrieval_test.rb +58 -0
- data/test/lib/troo/models/member_test.rb +44 -0
- data/test/lib/troo/models/model_helpers_test.rb +103 -0
- data/test/lib/troo/models/refresh_test.rb +45 -0
- data/test/lib/troo/presentation/template_test.rb +40 -0
- data/test/support/fabrication.rb +56 -0
- data/test/support/template.erb +3 -0
- data/test/support/vcr_setup.rb +36 -0
- data/test/test_helper.rb +30 -0
- data/troo.gemspec +24 -5
- metadata +501 -23
@@ -0,0 +1,58 @@
|
|
1
|
+
module Troo
|
2
|
+
class BoardDecorator
|
3
|
+
include DecoratorHelpers
|
4
|
+
|
5
|
+
def initialize(board, options = {})
|
6
|
+
@board = board
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def short
|
11
|
+
[default_str, id_str, name_str].join + "\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
def name_str
|
15
|
+
highlight(name, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_str
|
19
|
+
default.center(3)
|
20
|
+
end
|
21
|
+
|
22
|
+
def id_str
|
23
|
+
highlight(brackets(id) + " ", options).rjust(6)
|
24
|
+
end
|
25
|
+
|
26
|
+
def description
|
27
|
+
return "N/A" if board.description.nil? || board.description.empty?
|
28
|
+
word_wrap(board.description)
|
29
|
+
end
|
30
|
+
|
31
|
+
def name
|
32
|
+
(board.name && board.name.chomp) || "N/A"
|
33
|
+
end
|
34
|
+
|
35
|
+
def default
|
36
|
+
board.default? ? "*" : ""
|
37
|
+
end
|
38
|
+
|
39
|
+
def id
|
40
|
+
board.id.to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
attr_reader :board
|
45
|
+
|
46
|
+
def options
|
47
|
+
defaults.merge!(@options)
|
48
|
+
end
|
49
|
+
|
50
|
+
def defaults
|
51
|
+
{
|
52
|
+
ansicolor: true,
|
53
|
+
colour: Esc.blue,
|
54
|
+
underline: Esc.underline
|
55
|
+
}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Troo
|
2
|
+
class BoardPresenter
|
3
|
+
class << self
|
4
|
+
def render_all(board, options = {})
|
5
|
+
new(board, options).render_all
|
6
|
+
end
|
7
|
+
|
8
|
+
def render_show(board, options = {})
|
9
|
+
new(board, options).render_show
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
include DecoratorHelpers
|
14
|
+
|
15
|
+
def initialize(board, options = {})
|
16
|
+
@board = board
|
17
|
+
@options = options
|
18
|
+
end
|
19
|
+
|
20
|
+
def render_all
|
21
|
+
spacing({foot: false}) do
|
22
|
+
print BoardDecorator.new(board).short
|
23
|
+
|
24
|
+
if board.lists.any?
|
25
|
+
board.lists.each do |list|
|
26
|
+
indent do
|
27
|
+
print ListDecorator.new(list).short
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
print_error "No lists were found.\n"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def render_show
|
37
|
+
spacing do
|
38
|
+
print BoardDecorator.new(board).short
|
39
|
+
|
40
|
+
if board.lists.any?
|
41
|
+
board.lists.each do |list|
|
42
|
+
indent do
|
43
|
+
print ListDecorator.new(list).short
|
44
|
+
|
45
|
+
if list.cards.any?
|
46
|
+
list.cards.each do |card|
|
47
|
+
indent do
|
48
|
+
print CardDecorator.new(card).short
|
49
|
+
end
|
50
|
+
end
|
51
|
+
else
|
52
|
+
print_error "No cards were found."
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
else
|
57
|
+
print_error "No lists were found."
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
attr_reader :board
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Troo
|
2
|
+
class CardDecorator
|
3
|
+
include DecoratorHelpers
|
4
|
+
|
5
|
+
def initialize(card, options = {})
|
6
|
+
@card = card
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def short
|
11
|
+
[default_str, id_str, name_str].join + "\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
def title
|
15
|
+
title_options = { ansicolor: true, colour: Esc.green, underline: Esc.underline }
|
16
|
+
highlight([default, brackets(id), name].join(" "), title_options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def name_str
|
20
|
+
highlight(name, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
def default_str
|
24
|
+
default.center(3)
|
25
|
+
end
|
26
|
+
|
27
|
+
def id_str
|
28
|
+
highlight(brackets(id) + " ", options).rjust(6)
|
29
|
+
end
|
30
|
+
|
31
|
+
def name
|
32
|
+
(card.name && card.name.chomp) || "N/A"
|
33
|
+
end
|
34
|
+
|
35
|
+
def default
|
36
|
+
card.default? ? "*" : ""
|
37
|
+
end
|
38
|
+
|
39
|
+
def id
|
40
|
+
card.short_id
|
41
|
+
end
|
42
|
+
|
43
|
+
def description
|
44
|
+
if card.desc.nil? || card.desc.empty?
|
45
|
+
"There are no further details at this time."
|
46
|
+
else
|
47
|
+
word_wrap(card.desc)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def comments
|
52
|
+
if card.comments.any? && card.comments.size > 3
|
53
|
+
message = "(There are more comments, use: 'troo show comments #{card.short_id}' to view all comments.)"
|
54
|
+
[decorated_recent_comments, message].join("\n")
|
55
|
+
elsif card.comments.any?
|
56
|
+
decorated_all_comments
|
57
|
+
else
|
58
|
+
"No comments have been left."
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def members
|
63
|
+
if card.members.any?
|
64
|
+
MemberPresenter.new(card).render_show
|
65
|
+
else
|
66
|
+
"No members have been assigned."
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def last_activity_date
|
71
|
+
Time.parse(card.last_activity_date).strftime("%a, %b %d at %H:%M")
|
72
|
+
end
|
73
|
+
|
74
|
+
def board
|
75
|
+
BoardDecorator.new(card.board, options).short
|
76
|
+
end
|
77
|
+
|
78
|
+
def list
|
79
|
+
ListDecorator.new(card.list, options).short
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
attr_reader :card
|
84
|
+
|
85
|
+
def options
|
86
|
+
defaults.merge!(@options)
|
87
|
+
end
|
88
|
+
|
89
|
+
def defaults
|
90
|
+
{
|
91
|
+
ansicolor: false,
|
92
|
+
colour: nil,
|
93
|
+
underline: nil
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def decorated_recent_comments
|
98
|
+
card.recent_comments.map { |comment| CommentDecorator.new(comment).as_view }.join
|
99
|
+
end
|
100
|
+
|
101
|
+
def decorated_all_comments
|
102
|
+
card.comments.map { |comment| CommentDecorator.new(comment).as_view }.join
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Troo
|
2
|
+
class CardPresenter
|
3
|
+
class << self
|
4
|
+
def render_show(card, options = {})
|
5
|
+
new(card, options).render_show
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
include DecoratorHelpers
|
10
|
+
|
11
|
+
def initialize(card, options = {})
|
12
|
+
@card = card
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
def render_show
|
17
|
+
print Template.parse(decorated_card, "/../views/card.erb")
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
attr_reader :card
|
22
|
+
|
23
|
+
def decorated_card
|
24
|
+
@decorated_card ||= CardDecorator.new(card)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Troo
|
2
|
+
class CommentDecorator
|
3
|
+
include DecoratorHelpers
|
4
|
+
|
5
|
+
def initialize(comment)
|
6
|
+
@comment = comment
|
7
|
+
end
|
8
|
+
|
9
|
+
def as_view
|
10
|
+
Template.parse(self, "/../views/comment.erb")
|
11
|
+
end
|
12
|
+
|
13
|
+
def member_username
|
14
|
+
[comment.member.username, ":"].join
|
15
|
+
end
|
16
|
+
|
17
|
+
def text
|
18
|
+
word_wrap(comment.text)
|
19
|
+
end
|
20
|
+
|
21
|
+
def date
|
22
|
+
Time.parse(comment.date).strftime("%a, %b %d at %H:%M")
|
23
|
+
end
|
24
|
+
|
25
|
+
def id
|
26
|
+
brackets(comment.id)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
attr_reader :comment
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Troo
|
2
|
+
class CommentPresenter
|
3
|
+
class << self
|
4
|
+
def render_show(card, options = {})
|
5
|
+
new(card, options).render_show
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
include DecoratorHelpers
|
10
|
+
|
11
|
+
def initialize(card, options = {})
|
12
|
+
@card = card
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
def render_show
|
17
|
+
spacing do
|
18
|
+
print CardDecorator.new(card).short
|
19
|
+
|
20
|
+
if card.comments.any?
|
21
|
+
card.comments.each do |comment|
|
22
|
+
indent do
|
23
|
+
print CommentDecorator.new(comment).as_view
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
print_error "No comments were found."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
attr_reader :card
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Troo
|
2
|
+
module DecoratorHelpers
|
3
|
+
module ClassMethods
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def word_wrap(text, line_width = 70)
|
13
|
+
return text if line_width <= 0
|
14
|
+
text.gsub(/\n/, ' ').gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip
|
15
|
+
end
|
16
|
+
|
17
|
+
def highlight(value, options = {})
|
18
|
+
if options.fetch(:ansicolor, true)
|
19
|
+
[ options.fetch(:colour, nil),
|
20
|
+
options.fetch(:underline, nil),
|
21
|
+
value,
|
22
|
+
Esc.reset ].join
|
23
|
+
else
|
24
|
+
value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def brackets(value)
|
29
|
+
"(#{value})"
|
30
|
+
end
|
31
|
+
|
32
|
+
def label(string)
|
33
|
+
highlight(string, { ansicolor: true,
|
34
|
+
colour: Esc.yellow,
|
35
|
+
underline: Esc.underline })
|
36
|
+
end
|
37
|
+
|
38
|
+
def member(string)
|
39
|
+
highlight(string, { ansicolor: true,
|
40
|
+
colour: Esc.magenta,
|
41
|
+
underline: Esc.underline })
|
42
|
+
end
|
43
|
+
|
44
|
+
def metadata(label, string)
|
45
|
+
[ highlight(label.rjust(9), { ansicolor: true,
|
46
|
+
colour: Esc.cyan,
|
47
|
+
underline: nil }),
|
48
|
+
string ].join(" ")
|
49
|
+
end
|
50
|
+
|
51
|
+
def spacing(options = {}, &block)
|
52
|
+
puts if options.fetch(:head, true)
|
53
|
+
yield
|
54
|
+
puts if options.fetch(:foot, true)
|
55
|
+
end
|
56
|
+
|
57
|
+
def indent(&block)
|
58
|
+
@indent ||= 0
|
59
|
+
@indent += 4
|
60
|
+
print indentation
|
61
|
+
yield
|
62
|
+
ensure
|
63
|
+
@indent -= 4
|
64
|
+
end
|
65
|
+
|
66
|
+
def indentation
|
67
|
+
' ' * @indent
|
68
|
+
end
|
69
|
+
|
70
|
+
def print_error(message)
|
71
|
+
indent do
|
72
|
+
print [(" " * 2), [Esc.red, message, Esc.reset].join].join(" ") + "\n"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Troo
|
2
|
+
class ListDecorator
|
3
|
+
include DecoratorHelpers
|
4
|
+
|
5
|
+
def initialize(list, options = {})
|
6
|
+
@list = list
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def short
|
11
|
+
[default_str, id_str, name_str].join + "\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
def name_str
|
15
|
+
highlight(name, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_str
|
19
|
+
default.center(3)
|
20
|
+
end
|
21
|
+
|
22
|
+
def id_str
|
23
|
+
highlight(brackets(id) + " ", options).rjust(6)
|
24
|
+
end
|
25
|
+
|
26
|
+
def name
|
27
|
+
(list.name && list.name.chomp) || "N/A"
|
28
|
+
end
|
29
|
+
|
30
|
+
def default
|
31
|
+
list.default? ? "*" : ""
|
32
|
+
end
|
33
|
+
|
34
|
+
def id
|
35
|
+
list.id.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
attr_reader :list
|
40
|
+
|
41
|
+
def options
|
42
|
+
defaults.merge!(@options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def defaults
|
46
|
+
{
|
47
|
+
ansicolor: true,
|
48
|
+
colour: Esc.green,
|
49
|
+
underline: Esc.underline
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|