troo 0.0.8 → 0.0.9

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.ruby-version +1 -1
  4. data/.trooconf.example +18 -0
  5. data/Gemfile.lock +178 -0
  6. data/README.md +77 -21
  7. data/Rakefile +1 -1
  8. data/bin/completion.bash +10 -0
  9. data/bin/completion.zsh +10 -0
  10. data/bin/init.sh +15 -0
  11. data/bin/troo +12 -3
  12. data/config/cucumber.yml +3 -3
  13. data/config/en.yml +29 -0
  14. data/config/trello_api.yml +19 -0
  15. data/features/add/board.feature +3 -19
  16. data/features/add/card.feature +14 -18
  17. data/features/add/comment.feature +14 -14
  18. data/features/add/list.feature +11 -14
  19. data/features/default/board.feature +4 -4
  20. data/features/default/card.feature +4 -4
  21. data/features/default/list.feature +4 -4
  22. data/features/move/card.feature +54 -0
  23. data/features/refresh/all.feature +8 -4
  24. data/features/refresh/board.feature +9 -6
  25. data/features/refresh/card.feature +9 -6
  26. data/features/refresh/list.feature +9 -6
  27. data/features/show/board.feature +7 -7
  28. data/features/show/boards.feature +19 -0
  29. data/features/show/card.feature +86 -15
  30. data/features/show/comment.feature +14 -12
  31. data/features/show/list.feature +19 -14
  32. data/features/status.feature +27 -13
  33. data/features/step_definitions/fabrication_steps.rb +43 -8
  34. data/features/step_definitions/troo_steps.rb +3 -2
  35. data/features/support/env.rb +1 -0
  36. data/features/troo.feature +0 -12
  37. data/lib/troo.rb +32 -29
  38. data/lib/troo/api/client.rb +117 -0
  39. data/lib/troo/api/endpoints.rb +39 -0
  40. data/lib/troo/api/headers.rb +44 -0
  41. data/lib/troo/api/oauth_settings.rb +36 -0
  42. data/lib/troo/api/request.rb +37 -0
  43. data/lib/troo/api/response.rb +31 -0
  44. data/lib/troo/cli/add.rb +8 -12
  45. data/lib/troo/cli/commands/add.rb +95 -0
  46. data/lib/troo/cli/commands/default.rb +44 -0
  47. data/lib/troo/cli/commands/move/card.rb +95 -0
  48. data/lib/troo/cli/commands/refresh.rb +80 -0
  49. data/lib/troo/cli/commands/refresh/all.rb +52 -0
  50. data/lib/troo/cli/commands/show.rb +56 -0
  51. data/lib/troo/cli/commands/show/show_boards.rb +36 -0
  52. data/lib/troo/cli/commands/show/show_comments.rb +54 -0
  53. data/lib/troo/cli/commands/status.rb +68 -0
  54. data/lib/troo/cli/default.rb +3 -3
  55. data/lib/troo/cli/main.rb +60 -9
  56. data/lib/troo/cli/refresh.rb +4 -4
  57. data/lib/troo/cli/show.rb +7 -7
  58. data/lib/troo/cli/thor_fixes.rb +1 -5
  59. data/lib/troo/configuration.rb +53 -0
  60. data/lib/troo/debug.rb +18 -0
  61. data/lib/troo/decorators/member.rb +2 -19
  62. data/lib/troo/decorators/resource.rb +130 -0
  63. data/lib/troo/helpers/decorator_helpers.rb +21 -74
  64. data/lib/troo/helpers/model_helpers.rb +19 -4
  65. data/lib/troo/helpers/remote_model_helpers.rb +54 -0
  66. data/lib/troo/models/board.rb +19 -11
  67. data/lib/troo/models/card.rb +20 -17
  68. data/lib/troo/models/comment.rb +28 -8
  69. data/lib/troo/models/list.rb +22 -14
  70. data/lib/troo/models/member.rb +21 -5
  71. data/lib/troo/models/refresh.rb +3 -4
  72. data/lib/troo/persistence/local.rb +63 -0
  73. data/lib/troo/presentation/formatter.rb +132 -0
  74. data/lib/troo/presentation/template.rb +0 -4
  75. data/lib/troo/presenters/board.rb +32 -51
  76. data/lib/troo/presenters/card.rb +4 -11
  77. data/lib/troo/presenters/comment.rb +30 -16
  78. data/lib/troo/presenters/list.rb +25 -21
  79. data/lib/troo/presenters/member.rb +1 -8
  80. data/lib/troo/remote/all.rb +16 -0
  81. data/lib/troo/remote/board.rb +64 -0
  82. data/lib/troo/remote/card.rb +81 -0
  83. data/lib/troo/remote/comment.rb +70 -0
  84. data/lib/troo/remote/comment_data.rb +11 -0
  85. data/lib/troo/remote/comment_data_board.rb +13 -0
  86. data/lib/troo/remote/comment_data_card.rb +15 -0
  87. data/lib/troo/remote/list.rb +49 -0
  88. data/lib/troo/remote/member.rb +75 -0
  89. data/lib/troo/remote/persistence/board.rb +57 -0
  90. data/lib/troo/remote/persistence/card.rb +59 -0
  91. data/lib/troo/remote/persistence/comment.rb +58 -0
  92. data/lib/troo/remote/persistence/list.rb +57 -0
  93. data/lib/troo/remote/persistence/move_card.rb +85 -0
  94. data/lib/troo/retrieval/local.rb +100 -0
  95. data/lib/troo/retrieval/remote.rb +91 -0
  96. data/lib/troo/troo.rb +42 -42
  97. data/lib/troo/version.rb +1 -1
  98. data/lib/troo/views/card.erb +8 -10
  99. data/lib/troo/views/comments.erb +4 -0
  100. data/test/cassettes/board_by_id.yml +21 -30
  101. data/test/cassettes/boards_all.yml +22 -90
  102. data/test/cassettes/card_by_id.yml +49 -0
  103. data/test/cassettes/cards_by_board_id.yml +22 -90
  104. data/test/cassettes/cards_by_list_id.yml +22 -87
  105. data/test/cassettes/comments_by_board_id.yml +22 -95
  106. data/test/cassettes/comments_by_card_id.yml +22 -87
  107. data/test/cassettes/create_board.yml +20 -32
  108. data/test/cassettes/create_card.yml +21 -35
  109. data/test/cassettes/create_comment.yml +19 -37
  110. data/test/cassettes/create_list.yml +18 -32
  111. data/test/cassettes/list_by_id.yml +46 -0
  112. data/test/cassettes/lists_by_board_id.yml +19 -91
  113. data/test/cassettes/member_by_id.yml +48 -0
  114. data/test/cassettes/members_by_board_id.yml +21 -82
  115. data/test/cassettes/move_card_board.yml +49 -0
  116. data/test/cassettes/move_card_list.yml +49 -0
  117. data/test/lib/troo/api/client_test.rb +75 -0
  118. data/test/lib/troo/api/endpoints_test.rb +48 -0
  119. data/test/lib/troo/api/headers_test.rb +27 -0
  120. data/test/lib/troo/api/oauth_settings_test.rb +10 -0
  121. data/test/lib/troo/api/request_test.rb +63 -0
  122. data/test/lib/troo/api/response_test.rb +15 -0
  123. data/test/lib/troo/cli/add_test.rb +113 -0
  124. data/test/lib/troo/cli/commands/add_test.rb +66 -0
  125. data/test/lib/troo/cli/commands/default_test.rb +39 -0
  126. data/test/lib/troo/cli/commands/move/card_test.rb +86 -0
  127. data/test/lib/troo/cli/commands/refresh/all_test.rb +37 -0
  128. data/test/lib/troo/cli/commands/refresh_test.rb +59 -0
  129. data/test/lib/troo/cli/commands/show/show_boards_test.rb +35 -0
  130. data/test/lib/troo/cli/commands/show/show_comments_test.rb +63 -0
  131. data/test/lib/troo/cli/commands/show_test.rb +65 -0
  132. data/test/lib/troo/cli/commands/status_test.rb +48 -0
  133. data/test/lib/troo/cli/default_test.rb +39 -0
  134. data/test/lib/troo/cli/main_test.rb +102 -0
  135. data/test/lib/troo/cli/refresh_test.rb +43 -0
  136. data/test/lib/troo/cli/show_test.rb +49 -0
  137. data/test/lib/troo/cli/thor_fixes_test.rb +38 -0
  138. data/test/lib/troo/configuration_test.rb +43 -0
  139. data/test/lib/troo/debug_test.rb +25 -0
  140. data/test/lib/troo/decorators/card_test.rb +105 -229
  141. data/test/lib/troo/decorators/member_test.rb +20 -35
  142. data/test/lib/troo/decorators/resource_test.rb +157 -0
  143. data/test/lib/troo/helpers/decorator_helpers_test.rb +10 -19
  144. data/test/lib/troo/helpers/model_helpers_test.rb +18 -8
  145. data/test/lib/troo/helpers/remote_model_helpers_test.rb +68 -0
  146. data/test/lib/troo/models/behaviours/set_default_test.rb +0 -10
  147. data/test/lib/troo/models/board_test.rb +2 -2
  148. data/test/lib/troo/models/card_test.rb +2 -2
  149. data/test/lib/troo/models/comment_test.rb +6 -2
  150. data/test/lib/troo/models/list_test.rb +2 -2
  151. data/test/lib/troo/models/member_test.rb +6 -2
  152. data/test/lib/troo/persistence/local_test.rb +31 -0
  153. data/test/lib/troo/presentation/formatter_test.rb +31 -0
  154. data/test/lib/troo/presentation/sentence_test.rb +0 -12
  155. data/test/lib/troo/presentation/template_test.rb +1 -14
  156. data/test/lib/troo/presenters/board_test.rb +17 -36
  157. data/test/lib/troo/presenters/card_test.rb +1 -31
  158. data/test/lib/troo/presenters/comment_test.rb +19 -19
  159. data/test/lib/troo/presenters/list_test.rb +18 -18
  160. data/test/lib/troo/presenters/member_test.rb +1 -14
  161. data/test/lib/troo/remote/board_test.rb +66 -0
  162. data/test/lib/troo/remote/card_test.rb +81 -0
  163. data/test/lib/troo/remote/comment_data_board.rb +9 -0
  164. data/test/lib/troo/remote/comment_data_card_test.rb +9 -0
  165. data/test/lib/troo/remote/comment_data_test.rb +9 -0
  166. data/test/lib/troo/remote/comment_test.rb +100 -0
  167. data/test/lib/troo/remote/list_test.rb +67 -0
  168. data/test/lib/troo/remote/member_test.rb +70 -0
  169. data/test/lib/troo/remote/persistence/board_test.rb +39 -0
  170. data/test/lib/troo/remote/persistence/card_test.rb +50 -0
  171. data/test/lib/troo/remote/persistence/comment_test.rb +45 -0
  172. data/test/lib/troo/remote/persistence/list_test.rb +45 -0
  173. data/test/lib/troo/remote/persistence/move_card_test.rb +78 -0
  174. data/test/lib/troo/retrieval/local_test.rb +192 -0
  175. data/test/lib/troo/retrieval/remote_test.rb +49 -0
  176. data/test/support/fabrication.rb +17 -17
  177. data/test/support/fake_trello/fake_response.rb +38 -0
  178. data/test/support/fake_trello/server.rb +124 -0
  179. data/test/support/remotes/all_boards.json +41 -0
  180. data/test/support/remotes/board.json +140 -0
  181. data/test/support/remotes/board_by_id.json +75 -0
  182. data/test/support/remotes/card.json +40 -0
  183. data/test/support/remotes/card_by_card_id.json +302 -0
  184. data/test/support/remotes/comment.json +27 -0
  185. data/test/support/remotes/create_board.json +38 -0
  186. data/test/support/remotes/list.json +7 -0
  187. data/test/support/remotes/member.json +50 -0
  188. data/test/system_test.sh +21 -1
  189. data/test/test_helper.rb +2 -1
  190. data/troo.gemspec +28 -20
  191. metadata +376 -269
  192. data/configuration.yml.example +0 -7
  193. data/features/cleanup.feature +0 -13
  194. data/lib/troo/actions/create_board.rb +0 -46
  195. data/lib/troo/actions/create_card.rb +0 -44
  196. data/lib/troo/actions/create_comment.rb +0 -46
  197. data/lib/troo/actions/create_list.rb +0 -42
  198. data/lib/troo/actions/move_card.rb +0 -37
  199. data/lib/troo/adaptors/board.rb +0 -32
  200. data/lib/troo/adaptors/card.rb +0 -67
  201. data/lib/troo/adaptors/comment.rb +0 -42
  202. data/lib/troo/adaptors/list.rb +0 -37
  203. data/lib/troo/adaptors/member.rb +0 -52
  204. data/lib/troo/adaptors/resource.rb +0 -17
  205. data/lib/troo/commands/add/board.rb +0 -26
  206. data/lib/troo/commands/add/card.rb +0 -33
  207. data/lib/troo/commands/add/comment.rb +0 -33
  208. data/lib/troo/commands/add/list.rb +0 -33
  209. data/lib/troo/commands/add/resource.rb +0 -21
  210. data/lib/troo/commands/commands.rb +0 -28
  211. data/lib/troo/commands/default/board.rb +0 -25
  212. data/lib/troo/commands/default/card.rb +0 -25
  213. data/lib/troo/commands/default/list.rb +0 -25
  214. data/lib/troo/commands/default/resource.rb +0 -26
  215. data/lib/troo/commands/refresh/all.rb +0 -41
  216. data/lib/troo/commands/refresh/board.rb +0 -28
  217. data/lib/troo/commands/refresh/card.rb +0 -29
  218. data/lib/troo/commands/refresh/list.rb +0 -29
  219. data/lib/troo/commands/refresh/resource.rb +0 -42
  220. data/lib/troo/commands/show/board.rb +0 -13
  221. data/lib/troo/commands/show/boards.rb +0 -35
  222. data/lib/troo/commands/show/card.rb +0 -13
  223. data/lib/troo/commands/show/comments.rb +0 -21
  224. data/lib/troo/commands/show/list.rb +0 -13
  225. data/lib/troo/commands/show/resource.rb +0 -41
  226. data/lib/troo/commands/status/board.rb +0 -30
  227. data/lib/troo/commands/status/card.rb +0 -30
  228. data/lib/troo/commands/status/list.rb +0 -30
  229. data/lib/troo/commands/status/resource.rb +0 -34
  230. data/lib/troo/decorators/board.rb +0 -66
  231. data/lib/troo/decorators/card.rb +0 -105
  232. data/lib/troo/decorators/comment.rb +0 -36
  233. data/lib/troo/decorators/list.rb +0 -60
  234. data/lib/troo/external/board.rb +0 -31
  235. data/lib/troo/external/card.rb +0 -31
  236. data/lib/troo/external/comment.rb +0 -27
  237. data/lib/troo/external/list.rb +0 -27
  238. data/lib/troo/external/member.rb +0 -27
  239. data/lib/troo/external/resource.rb +0 -42
  240. data/lib/troo/helpers/command_helpers.rb +0 -37
  241. data/lib/troo/models/persistence/board.rb +0 -19
  242. data/lib/troo/models/persistence/card.rb +0 -19
  243. data/lib/troo/models/persistence/comment.rb +0 -19
  244. data/lib/troo/models/persistence/list.rb +0 -19
  245. data/lib/troo/models/persistence/member.rb +0 -19
  246. data/lib/troo/models/persistence/resource.rb +0 -50
  247. data/lib/troo/models/remote/comment.rb +0 -21
  248. data/lib/troo/models/remote/resource.rb +0 -25
  249. data/lib/troo/models/retrieval/board.rb +0 -29
  250. data/lib/troo/models/retrieval/card.rb +0 -33
  251. data/lib/troo/models/retrieval/comment.rb +0 -25
  252. data/lib/troo/models/retrieval/list.rb +0 -29
  253. data/lib/troo/models/retrieval/member.rb +0 -25
  254. data/lib/troo/models/retrieval/resource.rb +0 -36
  255. data/lib/troo/views/comment.erb +0 -3
  256. data/test/cassettes/card_by_card_id.yml +0 -58
  257. data/test/cassettes/comments_by_list_id.yml +0 -109
  258. data/test/cassettes/list_by_list_id.yml +0 -56
  259. data/test/cassettes/member_by_member_id.yml +0 -60
  260. data/test/cassettes/move_card.yml +0 -61
  261. data/test/lib/troo/actions/create_board_test.rb +0 -66
  262. data/test/lib/troo/actions/create_card_test.rb +0 -71
  263. data/test/lib/troo/actions/create_comment_test.rb +0 -71
  264. data/test/lib/troo/actions/create_list_test.rb +0 -65
  265. data/test/lib/troo/actions/move_card_test.rb +0 -54
  266. data/test/lib/troo/adaptors/board_test.rb +0 -38
  267. data/test/lib/troo/adaptors/card_test.rb +0 -49
  268. data/test/lib/troo/adaptors/comment_test.rb +0 -41
  269. data/test/lib/troo/adaptors/list_test.rb +0 -38
  270. data/test/lib/troo/adaptors/member_test.rb +0 -44
  271. data/test/lib/troo/commands/add/board_test.rb +0 -43
  272. data/test/lib/troo/commands/add/card_test.rb +0 -44
  273. data/test/lib/troo/commands/add/comment_test.rb +0 -44
  274. data/test/lib/troo/commands/add/list_test.rb +0 -44
  275. data/test/lib/troo/commands/add/resource_test.rb +0 -25
  276. data/test/lib/troo/commands/default/board_test.rb +0 -37
  277. data/test/lib/troo/commands/default/card_test.rb +0 -37
  278. data/test/lib/troo/commands/default/list_test.rb +0 -37
  279. data/test/lib/troo/commands/default/resource_test.rb +0 -20
  280. data/test/lib/troo/commands/refresh/all_test.rb +0 -39
  281. data/test/lib/troo/commands/refresh/board_test.rb +0 -62
  282. data/test/lib/troo/commands/refresh/card_test.rb +0 -62
  283. data/test/lib/troo/commands/refresh/list_test.rb +0 -62
  284. data/test/lib/troo/commands/refresh/resource_test.rb +0 -20
  285. data/test/lib/troo/commands/show/board_test.rb +0 -65
  286. data/test/lib/troo/commands/show/boards_test.rb +0 -36
  287. data/test/lib/troo/commands/show/card_test.rb +0 -64
  288. data/test/lib/troo/commands/show/comments_test.rb +0 -64
  289. data/test/lib/troo/commands/show/list_test.rb +0 -64
  290. data/test/lib/troo/commands/show/resource_test.rb +0 -25
  291. data/test/lib/troo/commands/status/board_test.rb +0 -43
  292. data/test/lib/troo/commands/status/card_test.rb +0 -43
  293. data/test/lib/troo/commands/status/list_test.rb +0 -43
  294. data/test/lib/troo/commands/status/resource_test.rb +0 -19
  295. data/test/lib/troo/decorators/board_test.rb +0 -129
  296. data/test/lib/troo/decorators/comment_test.rb +0 -74
  297. data/test/lib/troo/decorators/list_test.rb +0 -102
  298. data/test/lib/troo/external/board_test.rb +0 -102
  299. data/test/lib/troo/external/card_test.rb +0 -131
  300. data/test/lib/troo/external/comment_test.rb +0 -109
  301. data/test/lib/troo/external/list_test.rb +0 -94
  302. data/test/lib/troo/external/member_test.rb +0 -94
  303. data/test/lib/troo/external/resource_test.rb +0 -25
  304. data/test/lib/troo/helpers/command_helpers_test.rb +0 -82
  305. data/test/lib/troo/models/persistence/board_test.rb +0 -62
  306. data/test/lib/troo/models/persistence/card_test.rb +0 -61
  307. data/test/lib/troo/models/persistence/comment_test.rb +0 -69
  308. data/test/lib/troo/models/persistence/list_test.rb +0 -60
  309. data/test/lib/troo/models/persistence/member_test.rb +0 -60
  310. data/test/lib/troo/models/remote/comment_test.rb +0 -56
  311. data/test/lib/troo/models/remote/resource_test.rb +0 -26
  312. data/test/lib/troo/models/retrieval/board_test.rb +0 -93
  313. data/test/lib/troo/models/retrieval/card_test.rb +0 -101
  314. data/test/lib/troo/models/retrieval/comment_test.rb +0 -46
  315. data/test/lib/troo/models/retrieval/list_test.rb +0 -93
  316. data/test/lib/troo/models/retrieval/member_test.rb +0 -58
@@ -10,12 +10,20 @@ module Troo
10
10
  attribute :avatar_id
11
11
  attribute :bio
12
12
  attribute :url
13
- attribute :external_member_id
13
+ attribute :external_id
14
+ attribute :short_id
14
15
 
15
- index :external_member_id
16
+ index :external_id
17
+ index :short_id
16
18
 
17
- def self.remote(id, options = { mode: :member })
18
- External::Member.fetch(id, options).first
19
+ class << self
20
+ def remote
21
+ Remote::Member
22
+ end
23
+
24
+ def type
25
+ :member
26
+ end
19
27
  end
20
28
 
21
29
  def decorator(options = {})
@@ -23,7 +31,15 @@ module Troo
23
31
  end
24
32
 
25
33
  def presenter(options = {})
26
- Presenters::Member.new(self, options)
34
+ Presenters::Member.new(decorator, options)
35
+ end
36
+
37
+ def default?
38
+ false
39
+ end
40
+
41
+ def type
42
+ self.class.type
27
43
  end
28
44
  end
29
45
  end
@@ -7,17 +7,16 @@ module Troo
7
7
 
8
8
  index :last_performed_at
9
9
 
10
- alias_method :last_performed_at?, :last_performed_at
11
-
12
10
  class << self
13
11
  def completed!
14
12
  all.map { |record| record.delete }
15
13
  create(last_performed_at: Time.now.to_s)
16
14
  end
17
15
 
18
- def last_performed_at?
19
- first ? first.last_performed_at? : nil
16
+ def last_performed_at
17
+ first ? first.last_performed_at : nil
20
18
  end
19
+ alias_method :last_performed_at?, :last_performed_at
21
20
  end
22
21
  end
23
22
  end
@@ -0,0 +1,63 @@
1
+ module Troo
2
+ module Persistence
3
+ class Local
4
+ class << self
5
+ def with_collection(resources = [])
6
+ resources.map do |resource|
7
+ new(resource).preprocess
8
+ end
9
+ end
10
+
11
+ def persist(resource)
12
+ new(resource).persist
13
+ end
14
+ end
15
+
16
+ def initialize(resource)
17
+ @resource = resource
18
+ end
19
+
20
+ def preprocess
21
+ resource.preprocess
22
+ end
23
+
24
+ def persist
25
+ set_default
26
+ delete
27
+ create
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :resource
33
+
34
+ def set_default
35
+ remote.merge!(default: true) if default?
36
+ end
37
+
38
+ def delete
39
+ local.delete if exists?
40
+ end
41
+
42
+ def create
43
+ resource.local_model.create(remote)
44
+ end
45
+
46
+ def remote
47
+ resource.adapted
48
+ end
49
+
50
+ def default?
51
+ exists? && local.default?
52
+ end
53
+
54
+ def exists?
55
+ !!local
56
+ end
57
+
58
+ def local
59
+ resource.local
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,132 @@
1
+ module Troo
2
+ class Esc
3
+ extend Term::ANSIColor
4
+ end
5
+
6
+ class Align
7
+ include Virtus.value_object
8
+
9
+ values do
10
+ attribute :pos, Symbol, default: :none
11
+ attribute :pad, Integer, default: 0
12
+ attribute :char, String, default: ' '
13
+ attribute :width, Integer, default: 80
14
+ end
15
+ end
16
+
17
+ class Format
18
+ include Virtus.value_object
19
+
20
+ values do
21
+ attribute :ansicolor, Boolean, default: true
22
+ attribute :colour, String
23
+ attribute :underline, Boolean, default: false
24
+ attribute :reset, String, default: Esc.reset
25
+ attribute :align, Troo::Align, default: Troo::Align.new
26
+ end
27
+
28
+ def underline
29
+ @underline ? Esc.underline : nil
30
+ end
31
+ end
32
+
33
+ class Formatter
34
+ include Virtus.model
35
+
36
+ attribute :value, String
37
+ attribute :options, Troo::Format
38
+
39
+ class << self
40
+ def highlight(value, options = {})
41
+ new(value: value, options: options).highlight
42
+ end
43
+
44
+ def error(value)
45
+ new(value: value,
46
+ options: { colour: Esc.red }).error
47
+ end
48
+
49
+ def wordwrap(value, width = 70)
50
+ new(value: value,
51
+ options: { align: { width: width } }).wordwrap
52
+ end
53
+ end
54
+
55
+ def highlight
56
+ [
57
+ options.colour,
58
+ options.underline,
59
+ formatted_value,
60
+ options.reset
61
+ ].join
62
+ end
63
+
64
+ def error
65
+ [
66
+ options.colour,
67
+ formatted_value,
68
+ options.reset
69
+ ].join
70
+ end
71
+
72
+ def wordwrap
73
+ formatted_value
74
+ .gsub(/\n/, ' ')
75
+ .gsub(/(.{1,#{options.align.width}})(\s+|$)/, "\\1\n")
76
+ .strip
77
+ end
78
+
79
+ private
80
+
81
+ def formatted_value
82
+ alignment.fetch(position, :none)
83
+ end
84
+
85
+ def alignment
86
+ {
87
+ none: value,
88
+ left: value.ljust(padding, spacer),
89
+ right: value.rjust(padding, spacer)
90
+ }
91
+ end
92
+
93
+ def position
94
+ options.align.pos
95
+ end
96
+
97
+ def padding
98
+ options.align.pad
99
+ end
100
+
101
+ def spacer
102
+ options.align.char
103
+ end
104
+ end
105
+
106
+ class Output
107
+ attr_accessor :count
108
+
109
+ def initialize
110
+ @count = 0
111
+ end
112
+
113
+ def render(lines)
114
+ Array(lines).each { |line| print indentation + line }
115
+ nil
116
+ end
117
+
118
+ def indent(&block)
119
+ @count += 1
120
+
121
+ yield
122
+ ensure
123
+ @count -= 1
124
+ end
125
+
126
+ private
127
+
128
+ def indentation
129
+ ' ' * @count * 4
130
+ end
131
+ end
132
+ end
@@ -1,8 +1,4 @@
1
1
  module Troo
2
- class Esc
3
- extend Term::ANSIColor
4
- end
5
-
6
2
  class Template
7
3
  include DecoratorHelpers
8
4
 
@@ -5,76 +5,57 @@ module Troo
5
5
 
6
6
  class << self
7
7
  def all(boards, options = {})
8
- new(boards, options).all
9
- end
10
-
11
- def show(board, options = {})
12
- new(board, options).show
8
+ boards.map { |board| new(board.decorator, options).show }
9
+ nil
13
10
  end
14
11
  end
15
12
 
16
- def initialize(board_or_boards, options = {})
17
- @board = board_or_boards
18
- @options = options
13
+ def initialize(board, options = {})
14
+ @board, @options = board, options
19
15
  end
20
16
 
21
- def all
22
- boards.map do |board|
23
- puts board.decorator.title
24
-
25
- print_error 'No lists were found.' if lists(board).empty?
17
+ def show
18
+ output.render board.title
26
19
 
27
- print_lists(board)
20
+ output.indent do
21
+ if lists.empty?
22
+ output.render error('No lists were found.') + "\n"
23
+ else
24
+ print_lists_with_cards
25
+ end
28
26
  end
29
27
  end
30
28
 
31
- def show
32
- puts board.decorator.title
29
+ private
33
30
 
34
- print_error 'No lists were found.' if lists.empty?
31
+ attr_reader :board
35
32
 
36
- print_lists_with_cards
33
+ def output
34
+ @output ||= Troo::Output.new
37
35
  end
38
36
 
39
- private
40
-
41
- attr_reader :board
42
- alias_method :boards, :board
43
-
44
37
  def print_lists_with_cards
38
+ output.render "\n"
45
39
  lists.each do |list|
46
- title_for(list)
47
-
48
- print_error 'No cards were found.' if list.cards.empty?
49
-
50
- list.cards(unformatted).each do |card|
51
- title_for(card)
40
+ output.render list.title
41
+
42
+ output.indent do
43
+ if list.cards.empty?
44
+ output.render error('No cards were found.') + "\n"
45
+ else
46
+ output.render "\n"
47
+ list.cards.each do |card|
48
+ output.render card.title
49
+ end
50
+ output.render "\n"
51
+ end
52
52
  end
53
53
  end
54
- puts
55
- end
56
-
57
- def print_lists(optional_board = nil)
58
- lists(optional_board).each do |list|
59
- title_for(list)
60
- end
61
- puts
62
- end
63
-
64
- def lists(optional_board = nil)
65
- if optional_board.nil?
66
- board.decorator.lists
67
- else
68
- optional_board.decorator.lists
69
- end
54
+ nil
70
55
  end
71
56
 
72
- def unformatted
73
- {
74
- ansicolor: false,
75
- colour: nil,
76
- underline: nil
77
- }
57
+ def lists
58
+ board.lists
78
59
  end
79
60
  end
80
61
  end
@@ -3,27 +3,20 @@ module Troo
3
3
  class Card
4
4
  include DecoratorHelpers
5
5
 
6
- class << self
7
- def show(card, options = {})
8
- new(card, options).show
9
- end
10
- end
11
-
12
6
  def initialize(card, options = {})
13
- @card = card
14
- @options = options
7
+ @card, @options = card, options
15
8
  end
16
9
 
17
10
  def show
18
- print Template.parse(decorated_card, '/../views/card.erb')
11
+ output.render Template.parse(card, '/../views/card.erb')
19
12
  end
20
13
 
21
14
  private
22
15
 
23
16
  attr_reader :card
24
17
 
25
- def decorated_card
26
- @decorated_card ||= card.decorator
18
+ def output
19
+ @output ||= Troo::Output.new
27
20
  end
28
21
  end
29
22
  end
@@ -3,26 +3,17 @@ module Troo
3
3
  class Comment
4
4
  include DecoratorHelpers
5
5
 
6
- class << self
7
- def show(card, options = {})
8
- new(card, options).show
9
- end
10
- end
11
-
12
6
  def initialize(card, options = {})
13
- @card = card
14
- @options = options
7
+ @card, @options = card, options
15
8
  end
16
9
 
17
10
  def show
18
- spacing do
19
- print card.decorator.short
20
-
21
- print_error 'No comments were found.' unless comments.any?
11
+ title
22
12
 
23
- comments.each do |comment|
24
- indent { print comment.decorator.as_view }
25
- end
13
+ if comments?
14
+ all_comments
15
+ else
16
+ no_comments
26
17
  end
27
18
  end
28
19
 
@@ -30,8 +21,31 @@ module Troo
30
21
 
31
22
  attr_reader :card
32
23
 
24
+ def output
25
+ @output ||= Troo::Output.new
26
+ end
27
+
28
+ def all_comments
29
+ comments.map do |comment|
30
+ output.render comment.decorator.as_view
31
+ end
32
+ nil
33
+ end
34
+
35
+ def no_comments
36
+ output.render error('No comments were found.')
37
+ end
38
+
39
+ def comments?
40
+ comments.any?
41
+ end
42
+
33
43
  def comments
34
- card.comments
44
+ @comments ||= card.comments
45
+ end
46
+
47
+ def title
48
+ output.render card.decorator.title + "\n"
35
49
  end
36
50
  end
37
51
  end