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
@@ -0,0 +1,117 @@
1
+ module Troo
2
+ module API
3
+ class Client
4
+ include Virtus.model
5
+
6
+ attribute :verb
7
+ attribute :endpoint
8
+ attribute :interpolation, Hash
9
+ attribute :query, Hash
10
+ attribute :model
11
+
12
+ class << self
13
+ def perform(parameters)
14
+ new(parameters).perform
15
+ end
16
+ end
17
+
18
+ def perform
19
+ return [] unless allow_remote?
20
+ return [] if missing_parameters?
21
+ return [] if error_response?
22
+ return [] if empty_response?
23
+
24
+ log
25
+
26
+ if collection?
27
+ model.with_collection(parsed_response)
28
+ else
29
+ [model.new(parsed_response)]
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def collection?
36
+ parsed_response.is_a?(Array)
37
+ end
38
+
39
+ def empty_response?
40
+ parsed_response.empty?
41
+ end
42
+
43
+ def error_response?
44
+ response.is_a?(ErrorResponse)
45
+ end
46
+
47
+ def parsed_response
48
+ @parsed ||= Yajl::Parser.parse(response.body)
49
+ end
50
+
51
+ def response
52
+ @response ||= API::Request.make(verb, uri, query)
53
+ end
54
+
55
+ def query
56
+ Addressable::URI.new
57
+ .tap { |u| u.query_values = @query }.query
58
+ end
59
+
60
+ def uri
61
+ Addressable::URI.parse(url + urn).to_s
62
+ end
63
+
64
+ def url
65
+ Troo.configuration.api_url
66
+ end
67
+
68
+ def urn
69
+ Troo.endpoints.interpolate!(endpoint, interpolation)
70
+ end
71
+
72
+ def missing_parameters?
73
+ verb.nil? || endpoint.nil? || model.nil?
74
+ end
75
+
76
+ def allow_remote?
77
+ Troo.configuration.allow_remote
78
+ end
79
+
80
+ def log
81
+ Troo.logger.debug(formatted_messages) if log?
82
+ end
83
+
84
+ def log?
85
+ Troo.configuration.logs
86
+ end
87
+
88
+ def formatted_messages
89
+ messages.map do |label, value|
90
+ [
91
+ [Esc.red, label.rjust(8, ' '), ':', Esc.reset].join, value
92
+ ].join(' ')
93
+ end.join("\n")
94
+ end
95
+
96
+ def messages
97
+ request_log.merge!(response_log)
98
+ end
99
+
100
+ def request_log
101
+ {
102
+ 'Endpoint' => endpoint,
103
+ 'Verb' => verb,
104
+ 'URI' => uri,
105
+ 'Query' => query
106
+ }
107
+ end
108
+
109
+ def response_log
110
+ {
111
+ 'Status' => response.code,
112
+ 'Response' => response.body
113
+ }
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,39 @@
1
+ module Troo
2
+ module API
3
+ class Endpoints
4
+ include Virtus.value_object
5
+
6
+ values do
7
+ attribute :board_by_id
8
+ attribute :boards_all
9
+ attribute :card_by_id
10
+ attribute :cards_by_board_id
11
+ attribute :cards_by_list_id
12
+ attribute :comments_by_board_id
13
+ attribute :comments_by_card_id
14
+ attribute :comments_by_list_id
15
+ attribute :create_board
16
+ attribute :create_card
17
+ attribute :create_comment
18
+ attribute :create_list
19
+ attribute :list_by_id
20
+ attribute :lists_by_board_id
21
+ attribute :member_by_id
22
+ attribute :members_by_board_id
23
+ attribute :move_card_board
24
+ attribute :move_card_list
25
+ end
26
+
27
+ class << self
28
+ def load(file, version)
29
+ new(YAML.load_file(file)[version.to_s])
30
+ end
31
+ end
32
+
33
+ def interpolate!(endpoint, value = {})
34
+ return send(endpoint) % value if respond_to?(endpoint)
35
+ fail EndpointNotFound
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,44 @@
1
+ module Troo
2
+ module API
3
+ class Headers
4
+ class << self
5
+ def build!(uri, headers = {})
6
+ new(uri, headers).build!
7
+ end
8
+ end
9
+
10
+ def initialize(uri, headers = {})
11
+ @uri, @headers = uri, headers
12
+ end
13
+
14
+ def build!
15
+ defaults.merge!(@headers)
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :uri
21
+
22
+ def defaults
23
+ {
24
+ 'Authorization' => consumer.sign!(wrapper, application)
25
+ }
26
+ end
27
+
28
+ def application
29
+ OAuth::Token.new(Troo.configuration.api_oauth_token,
30
+ Troo.configuration.api_oauth_token_secret)
31
+ end
32
+
33
+ def wrapper
34
+ Net::HTTP::Get.new(uri)
35
+ end
36
+
37
+ def consumer
38
+ OAuth::Consumer.new(Troo.configuration.api_key,
39
+ Troo.configuration.api_token,
40
+ OAuthSettings.new(uri: uri).to_hash)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ module Troo
2
+ module API
3
+ class OAuthSettings
4
+ include Virtus.value_object
5
+
6
+ values do
7
+ attribute :scheme, Symbol, default: :header
8
+ attribute :http_method, Symbol, default: :get
9
+ attribute :timestamp, Integer, default: Time.now.to_i
10
+ attribute :signature_method, String, default: 'HMAC-SHA1'
11
+
12
+ attribute :nonce,
13
+ String,
14
+ default: SecureRandom.hex
15
+
16
+ attribute :scope,
17
+ String,
18
+ default: 'read,write,account'
19
+
20
+ attribute :uri, String
21
+
22
+ attribute :request_token_path,
23
+ String,
24
+ default: 'https://trello.com/1/OAuthGetRequestToken'
25
+
26
+ attribute :authorize_path,
27
+ String,
28
+ default: 'https://trello.com/1/OAuthAuthorizeToken'
29
+
30
+ attribute :access_token_path,
31
+ String,
32
+ default: 'https://trello.com/1/OAuthGetAccessToken'
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ module Troo
2
+ module API
3
+ class Request
4
+ class << self
5
+ def make(verb, uri, query = {})
6
+ new(verb, uri, query).make
7
+ end
8
+ end
9
+
10
+ def initialize(verb, uri, query = {})
11
+ @verb, @uri, @query = verb, uri, query
12
+ end
13
+
14
+ def make
15
+ @request ||= request
16
+ rescue RestClient::Exception => e
17
+ ErrorResponse.new(body: e.http_body, code: e.http_code)
18
+ rescue SocketError, Errno::ECONNREFUSED
19
+ ErrorResponse.new(body: 'Cannot reach Trello.', code: 0)
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :query, :uri, :verb
25
+
26
+ def request
27
+ RestClient::Request.execute(headers: Headers.build!(uri),
28
+ payload: query,
29
+ timeout: 10,
30
+ method: verb,
31
+ url: uri) do |response|
32
+ Responder.build(body: response.body, code: response.code)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ module Troo
2
+ module API
3
+ class Responder
4
+ include Virtus.value_object
5
+
6
+ values do
7
+ attribute :body, String
8
+ attribute :code, String
9
+ end
10
+
11
+ class << self
12
+ def build(response)
13
+ new(response).build
14
+ end
15
+ end
16
+
17
+ def build
18
+ ok? ? Response.new(attributes) : ErrorResponse.new(attributes)
19
+ end
20
+
21
+ private
22
+
23
+ def ok?
24
+ code == '200'
25
+ end
26
+ end
27
+
28
+ class Response < Responder; end
29
+ class ErrorResponse < Responder; end
30
+ end
31
+ end
@@ -7,36 +7,32 @@ module Troo
7
7
  'Add a new board with <name>; prompts if <name> not ' \
8
8
  'provided.'
9
9
  def board(name = nil)
10
- board_name = name.nil? ? prompt_for_name : name
11
-
12
- say Commands::Add::Board.dispatch(board_name)
10
+ value = name.nil? ? prompt_for_name : name
11
+ say Commands::Add.dispatch(value, nil, type: :board)
13
12
  end
14
13
 
15
14
  desc 'card <list_id> (<name>)',
16
15
  'Add a new card to the list with <list_id> with <name>; ' \
17
16
  'prompts if <name> not provided.'
18
17
  def card(id, name = nil)
19
- card_name = name.nil? ? prompt_for_name : name
20
-
21
- say Commands::Add::Card.dispatch(card_name, id)
18
+ value = name.nil? ? prompt_for_name : name
19
+ say Commands::Add.dispatch(value, id, type: :card)
22
20
  end
23
21
 
24
22
  desc 'comment <card_id> (<comment>)',
25
23
  'Add a new comment to the card with <card_id> with ' \
26
24
  '<comment>; prompts if <comment> not provided.'
27
25
  def comment(id, comment = nil)
28
- comment_text = comment.nil? ? prompt_for_comment : comment
29
-
30
- say Commands::Add::Comment.dispatch(comment_text, id)
26
+ value = comment.nil? ? prompt_for_comment : comment
27
+ say Commands::Add.dispatch(value, id, type: :comment)
31
28
  end
32
29
 
33
30
  desc 'list <board_id> (<name>)',
34
31
  'Add a new list to the board with <board_id> with ' \
35
32
  '<name>; prompts if <name> not provided.'
36
33
  def list(id, name = nil)
37
- list_name = name.nil? ? prompt_for_name : name
38
-
39
- say Commands::Add::List.dispatch(list_name, id)
34
+ value = name.nil? ? prompt_for_name : name
35
+ say Commands::Add.dispatch(value, id, type: :list)
40
36
  end
41
37
 
42
38
  private
@@ -0,0 +1,95 @@
1
+ module Troo
2
+ module Commands
3
+ class Add
4
+ attr_reader :id, :value
5
+
6
+ class << self
7
+ def dispatch(value, id = nil, options = {})
8
+ new(value, id, options).add
9
+ end
10
+ end
11
+
12
+ def initialize(value, id = nil, options = {})
13
+ @value, @id, @options = value, id, options
14
+ end
15
+
16
+ def add
17
+ return success if create
18
+ error
19
+ end
20
+
21
+ private
22
+
23
+ def success
24
+ ['New', type.to_s, quoted, 'created.'].compact.join(' ')
25
+ end
26
+
27
+ def error
28
+ return 'Could not create resource.' if no_type?
29
+ "#{klass} could not be created."
30
+ end
31
+
32
+ def quoted
33
+ type == :comment ? nil : "'#{value}'"
34
+ end
35
+
36
+ def create
37
+ return false if no_type?
38
+
39
+ if type == :board
40
+ @create ||= remote.with(value)
41
+ else
42
+ return false if no_local?
43
+ @create ||= remote.with(resource.external_id, value)
44
+ end
45
+ end
46
+
47
+ def remote
48
+ Object.const_get('Troo::Remote::Persistence::' + klass)
49
+ end
50
+
51
+ def no_local?
52
+ resource.nil?
53
+ end
54
+
55
+ def resource
56
+ @resource ||= local.retrieve(id)
57
+ end
58
+
59
+ def local
60
+ Object.const_get('Troo::' + mapping.fetch(type))
61
+ end
62
+
63
+ def klass
64
+ type.to_s.capitalize
65
+ end
66
+
67
+ def no_type?
68
+ type == :none
69
+ end
70
+
71
+ def type
72
+ options.fetch(:type)
73
+ end
74
+
75
+ def options
76
+ defaults.merge!(@options)
77
+ end
78
+
79
+ def defaults
80
+ {
81
+ type: :none
82
+ }
83
+ end
84
+
85
+ def mapping
86
+ {
87
+ comment: 'Card',
88
+ board: 'Board',
89
+ list: 'Board',
90
+ card: 'List'
91
+ }
92
+ end
93
+ end
94
+ end
95
+ end