tacokit 0.1.0

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 (174) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.pryrc +7 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +18 -0
  6. data/Gemfile +28 -0
  7. data/Guardfile +12 -0
  8. data/LICENSE +22 -0
  9. data/README.md +134 -0
  10. data/Rakefile +8 -0
  11. data/config.ru +7 -0
  12. data/lib/tacokit/authorization.rb +46 -0
  13. data/lib/tacokit/client/actions.rb +54 -0
  14. data/lib/tacokit/client/boards.rb +124 -0
  15. data/lib/tacokit/client/cards.rb +143 -0
  16. data/lib/tacokit/client/checklists.rb +59 -0
  17. data/lib/tacokit/client/labels.rb +44 -0
  18. data/lib/tacokit/client/lists.rb +54 -0
  19. data/lib/tacokit/client/members.rb +91 -0
  20. data/lib/tacokit/client/notifications.rb +48 -0
  21. data/lib/tacokit/client/organizations.rb +79 -0
  22. data/lib/tacokit/client/searches.rb +20 -0
  23. data/lib/tacokit/client/tokens.rb +41 -0
  24. data/lib/tacokit/client/types.rb +11 -0
  25. data/lib/tacokit/client/webhooks.rb +43 -0
  26. data/lib/tacokit/client.rb +169 -0
  27. data/lib/tacokit/configuration.rb +60 -0
  28. data/lib/tacokit/error.rb +31 -0
  29. data/lib/tacokit/middleware/boom.rb +26 -0
  30. data/lib/tacokit/middleware/debug.rb +22 -0
  31. data/lib/tacokit/middleware.rb +15 -0
  32. data/lib/tacokit/resource.rb +114 -0
  33. data/lib/tacokit/response.rb +23 -0
  34. data/lib/tacokit/transform.rb +97 -0
  35. data/lib/tacokit/utils.rb +51 -0
  36. data/lib/tacokit/version.rb +3 -0
  37. data/lib/tacokit.rb +20 -0
  38. data/script/console +6 -0
  39. data/spec/cassettes/Tacokit_Client/_connection/authorized_GET_request_with_app_key_and_token_params.json +1 -0
  40. data/spec/cassettes/Tacokit_Client_Actions/_action/returns_a_token_authorized_action.json +1 -0
  41. data/spec/cassettes/Tacokit_Client_Actions/_action/returns_oauth_authorized_board.json +1 -0
  42. data/spec/cassettes/Tacokit_Client_Actions/_action_field/returns_a_hash.json +1 -0
  43. data/spec/cassettes/Tacokit_Client_Actions/_action_field/returns_a_resource.json +1 -0
  44. data/spec/cassettes/Tacokit_Client_Actions/_action_field/returns_a_value.json +1 -0
  45. data/spec/cassettes/Tacokit_Client_Actions/_action_resource/returns_action_board.json +1 -0
  46. data/spec/cassettes/Tacokit_Client_Actions/_action_resource/returns_action_entities.json +1 -0
  47. data/spec/cassettes/Tacokit_Client_Actions/_action_resource/returns_action_memberships.json +1 -0
  48. data/spec/cassettes/Tacokit_Client_Actions/_delete_action/deletes_an_action.json +1 -0
  49. data/spec/cassettes/Tacokit_Client_Actions/_update_action/updates_a_action.json +1 -0
  50. data/spec/cassettes/Tacokit_Client_Actions/_update_action/updates_an_action.json +1 -0
  51. data/spec/cassettes/Tacokit_Client_Actions/_update_action_text/updates_an_action.json +1 -0
  52. data/spec/cassettes/Tacokit_Client_Boards/_add_board_member/adds_invites_member_to_board.json +1 -0
  53. data/spec/cassettes/Tacokit_Client_Boards/_board/returns_a_token_authorized_board.json +1 -0
  54. data/spec/cassettes/Tacokit_Client_Boards/_board/returns_oauth_authorized_board.json +1 -0
  55. data/spec/cassettes/Tacokit_Client_Boards/_board_field/returns_a_hash.json +1 -0
  56. data/spec/cassettes/Tacokit_Client_Boards/_board_field/returns_a_value.json +1 -0
  57. data/spec/cassettes/Tacokit_Client_Boards/_board_field/returns_an_array.json +1 -0
  58. data/spec/cassettes/Tacokit_Client_Boards/_board_resource/returns_board_actions.json +1 -0
  59. data/spec/cassettes/Tacokit_Client_Boards/_board_resource/returns_board_cards.json +1 -0
  60. data/spec/cassettes/Tacokit_Client_Boards/_board_resource/returns_board_members.json +1 -0
  61. data/spec/cassettes/Tacokit_Client_Boards/_create_board/creates_a_board.json +1 -0
  62. data/spec/cassettes/Tacokit_Client_Boards/_create_board_resource/creates_a_board_calendar_key.json +1 -0
  63. data/spec/cassettes/Tacokit_Client_Boards/_create_board_resource/creates_a_board_label.json +1 -0
  64. data/spec/cassettes/Tacokit_Client_Boards/_create_board_resource/creates_a_board_resource.json +1 -0
  65. data/spec/cassettes/Tacokit_Client_Boards/_update_board/updates_a_board.json +1 -0
  66. data/spec/cassettes/Tacokit_Client_Boards/_update_board/updates_nested_resource.json +1 -0
  67. data/spec/cassettes/Tacokit_Client_Boards/_update_board_field/updates_a_board_field.json +1 -0
  68. data/spec/cassettes/Tacokit_Client_Boards/_update_board_resource/updates_member.json +1 -0
  69. data/spec/cassettes/Tacokit_Client_Cards/_card/returns_a_card_by_id.json +1 -0
  70. data/spec/cassettes/Tacokit_Client_Cards/_card/returns_a_card_by_short_link.json +1 -0
  71. data/spec/cassettes/Tacokit_Client_Cards/_card_field/returns_a_hash.json +1 -0
  72. data/spec/cassettes/Tacokit_Client_Cards/_card_field/returns_a_value.json +1 -0
  73. data/spec/cassettes/Tacokit_Client_Cards/_card_field/returns_an_array.json +1 -0
  74. data/spec/cassettes/Tacokit_Client_Cards/_card_resource/returns_card_actions.json +1 -0
  75. data/spec/cassettes/Tacokit_Client_Cards/_card_resource/returns_card_board.json +1 -0
  76. data/spec/cassettes/Tacokit_Client_Cards/_card_resource/returns_card_check_item_states.json +1 -0
  77. data/spec/cassettes/Tacokit_Client_Cards/_create_card/creates_a_card.json +1 -0
  78. data/spec/cassettes/Tacokit_Client_Cards/_create_card_attachment/attaches_external_url.json +1 -0
  79. data/spec/cassettes/Tacokit_Client_Cards/_create_card_attachment/uploads_local_file.json +1 -0
  80. data/spec/cassettes/Tacokit_Client_Cards/_create_card_comment/creates_a_comment.json +1 -0
  81. data/spec/cassettes/Tacokit_Client_Cards/_delete_card/deletes_a_card.json +1 -0
  82. data/spec/cassettes/Tacokit_Client_Cards/_delete_card_resource/deletes_resource.json +1 -0
  83. data/spec/cassettes/Tacokit_Client_Cards/_update_card/updates_a_card.json +1 -0
  84. data/spec/cassettes/Tacokit_Client_Checklists/_checklist/returns_a_checklist_by_id.json +1 -0
  85. data/spec/cassettes/Tacokit_Client_Checklists/_checklist_field/returns_a_value.json +1 -0
  86. data/spec/cassettes/Tacokit_Client_Checklists/_checklist_resource/returns_checklist_actions.json +1 -0
  87. data/spec/cassettes/Tacokit_Client_Checklists/_checklist_resource/returns_checklist_board.json +1 -0
  88. data/spec/cassettes/Tacokit_Client_Checklists/_checklist_resource/returns_checklist_prefs.json +1 -0
  89. data/spec/cassettes/Tacokit_Client_Checklists/_create_checklist/creates_a_checklist.json +1 -0
  90. data/spec/cassettes/Tacokit_Client_Checklists/_delete_checklist/deletes_a_checklist.json +1 -0
  91. data/spec/cassettes/Tacokit_Client_Checklists/_update_checklist/updates_a_checklist.json +1 -0
  92. data/spec/cassettes/Tacokit_Client_Labels/_create_label/creates_a_label.json +1 -0
  93. data/spec/cassettes/Tacokit_Client_Labels/_delete_label/deletes_a_label.json +1 -0
  94. data/spec/cassettes/Tacokit_Client_Labels/_label/returns_a_label_by_id.json +1 -0
  95. data/spec/cassettes/Tacokit_Client_Labels/_label_resource/returns_a_board.json +1 -0
  96. data/spec/cassettes/Tacokit_Client_Labels/_labels/returns_a_label_by_id.json +1 -0
  97. data/spec/cassettes/Tacokit_Client_Labels/_update_label/updates_a_label.json +1 -0
  98. data/spec/cassettes/Tacokit_Client_Lists/_create_list/creates_a_list.json +1 -0
  99. data/spec/cassettes/Tacokit_Client_Lists/_list/returns_a_list_by_id.json +1 -0
  100. data/spec/cassettes/Tacokit_Client_Lists/_list_field/returns_a_value.json +1 -0
  101. data/spec/cassettes/Tacokit_Client_Lists/_list_resource/returns_list_actions.json +1 -0
  102. data/spec/cassettes/Tacokit_Client_Lists/_list_resource/returns_list_board.json +1 -0
  103. data/spec/cassettes/Tacokit_Client_Lists/_list_resource/returns_list_cards.json +1 -0
  104. data/spec/cassettes/Tacokit_Client_Lists/_update_list/updates_a_list.json +1 -0
  105. data/spec/cassettes/Tacokit_Client_Members/_member/authenticated/returns_self.json +1 -0
  106. data/spec/cassettes/Tacokit_Client_Members/_member/raises_error_for_missing_token.json +1 -0
  107. data/spec/cassettes/Tacokit_Client_Members/_member/returns_a_member.json +1 -0
  108. data/spec/cassettes/Tacokit_Client_Members/_member/returns_self.json +1 -0
  109. data/spec/cassettes/Tacokit_Client_Members/_member/supports_query_fields_as_string_or_array.json +1 -0
  110. data/spec/cassettes/Tacokit_Client_Members/_member_field/returns_a_hash.json +1 -0
  111. data/spec/cassettes/Tacokit_Client_Members/_member_field/returns_a_member_field.json +1 -0
  112. data/spec/cassettes/Tacokit_Client_Members/_member_field/returns_a_resource.json +1 -0
  113. data/spec/cassettes/Tacokit_Client_Members/_member_field/returns_a_value.json +1 -0
  114. data/spec/cassettes/Tacokit_Client_Members/_member_field/returns_an_array.json +1 -0
  115. data/spec/cassettes/Tacokit_Client_Members/_member_resource/returns_member_actions.json +1 -0
  116. data/spec/cassettes/Tacokit_Client_Members/_member_resource/returns_member_board_stars.json +1 -0
  117. data/spec/cassettes/Tacokit_Client_Members/_member_resource/returns_member_boards.json +1 -0
  118. data/spec/cassettes/Tacokit_Client_Members/_update_member/updates_a_member.json +1 -0
  119. data/spec/cassettes/Tacokit_Client_Members/_update_member/updates_nested_resource.json +1 -0
  120. data/spec/cassettes/Tacokit_Client_Notifications/_notification/returns_a_notification_by_id.json +1 -0
  121. data/spec/cassettes/Tacokit_Client_Notifications/_notification_field/returns_a_hash.json +1 -0
  122. data/spec/cassettes/Tacokit_Client_Notifications/_notification_field/returns_a_resource.json +1 -0
  123. data/spec/cassettes/Tacokit_Client_Notifications/_notification_field/returns_a_value.json +1 -0
  124. data/spec/cassettes/Tacokit_Client_Notifications/_notification_resource/returns_action_entities.json +1 -0
  125. data/spec/cassettes/Tacokit_Client_Notifications/_notification_resource/returns_notification_board.json +1 -0
  126. data/spec/cassettes/Tacokit_Client_Notifications/_update_notification/updates_a_notification.json +1 -0
  127. data/spec/cassettes/Tacokit_Client_Organizations/_create_organization/creates_a_organization.json +1 -0
  128. data/spec/cassettes/Tacokit_Client_Organizations/_delete_organization/deletes_a_organization.json +1 -0
  129. data/spec/cassettes/Tacokit_Client_Organizations/_organization/returns_an_organization_by_id.json +1 -0
  130. data/spec/cassettes/Tacokit_Client_Organizations/_organization_field/returns_a_hash.json +1 -0
  131. data/spec/cassettes/Tacokit_Client_Organizations/_organization_field/returns_a_resource.json +1 -0
  132. data/spec/cassettes/Tacokit_Client_Organizations/_organization_field/returns_a_value.json +1 -0
  133. data/spec/cassettes/Tacokit_Client_Organizations/_organization_field/returns_an_array.json +1 -0
  134. data/spec/cassettes/Tacokit_Client_Organizations/_organization_resource/returns_organization_actions.json +1 -0
  135. data/spec/cassettes/Tacokit_Client_Organizations/_organization_resource/returns_organization_boards.json +1 -0
  136. data/spec/cassettes/Tacokit_Client_Organizations/_organization_resource/returns_organization_members.json +1 -0
  137. data/spec/cassettes/Tacokit_Client_Organizations/_update_organization/updates_a_organization.json +1 -0
  138. data/spec/cassettes/Tacokit_Client_Searches/_search/returns_search_result.json +1 -0
  139. data/spec/cassettes/Tacokit_Client_Tokens/_delete_token/deletes_a_token.json +1 -0
  140. data/spec/cassettes/Tacokit_Client_Tokens/_token/returns_a_token_for_token_string.json +1 -0
  141. data/spec/cassettes/Tacokit_Client_Tokens/_token_field/returns_a_value.json +1 -0
  142. data/spec/cassettes/Tacokit_Client_Tokens/_token_field/returns_an_array.json +1 -0
  143. data/spec/cassettes/Tacokit_Client_Tokens/_token_resource/returns_token_member.json +1 -0
  144. data/spec/cassettes/Tacokit_Client_Tokens/_token_resource/returns_token_webhooks.json +1 -0
  145. data/spec/cassettes/Tacokit_Client_Types/_type/returns_a_type_by_id.json +1 -0
  146. data/spec/cassettes/Tacokit_Client_Webhooks/_create_webhook/creates_a_webhook.json +1 -0
  147. data/spec/cassettes/Tacokit_Client_Webhooks/_delete_webhook/deletes_a_webhook.json +1 -0
  148. data/spec/cassettes/Tacokit_Client_Webhooks/_update_webhook/updates_a_webhook.json +1 -0
  149. data/spec/cassettes/Tacokit_Client_Webhooks/_webhook/returns_a_webhook_by_short_link.json +1 -0
  150. data/spec/cassettes/Tacokit_Client_Webhooks/_webhook_field/returns_a_value.json +1 -0
  151. data/spec/fixtures/taco.png +0 -0
  152. data/spec/spec_helper.rb +162 -0
  153. data/spec/tacokit/authorization_spec.rb +47 -0
  154. data/spec/tacokit/client/actions_spec.rb +100 -0
  155. data/spec/tacokit/client/boards_spec.rb +168 -0
  156. data/spec/tacokit/client/cards_spec.rb +192 -0
  157. data/spec/tacokit/client/checklists_spec.rb +87 -0
  158. data/spec/tacokit/client/labels_spec.rb +70 -0
  159. data/spec/tacokit/client/lists_spec.rb +81 -0
  160. data/spec/tacokit/client/members_spec.rb +114 -0
  161. data/spec/tacokit/client/notifications_spec.rb +52 -0
  162. data/spec/tacokit/client/organizations_spec.rb +100 -0
  163. data/spec/tacokit/client/searches_spec.rb +13 -0
  164. data/spec/tacokit/client/tokens_spec.rb +49 -0
  165. data/spec/tacokit/client/types_spec.rb +12 -0
  166. data/spec/tacokit/client/webhooks_spec.rb +70 -0
  167. data/spec/tacokit/client_spec.rb +28 -0
  168. data/spec/tacokit/configuration_spec.rb +51 -0
  169. data/spec/tacokit/middleware/boom_spec.rb +35 -0
  170. data/spec/tacokit/resource_spec.rb +26 -0
  171. data/spec/tacokit/transform_spec.rb +131 -0
  172. data/spec/tacokit_spec.rb +16 -0
  173. data/tacokit.gemspec +28 -0
  174. metadata +436 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f2578b367de9a2fa3604a9942c8605949fbe319a
4
+ data.tar.gz: c78e9ff1f74434acd490dbe1aacc4eb9dac5c579
5
+ SHA512:
6
+ metadata.gz: 510e5322ab2146b830db7124c8f644a5e7d2b35fc3a9c2ee2f2f8750690ae23103142d537040118d3329632cc8ff78147b63036a1ab99beafe2ddd06f2eb9c72
7
+ data.tar.gz: 2487e3e8af3c5f79a54555ce7c8021bc7417f20398bed4a787ab08f1e8f819ac780a0aaacf41ca17f9723c56864381e4533f0510821153ee88a925db41d4067b
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ .env
16
+ .env.development
data/.pryrc ADDED
@@ -0,0 +1,7 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+ require 'dotenv'
4
+ Dotenv.load(
5
+ File.expand_path("../.env", __FILE__),
6
+ File.expand_path("../.env.development", __FILE__)
7
+ )
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,18 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1
7
+ - ruby-head
8
+
9
+ bundler_args: --without development --retry=3 --jobs=3
10
+
11
+ env:
12
+ # global:
13
+ # - TRELLO_APP_KEY='tacokit-app-key'
14
+
15
+ matrix:
16
+ allow_failures:
17
+ - rvm: ruby-head
18
+ fast_finish: true
data/Gemfile ADDED
@@ -0,0 +1,28 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'awesome_print', :require => 'ap'
7
+ gem 'guard-rspec'
8
+ gem 'pry'
9
+ gem 'pry-byebug', :platforms => :ruby_21
10
+
11
+ gem 'oauth'
12
+ gem 'sinatra'
13
+ end
14
+
15
+ group :test do
16
+ # gem 'coveralls', :require => false
17
+ # gem 'json', '~> 1.7', :platforms => [:ruby_18, :jruby]
18
+ # gem 'mime-types', '< 2.0.0'
19
+ # gem 'netrc', '~> 0.7.7'
20
+ gem 'dotenv'
21
+ gem 'launchy'
22
+ gem 'rb-fsevent'
23
+ gem 'rspec'
24
+ gem 'simplecov', :require => false
25
+ gem 'vcr'
26
+ gem 'webmock'
27
+ gem 'rake'
28
+ end
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+ guard :rspec, cmd: "bundle exec rspec" do
2
+ require "ostruct"
3
+
4
+ rspec = OpenStruct.new
5
+ rspec.spec = ->(m) { "spec/#{m}_spec.rb" }
6
+ rspec.spec_dir = "spec"
7
+ rspec.spec_helper = "spec/spec_helper.rb"
8
+
9
+ watch(%r{^spec/.+_spec\.rb$})
10
+ watch(%r{^lib/(.+)\.rb$}) { |m| rspec.spec.(m[1]) }
11
+ watch(rspec.spec_helper) { rspec.spec_dir }
12
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Ross Kaffenberger
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # Tacokit
2
+
3
+ [![Build Status](https://travis-ci.org/rossta/tacokit.rb.svg?branch=master)](https://travis-ci.org/rossta/tacokit.rb) [![Code Climate](https://codeclimate.com/github/rossta/tacokit.rb/badges/gpa.svg)](https://codeclimate.com/github/rossta/tacokit.rb) [![Dependency Status](https://gemnasium.com/rossta/tacokit.rb.svg)](https://gemnasium.com/rossta/tacokit.rb)
4
+
5
+ Ruby toolkit for the Trello API... a work-in-progress. Design and philosophy
6
+ inspired by [ocktokit.rb](https://github.com/ocktokit/ocktokit.rb)
7
+
8
+ This is Taco.
9
+
10
+ ![Taco][taco]
11
+ [taco]: http://cl.ly/image/2p1x3K1X160b/taco.png
12
+
13
+ ## Quick Start
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ ```ruby
18
+ gem 'tacokit'
19
+ ```
20
+
21
+ ... or install it yourself as:
22
+
23
+ $ gem install tacokit
24
+
25
+ Configure the client with public-read application credentials:
26
+
27
+ ```ruby
28
+ # View an app key and secret on Trello
29
+ Tacokit.open_app_key
30
+
31
+ # Configure the client
32
+ Tacokit.configure do |c|
33
+ c.app_key = '4ppk3y'
34
+ end
35
+ ```
36
+
37
+ Make requests to Trello API methods using module-level configuration or as
38
+ client instance methods.
39
+ ```ruby
40
+ # Fetch the current member
41
+ Tacokit.member
42
+
43
+ # Fetch another member
44
+ Tacokit.member 'tacokit'
45
+
46
+ # Configure a separate client
47
+ client = Tacokit::Client.new app_key: '4ppk3y'
48
+
49
+ # Fetch a member
50
+ client.member 'tacokit'
51
+ ```
52
+ ## Authentication
53
+
54
+ ### Application Authorization
55
+
56
+ Trello supports application-level client authorization via an application key and application token.
57
+
58
+ Tacokit provides a simple way to retrieve your application key:
59
+
60
+ ```ruby
61
+ # Install the `launchy` gem to load the Trello page automatically
62
+ Tacokit.open_app_key
63
+ ```
64
+ Your application key are available by logging into Trello and visiting the [app key](https://trello.com/app-key) page. This page also provides your application secret that can be used to generate OAuth token access (see below).
65
+
66
+ The application token, generated separately from the app key, can be associated with a `scope` and `expiration`. See the Trello [authorization docs](https://trello.com/docs/gettingstarted/authorize.html) for more info on token params.
67
+
68
+ Tacokit provides a simple way to generate a new app token:
69
+
70
+ ```ruby
71
+ # Full permissions for 30 days
72
+ Tacokit.authorize scope: %w[ read write account ], expiration: '30days'
73
+
74
+ # Authorize a custom application and a different app key
75
+ Tacokit.authorize name: 'My Trello App', key: '4ppk3y2'
76
+
77
+ # Read only permissions for custom app forever
78
+ Tacokit.authorize scope: 'read', expiration: 'never', name: 'My Trello App'
79
+ ```
80
+
81
+ Your Tacokit client can now be configured to make requests:
82
+
83
+ ```ruby
84
+ # Configure the client
85
+ Tacokit.configure do |c|
86
+ c.app_key = '4ppk3y'
87
+ c.app_token = '4ppt0k3n'
88
+ end
89
+ ```
90
+
91
+ More information is available in the [Trello docs](https://trello.com/docs/index.html).
92
+
93
+ ### OAuth Authorization
94
+
95
+ The Trello API provides OAuth 1.0 credentials through the typical OAuth web
96
+ flow. Tacokit clients can therefore be configured separately to make requests on
97
+ behalf of different members:
98
+
99
+ ```ruby
100
+ client = Tacokit::Client.new app_key: '4ppk3y', oauth_token: '04utht0k3n'
101
+ ```
102
+
103
+ To experiment with OAuth tokens for development, visit the [Tacokit
104
+ Sandbox](https://tacokit.herokuapp.com) and enter your Trello app key and app secret.
105
+
106
+ #### Resources
107
+
108
+ For more information on setting up Trello OAuth for your web application
109
+
110
+ * Using OmniAuth? Try adding [omniauth-trello](https://github.com/joshrowley/omniauth-trello)
111
+ * To roll your own, see how the sandbox works: [Tacokit sandbox source](https://github.com/rossta/tacokit.rb/blob/heroku/app.rb)
112
+ * Check out the [Trello OAuth docs](https://trello.com/docs/gettingstarted/oauth.html)
113
+
114
+ ### Using ENV variables
115
+
116
+ Default Tacokit client values can be set by values in ENV:
117
+
118
+ ```shell
119
+ TRELLO_APP_KEY=4ppk3y
120
+ TRELLO_APP_SECRET=4pps3cr3t
121
+ TRELLO_APP_TOKEN=4ppt0k3n
122
+ ```
123
+
124
+ ## Usage
125
+
126
+ Coming soon.
127
+
128
+ ## Contributing
129
+
130
+ 1. Fork it ( https://github.com/[my-github-username]/tacokit/fork )
131
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
132
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
133
+ 4. Push to the branch (`git push origin my-new-feature`)
134
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :test => :spec
8
+ task :default => :spec
data/config.ru ADDED
@@ -0,0 +1,7 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+ require 'dotenv'
4
+ Dotenv.load(File.expand_path("../.env", __FILE__))
5
+
6
+ require './app'
7
+ run TrelloOauth
@@ -0,0 +1,46 @@
1
+ module Tacokit
2
+ module Authorization
3
+
4
+ def open_app_key
5
+ open_url web_url("appKey/generate")
6
+ end
7
+
8
+ # Params
9
+ # callback_method: "postMessage" or "fragment"
10
+ # return_url: URL the token should be returned to
11
+ # scope: Comma-separated list of one or more of "read", "write", "account"
12
+ # expiration: "1hour", "1day", "30days", "never"
13
+ # name: Name of the application
14
+ # key: Application key
15
+ #
16
+ def authorize(params = {})
17
+ open_url authorize_url(params)
18
+ end
19
+
20
+ def authorize_url(params = {})
21
+ params[:key] ||= app_key
22
+ params[:name] ||= 'Tacokit'
23
+ params[:response_type] ||= 'token'
24
+ web_url "authorize", params
25
+ end
26
+
27
+ private
28
+
29
+ def open_url(url)
30
+ require 'launchy'
31
+ Launchy.open(url)
32
+ rescue LoadError
33
+ warn "Visit #{url}"
34
+ warn "Please install the launchy gem to open the url automatically."
35
+ end
36
+
37
+ def web_url(path, params = {})
38
+ web_connection.build_url(path, params).to_s
39
+ end
40
+
41
+ def web_connection
42
+ Faraday::Connection.new(web_endpoint)
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,54 @@
1
+ module Tacokit
2
+ class Client
3
+ module Actions
4
+
5
+ # GET /1/actions/[idAction]
6
+ def action(action_id, options = nil)
7
+ get action_path(action_id), options
8
+ end
9
+
10
+ # GET /1/actions/[idAction]/[field]
11
+ def action_field(action_id, field)
12
+ get action_path(action_id, camp(field))
13
+ end
14
+
15
+ # GET /1/actions/[idAction]/[resource]
16
+ # board
17
+ # board/[field]
18
+ # card
19
+ # card/[field]
20
+ # entities
21
+ # list
22
+ # list/[field]
23
+ # member
24
+ # member/[field]
25
+ # memberCreator
26
+ # memberCreator/[field]
27
+ # organization
28
+ # organization/[field]
29
+ def action_resource(action_id, resource, *paths)
30
+ paths, options = extract_options(camp(resource), *paths)
31
+ get action_path(action_id, *paths), options
32
+ end
33
+
34
+ # PUT /1/actions/[idAction]
35
+ def update_action(action_id, options = {})
36
+ put action_path(action_id), options
37
+ end
38
+
39
+ # PUT /1/actions/[idAction]/text
40
+ def update_action_text(action_id, text)
41
+ put action_path(action_id, 'text'), value: text
42
+ end
43
+
44
+ # DELETE /1/actions/[idAction]
45
+ def delete_action(action_id)
46
+ delete action_path(action_id)
47
+ end
48
+
49
+ def action_path(*paths)
50
+ path_join("actions", *paths)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,124 @@
1
+ module Tacokit
2
+ class Client
3
+ module Boards
4
+
5
+ # GET /1/boards/[board_id]
6
+ def board(board_id, options = nil)
7
+ get board_path(board_id), options
8
+ end
9
+
10
+ # GET /1/boards/[board_id]/[field]
11
+ def board_field(board_id, field, options = nil)
12
+ get board_path(board_id, camp(field)), options
13
+ end
14
+
15
+ # GET /1/boards/[board_id]/[resource]
16
+ # actions
17
+ # boardStars
18
+ # cards
19
+ # cards/[filter]
20
+ # cards/[idCard]
21
+ # checklists
22
+ # deltas
23
+ # labels
24
+ # labels/[idLabel]
25
+ # lists
26
+ # lists/[filter]
27
+ # members
28
+ # members/[filter]
29
+ # members/[idMember]/cards
30
+ # membersInvited
31
+ # membersInvited/[field]
32
+ # memberships
33
+ # memberships/[idMembership]
34
+ # myPrefs
35
+ # organization
36
+ # organization/[field]
37
+ def board_resource(board_id, resource, *paths)
38
+ paths, options = extract_options(camp(resource), *paths)
39
+ get board_path(board_id, *paths), options
40
+ end
41
+
42
+ # PUT /1/boards/[board_id]
43
+ def update_board(board_id, options = {})
44
+ put board_path(board_id), options
45
+ end
46
+
47
+ # PUT /1/boards/[board_id]/[field]
48
+ # closed
49
+ # desc
50
+ # idOrganization
51
+ # labelNames/blue
52
+ # labelNames/green
53
+ # labelNames/orange
54
+ # labelNames/purple
55
+ # labelNames/red
56
+ # labelNames/yellow
57
+ # myPrefs/emailPosition
58
+ # myPrefs/idEmailList
59
+ # myPrefs/showListGuide
60
+ # myPrefs/showSidebar
61
+ # myPrefs/showSidebarActivity
62
+ # myPrefs/showSidebarBoardActions
63
+ # myPrefs/showSidebarMembers
64
+ # name
65
+ # prefs/background
66
+ # prefs/calendarFeedEnabled
67
+ # prefs/cardAging
68
+ # prefs/cardCovers
69
+ # prefs/comments
70
+ # prefs/invitations
71
+ # prefs/permissionLevel
72
+ # prefs/selfJoin
73
+ # prefs/voting
74
+ # subscribed
75
+ def update_board_field(board_id, *paths)
76
+ value = paths.pop
77
+ put board_path(board_id, camel_join(*paths)), value: value
78
+ end
79
+
80
+ # PUT /1/boards/[board_id]/members
81
+ def add_board_member(board_id, email, full_name, options = {})
82
+ options.update \
83
+ email: email,
84
+ full_name: full_name
85
+ put board_path(board_id, "members"), options
86
+ end
87
+
88
+ # PUT /1/boards/[board_id]/[resource]
89
+ # members/[idMember]
90
+ # memberships/[idMembership]
91
+ def update_board_resource(board_id, resource, resource_id, options = {})
92
+ put board_path(board_id, camp(resource), resource_id), options
93
+ end
94
+
95
+ # POST /1/boards
96
+ def create_board(name, options = {})
97
+ post board_path, options.merge(name: name)
98
+ end
99
+
100
+ # POST /1/boards/[board_id]/[resource]
101
+ # calendarKey/generate
102
+ # checklists
103
+ # emailKey/generate
104
+ # labels
105
+ # lists
106
+ # markAsViewed
107
+ # powerUps
108
+ def create_board_resource(board_id, resource, *paths)
109
+ paths, options = extract_options(camp(resource), *paths)
110
+ post board_path(board_id, *paths), options
111
+ end
112
+
113
+ # DELETE /1/boards/[board_id]/[resource]/[resource_id]
114
+ # members/[idMember]
115
+ # powerUps/[powerUp]
116
+ #
117
+
118
+ def board_path(*paths)
119
+ path_join("boards", *paths)
120
+ end
121
+
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,143 @@
1
+ module Tacokit
2
+ class Client
3
+ module Cards
4
+
5
+ # GET cards/[card id or shortlink]
6
+ def card(card_id, options = nil)
7
+ get card_path(card_id), options
8
+ end
9
+
10
+ # GET cards/[card id or shortlink]/[field]
11
+ # badges
12
+ # checkItemStates
13
+ # closed
14
+ # dateLastActivity
15
+ # desc
16
+ # descData
17
+ # due
18
+ # email
19
+ # idAttachmentCover
20
+ # idBoard
21
+ # idChecklists
22
+ # idLabels
23
+ # idList
24
+ # idMembers
25
+ # idMembersVoted
26
+ # idShort
27
+ # labels
28
+ # manualCoverAttachment
29
+ # name
30
+ # pos
31
+ # shortLink
32
+ # shortUrl
33
+ # subscribed
34
+ # url
35
+ def card_field(card_id, field, options = nil)
36
+ get card_path(card_id, camp(field)), options
37
+ end
38
+
39
+ # GET cards/[card id or shortlink]/[resource]
40
+ # actions
41
+ # attachments
42
+ # attachments/[idAttachment]
43
+ # board
44
+ # board/[field]
45
+ # checkItemStates
46
+ # checklists
47
+ # list
48
+ # list/[field]
49
+ # members
50
+ # membersVoted
51
+ # stickers
52
+ # stickers/[idSticker]
53
+ def card_resource(card_id, resource, options = {})
54
+ get card_path(card_id, camp(resource)), options
55
+ end
56
+
57
+ # PUT cards/[card id or shortlink]
58
+ def update_card(card_id, options = {})
59
+ put card_path(card_id), options
60
+ end
61
+
62
+ # PUT cards/[card id or shortlink]/[resource]
63
+ # actions/[idAction]/comments
64
+ # checklist/[idChecklist]/checkItem/[idCheckItem]/name
65
+ # checklist/[idChecklist]/checkItem/[idCheckItem]/pos
66
+ # checklist/[idChecklist]/checkItem/[idCheckItem]/state
67
+ # checklist/[idChecklistCurrent]/checkItem/[idCheckItem]
68
+ # closed
69
+ # desc
70
+ # due
71
+ # idAttachmentCover
72
+ # idBoard
73
+ # idList
74
+ # idMembers
75
+ # labels
76
+ # name
77
+ # pos
78
+ # stickers/[idSticker]
79
+ # subscribed
80
+
81
+ # POST cards
82
+ def create_card(list_id, name = nil, options = {})
83
+ post card_path, options.merge(name: name, list_id: list_id)
84
+ end
85
+
86
+ # POST cards/[card id or shortlink]/actions/comments
87
+ def create_card_comment(card_id, text, options = {})
88
+ options.update text: text
89
+ create_card_resource card_id, "actions", "comments", options
90
+ end
91
+
92
+ # POST cards/[card id or shortlink]/attachments
93
+ def create_card_attachment(card_id, url, mime_type = nil, options = {})
94
+ uri = Addressable::URI.parse(url)
95
+
96
+ if uri.scheme =~ %r{https?}
97
+ options.update url: uri.to_s, mime_type: mime_type
98
+ else
99
+ file = Faraday::UploadIO.new(uri.to_s, mime_type)
100
+ options.update file: file, mime_type: file.content_type
101
+ end
102
+
103
+ create_card_resource card_id, 'attachments', options
104
+ end
105
+
106
+ # POST cards/[card id or shortlink]/[resource]
107
+ # checklist/[idChecklist]/checkItem
108
+ # checklist/[idChecklist]/checkItem/[idCheckItem]/convertToCard
109
+ # checklists
110
+ # idMembers
111
+ # labels
112
+ # markAssociatedNotificationsRead
113
+ # membersVoted
114
+ # stickers
115
+ def create_card_resource(card_id, resource, *paths)
116
+ paths, options = extract_options(camp(resource), *paths)
117
+ post card_path(card_id, *paths), options
118
+ end
119
+
120
+ # DELETE cards/[card id or shortlink]
121
+ def delete_card(card_id)
122
+ delete card_path(card_id)
123
+ end
124
+
125
+ # DELETE cards/[card id or shortlink]/[resource]
126
+ # actions/[idAction]/comments
127
+ # attachments/[idAttachment]
128
+ # checklist/[idChecklist]/checkItem/[idCheckItem]
129
+ # checklists/[idChecklist]
130
+ # idMembers/[idMember]
131
+ # labels/[color]
132
+ # membersVoted/[idMember]
133
+ # stickers/[idSticker]
134
+ def delete_card_resource(card_id, resource, *paths)
135
+ delete card_path(card_id, camp(resource), *paths)
136
+ end
137
+
138
+ def card_path(*paths)
139
+ path_join "cards", *paths
140
+ end
141
+ end
142
+ end
143
+ end