troo 0.0.7 → 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.
Files changed (271) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +2 -0
  4. data/Guardfile +3 -1
  5. data/Rakefile +7 -0
  6. data/bin/troo +3 -8
  7. data/config/.gitkeep +0 -0
  8. data/config/cucumber.yml +8 -0
  9. data/features/add/board.feature +26 -0
  10. data/features/add/card.feature +34 -0
  11. data/features/add/comment.feature +21 -0
  12. data/features/add/list.feature +24 -0
  13. data/features/cleanup.feature +13 -0
  14. data/features/default/board.feature +21 -0
  15. data/features/default/card.feature +21 -0
  16. data/features/default/list.feature +21 -0
  17. data/features/refresh/all.feature +7 -0
  18. data/features/refresh/board.feature +26 -0
  19. data/features/refresh/card.feature +27 -0
  20. data/features/refresh/list.feature +27 -0
  21. data/features/show/board.feature +32 -0
  22. data/features/show/card.feature +62 -0
  23. data/features/show/comment.feature +39 -0
  24. data/features/show/list.feature +37 -0
  25. data/features/status.feature +46 -1
  26. data/features/step_definitions/fabrication_steps.rb +34 -0
  27. data/features/step_definitions/troo_steps.rb +16 -0
  28. data/features/support/env.rb +22 -24
  29. data/features/troo.feature +31 -1
  30. data/lib/troo/actions/create_board.rb +10 -7
  31. data/lib/troo/actions/create_card.rb +5 -4
  32. data/lib/troo/actions/create_comment.rb +15 -13
  33. data/lib/troo/actions/create_list.rb +5 -4
  34. data/lib/troo/actions/move_card.rb +4 -3
  35. data/lib/troo/{external/board_adaptor.rb → adaptors/board.rb} +3 -14
  36. data/lib/troo/{external/card_adaptor.rb → adaptors/card.rb} +4 -15
  37. data/lib/troo/{external/comment_adaptor.rb → adaptors/comment.rb} +6 -17
  38. data/lib/troo/{external/list_adaptor.rb → adaptors/list.rb} +3 -14
  39. data/lib/troo/{external/member_adaptor.rb → adaptors/member.rb} +3 -14
  40. data/lib/troo/adaptors/resource.rb +17 -0
  41. data/lib/troo/cli/add.rb +53 -0
  42. data/lib/troo/cli/default.rb +25 -0
  43. data/lib/troo/cli/main.rb +46 -0
  44. data/lib/troo/cli/refresh.rb +31 -0
  45. data/lib/troo/cli/show.rb +41 -0
  46. data/lib/troo/cli/thor_fixes.rb +13 -0
  47. data/lib/troo/commands/add/board.rb +26 -0
  48. data/lib/troo/commands/add/card.rb +33 -0
  49. data/lib/troo/commands/add/comment.rb +33 -0
  50. data/lib/troo/commands/add/list.rb +33 -0
  51. data/lib/troo/commands/add/resource.rb +21 -0
  52. data/lib/troo/commands/commands.rb +28 -0
  53. data/lib/troo/commands/default/board.rb +25 -0
  54. data/lib/troo/commands/default/card.rb +25 -0
  55. data/lib/troo/commands/default/list.rb +25 -0
  56. data/lib/troo/commands/default/resource.rb +26 -0
  57. data/lib/troo/commands/refresh/all.rb +41 -0
  58. data/lib/troo/commands/refresh/board.rb +28 -0
  59. data/lib/troo/commands/refresh/card.rb +29 -0
  60. data/lib/troo/commands/refresh/list.rb +29 -0
  61. data/lib/troo/commands/refresh/resource.rb +42 -0
  62. data/lib/troo/commands/show/board.rb +13 -0
  63. data/lib/troo/commands/show/boards.rb +35 -0
  64. data/lib/troo/commands/show/card.rb +13 -0
  65. data/lib/troo/commands/show/comments.rb +21 -0
  66. data/lib/troo/commands/show/list.rb +13 -0
  67. data/lib/troo/commands/show/resource.rb +41 -0
  68. data/lib/troo/commands/status/board.rb +30 -0
  69. data/lib/troo/commands/status/card.rb +30 -0
  70. data/lib/troo/commands/status/list.rb +30 -0
  71. data/lib/troo/commands/status/resource.rb +34 -0
  72. data/lib/troo/decorators/board.rb +66 -0
  73. data/lib/troo/decorators/card.rb +105 -0
  74. data/lib/troo/decorators/comment.rb +36 -0
  75. data/lib/troo/decorators/list.rb +60 -0
  76. data/lib/troo/decorators/member.rb +28 -0
  77. data/lib/troo/external/board.rb +14 -26
  78. data/lib/troo/external/card.rb +2 -19
  79. data/lib/troo/external/comment.rb +5 -23
  80. data/lib/troo/external/list.rb +2 -20
  81. data/lib/troo/external/member.rb +2 -20
  82. data/lib/troo/external/resource.rb +21 -6
  83. data/lib/troo/helpers/command_helpers.rb +37 -0
  84. data/lib/troo/{display → helpers}/decorator_helpers.rb +23 -17
  85. data/lib/troo/{models → helpers}/model_helpers.rb +1 -1
  86. data/lib/troo/models/behaviours/set_default.rb +49 -0
  87. data/lib/troo/models/board.rb +10 -7
  88. data/lib/troo/models/card.rb +33 -15
  89. data/lib/troo/models/comment.rb +8 -5
  90. data/lib/troo/models/list.rb +10 -6
  91. data/lib/troo/models/member.rb +7 -4
  92. data/lib/troo/models/persistence/board.rb +19 -0
  93. data/lib/troo/models/persistence/card.rb +19 -0
  94. data/lib/troo/models/persistence/comment.rb +19 -0
  95. data/lib/troo/models/persistence/list.rb +19 -0
  96. data/lib/troo/models/persistence/member.rb +19 -0
  97. data/lib/troo/models/persistence/resource.rb +50 -0
  98. data/lib/troo/models/refresh.rb +1 -1
  99. data/lib/troo/models/remote/comment.rb +21 -0
  100. data/lib/troo/models/remote/resource.rb +25 -0
  101. data/lib/troo/models/retrieval/board.rb +29 -0
  102. data/lib/troo/models/retrieval/card.rb +33 -0
  103. data/lib/troo/models/retrieval/comment.rb +25 -0
  104. data/lib/troo/models/retrieval/list.rb +29 -0
  105. data/lib/troo/models/retrieval/member.rb +25 -0
  106. data/lib/troo/models/retrieval/resource.rb +36 -0
  107. data/lib/troo/presentation/sentence.rb +57 -0
  108. data/lib/troo/presentation/template.rb +4 -3
  109. data/lib/troo/presenters/board.rb +81 -0
  110. data/lib/troo/presenters/card.rb +30 -0
  111. data/lib/troo/presenters/comment.rb +38 -0
  112. data/lib/troo/presenters/list.rb +44 -0
  113. data/lib/troo/presenters/member.rb +32 -0
  114. data/lib/troo/troo.rb +79 -65
  115. data/lib/troo/version.rb +1 -2
  116. data/lib/troo.rb +36 -8
  117. data/test/lib/troo/actions/create_board_test.rb +34 -15
  118. data/test/lib/troo/actions/create_card_test.rb +35 -18
  119. data/test/lib/troo/actions/create_comment_test.rb +38 -16
  120. data/test/lib/troo/actions/create_list_test.rb +31 -15
  121. data/test/lib/troo/actions/move_card_test.rb +23 -15
  122. data/test/lib/troo/adaptors/board_test.rb +38 -0
  123. data/test/lib/troo/adaptors/card_test.rb +49 -0
  124. data/test/lib/troo/adaptors/comment_test.rb +41 -0
  125. data/test/lib/troo/adaptors/list_test.rb +38 -0
  126. data/test/lib/troo/adaptors/member_test.rb +44 -0
  127. data/test/lib/troo/commands/add/board_test.rb +43 -0
  128. data/test/lib/troo/commands/add/card_test.rb +44 -0
  129. data/test/lib/troo/commands/add/comment_test.rb +44 -0
  130. data/test/lib/troo/commands/add/list_test.rb +44 -0
  131. data/test/lib/troo/commands/add/resource_test.rb +25 -0
  132. data/test/lib/troo/commands/default/board_test.rb +37 -0
  133. data/test/lib/troo/commands/default/card_test.rb +37 -0
  134. data/test/lib/troo/commands/default/list_test.rb +37 -0
  135. data/test/lib/troo/commands/default/resource_test.rb +20 -0
  136. data/test/lib/troo/commands/refresh/all_test.rb +39 -0
  137. data/test/lib/troo/commands/refresh/board_test.rb +62 -0
  138. data/test/lib/troo/commands/refresh/card_test.rb +62 -0
  139. data/test/lib/troo/commands/refresh/list_test.rb +62 -0
  140. data/test/lib/troo/commands/refresh/resource_test.rb +20 -0
  141. data/test/lib/troo/commands/show/board_test.rb +65 -0
  142. data/test/lib/troo/commands/show/boards_test.rb +36 -0
  143. data/test/lib/troo/commands/show/card_test.rb +64 -0
  144. data/test/lib/troo/commands/show/comments_test.rb +64 -0
  145. data/test/lib/troo/commands/show/list_test.rb +64 -0
  146. data/test/lib/troo/commands/show/resource_test.rb +25 -0
  147. data/test/lib/troo/commands/status/board_test.rb +43 -0
  148. data/test/lib/troo/commands/status/card_test.rb +43 -0
  149. data/test/lib/troo/commands/status/list_test.rb +43 -0
  150. data/test/lib/troo/commands/status/resource_test.rb +19 -0
  151. data/test/lib/troo/decorators/board_test.rb +129 -0
  152. data/test/lib/troo/decorators/card_test.rb +237 -0
  153. data/test/lib/troo/decorators/comment_test.rb +74 -0
  154. data/test/lib/troo/decorators/list_test.rb +102 -0
  155. data/test/lib/troo/decorators/member_test.rb +50 -0
  156. data/test/lib/troo/external/board_test.rb +74 -41
  157. data/test/lib/troo/external/card_test.rb +49 -37
  158. data/test/lib/troo/external/comment_test.rb +43 -33
  159. data/test/lib/troo/external/list_test.rb +37 -30
  160. data/test/lib/troo/external/member_test.rb +37 -30
  161. data/test/lib/troo/external/resource_test.rb +18 -1
  162. data/test/lib/troo/helpers/command_helpers_test.rb +82 -0
  163. data/test/lib/troo/{display → helpers}/decorator_helpers_test.rb +6 -6
  164. data/test/lib/troo/helpers/model_helpers_test.rb +103 -0
  165. data/test/lib/troo/models/behaviours/set_default_test.rb +54 -0
  166. data/test/lib/troo/models/board_test.rb +13 -14
  167. data/test/lib/troo/models/card_test.rb +64 -33
  168. data/test/lib/troo/models/comment_test.rb +18 -19
  169. data/test/lib/troo/models/list_test.rb +15 -15
  170. data/test/lib/troo/models/member_test.rb +18 -18
  171. data/test/lib/troo/models/persistence/board_test.rb +62 -0
  172. data/test/lib/troo/models/persistence/card_test.rb +61 -0
  173. data/test/lib/troo/models/persistence/comment_test.rb +69 -0
  174. data/test/lib/troo/models/persistence/list_test.rb +60 -0
  175. data/test/lib/troo/models/persistence/member_test.rb +60 -0
  176. data/test/lib/troo/models/refresh_test.rb +12 -11
  177. data/test/lib/troo/models/remote/comment_test.rb +56 -0
  178. data/test/lib/troo/models/remote/resource_test.rb +26 -0
  179. data/test/lib/troo/models/retrieval/board_test.rb +93 -0
  180. data/test/lib/troo/models/retrieval/card_test.rb +101 -0
  181. data/test/lib/troo/models/retrieval/comment_test.rb +46 -0
  182. data/test/lib/troo/models/retrieval/list_test.rb +93 -0
  183. data/test/lib/troo/models/retrieval/member_test.rb +58 -0
  184. data/test/lib/troo/presentation/sentence_test.rb +57 -0
  185. data/test/lib/troo/presentation/template_test.rb +17 -16
  186. data/test/lib/troo/presenters/board_test.rb +79 -0
  187. data/test/lib/troo/presenters/card_test.rb +41 -0
  188. data/test/lib/troo/presenters/comment_test.rb +49 -0
  189. data/test/lib/troo/presenters/list_test.rb +50 -0
  190. data/test/lib/troo/presenters/member_test.rb +40 -0
  191. data/test/support/fabrication.rb +31 -32
  192. data/test/support/vcr_setup.rb +7 -9
  193. data/test/system_test.sh +55 -0
  194. data/test/test_helper.rb +10 -10
  195. data/troo.gemspec +1 -0
  196. metadata +232 -134
  197. data/features/add_board.feature +0 -1
  198. data/features/add_card.feature +0 -1
  199. data/features/add_comment.feature +0 -1
  200. data/features/add_list.feature +0 -1
  201. data/features/move_card_to_list.feature +0 -1
  202. data/features/refresh.feature +0 -1
  203. data/features/set_default.feature +0 -7
  204. data/features/show_board.feature +0 -1
  205. data/features/show_boards.feature +0 -1
  206. data/features/show_card.feature +0 -1
  207. data/features/show_comments.feature +0 -1
  208. data/features/show_list.feature +0 -1
  209. data/features/version.feature +0 -8
  210. data/lib/troo/actions/refresh_all.rb +0 -79
  211. data/lib/troo/actions/set_default.rb +0 -46
  212. data/lib/troo/cli/add_cli.rb +0 -83
  213. data/lib/troo/cli/cli_helpers.rb +0 -34
  214. data/lib/troo/cli/default_cli.rb +0 -32
  215. data/lib/troo/cli/main_cli.rb +0 -132
  216. data/lib/troo/cli/show_cli.rb +0 -64
  217. data/lib/troo/display/board_decorator.rb +0 -62
  218. data/lib/troo/display/board_presenter.rb +0 -71
  219. data/lib/troo/display/card_decorator.rb +0 -100
  220. data/lib/troo/display/card_presenter.rb +0 -27
  221. data/lib/troo/display/comment_decorator.rb +0 -33
  222. data/lib/troo/display/comment_presenter.rb +0 -31
  223. data/lib/troo/display/list_decorator.rb +0 -57
  224. data/lib/troo/display/list_presenter.rb +0 -41
  225. data/lib/troo/display/member_decorator.rb +0 -25
  226. data/lib/troo/display/member_presenter.rb +0 -59
  227. data/lib/troo/models/board_persistence.rb +0 -25
  228. data/lib/troo/models/board_retrieval.rb +0 -45
  229. data/lib/troo/models/card_persistence.rb +0 -25
  230. data/lib/troo/models/card_retrieval.rb +0 -49
  231. data/lib/troo/models/comment_persistence.rb +0 -25
  232. data/lib/troo/models/comment_retrieval.rb +0 -32
  233. data/lib/troo/models/list_persistence.rb +0 -25
  234. data/lib/troo/models/list_retrieval.rb +0 -45
  235. data/lib/troo/models/member_persistence.rb +0 -25
  236. data/lib/troo/models/member_retrieval.rb +0 -36
  237. data/lib/troo/models/persistence.rb +0 -39
  238. data/test/lib/troo/actions/refresh_all_test.rb +0 -68
  239. data/test/lib/troo/actions/set_default_test.rb +0 -44
  240. data/test/lib/troo/cli/add_cli_test.rb +0 -216
  241. data/test/lib/troo/cli/cli_helpers_test.rb +0 -24
  242. data/test/lib/troo/cli/default_cli_test.rb +0 -85
  243. data/test/lib/troo/cli/main_cli_test.rb +0 -234
  244. data/test/lib/troo/cli/show_cli_test.rb +0 -251
  245. data/test/lib/troo/display/board_decorator_test.rb +0 -126
  246. data/test/lib/troo/display/board_presenter_test.rb +0 -77
  247. data/test/lib/troo/display/card_decorator_test.rb +0 -213
  248. data/test/lib/troo/display/card_presenter_test.rb +0 -38
  249. data/test/lib/troo/display/comment_decorator_test.rb +0 -70
  250. data/test/lib/troo/display/comment_presenter_test.rb +0 -47
  251. data/test/lib/troo/display/list_decorator_test.rb +0 -98
  252. data/test/lib/troo/display/list_presenter_test.rb +0 -48
  253. data/test/lib/troo/display/member_decorator_test.rb +0 -47
  254. data/test/lib/troo/display/member_presenter_test.rb +0 -70
  255. data/test/lib/troo/external/board_adaptor_test.rb +0 -36
  256. data/test/lib/troo/external/card_adaptor_test.rb +0 -50
  257. data/test/lib/troo/external/comment_adaptor_test.rb +0 -41
  258. data/test/lib/troo/external/list_adaptor_test.rb +0 -38
  259. data/test/lib/troo/external/member_adaptor_test.rb +0 -44
  260. data/test/lib/troo/models/board_persistence_test.rb +0 -61
  261. data/test/lib/troo/models/board_retrieval_test.rb +0 -93
  262. data/test/lib/troo/models/card_persistence_test.rb +0 -60
  263. data/test/lib/troo/models/card_retrieval_test.rb +0 -101
  264. data/test/lib/troo/models/comment_persistence_test.rb +0 -65
  265. data/test/lib/troo/models/comment_retrieval_test.rb +0 -46
  266. data/test/lib/troo/models/list_persistence_test.rb +0 -60
  267. data/test/lib/troo/models/list_retrieval_test.rb +0 -93
  268. data/test/lib/troo/models/member_persistence_test.rb +0 -59
  269. data/test/lib/troo/models/member_retrieval_test.rb +0 -58
  270. data/test/lib/troo/models/model_helpers_test.rb +0 -103
  271. data/test/lib/troo/models/persistence_test.rb +0 -6
@@ -0,0 +1,34 @@
1
+ module Troo
2
+ module Commands
3
+ module Status
4
+ class Resource
5
+ include CommandHelpers
6
+
7
+ class << self
8
+ def dispatch
9
+ new.report_status
10
+ end
11
+ end
12
+
13
+ def report_status
14
+ return success if resource
15
+ error
16
+ end
17
+
18
+ private
19
+
20
+ def resource_title
21
+ resource.decorator.title
22
+ end
23
+
24
+ def plural(singular)
25
+ if count == 1
26
+ "#{count} #{singular}"
27
+ else
28
+ "#{count} #{singular}s"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,66 @@
1
+ module Troo
2
+ module Decorators
3
+ class Board
4
+ include DecoratorHelpers
5
+
6
+ def initialize(board, options = {})
7
+ @board = board
8
+ @options = options
9
+ end
10
+
11
+ def short
12
+ [default_str, id_str, name_str].join + "\n"
13
+ end
14
+
15
+ def name_str
16
+ highlight(name, options)
17
+ end
18
+
19
+ def default_str
20
+ default.center(3)
21
+ end
22
+
23
+ def id_str
24
+ highlight(brackets(id) + ' ', options).rjust(6)
25
+ end
26
+
27
+ def description
28
+ return 'N/A' if board.description.nil? ||
29
+ board.description.empty?
30
+ word_wrap(board.description)
31
+ end
32
+
33
+ def name
34
+ (board.name && board.name.chomp) || 'N/A'
35
+ end
36
+
37
+ def default
38
+ board.default? ? '*' : ''
39
+ end
40
+
41
+ def id
42
+ board.id.to_s
43
+ end
44
+
45
+ def lists(alt_options = {})
46
+ board.lists.map { |list| list.decorator(alt_options) }
47
+ end
48
+
49
+ private
50
+
51
+ attr_reader :board
52
+
53
+ def options
54
+ defaults.merge!(@options)
55
+ end
56
+
57
+ def defaults
58
+ {
59
+ ansicolor: true,
60
+ colour: Esc.blue,
61
+ underline: Esc.underline
62
+ }
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,105 @@
1
+ module Troo
2
+ module Decorators
3
+ class Card
4
+ include DecoratorHelpers
5
+
6
+ def initialize(card, options = {})
7
+ @card = card
8
+ @options = options
9
+ end
10
+
11
+ def short
12
+ [default_str, id_str, name_str].join + "\n"
13
+ end
14
+
15
+ def name_str
16
+ highlight(name, options)
17
+ end
18
+
19
+ def default_str
20
+ default.center(3)
21
+ end
22
+
23
+ def id_str
24
+ highlight(brackets(id) + ' ', options).rjust(6)
25
+ end
26
+
27
+ def name
28
+ (card.name && card.name.chomp) || 'N/A'
29
+ end
30
+
31
+ def default
32
+ card.default? ? '*' : ''
33
+ end
34
+
35
+ def id
36
+ card.short_id
37
+ end
38
+
39
+ def description
40
+ if card.desc.nil? || card.desc.empty?
41
+ 'There are no further details at this time.'
42
+ else
43
+ word_wrap(card.desc)
44
+ end
45
+ end
46
+
47
+ def comments
48
+ if card.comments.any? && card.comments.size > 3
49
+ message = "(There are more comments, use: " \
50
+ "'troo show comments #{card.short_id}' to view " \
51
+ " all comments.)"
52
+ [decorated_recent_comments, message].join("\n")
53
+ elsif card.comments.any?
54
+ decorated_all_comments
55
+ else
56
+ 'No comments have been left.'
57
+ end
58
+ end
59
+
60
+ def members
61
+ Presenters::Member.show(card)
62
+ end
63
+
64
+ def last_activity_date
65
+ return 'N/A' unless card.last_activity_date
66
+ Time.parse(card.last_activity_date)
67
+ .strftime('%a, %b %d at %H:%M')
68
+ end
69
+
70
+ def board
71
+ card.board.decorator(options).short
72
+ end
73
+
74
+ def list
75
+ card.list.decorator(options).short
76
+ end
77
+
78
+ private
79
+
80
+ attr_reader :card
81
+
82
+ def options
83
+ defaults.merge!(@options)
84
+ end
85
+
86
+ def defaults
87
+ {
88
+ ansicolor: true,
89
+ colour: Esc.magenta,
90
+ underline: Esc.underline
91
+ }
92
+ end
93
+
94
+ def decorated_recent_comments
95
+ card.recent_comments.map do |comment|
96
+ comment.decorator.as_view
97
+ end.join
98
+ end
99
+
100
+ def decorated_all_comments
101
+ card.comments.map { |comment| comment.decorator.as_view }.join
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,36 @@
1
+ module Troo
2
+ module Decorators
3
+ class Comment
4
+ include DecoratorHelpers
5
+
6
+ def initialize(comment, options = {})
7
+ @comment = comment
8
+ @options = options
9
+ end
10
+
11
+ def as_view
12
+ Template.parse(self, '/../views/comment.erb')
13
+ end
14
+
15
+ def member_username
16
+ [comment.member.username, ':'].join
17
+ end
18
+
19
+ def text
20
+ word_wrap(comment.text)
21
+ end
22
+
23
+ def date
24
+ Time.parse(comment.date).strftime('%a, %b %d at %H:%M')
25
+ end
26
+
27
+ def id
28
+ brackets(comment.id)
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :comment
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,60 @@
1
+ module Troo
2
+ module Decorators
3
+ class List
4
+ include DecoratorHelpers
5
+
6
+ def initialize(list, options = {})
7
+ @list = list
8
+ @options = options
9
+ end
10
+
11
+ def short
12
+ [default_str, id_str, name_str].join + "\n"
13
+ end
14
+
15
+ def name_str
16
+ highlight(name, options)
17
+ end
18
+
19
+ def default_str
20
+ default.center(3)
21
+ end
22
+
23
+ def id_str
24
+ highlight(brackets(id) + ' ', options).rjust(6)
25
+ end
26
+
27
+ def name
28
+ (list.name && list.name.chomp) || 'N/A'
29
+ end
30
+
31
+ def default
32
+ list.default? ? '*' : ''
33
+ end
34
+
35
+ def id
36
+ list.id.to_s
37
+ end
38
+
39
+ def cards(alt_options = {})
40
+ list.cards.map { |card| card.decorator(alt_options) }
41
+ end
42
+
43
+ private
44
+
45
+ attr_reader :list
46
+
47
+ def options
48
+ defaults.merge!(@options)
49
+ end
50
+
51
+ def defaults
52
+ {
53
+ ansicolor: true,
54
+ colour: Esc.green,
55
+ underline: Esc.underline
56
+ }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,28 @@
1
+ module Troo
2
+ module Decorators
3
+ class Member
4
+ include DecoratorHelpers
5
+
6
+ def initialize(member, options = {})
7
+ @member = member
8
+ @options = options
9
+ end
10
+
11
+ def username
12
+ ['@', member.username].join
13
+ end
14
+
15
+ def name
16
+ member.full_name
17
+ end
18
+
19
+ def initials
20
+ member.initials
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :member
26
+ end
27
+ end
28
+ end
@@ -1,43 +1,31 @@
1
1
  module Troo
2
2
  module External
3
3
  class Board < Resource
4
- class << self
5
- def fetch(external_id, options = {})
6
- new(external_id, options).fetch_by_external_id.map do |resource|
7
- BoardPersistence.for(resource) unless closed?(resource)
8
- end
9
- end
10
-
11
- def fetch_all
12
- new.fetch_all.map do |resource|
13
- BoardPersistence.for(resource) unless closed?(resource)
14
- end
15
- end
4
+ def persist
5
+ Persistence::Board.with_collection(fetch)
16
6
  end
17
7
 
18
- def initialize(external_id = nil, options = {})
19
- @external_id = external_id
20
- @options = options
8
+ private
9
+
10
+ def all_boards
11
+ Trello::Board.all
21
12
  end
22
13
 
23
- def fetch_by_external_id
14
+ def by_board_id
24
15
  [Trello::Board.find(external_id)]
25
- rescue Trello::InvalidAccessToken
26
- raise Troo::InvalidAccessToken
27
- rescue Trello::Error
16
+ end
17
+
18
+ def by_list_id
28
19
  []
29
20
  end
30
21
 
31
- def fetch_all
32
- Trello::Board.all
33
- rescue Trello::InvalidAccessToken
34
- raise Troo::InvalidAccessToken
35
- rescue Trello::Error
22
+ def by_card_id
36
23
  []
37
24
  end
38
25
 
39
- private
40
- attr_reader :external_id
26
+ def by_member_id
27
+ []
28
+ end
41
29
  end
42
30
  end
43
31
  end
@@ -1,28 +1,11 @@
1
1
  module Troo
2
2
  module External
3
3
  class Card < Resource
4
- class << self
5
- def fetch(external_id, options = {})
6
- new(external_id, options).fetch_by_external_id.map do |resource|
7
- unless closed?(resource)
8
- Troo::External::Comment.fetch(resource.id, { mode: :card }) if options.fetch(:comments, true)
9
- CardPersistence.for(resource)
10
- end
11
- end
12
- end
13
- end
14
-
15
- def initialize(external_id, options = {})
16
- @external_id = external_id
17
- @options = options
4
+ def persist
5
+ Persistence::Card.with_collection(fetch)
18
6
  end
19
7
 
20
8
  private
21
- attr_reader :external_id
22
-
23
- def options
24
- defaults.merge!(@options)
25
- end
26
9
 
27
10
  def defaults
28
11
  { comments: true, mode: :board }
@@ -1,40 +1,22 @@
1
1
  module Troo
2
2
  module External
3
3
  class Comment < Resource
4
- class << self
5
- def fetch(external_id, options = {})
6
- new(external_id, options).fetch_by_external_id.map do |resource|
7
- CommentPersistence.for(resource)
8
- end
9
- end
10
- end
11
-
12
- def initialize(external_id, options = {})
13
- @external_id = external_id
14
- @options = options
4
+ def persist
5
+ Persistence::Comment.with_collection(fetch)
15
6
  end
16
7
 
17
8
  private
18
- attr_reader :external_id
19
-
20
- def options
21
- defaults.merge!(@options)
22
- end
23
-
24
- def defaults
25
- { mode: :board }
26
- end
27
9
 
28
10
  def by_board_id
29
- Trello::Board.find(external_id).actions({ filter: "commentCard" })
11
+ Trello::Board.find(external_id).actions(filter: 'commentCard')
30
12
  end
31
13
 
32
14
  def by_list_id
33
- Trello::List.find(external_id).actions({ filter: "commentCard" })
15
+ Trello::List.find(external_id).actions(filter: 'commentCard')
34
16
  end
35
17
 
36
18
  def by_card_id
37
- Trello::Card.find(external_id).actions({ filter: "commentCard" })
19
+ Trello::Card.find(external_id).actions(filter: 'commentCard')
38
20
  end
39
21
 
40
22
  def by_member_id
@@ -1,29 +1,11 @@
1
1
  module Troo
2
2
  module External
3
3
  class List < Resource
4
- class << self
5
- def fetch(external_id, options = {})
6
- new(external_id, options).fetch_by_external_id.map do |resource|
7
- ListPersistence.for(resource) unless closed?(resource)
8
- end
9
- end
10
- end
11
-
12
- def initialize(external_id, options = {})
13
- @external_id = external_id
14
- @options = options
4
+ def persist
5
+ Persistence::List.with_collection(fetch)
15
6
  end
16
7
 
17
8
  private
18
- attr_reader :external_id
19
-
20
- def options
21
- defaults.merge!(@options)
22
- end
23
-
24
- def defaults
25
- { mode: :board }
26
- end
27
9
 
28
10
  def by_board_id
29
11
  Trello::Board.find(external_id).lists
@@ -1,29 +1,11 @@
1
1
  module Troo
2
2
  module External
3
3
  class Member < Resource
4
- class << self
5
- def fetch(external_id, options = {})
6
- new(external_id, options).fetch_by_external_id.map do |resource|
7
- MemberPersistence.for(resource)
8
- end
9
- end
10
- end
11
-
12
- def initialize(external_id, options = {})
13
- @external_id = external_id
14
- @options = options
4
+ def persist
5
+ Persistence::Member.with_collection(fetch)
15
6
  end
16
7
 
17
8
  private
18
- attr_reader :external_id
19
-
20
- def options
21
- defaults.merge!(@options)
22
- end
23
-
24
- def defaults
25
- { mode: :board }
26
- end
27
9
 
28
10
  def by_board_id
29
11
  Trello::Board.find(external_id).members
@@ -1,16 +1,22 @@
1
1
  module Troo
2
2
  module External
3
3
  class Resource
4
- class << self
5
- private
4
+ attr_reader :external_id
6
5
 
7
- def closed?(resource)
8
- resource.nil? || resource.closed?
6
+ class << self
7
+ def fetch(external_id, options = {})
8
+ new(external_id, options).persist
9
9
  end
10
10
  end
11
11
 
12
- def fetch_by_external_id
12
+ def initialize(external_id, options = {})
13
+ @external_id = external_id
14
+ @options = options
15
+ end
16
+
17
+ def fetch
13
18
  case options.fetch(:mode)
19
+ when :all then all_boards
14
20
  when :board then by_board_id
15
21
  when :list then by_list_id
16
22
  when :card then by_card_id
@@ -21,7 +27,16 @@ module Troo
21
27
  rescue Trello::Error
22
28
  []
23
29
  end
30
+
31
+ private
32
+
33
+ def options
34
+ defaults.merge!(@options)
35
+ end
36
+
37
+ def defaults
38
+ { mode: :board }
39
+ end
24
40
  end
25
41
  end
26
42
  end
27
-
@@ -0,0 +1,37 @@
1
+ module Troo
2
+ module CommandHelpers
3
+ module ClassMethods
4
+ end
5
+
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ def error_no_default
11
+ @type = :card if type == :comments
12
+ "Specify an <id> or use 'troo default #{type_str} <id>' " \
13
+ "to set a default #{type_str} first."
14
+ end
15
+
16
+ def error_not_found
17
+ @type = :card if type == :comments
18
+ "#{type_capitalize} cannot be found. " + error_no_default
19
+ end
20
+
21
+ def type_str
22
+ type.to_s
23
+ end
24
+
25
+ def type_capitalize
26
+ type_str.capitalize
27
+ end
28
+
29
+ def type_pluralize
30
+ type_str + 's'
31
+ end
32
+
33
+ def no_default?
34
+ id.nil?
35
+ end
36
+ end
37
+ end
@@ -8,7 +8,7 @@ module Troo
8
8
  end
9
9
 
10
10
  def title
11
- highlight([default, brackets(id), name].join(" "), options)
11
+ highlight([default, brackets(id), name].join(' '), options)
12
12
  end
13
13
 
14
14
  private
@@ -19,15 +19,17 @@ module Troo
19
19
 
20
20
  def word_wrap(text, line_width = 70)
21
21
  return text if line_width <= 0
22
- text.gsub(/\n/, ' ').gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip
22
+ text.gsub(/\n/, ' ')
23
+ .gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n")
24
+ .strip
23
25
  end
24
26
 
25
27
  def highlight(value, options = {})
26
28
  if options.fetch(:ansicolor, true)
27
- [ options.fetch(:colour, nil),
28
- options.fetch(:underline, nil),
29
- value,
30
- Esc.reset ].join
29
+ [options.fetch(:colour, nil),
30
+ options.fetch(:underline, nil),
31
+ value,
32
+ Esc.reset].join
31
33
  else
32
34
  value
33
35
  end
@@ -38,22 +40,22 @@ module Troo
38
40
  end
39
41
 
40
42
  def label(string)
41
- highlight(string, { ansicolor: true,
42
- colour: Esc.yellow,
43
- underline: Esc.underline })
43
+ highlight(string, ansicolor: true,
44
+ colour: Esc.yellow,
45
+ underline: Esc.underline)
44
46
  end
45
47
 
46
48
  def member(string)
47
- highlight(string, { ansicolor: true,
48
- colour: Esc.magenta,
49
- underline: Esc.underline })
49
+ highlight(string, ansicolor: true,
50
+ colour: Esc.magenta,
51
+ underline: Esc.underline)
50
52
  end
51
53
 
52
54
  def metadata(label, string)
53
- [ highlight(label.rjust(9), { ansicolor: true,
54
- colour: Esc.cyan,
55
- underline: nil }),
56
- string ].join(" ")
55
+ [highlight(label.rjust(9), ansicolor: true,
56
+ colour: Esc.cyan,
57
+ underline: nil),
58
+ string].join(' ')
57
59
  end
58
60
 
59
61
  def spacing(options = {}, &block)
@@ -77,8 +79,12 @@ module Troo
77
79
 
78
80
  def print_error(message)
79
81
  indent do
80
- print [(" " * 2), [Esc.red, message, Esc.reset].join].join(" ") + "\n"
82
+ print [(' ' * 2), error(message)].join(' ') + "\n"
81
83
  end
82
84
  end
85
+
86
+ def error(message)
87
+ [Esc.red, message, Esc.reset].join
88
+ end
83
89
  end
84
90
  end