troo 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +0 -1
  5. data/Guardfile +6 -0
  6. data/LICENSE.txt +1 -0
  7. data/README.md +46 -3
  8. data/Rakefile +11 -0
  9. data/bin/troo +12 -0
  10. data/configuration.yml.example +7 -0
  11. data/features/add_board.feature +1 -0
  12. data/features/add_card.feature +1 -0
  13. data/features/add_comment.feature +1 -0
  14. data/features/add_list.feature +1 -0
  15. data/features/cleanup.feature +0 -0
  16. data/features/move_card_to_list.feature +1 -0
  17. data/features/refresh.feature +1 -0
  18. data/features/set_default.feature +7 -0
  19. data/features/show_board.feature +1 -0
  20. data/features/show_boards.feature +1 -0
  21. data/features/show_card.feature +1 -0
  22. data/features/show_comments.feature +1 -0
  23. data/features/show_list.feature +1 -0
  24. data/features/status.feature +1 -0
  25. data/features/step_definitions/troo_steps.rb +0 -0
  26. data/features/support/env.rb +31 -0
  27. data/features/troo.feature +1 -0
  28. data/features/version.feature +8 -0
  29. data/lib/troo.rb +24 -2
  30. data/lib/troo/actions/create_board.rb +43 -0
  31. data/lib/troo/actions/create_card.rb +43 -0
  32. data/lib/troo/actions/create_comment.rb +44 -0
  33. data/lib/troo/actions/create_list.rb +41 -0
  34. data/lib/troo/actions/move_card.rb +36 -0
  35. data/lib/troo/actions/refresh_all.rb +79 -0
  36. data/lib/troo/actions/set_default.rb +35 -0
  37. data/lib/troo/cli/add_cli.rb +83 -0
  38. data/lib/troo/cli/default_cli.rb +37 -0
  39. data/lib/troo/cli/main_cli.rb +130 -0
  40. data/lib/troo/cli/show_cli.rb +83 -0
  41. data/lib/troo/cli/thor_fixes.rb +9 -0
  42. data/lib/troo/display/board_decorator.rb +58 -0
  43. data/lib/troo/display/board_presenter.rb +65 -0
  44. data/lib/troo/display/card_decorator.rb +105 -0
  45. data/lib/troo/display/card_presenter.rb +27 -0
  46. data/lib/troo/display/comment_decorator.rb +32 -0
  47. data/lib/troo/display/comment_presenter.rb +35 -0
  48. data/lib/troo/display/decorator_helpers.rb +76 -0
  49. data/lib/troo/display/list_decorator.rb +53 -0
  50. data/lib/troo/display/list_presenter.rb +43 -0
  51. data/lib/troo/display/member_decorator.rb +24 -0
  52. data/lib/troo/display/member_presenter.rb +59 -0
  53. data/lib/troo/external/board.rb +49 -0
  54. data/lib/troo/external/board_adaptor.rb +43 -0
  55. data/lib/troo/external/card.rb +70 -0
  56. data/lib/troo/external/card_adaptor.rb +78 -0
  57. data/lib/troo/external/comment.rb +64 -0
  58. data/lib/troo/external/comment_adaptor.rb +53 -0
  59. data/lib/troo/external/list.rb +58 -0
  60. data/lib/troo/external/list_adaptor.rb +48 -0
  61. data/lib/troo/external/member.rb +52 -0
  62. data/lib/troo/external/member_adaptor.rb +63 -0
  63. data/lib/troo/models/board.rb +26 -0
  64. data/lib/troo/models/board_persistence.rb +53 -0
  65. data/lib/troo/models/board_retrieval.rb +45 -0
  66. data/lib/troo/models/card.rb +54 -0
  67. data/lib/troo/models/card_persistence.rb +53 -0
  68. data/lib/troo/models/card_retrieval.rb +49 -0
  69. data/lib/troo/models/comment.rb +32 -0
  70. data/lib/troo/models/comment_persistence.rb +53 -0
  71. data/lib/troo/models/comment_retrieval.rb +32 -0
  72. data/lib/troo/models/list.rb +27 -0
  73. data/lib/troo/models/list_persistence.rb +53 -0
  74. data/lib/troo/models/list_retrieval.rb +45 -0
  75. data/lib/troo/models/member.rb +18 -0
  76. data/lib/troo/models/member_persistence.rb +53 -0
  77. data/lib/troo/models/member_retrieval.rb +36 -0
  78. data/lib/troo/models/model_helpers.rb +32 -0
  79. data/lib/troo/models/refresh.rb +23 -0
  80. data/lib/troo/presentation/template.rb +31 -0
  81. data/lib/troo/troo.rb +69 -0
  82. data/lib/troo/version.rb +2 -1
  83. data/lib/troo/views/card.erb +17 -0
  84. data/lib/troo/views/comment.erb +3 -0
  85. data/logs/.gitkeep +0 -0
  86. data/test/cassettes/board_by_id.yml +59 -0
  87. data/test/cassettes/boards_all.yml +118 -0
  88. data/test/cassettes/card_by_card_id.yml +58 -0
  89. data/test/cassettes/cards_by_board_id.yml +117 -0
  90. data/test/cassettes/cards_by_list_id.yml +114 -0
  91. data/test/cassettes/comments_by_board_id.yml +122 -0
  92. data/test/cassettes/comments_by_card_id.yml +114 -0
  93. data/test/cassettes/comments_by_list_id.yml +109 -0
  94. data/test/cassettes/create_board.yml +62 -0
  95. data/test/cassettes/create_card.yml +63 -0
  96. data/test/cassettes/create_comment.yml +67 -0
  97. data/test/cassettes/create_list.yml +60 -0
  98. data/test/cassettes/list_by_list_id.yml +56 -0
  99. data/test/cassettes/lists_by_board_id.yml +118 -0
  100. data/test/cassettes/member_by_member_id.yml +60 -0
  101. data/test/cassettes/members_by_board_id.yml +109 -0
  102. data/test/cassettes/move_card.yml +61 -0
  103. data/test/lib/troo/actions/create_board_test.rb +47 -0
  104. data/test/lib/troo/actions/create_card_test.rb +54 -0
  105. data/test/lib/troo/actions/create_comment_test.rb +49 -0
  106. data/test/lib/troo/actions/create_list_test.rb +49 -0
  107. data/test/lib/troo/actions/move_card_test.rb +46 -0
  108. data/test/lib/troo/actions/refresh_all_test.rb +68 -0
  109. data/test/lib/troo/actions/set_default_test.rb +44 -0
  110. data/test/lib/troo/cli/add_cli_test.rb +216 -0
  111. data/test/lib/troo/cli/default_cli_test.rb +79 -0
  112. data/test/lib/troo/cli/main_cli_test.rb +232 -0
  113. data/test/lib/troo/cli/show_cli_test.rb +221 -0
  114. data/test/lib/troo/cli/thor_fixes_test.rb +21 -0
  115. data/test/lib/troo/display/board_decorator_test.rb +126 -0
  116. data/test/lib/troo/display/board_presenter_test.rb +77 -0
  117. data/test/lib/troo/display/card_decorator_test.rb +221 -0
  118. data/test/lib/troo/display/card_presenter_test.rb +38 -0
  119. data/test/lib/troo/display/comment_decorator_test.rb +65 -0
  120. data/test/lib/troo/display/comment_presenter_test.rb +47 -0
  121. data/test/lib/troo/display/decorator_helpers_test.rb +7 -0
  122. data/test/lib/troo/display/list_decorator_test.rb +98 -0
  123. data/test/lib/troo/display/list_presenter_test.rb +48 -0
  124. data/test/lib/troo/display/member_decorator_test.rb +42 -0
  125. data/test/lib/troo/display/member_presenter_test.rb +70 -0
  126. data/test/lib/troo/external/board_adaptor_test.rb +36 -0
  127. data/test/lib/troo/external/board_test.rb +69 -0
  128. data/test/lib/troo/external/card_adaptor_test.rb +50 -0
  129. data/test/lib/troo/external/card_test.rb +108 -0
  130. data/test/lib/troo/external/comment_adaptor_test.rb +41 -0
  131. data/test/lib/troo/external/comment_test.rb +88 -0
  132. data/test/lib/troo/external/list_adaptor_test.rb +38 -0
  133. data/test/lib/troo/external/list_test.rb +65 -0
  134. data/test/lib/troo/external/member_adaptor_test.rb +44 -0
  135. data/test/lib/troo/external/member_test.rb +65 -0
  136. data/test/lib/troo/models/board_persistence_test.rb +61 -0
  137. data/test/lib/troo/models/board_retrieval_test.rb +93 -0
  138. data/test/lib/troo/models/board_test.rb +50 -0
  139. data/test/lib/troo/models/card_persistence_test.rb +60 -0
  140. data/test/lib/troo/models/card_retrieval_test.rb +101 -0
  141. data/test/lib/troo/models/card_test.rb +102 -0
  142. data/test/lib/troo/models/comment_persistence_test.rb +65 -0
  143. data/test/lib/troo/models/comment_retrieval_test.rb +46 -0
  144. data/test/lib/troo/models/comment_test.rb +59 -0
  145. data/test/lib/troo/models/list_persistence_test.rb +60 -0
  146. data/test/lib/troo/models/list_retrieval_test.rb +93 -0
  147. data/test/lib/troo/models/list_test.rb +53 -0
  148. data/test/lib/troo/models/member_persistence_test.rb +59 -0
  149. data/test/lib/troo/models/member_retrieval_test.rb +58 -0
  150. data/test/lib/troo/models/member_test.rb +44 -0
  151. data/test/lib/troo/models/model_helpers_test.rb +103 -0
  152. data/test/lib/troo/models/refresh_test.rb +45 -0
  153. data/test/lib/troo/presentation/template_test.rb +40 -0
  154. data/test/support/fabrication.rb +56 -0
  155. data/test/support/template.erb +3 -0
  156. data/test/support/vcr_setup.rb +36 -0
  157. data/test/test_helper.rb +30 -0
  158. data/troo.gemspec +24 -5
  159. metadata +501 -23
@@ -0,0 +1,9 @@
1
+ module Troo
2
+ module CLI
3
+ class ThorFixes < Thor
4
+ def self.banner(command, namespace = nil, subcommand = false)
5
+ "#{basename} #{@package_name} #{command.usage}"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -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