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.
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