troo 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec548e3cb4fcf63ce3ef9f764330c3c932ce05f1
4
- data.tar.gz: c20fa62afcba4222ed5dbcb682fd39e86b9d2db9
3
+ metadata.gz: 4b625aae48b254cf382ba5fbd8a15632cd196d60
4
+ data.tar.gz: 0e93d32a02dd9188393fc40c0e0f7547799e0881
5
5
  SHA512:
6
- metadata.gz: 1ebb3b4d96e3904c7a108d2e3c9f67de9f4594137fd48eecc5ff0a2e08a51d7729ff79556662163db46be57aea9ea3b5a4a3831fd2224f4899c4298a303340c5
7
- data.tar.gz: 665e9794e4925df68e990a537a022262bbef41957b754e183fa78bd3178232bbc4e0a271af07abcb15de8c6e9a2483969b26bc19f488c622ade2042be4627de9
6
+ metadata.gz: 60663bb433fbdb7dba0b4e7c7328349c256921d2060390484937c6c6a842ca6ab3b69e9c044b417f740b4ffd855eddd1e046ed4e4e133fe05fc6442f78ac3918
7
+ data.tar.gz: dff68ad0407bca257694e0d4a2eb877abd7d364aa0e0c874dabd1711a8d690727a2392d31bd8ac08201be9e06a6f9a23f5ab1d64800ac3d618f6e36b7c5ac3ee
data/.gitignore CHANGED
@@ -15,3 +15,10 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+
19
+ configuration.yml
20
+ configuration.yml.otb
21
+ configuration.yml.personal
22
+ logs/*.log
23
+ troo.db
24
+ tags
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in troo.gemspec
4
3
  gemspec
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard :minitest do
2
+ watch(%r{^test/(.*)_test\.rb})
3
+ watch(%r{^lib/(.+)\.rb}) { |m| "test/lib/#{m[1]}_test.rb" }
4
+ watch(%r{^test/test_helper\.rb}) { 'test' }
5
+ watch(%r{^test/support/vcr_setup\.rb}) { 'test' }
6
+ end
data/LICENSE.txt CHANGED
@@ -20,3 +20,4 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
20
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
21
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
data/README.md CHANGED
@@ -1,6 +1,33 @@
1
1
  # Troo
2
2
 
3
- TODO: Write a gem description
3
+ CLI interface for Trello. Named after Trello's mascot 'Roo'.
4
+
5
+ ## Features
6
+
7
+ troo refresh
8
+ troo refresh --lists
9
+ troo refresh --cards
10
+ troo default board <board_id>
11
+ troo default card <card_id>
12
+ troo default list <list_id>
13
+ troo add board <name>
14
+ troo add card <list_id>
15
+ troo add comment <card_id>
16
+ troo add list <board_id>
17
+ troo show boards
18
+ troo show board (<board_id>)
19
+ troo show list <list_id>
20
+ troo show card <card_id>
21
+ troo show comments <card_id>
22
+ troo move <card_id> <list_id>
23
+ troo cleanup
24
+ troo version
25
+
26
+ ## Requirements
27
+
28
+ - A Trello account with API key/secret.
29
+ - Ruby 2.1.0 (>= 1.9.3 should be fine.)
30
+ - Redis.
4
31
 
5
32
  ## Installation
6
33
 
@@ -18,12 +45,28 @@ Or install it yourself as:
18
45
 
19
46
  ## Usage
20
47
 
21
- TODO: Write usage instructions here
48
+ You will need user authentication tokens to access your Trello account.
49
+
50
+ 1) Create your developer key at Trello:
51
+
52
+ https://trello.com/1/appKey/generate
53
+
54
+ 2) Go to
55
+
56
+ https://trello.com/1/connect?key=your_key_here&name=troo&response_type=token&scope=read,write
57
+
58
+ 3) Have fun, and tweet me @gavinlaking if you like it.
59
+
60
+ ## Todo
61
+
62
+ - Fix multitude of sins.
63
+ - Write cucumber integration tests.
22
64
 
23
65
  ## Contributing
24
66
 
25
- 1. Fork it ( http://github.com/<my-github-username>/troo/fork )
67
+ 1. Fork it
26
68
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
69
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
70
  4. Push to the branch (`git push origin my-new-feature`)
29
71
  5. Create new Pull Request
72
+
data/Rakefile CHANGED
@@ -1 +1,12 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'lib/troo'
6
+ t.test_files = FileList["test/lib/troo/*_test.rb",
7
+ "test/lib/troo/**/*_test.rb"]
8
+ t.verbose = false
9
+ end
10
+
11
+ task :default => :test
12
+
data/bin/troo ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ trap("SIGINT") { exit! }
4
+
5
+ require_relative "../lib/troo"
6
+
7
+ begin
8
+ puts
9
+ Troo::CLI::Main.start(ARGV)
10
+ rescue SocketError
11
+ puts "Cannot continue, no network connection."
12
+ end
@@ -0,0 +1,7 @@
1
+ key: some_key
2
+ secret: some_secret
3
+ oauth_token: some_oauth_token
4
+ oauth_token_secret: some_oauth_token_secret
5
+ main_db: 1
6
+ test_db: 2
7
+
@@ -0,0 +1 @@
1
+ Feature: Adding a new board
@@ -0,0 +1 @@
1
+ Feature: Adding a new card to a list
@@ -0,0 +1 @@
1
+ Feature: Adding a comment to a card
@@ -0,0 +1 @@
1
+ Feature: Adding a new list to a board
File without changes
@@ -0,0 +1 @@
1
+ Feature: Moving a card to a list
@@ -0,0 +1 @@
1
+ Feature: Refreshing
@@ -0,0 +1,7 @@
1
+ Feature: Setting a default board, card and list
2
+
3
+ Scenario: Setting a default board
4
+
5
+ Scenario: Setting a default list
6
+
7
+ Scenario: Setting a default card
@@ -0,0 +1 @@
1
+ Feature: Showing a board
@@ -0,0 +1 @@
1
+ Feature: Showing all boards
@@ -0,0 +1 @@
1
+ Feature: Showing a card
@@ -0,0 +1 @@
1
+ Feature: Showing all comments for a card
@@ -0,0 +1 @@
1
+ Feature: Showing a list
@@ -0,0 +1 @@
1
+ Feature: Getting the local status
File without changes
@@ -0,0 +1,31 @@
1
+ # require "minitest/spec"
2
+ # World(MiniTest::Assertions)
3
+ # MiniTest::Spec.new(nil)
4
+
5
+ # require 'minitest'
6
+ # module MiniTestAssertions
7
+ # def self.extended(base)
8
+ # base.extend(MiniTest::Assertions)
9
+ # base.assertions = 0
10
+ # end
11
+
12
+ # attr_accessor :assertions
13
+ # end
14
+ # World(MiniTestAssertions)
15
+
16
+
17
+ require "aruba/cucumber"
18
+
19
+ ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + "/../../bin")}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
20
+ LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "lib")
21
+
22
+ Before do
23
+ # Using "announce" causes massive warnings on 1.9.2
24
+ @puts = true
25
+ @original_rubylib = ENV['RUBYLIB']
26
+ ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
27
+ end
28
+
29
+ After do
30
+ ENV['RUBYLIB'] = @original_rubylib
31
+ end
@@ -0,0 +1 @@
1
+ Feature: Running the `troo` command
@@ -0,0 +1,8 @@
1
+ Feature: Ascertaining the version of Troo.
2
+
3
+ Scenario:
4
+ When I run `troo version`
5
+ Then the output should contain:
6
+ """
7
+ troo 0.0.2
8
+ """
data/lib/troo.rb CHANGED
@@ -1,5 +1,27 @@
1
- require "troo/version"
1
+ require_relative "troo/troo"
2
+ require_relative "troo/version"
2
3
 
3
4
  module Troo
4
- # Your code goes here...
5
+ class InvalidAccessToken < StandardError; end
6
+
7
+ def self.config
8
+ @config ||= OpenStruct.new(YAML.load_file(File.dirname(__FILE__) + "/../configuration.yml"))
9
+ rescue Errno::ENOENT
10
+ warn "Cannot continue, no configuration file."
11
+ exit!
12
+ end
13
+
14
+ def self.logger
15
+ @logger ||= Logger.new("logs/troo.log")
16
+ end
17
+
18
+ # Trello.logger = Logger.new("logs/trello.log")
19
+ Trello.configure do |trello|
20
+ trello.consumer_key = config.key
21
+ trello.consumer_secret = config.secret
22
+ trello.oauth_token = config.oauth_token
23
+ trello.oauth_token_secret = config.oauth_token_secret
24
+ end
25
+
26
+ Ohm.connect(db: config.main_db)
5
27
  end
@@ -0,0 +1,43 @@
1
+ module Troo
2
+ class CreateBoard
3
+ class << self
4
+ def with(name, description = nil)
5
+ new(name, description).perform
6
+ end
7
+ end
8
+
9
+ attr_reader :name
10
+
11
+ def initialize(name, description = nil)
12
+ @name = name
13
+ @description = description
14
+ end
15
+
16
+ def perform
17
+ update_boards
18
+ end
19
+
20
+ private
21
+ attr_reader :name, :description
22
+
23
+ def update_boards
24
+ return Troo::BoardPersistence.for(create_board) if create_board
25
+ false
26
+ end
27
+
28
+ def create_board
29
+ @board ||= Trello::Board.create(attributes)
30
+ rescue Trello::InvalidAccessToken
31
+ raise Troo::InvalidAccessToken
32
+ rescue Trello::Error
33
+ false
34
+ end
35
+
36
+ def attributes
37
+ {
38
+ name: name,
39
+ description: description
40
+ }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ module Troo
2
+ class CreateCard
3
+ class << self
4
+ def for(list, name = nil, description = nil)
5
+ new(list, name, description).perform
6
+ end
7
+ end
8
+
9
+ def initialize(list, name = nil, description = nil)
10
+ @list = list
11
+ @name = name
12
+ @description = description
13
+ end
14
+
15
+ def perform
16
+ update_cards
17
+ end
18
+
19
+ private
20
+ attr_reader :list, :name, :description
21
+
22
+ def update_cards
23
+ return Troo::CardPersistence.for(create_card) if create_card
24
+ false
25
+ end
26
+
27
+ def create_card
28
+ @card ||= Trello::Card.create(attributes)
29
+ rescue Trello::InvalidAccessToken
30
+ raise Troo::InvalidAccessToken
31
+ rescue Trello::Error
32
+ false
33
+ end
34
+
35
+ def attributes
36
+ {
37
+ name: name,
38
+ list_id: list.external_list_id,
39
+ desc: description
40
+ }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,44 @@
1
+ module Troo
2
+ class CreateComment
3
+ class << self
4
+ def for(card, comment)
5
+ new(card, comment).perform
6
+ end
7
+ end
8
+
9
+ def initialize(card, comment)
10
+ @card = card
11
+ @comment = comment
12
+ end
13
+
14
+ def perform
15
+ update_comments
16
+ end
17
+
18
+ private
19
+ attr_reader :card, :comment
20
+
21
+ def update_comments
22
+ return Troo::CommentPersistence.for(parsed_json_response) if parsed_json_response
23
+ false
24
+ end
25
+
26
+ def parsed_json_response
27
+ return false unless create_comment
28
+ resource = OpenStruct.new(JSON.parse(create_comment))
29
+ resource.member_creator_id = resource.memberCreator.fetch("id", "")
30
+ resource
31
+ end
32
+
33
+ def create_comment
34
+ @comment_resource ||= Trello::Card.new.
35
+ update_fields(attributes).add_comment(comment)
36
+ rescue
37
+ false
38
+ end
39
+
40
+ def attributes
41
+ { 'id' => card.external_card_id }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ module Troo
2
+ class CreateList
3
+ class << self
4
+ def for(board, name)
5
+ new(board, name).perform
6
+ end
7
+ end
8
+
9
+ def initialize(board, name)
10
+ @board = board
11
+ @name = name
12
+ end
13
+
14
+ def perform
15
+ update_lists
16
+ end
17
+
18
+ private
19
+ attr_reader :board, :name
20
+
21
+ def update_lists
22
+ return Troo::ListPersistence.for(create_list) if create_list
23
+ false
24
+ end
25
+
26
+ def create_list
27
+ @list ||= Trello::List.create(attributes)
28
+ rescue Trello::InvalidAccessToken
29
+ raise Troo::InvalidAccessToken
30
+ rescue Trello::Error
31
+ false
32
+ end
33
+
34
+ def attributes
35
+ {
36
+ name: name,
37
+ board_id: board.external_board_id
38
+ }
39
+ end
40
+ end
41
+ end