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,43 @@
1
+ module Troo
2
+ class ListPresenter
3
+ class << self
4
+ def render_show(list, options = {})
5
+ new(list, options).render_show
6
+ end
7
+ end
8
+
9
+ include DecoratorHelpers
10
+
11
+ def initialize(list, options = {})
12
+ @list = list
13
+ @options = options
14
+ end
15
+
16
+ def render_show
17
+ spacing do
18
+ print BoardDecorator.new(board).short
19
+
20
+ indent do
21
+ print ListDecorator.new(list).short
22
+
23
+ if list.cards.any?
24
+ list.cards.each do |card|
25
+ indent do
26
+ print CardDecorator.new(card).short
27
+ end
28
+ end
29
+ else
30
+ print_error "No cards were found."
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ private
37
+ attr_reader :list
38
+
39
+ def board
40
+ list.board
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ module Troo
2
+ class MemberDecorator
3
+ include DecoratorHelpers
4
+
5
+ def initialize(member)
6
+ @member = member
7
+ end
8
+
9
+ def username
10
+ ["@", member.username].join
11
+ end
12
+
13
+ def name
14
+ member.full_name
15
+ end
16
+
17
+ def initials
18
+ member.initials
19
+ end
20
+
21
+ private
22
+ attr_reader :member
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ module Troo
2
+ class MemberPresenter
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
+ decorated_members
18
+ end
19
+
20
+ private
21
+ attr_reader :card
22
+
23
+ def decorated_members
24
+ if one_member?
25
+ members.first
26
+ elsif two_members?
27
+ members.join(" and ")
28
+ elsif many_members?
29
+ word_wrap([all_but_last_member, last_member].join(" and "))
30
+ else
31
+ "No members have been assigned."
32
+ end
33
+ end
34
+
35
+ def members
36
+ @members ||= card.members.map { |member| MemberDecorator.new(member).username }
37
+ end
38
+
39
+ def one_member?
40
+ members.size == 1
41
+ end
42
+
43
+ def two_members?
44
+ members.size == 2
45
+ end
46
+
47
+ def many_members?
48
+ members.size > 2
49
+ end
50
+
51
+ def all_but_last_member
52
+ members[0...-1].join(", ")
53
+ end
54
+
55
+ def last_member
56
+ members[-1]
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,49 @@
1
+ module Troo
2
+ module External
3
+ class Board
4
+ class << self
5
+ def fetch(external_id, options = {})
6
+ new(external_id, options).fetch_by_external_id.map do |resource|
7
+ Troo::BoardPersistence.for(resource) unless closed?(resource)
8
+ end
9
+ end
10
+
11
+ def fetch_all
12
+ new.fetch_all.map do |resource|
13
+ Troo::BoardPersistence.for(resource) unless closed?(resource)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def closed?(resource)
20
+ resource.nil? || resource.closed?
21
+ end
22
+ end
23
+
24
+ def initialize(external_id = nil, options = {})
25
+ @external_id = external_id
26
+ @options = options
27
+ end
28
+
29
+ def fetch_by_external_id
30
+ [Trello::Board.find(external_id)]
31
+ rescue Trello::InvalidAccessToken
32
+ raise Troo::InvalidAccessToken
33
+ rescue Trello::Error
34
+ []
35
+ end
36
+
37
+ def fetch_all
38
+ Trello::Board.all
39
+ rescue Trello::InvalidAccessToken
40
+ raise Troo::InvalidAccessToken
41
+ rescue Trello::Error
42
+ []
43
+ end
44
+
45
+ private
46
+ attr_reader :external_id
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,43 @@
1
+ module Troo
2
+ module External
3
+ class BoardAdaptor
4
+ class << self
5
+ def adapt(resource)
6
+ new(resource).adapted
7
+ end
8
+ end
9
+
10
+ def initialize(resource)
11
+ @resource = resource
12
+ end
13
+
14
+ def adapted
15
+ {
16
+ external_board_id: external_board_id,
17
+ name: name,
18
+ description: description,
19
+ closed: closed,
20
+ }
21
+ end
22
+
23
+ private
24
+ attr_reader :resource
25
+
26
+ def external_board_id
27
+ resource.id
28
+ end
29
+
30
+ def name
31
+ resource.name
32
+ end
33
+
34
+ def description
35
+ resource.description
36
+ end
37
+
38
+ def closed
39
+ resource.closed.to_s
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,70 @@
1
+ module Troo
2
+ module External
3
+ class Card
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
+ Troo::CardPersistence.for(resource)
10
+ end
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def closed?(resource)
17
+ resource.nil? || resource.closed?
18
+ end
19
+ end
20
+
21
+ def initialize(external_id, options = {})
22
+ @external_id = external_id
23
+ @options = options
24
+ end
25
+
26
+ def fetch_by_external_id
27
+ case options.fetch(:mode)
28
+ when :board then board_mode
29
+ when :list then list_mode
30
+ when :card then card_mode
31
+ end
32
+ end
33
+
34
+ private
35
+ attr_reader :external_id
36
+
37
+ def options
38
+ defaults.merge!(@options)
39
+ end
40
+
41
+ def defaults
42
+ { comments: true, mode: :board }
43
+ end
44
+
45
+ def board_mode
46
+ Trello::Board.find(external_id).cards
47
+ rescue Trello::InvalidAccessToken
48
+ raise Troo::InvalidAccessToken
49
+ rescue Trello::Error
50
+ []
51
+ end
52
+
53
+ def list_mode
54
+ Trello::List.find(external_id).cards
55
+ rescue Trello::InvalidAccessToken
56
+ raise Troo::InvalidAccessToken
57
+ rescue Trello::Error
58
+ []
59
+ end
60
+
61
+ def card_mode
62
+ [Trello::Card.find(external_id)]
63
+ rescue Trello::InvalidAccessToken
64
+ raise Troo::InvalidAccessToken
65
+ rescue Trello::Error
66
+ []
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,78 @@
1
+ module Troo
2
+ module External
3
+ class CardAdaptor
4
+ class << self
5
+ def adapt(resource)
6
+ new(resource).adapted
7
+ end
8
+ end
9
+
10
+ def initialize(resource)
11
+ @resource = resource
12
+ end
13
+
14
+ def adapted
15
+ {
16
+ external_board_id: external_board_id,
17
+ external_list_id: external_list_id,
18
+ external_card_id: external_card_id,
19
+ external_member_ids: external_member_ids,
20
+ short_id: short_id,
21
+ name: name,
22
+ desc: desc,
23
+ url: url,
24
+ position: position,
25
+ last_activity_date: last_activity_date,
26
+ closed: closed,
27
+ }
28
+ end
29
+
30
+ private
31
+ attr_reader :resource
32
+
33
+ def external_board_id
34
+ resource.board_id
35
+ end
36
+
37
+ def external_list_id
38
+ resource.list_id
39
+ end
40
+
41
+ def external_card_id
42
+ resource.id
43
+ end
44
+
45
+ def external_member_ids
46
+ resource.member_ids.to_s.gsub(" ", "")
47
+ end
48
+
49
+ def short_id
50
+ resource.short_id.to_s
51
+ end
52
+
53
+ def name
54
+ resource.name
55
+ end
56
+
57
+ def desc
58
+ resource.desc
59
+ end
60
+
61
+ def url
62
+ resource.url
63
+ end
64
+
65
+ def position
66
+ resource.pos.to_s
67
+ end
68
+
69
+ def last_activity_date
70
+ resource.last_activity_date.to_s
71
+ end
72
+
73
+ def closed
74
+ resource.closed.to_s
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,64 @@
1
+ module Troo
2
+ module External
3
+ class Comment
4
+ class << self
5
+ def fetch(external_id, options = {})
6
+ new(external_id, options).fetch_by_external_id.map do |resource|
7
+ Troo::CommentPersistence.for(resource)
8
+ end
9
+ end
10
+ end
11
+
12
+ def initialize(external_id, options = {})
13
+ @external_id = external_id
14
+ @options = options
15
+ end
16
+
17
+ def fetch_by_external_id
18
+ case options.fetch(:mode)
19
+ when :board then board_mode
20
+ when :list then list_mode
21
+ when :card then card_mode
22
+ end
23
+ end
24
+
25
+ private
26
+ attr_reader :external_id
27
+
28
+ def options
29
+ defaults.merge!(@options)
30
+ end
31
+
32
+ def defaults
33
+ { mode: :board }
34
+ end
35
+
36
+ def board_mode
37
+ Trello::Board.find(external_id).actions({ filter: "commentCard" }).
38
+ delete_if { |a| a.nil? || a.type != "commentCard" }
39
+ rescue Trello::InvalidAccessToken
40
+ raise Troo::InvalidAccessToken
41
+ rescue Trello::Error
42
+ []
43
+ end
44
+
45
+ def list_mode
46
+ Trello::List.find(external_id).actions({ filter: "commentCard" }).
47
+ delete_if { |a| a.nil? || a.type != "commentCard" }
48
+ rescue Trello::InvalidAccessToken
49
+ raise Troo::InvalidAccessToken
50
+ rescue Trello::Error
51
+ []
52
+ end
53
+
54
+ def card_mode
55
+ Trello::Card.find(external_id).actions({ filter: "commentCard" }).
56
+ delete_if { |a| a.nil? || a.type != "commentCard" }
57
+ rescue Trello::InvalidAccessToken
58
+ raise Troo::InvalidAccessToken
59
+ rescue Trello::Error
60
+ []
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,53 @@
1
+ module Troo
2
+ module External
3
+ class CommentAdaptor
4
+ class << self
5
+ def adapt(resource)
6
+ new(resource).adapted
7
+ end
8
+ end
9
+
10
+ def initialize(resource)
11
+ @resource = resource
12
+ end
13
+
14
+ def adapted
15
+ {
16
+ external_comment_id: external_comment_id,
17
+ external_board_id: external_board_id,
18
+ external_card_id: external_card_id,
19
+ external_member_id: external_member_id,
20
+ date: date,
21
+ text: text,
22
+ }
23
+ end
24
+
25
+ private
26
+ attr_reader :resource
27
+
28
+ def external_comment_id
29
+ resource.id
30
+ end
31
+
32
+ def external_board_id
33
+ resource.data.fetch("board", {}).fetch("id", "")
34
+ end
35
+
36
+ def external_card_id
37
+ resource.data.fetch("card", {}).fetch("id", "")
38
+ end
39
+
40
+ def external_member_id
41
+ resource.member_creator_id
42
+ end
43
+
44
+ def date
45
+ resource.date.to_s
46
+ end
47
+
48
+ def text
49
+ resource.data.fetch("text", "")
50
+ end
51
+ end
52
+ end
53
+ end