ruby-trello 1.5.1 → 1.6.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/trello.rb +1 -0
- data/lib/trello/action.rb +1 -1
- data/lib/trello/basic_data.rb +3 -1
- data/lib/trello/board.rb +12 -10
- data/lib/trello/card.rb +19 -10
- data/lib/trello/checklist.rb +3 -3
- data/lib/trello/label.rb +3 -3
- data/lib/trello/list.rb +4 -4
- data/lib/trello/plugin_datum.rb +34 -0
- data/lib/trello/webhook.rb +3 -3
- data/spec/array_spec.rb +4 -1
- data/spec/board_spec.rb +22 -1
- data/spec/card_spec.rb +91 -7
- data/spec/checklist_spec.rb +24 -1
- data/spec/label_spec.rb +18 -0
- data/spec/list_spec.rb +20 -0
- data/spec/spec_helper.rb +81 -9
- data/spec/webhook_spec.rb +18 -0
- metadata +19 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b666e156d0e650e1f3a28d42dfdc0eaff8b8c147
|
4
|
+
data.tar.gz: 232b7631c884e4126aba17d87dcde5fa7e3b44be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4195f7cabbe3497ce58ca381d35703e05fca562895abaaf305351d70418ea2e54d13e72be42c2fa548920350a2e01f7a80ab88cd10d66cf876f4e77361e2ddb0
|
7
|
+
data.tar.gz: 134a4f52ae538a3d4c68004a2ae9b5852c36a98d7841c9becc456b9fdabe7130a0a2b70a8a684d0a7de2f67906ddc511f41c03e90629888d2391930b906d3c9f
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Ruby Trello API
|
2
2
|
|
3
3
|
[](http://waffle.io/jeremytregunna/ruby-trello)
|
4
|
-
[](http://travis-ci.org/jeremytregunna/ruby-trello) [](https://gemnasium.com/jeremytregunna/ruby-trello
|
4
|
+
[](http://travis-ci.org/jeremytregunna/ruby-trello) [](https://gemnasium.com/jeremytregunna/ruby-trello)
|
5
5
|
[](https://codeclimate.com/github/jeremytregunna/ruby-trello)
|
6
6
|
|
7
7
|
This library implements the [Trello](http://www.trello.com/) [API](http://trello.com/api).
|
data/lib/trello.rb
CHANGED
@@ -59,6 +59,7 @@ module Trello
|
|
59
59
|
autoload :MultiAssociation, 'trello/multi_association'
|
60
60
|
autoload :Notification, 'trello/notification'
|
61
61
|
autoload :Organization, 'trello/organization'
|
62
|
+
autoload :PluginDatum, 'trello/plugin_datum'
|
62
63
|
autoload :Request, 'trello/net'
|
63
64
|
autoload :TInternet, 'trello/net'
|
64
65
|
autoload :Token, 'trello/token'
|
data/lib/trello/action.rb
CHANGED
@@ -24,7 +24,7 @@ module Trello
|
|
24
24
|
client.find(:action, id, params)
|
25
25
|
end
|
26
26
|
|
27
|
-
def search(query, opts={})
|
27
|
+
def search(query, opts = {})
|
28
28
|
response = client.get("/search/", { query: query }.merge(opts))
|
29
29
|
parse_json(response).except("options").each_with_object({}) do |(key, data), result|
|
30
30
|
klass = "Trello::#{key.singularize.capitalize}".constantize
|
data/lib/trello/basic_data.rb
CHANGED
@@ -90,8 +90,10 @@ module Trello
|
|
90
90
|
options = opts.dup
|
91
91
|
resource = options.delete(:in) || self.class.to_s.split("::").last.downcase.pluralize
|
92
92
|
klass = options.delete(:via) || Trello.const_get(name.to_s.singularize.camelize)
|
93
|
+
path = options.delete(:path) || name
|
93
94
|
params = options.merge(args[0] || {})
|
94
|
-
|
95
|
+
|
96
|
+
resources = client.find_many(klass, "/#{resource}/#{id}/#{path}", params)
|
95
97
|
MultiAssociation.new(self, resources).proxy
|
96
98
|
end
|
97
99
|
end
|
data/lib/trello/board.rb
CHANGED
@@ -87,15 +87,17 @@ module Trello
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def update_fields(fields)
|
90
|
-
attributes[:id] = fields['id']
|
91
|
-
attributes[:name] = fields['name']
|
92
|
-
attributes[:description] = fields['desc']
|
93
|
-
attributes[:closed] = fields['closed']
|
94
|
-
attributes[:
|
95
|
-
attributes[:
|
96
|
-
attributes[:
|
97
|
-
attributes[:
|
98
|
-
attributes[:
|
90
|
+
attributes[:id] = fields['id'] || fields[:id] if fields['id'] || fields[:id]
|
91
|
+
attributes[:name] = fields['name'] || fields[:name] if fields['name'] || fields[:name]
|
92
|
+
attributes[:description] = fields['desc'] || fields[:desc] if fields['desc'] || fields[:desc]
|
93
|
+
attributes[:closed] = fields['closed'] if fields.has_key?('closed')
|
94
|
+
attributes[:closed] = fields[:closed] if fields.has_key?(:closed)
|
95
|
+
attributes[:starred] = fields['starred'] if fields.has_key?('starred')
|
96
|
+
attributes[:starred] = fields[:starred] if fields.has_key?(:starred)
|
97
|
+
attributes[:url] = fields['url'] if fields['url']
|
98
|
+
attributes[:organization_id] = fields['idOrganization'] || fields[:organization_id] if fields['idOrganization'] || fields[:organization_id]
|
99
|
+
attributes[:prefs] = fields['prefs'] || fields[:prefs] || {}
|
100
|
+
attributes[:last_activity_date] = Time.iso8601(fields['dateLastActivity']) rescue nil
|
99
101
|
self
|
100
102
|
end
|
101
103
|
|
@@ -155,7 +157,7 @@ module Trello
|
|
155
157
|
# Returns a reference to the organization this board belongs to.
|
156
158
|
one :organization, path: :organizations, using: :organization_id
|
157
159
|
|
158
|
-
def labels(params={})
|
160
|
+
def labels(params = {})
|
159
161
|
# Set the limit to as high as possible given there is no pagination in this API.
|
160
162
|
params[:limit] = 1000 unless params[:limit]
|
161
163
|
labels = Label.from_response client.get("/boards/#{id}/labels", params)
|
data/lib/trello/card.rb
CHANGED
@@ -43,7 +43,7 @@ module Trello
|
|
43
43
|
# @return [Array<String>] Array of strings
|
44
44
|
|
45
45
|
class Card < BasicData
|
46
|
-
register_attributes :id, :short_id, :name, :desc, :due, :closed, :url, :short_url,
|
46
|
+
register_attributes :id, :short_id, :name, :desc, :due, :due_complete, :closed, :url, :short_url,
|
47
47
|
:board_id, :member_ids, :list_id, :pos, :last_activity_date, :labels, :card_labels,
|
48
48
|
:cover_image_id, :badges, :card_members, :source_card_id, :source_card_properties,
|
49
49
|
readonly: [ :id, :short_id, :url, :short_url, :last_activity_date, :badges, :card_members ]
|
@@ -59,6 +59,7 @@ module Trello
|
|
59
59
|
name: 'name',
|
60
60
|
desc: 'desc',
|
61
61
|
due: 'due',
|
62
|
+
due_complete: 'dueComplete',
|
62
63
|
closed: 'closed',
|
63
64
|
url: 'url',
|
64
65
|
short_url: 'shortUrl',
|
@@ -122,6 +123,7 @@ module Trello
|
|
122
123
|
'idMembers' => options[:member_ids],
|
123
124
|
'idLabels' => options[:card_labels],
|
124
125
|
'due' => options[:due],
|
126
|
+
'due_complete' => options[:due_complete] || false,
|
125
127
|
'pos' => options[:pos],
|
126
128
|
'idCardSource' => options[:source_card_id],
|
127
129
|
'keepFromSource' => options.key?(:source_card_properties) ? options[:source_card_properties] : 'all'
|
@@ -146,6 +148,7 @@ module Trello
|
|
146
148
|
# @option fields [String] :desc A string with a length from 0 to
|
147
149
|
# 16384.
|
148
150
|
# @option fields [Date] :due A date, or `nil`.
|
151
|
+
# @option fields [Boolean] :due_complete
|
149
152
|
# @option fields [Boolean] :closed
|
150
153
|
# @option fields [String] :url
|
151
154
|
# @option fields [String] :short_url
|
@@ -168,24 +171,26 @@ module Trello
|
|
168
171
|
def update_fields(fields)
|
169
172
|
attributes[:id] = fields[SYMBOL_TO_STRING[:id]]
|
170
173
|
attributes[:short_id] = fields[SYMBOL_TO_STRING[:short_id]]
|
171
|
-
attributes[:name] = fields[SYMBOL_TO_STRING[:name]]
|
172
|
-
attributes[:desc] = fields[SYMBOL_TO_STRING[:desc]]
|
174
|
+
attributes[:name] = fields[SYMBOL_TO_STRING[:name]] || fields[:name]
|
175
|
+
attributes[:desc] = fields[SYMBOL_TO_STRING[:desc]] || fields[:desc]
|
173
176
|
attributes[:due] = Time.iso8601(fields[SYMBOL_TO_STRING[:due]]) rescue nil
|
177
|
+
attributes[:due] ||= fields[:due]
|
178
|
+
attributes[:due_complete] = fields[SYMBOL_TO_STRING[:due_complete]] || false
|
174
179
|
attributes[:closed] = fields[SYMBOL_TO_STRING[:closed]]
|
175
180
|
attributes[:url] = fields[SYMBOL_TO_STRING[:url]]
|
176
181
|
attributes[:short_url] = fields[SYMBOL_TO_STRING[:short_url]]
|
177
182
|
attributes[:board_id] = fields[SYMBOL_TO_STRING[:board_id]]
|
178
|
-
attributes[:member_ids] = fields[SYMBOL_TO_STRING[:member_ids]]
|
179
|
-
attributes[:list_id] = fields[SYMBOL_TO_STRING[:list_id]]
|
180
|
-
attributes[:pos] = fields[SYMBOL_TO_STRING[:pos]]
|
183
|
+
attributes[:member_ids] = fields[SYMBOL_TO_STRING[:member_ids]] || fields[:member_ids]
|
184
|
+
attributes[:list_id] = fields[SYMBOL_TO_STRING[:list_id]] || fields[:list_id]
|
185
|
+
attributes[:pos] = fields[SYMBOL_TO_STRING[:pos]] || fields[:pos]
|
181
186
|
attributes[:labels] = (fields[SYMBOL_TO_STRING[:labels]] || []).map { |lbl| Trello::Label.new(lbl) }
|
182
|
-
attributes[:card_labels] = fields[SYMBOL_TO_STRING[:card_labels]]
|
187
|
+
attributes[:card_labels] = fields[SYMBOL_TO_STRING[:card_labels]] || fields[:card_labels]
|
183
188
|
attributes[:last_activity_date] = Time.iso8601(fields[SYMBOL_TO_STRING[:last_activity_date]]) rescue nil
|
184
189
|
attributes[:cover_image_id] = fields[SYMBOL_TO_STRING[:cover_image_id]]
|
185
190
|
attributes[:badges] = fields[SYMBOL_TO_STRING[:badges]]
|
186
191
|
attributes[:card_members] = fields[SYMBOL_TO_STRING[:card_members]]
|
187
|
-
attributes[:source_card_id] = fields[SYMBOL_TO_STRING[:source_card_id]]
|
188
|
-
attributes[:source_card_properties] = fields[SYMBOL_TO_STRING[:source_card_properties]]
|
192
|
+
attributes[:source_card_id] = fields[SYMBOL_TO_STRING[:source_card_id]] || fields[:source_card_id]
|
193
|
+
attributes[:source_card_properties] = fields[SYMBOL_TO_STRING[:source_card_properties]] || fields[:source_card_properties]
|
189
194
|
self
|
190
195
|
end
|
191
196
|
|
@@ -201,6 +206,9 @@ module Trello
|
|
201
206
|
# :filter => [ :none, :all ] # default :all
|
202
207
|
many :checklists, filter: :all
|
203
208
|
|
209
|
+
# Returns a list of plugins associated with the card
|
210
|
+
many :plugin_data, path: "pluginData"
|
211
|
+
|
204
212
|
def check_item_states
|
205
213
|
states = CheckItemState.from_response client.get("/cards/#{self.id}/checkItemStates")
|
206
214
|
MultiAssociation.new(self, states).proxy
|
@@ -247,6 +255,7 @@ module Trello
|
|
247
255
|
idLabels: card_labels,
|
248
256
|
pos: pos,
|
249
257
|
due: due,
|
258
|
+
dueComplete: due_complete,
|
250
259
|
idCardSource: source_card_id,
|
251
260
|
keepFromSource: source_card_properties
|
252
261
|
})
|
@@ -397,7 +406,7 @@ module Trello
|
|
397
406
|
end
|
398
407
|
|
399
408
|
# Add an attachment to this card
|
400
|
-
def add_attachment(attachment, name='')
|
409
|
+
def add_attachment(attachment, name = '')
|
401
410
|
# Is it a file object or a string (url)?
|
402
411
|
if attachment.respond_to?(:path) && attachment.respond_to?(:read)
|
403
412
|
client.post("/cards/#{id}/attachments", {
|
data/lib/trello/checklist.rb
CHANGED
@@ -46,14 +46,14 @@ module Trello
|
|
46
46
|
# a checklist.
|
47
47
|
def update_fields(fields)
|
48
48
|
attributes[:id] = fields['id']
|
49
|
-
attributes[:name] = fields['name']
|
49
|
+
attributes[:name] = fields['name'] || fields[:name]
|
50
50
|
attributes[:description] = fields['desc']
|
51
51
|
attributes[:closed] = fields['closed']
|
52
52
|
attributes[:url] = fields['url']
|
53
53
|
attributes[:check_items] = fields['checkItems']
|
54
54
|
attributes[:position] = fields['pos']
|
55
55
|
attributes[:board_id] = fields['idBoard']
|
56
|
-
attributes[:card_id] = fields['idCard']
|
56
|
+
attributes[:card_id] = fields['idCard'] || fields[:card_id]
|
57
57
|
attributes[:list_id] = fields['idList']
|
58
58
|
attributes[:member_ids] = fields['idMembers']
|
59
59
|
self
|
@@ -103,7 +103,7 @@ module Trello
|
|
103
103
|
end
|
104
104
|
|
105
105
|
# Add an item to the checklist
|
106
|
-
def add_item(name, checked=false, position='bottom')
|
106
|
+
def add_item(name, checked = false, position = 'bottom')
|
107
107
|
client.post("/checklists/#{id}/checkItems", {name: name, checked: checked, pos: position})
|
108
108
|
end
|
109
109
|
|
data/lib/trello/label.rb
CHANGED
@@ -65,9 +65,9 @@ module Trello
|
|
65
65
|
# a label.
|
66
66
|
def update_fields(fields)
|
67
67
|
attributes[:id] = fields['id']
|
68
|
-
attributes[:name] = fields['name']
|
69
|
-
attributes[:color] = fields['color']
|
70
|
-
attributes[:board_id] = fields['idBoard']
|
68
|
+
attributes[:name] = fields['name'] || fields[:name]
|
69
|
+
attributes[:color] = fields['color'] || fields[:color]
|
70
|
+
attributes[:board_id] = fields['idBoard'] || fields[:board_id]
|
71
71
|
attributes[:uses] = fields['uses']
|
72
72
|
self
|
73
73
|
end
|
data/lib/trello/list.rb
CHANGED
@@ -42,11 +42,11 @@ module Trello
|
|
42
42
|
# a List.
|
43
43
|
def update_fields(fields)
|
44
44
|
attributes[:id] = fields['id']
|
45
|
-
attributes[:name] = fields['name']
|
45
|
+
attributes[:name] = fields['name'] || fields[:name]
|
46
46
|
attributes[:closed] = fields['closed']
|
47
|
-
attributes[:board_id] = fields['idBoard']
|
48
|
-
attributes[:pos] = fields['pos']
|
49
|
-
attributes[:source_list_id] = fields['idListSource']
|
47
|
+
attributes[:board_id] = fields['idBoard'] || fields[:board_id]
|
48
|
+
attributes[:pos] = fields['pos'] || fields[:pos]
|
49
|
+
attributes[:source_list_id] = fields['idListSource'] || fields[:source_list_id]
|
50
50
|
self
|
51
51
|
end
|
52
52
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Trello
|
2
|
+
# A file or url that is linked to a Trello card
|
3
|
+
#
|
4
|
+
# @!attribute id
|
5
|
+
# @return [String]
|
6
|
+
# @!attribute idPlugin
|
7
|
+
# @return [String]
|
8
|
+
# @!attribute scope
|
9
|
+
# @return [String]
|
10
|
+
# @!attribute idModel
|
11
|
+
# @return [String]
|
12
|
+
# @!attribute value
|
13
|
+
# @return [String]
|
14
|
+
# @!attribute access
|
15
|
+
# @return [String]
|
16
|
+
class PluginDatum < BasicData
|
17
|
+
# Update the fields of a plugin.
|
18
|
+
register_attributes :id, :idPlugin, :scope, :idModel, :value, :access
|
19
|
+
|
20
|
+
|
21
|
+
# Supply a hash of stringkeyed data retrieved from the Trello API representing
|
22
|
+
# an attachment.
|
23
|
+
def update_fields(fields)
|
24
|
+
attributes[:id] = fields['id']
|
25
|
+
attributes[:idPlugin] = fields['idPlugin']
|
26
|
+
attributes[:scope] = fields['scope']
|
27
|
+
attributes[:value] = JSON.parse fields['value']
|
28
|
+
attributes[:idModel] = fields['idModel']
|
29
|
+
attributes[:access] = fields['access']
|
30
|
+
self
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/lib/trello/webhook.rb
CHANGED
@@ -49,9 +49,9 @@ module Trello
|
|
49
49
|
# @return [Trello::Webhook] self
|
50
50
|
def update_fields(fields)
|
51
51
|
attributes[:id] = fields['id']
|
52
|
-
attributes[:description] = fields['description']
|
53
|
-
attributes[:id_model] = fields['idModel']
|
54
|
-
attributes[:callback_url] = fields['callbackURL']
|
52
|
+
attributes[:description] = fields['description'] || fields[:description]
|
53
|
+
attributes[:id_model] = fields['idModel'] || fields[:id_model]
|
54
|
+
attributes[:callback_url] = fields['callbackURL'] || fields[:callback_url]
|
55
55
|
attributes[:active] = fields['active']
|
56
56
|
self
|
57
57
|
end
|
data/spec/array_spec.rb
CHANGED
@@ -5,6 +5,9 @@ describe Array, '#jsoned_into' do
|
|
5
5
|
include Helpers
|
6
6
|
|
7
7
|
it "should convert an array of parsed json into cards" do
|
8
|
-
|
8
|
+
expected = cards_details.map do |card_details|
|
9
|
+
card_details.jsoned_into(Trello::Card)
|
10
|
+
end
|
11
|
+
expect(cards_details.jsoned_into(Trello::Card)).to eq(expected)
|
9
12
|
end
|
10
13
|
end
|
data/spec/board_spec.rb
CHANGED
@@ -273,7 +273,28 @@ module Trello
|
|
273
273
|
expect(board.organization_id).to eq expected['idOrganization']
|
274
274
|
end
|
275
275
|
|
276
|
-
it "
|
276
|
+
it "initializes all fields from response-like formatted hash" do
|
277
|
+
board_details = boards_details.first
|
278
|
+
board = Board.new(board_details)
|
279
|
+
expect(board.id).to eq board_details['id']
|
280
|
+
expect(board.name).to eq board_details['name']
|
281
|
+
expect(board.description).to eq board_details['desc']
|
282
|
+
expect(board.closed).to eq board_details['closed']
|
283
|
+
expect(board.starred).to eq board_details['starred']
|
284
|
+
expect(board.organization_id).to eq board_details['idOrganization']
|
285
|
+
expect(board.url).to eq board_details['url']
|
286
|
+
expect(board.last_activity_date).to eq board_details['dateLastActivity']
|
287
|
+
end
|
288
|
+
|
289
|
+
it "initializes all fields from options-like formatted hash" do
|
290
|
+
board_details = boards_details[1]
|
291
|
+
board = Board.new(board_details)
|
292
|
+
expect(board.name).to eq board_details[:name]
|
293
|
+
expect(board.description).to eq board_details[:desc]
|
294
|
+
expect(board.closed).to eq board_details[:closed]
|
295
|
+
expect(board.starred).to eq board_details[:starred]
|
296
|
+
expect(board.organization_id).to eq board_details[:organization_id]
|
297
|
+
end
|
277
298
|
end
|
278
299
|
|
279
300
|
describe "#save" do
|
data/spec/card_spec.rb
CHANGED
@@ -39,8 +39,44 @@ module Trello
|
|
39
39
|
let(:client) { Trello.client }
|
40
40
|
|
41
41
|
it "creates a new record" do
|
42
|
-
|
43
|
-
|
42
|
+
cards_details.each do |card_details|
|
43
|
+
card = Card.new(card_details)
|
44
|
+
expect(card).to be_valid
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'properly initializes all fields from response-like formatted hash' do
|
49
|
+
card_details = cards_details.first
|
50
|
+
card = Card.new(card_details)
|
51
|
+
expect(card.id).to eq(card_details['id'])
|
52
|
+
expect(card.short_id).to eq(card_details['idShort'])
|
53
|
+
expect(card.name).to eq(card_details['name'])
|
54
|
+
expect(card.desc).to eq(card_details['desc'])
|
55
|
+
expect(card.closed).to eq(card_details['closed'])
|
56
|
+
expect(card.list_id).to eq(card_details['idList'])
|
57
|
+
expect(card.board_id).to eq(card_details['idBoard'])
|
58
|
+
expect(card.cover_image_id).to eq(card_details['idAttachmentCover'])
|
59
|
+
expect(card.member_ids).to eq(card_details['idMembers'])
|
60
|
+
expect(card.labels).to eq(card_details['labels'].map { |lbl| Trello::Label.new(lbl) })
|
61
|
+
expect(card.card_labels).to eq(card_details['idLabels'])
|
62
|
+
expect(card.url).to eq(card_details['url'])
|
63
|
+
expect(card.short_url).to eq(card_details['shortUrl'])
|
64
|
+
expect(card.pos).to eq(card_details['pos'])
|
65
|
+
expect(card.last_activity_date).to eq(card_details['dateLastActivity'])
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'properly initializes all fields from options-like formatted hash' do
|
69
|
+
card_details = cards_details[1]
|
70
|
+
card = Card.new(card_details)
|
71
|
+
expect(card.name).to eq(card_details[:name])
|
72
|
+
expect(card.list_id).to eq(card_details[:list_id])
|
73
|
+
expect(card.desc).to eq(card_details[:desc])
|
74
|
+
expect(card.member_ids).to eq(card_details[:member_ids])
|
75
|
+
expect(card.card_labels).to eq(card_details[:card_labels])
|
76
|
+
expect(card.due).to eq(card_details[:due])
|
77
|
+
expect(card.pos).to eq(card_details[:pos])
|
78
|
+
expect(card.source_card_id).to eq(card_details[:source_card_id])
|
79
|
+
expect(card.source_card_properties).to eq(card_details[:source_card_properties])
|
44
80
|
end
|
45
81
|
|
46
82
|
it 'must not be valid if not given a name' do
|
@@ -63,7 +99,7 @@ module Trello
|
|
63
99
|
result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
|
64
100
|
|
65
101
|
expected_payload = {name: "Test Card", desc: nil, idList: "abcdef123456789123456789",
|
66
|
-
idMembers: nil, idLabels: "abcdef123456789123456789", pos: nil, due: nil, idCardSource: nil, keepFromSource: 'all'}
|
102
|
+
idMembers: nil, idLabels: "abcdef123456789123456789", pos: nil, due: nil, dueComplete: false, idCardSource: nil, keepFromSource: 'all'}
|
67
103
|
|
68
104
|
expect(client)
|
69
105
|
.to receive(:post)
|
@@ -83,7 +119,7 @@ module Trello
|
|
83
119
|
result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
|
84
120
|
|
85
121
|
expected_payload = {name: nil, desc: nil, idList: "abcdef123456789123456789",
|
86
|
-
idMembers: nil, idLabels: nil, pos: nil, due: nil, idCardSource: cards_details.first['id'], keepFromSource: 'all'}
|
122
|
+
idMembers: nil, idLabels: nil, pos: nil, due: nil, dueComplete: false, idCardSource: cards_details.first['id'], keepFromSource: 'all'}
|
87
123
|
|
88
124
|
expect(client)
|
89
125
|
.to receive(:post)
|
@@ -98,13 +134,13 @@ module Trello
|
|
98
134
|
it 'creates a duplicate card with source due date and checklists and saves it on Trello', refactor: true do
|
99
135
|
payload = {
|
100
136
|
source_card_id: cards_details.first['id'],
|
101
|
-
source_card_properties: ['due','checklists']
|
137
|
+
source_card_properties: ['due', 'checklists']
|
102
138
|
}
|
103
139
|
|
104
140
|
result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
|
105
141
|
|
106
142
|
expected_payload = {name: nil, desc: nil, idList: "abcdef123456789123456789",
|
107
|
-
idMembers: nil, idLabels: nil, pos: nil, due: nil, idCardSource: cards_details.first['id'], keepFromSource: ['due','checklists']}
|
143
|
+
idMembers: nil, idLabels: nil, pos: nil, due: nil, dueComplete: false, idCardSource: cards_details.first['id'], keepFromSource: ['due', 'checklists']}
|
108
144
|
|
109
145
|
expect(client)
|
110
146
|
.to receive(:post)
|
@@ -125,7 +161,7 @@ module Trello
|
|
125
161
|
result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
|
126
162
|
|
127
163
|
expected_payload = {name: nil, desc: nil, idList: "abcdef123456789123456789",
|
128
|
-
idMembers: nil, idLabels: nil, pos: nil, due: nil, idCardSource: cards_details.first['id'], keepFromSource: nil}
|
164
|
+
idMembers: nil, idLabels: nil, pos: nil, due: nil, dueComplete: false, idCardSource: cards_details.first['id'], keepFromSource: nil}
|
129
165
|
|
130
166
|
expect(client)
|
131
167
|
.to receive(:post)
|
@@ -561,6 +597,40 @@ module Trello
|
|
561
597
|
end
|
562
598
|
end
|
563
599
|
|
600
|
+
context "plugins" do
|
601
|
+
it "can list the existing plugins with correct fields" do
|
602
|
+
allow(client)
|
603
|
+
.to receive(:get)
|
604
|
+
.with("/boards/abcdef123456789123456789", {})
|
605
|
+
.and_return JSON.generate(boards_details.first)
|
606
|
+
|
607
|
+
allow(client)
|
608
|
+
.to receive(:get)
|
609
|
+
.with("/cards/abcdef123456789123456789/pluginData", {})
|
610
|
+
.and_return plugin_data_payload
|
611
|
+
|
612
|
+
expect(card.board).to_not be_nil
|
613
|
+
expect(card.plugin_data).to_not be_nil
|
614
|
+
|
615
|
+
first_plugin = card.plugin_data.first
|
616
|
+
expect(first_plugin.id).to eq plugin_data_details[0]["id"]
|
617
|
+
expect(first_plugin.idPlugin).to eq plugin_data_details[0]["idPlugin"]
|
618
|
+
expect(first_plugin.scope).to eq plugin_data_details[0]["scope"]
|
619
|
+
expect(first_plugin.idModel).to eq plugin_data_details[0]["idModel"]
|
620
|
+
expect(first_plugin.value).to eq JSON.parse plugin_data_details[0]["value"]
|
621
|
+
expect(first_plugin.access).to eq plugin_data_details[0]["access"]
|
622
|
+
|
623
|
+
second_plugin = card.plugin_data[1]
|
624
|
+
expect(second_plugin.id).to eq plugin_data_details[1]["id"]
|
625
|
+
expect(second_plugin.idPlugin).to eq plugin_data_details[1]["idPlugin"]
|
626
|
+
expect(second_plugin.scope).to eq plugin_data_details[1]["scope"]
|
627
|
+
expect(second_plugin.idModel).to eq plugin_data_details[1]["idModel"]
|
628
|
+
expect(second_plugin.value).to eq JSON.parse plugin_data_details[1]["value"]
|
629
|
+
expect(second_plugin.access).to eq plugin_data_details[1]["access"]
|
630
|
+
|
631
|
+
end
|
632
|
+
end
|
633
|
+
|
564
634
|
context "attachments" do
|
565
635
|
it "can add an attachment" do
|
566
636
|
f = File.new('spec/list_spec.rb', 'r')
|
@@ -649,5 +719,19 @@ module Trello
|
|
649
719
|
card.close!
|
650
720
|
end
|
651
721
|
end
|
722
|
+
|
723
|
+
describe "can mark due_complete" do
|
724
|
+
it "updates the due completed attribute to true" do
|
725
|
+
card.due = Time.now
|
726
|
+
card.save
|
727
|
+
|
728
|
+
expect(card.due).to_not be_nil
|
729
|
+
|
730
|
+
card.due_complete = true
|
731
|
+
card.save
|
732
|
+
|
733
|
+
expect(card.due_complete).to_be true
|
734
|
+
end
|
735
|
+
end
|
652
736
|
end
|
653
737
|
end
|
data/spec/checklist_spec.rb
CHANGED
@@ -42,7 +42,7 @@ module Trello
|
|
42
42
|
|
43
43
|
attributes = checklists_details.first.merge(payload).except("idBoard")
|
44
44
|
result = JSON.generate(attributes)
|
45
|
-
|
45
|
+
|
46
46
|
|
47
47
|
expected_payload = {name: "Test Checklist", idCard: cards_details.first['id']}
|
48
48
|
|
@@ -55,6 +55,29 @@ module Trello
|
|
55
55
|
|
56
56
|
expect(checklist).to be_a Checklist
|
57
57
|
end
|
58
|
+
|
59
|
+
it 'initializes all fields from response-like hash' do
|
60
|
+
checklist_details = checklists_details.first
|
61
|
+
checklist = Checklist.new(checklist_details)
|
62
|
+
expect(checklist.id).to eq checklist_details['id']
|
63
|
+
expect(checklist.name).to eq checklist_details['name']
|
64
|
+
expect(checklist.description).to eq checklist_details['desc']
|
65
|
+
expect(checklist.closed).to eq checklist_details['closed']
|
66
|
+
expect(checklist.position).to eq checklist_details['pos']
|
67
|
+
expect(checklist.url).to eq checklist_details['url']
|
68
|
+
expect(checklist.board_id).to eq checklist_details['idBoard']
|
69
|
+
expect(checklist.card_id).to eq checklist_details['idCard']
|
70
|
+
expect(checklist.list_id).to eq checklist_details['idList']
|
71
|
+
expect(checklist.member_ids).to eq checklist_details['idMembers']
|
72
|
+
expect(checklist.check_items).to eq checklist_details['checkItems']
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'initializes required fields from options-like hash' do
|
76
|
+
checklist_details = checklists_details[1]
|
77
|
+
checklist = Checklist.new(checklist_details)
|
78
|
+
expect(checklist.name).to eq checklist_details[:name]
|
79
|
+
expect(checklist.card_id).to eq checklist_details[:card_id]
|
80
|
+
end
|
58
81
|
end
|
59
82
|
|
60
83
|
context "deleting" do
|
data/spec/label_spec.rb
CHANGED
@@ -37,6 +37,24 @@ module Trello
|
|
37
37
|
expect(Label.new(label_details.first)).to be_valid
|
38
38
|
end
|
39
39
|
|
40
|
+
it "initializes all fields from response-like formatted hash" do
|
41
|
+
details = label_details.first
|
42
|
+
label = Label.new(details)
|
43
|
+
expect(label.color).to eq details['color']
|
44
|
+
expect(label.name).to eq details['name']
|
45
|
+
expect(label.id).to eq details['id']
|
46
|
+
expect(label.uses).to eq details['uses']
|
47
|
+
expect(label.board_id).to eq details['idBoard']
|
48
|
+
end
|
49
|
+
|
50
|
+
it "initializes required fields from options-like formatted hash" do
|
51
|
+
details = label_options
|
52
|
+
label = Label.new(details)
|
53
|
+
expect(label.name).to eq details[:name]
|
54
|
+
expect(label.board_id).to eq details[:board_id]
|
55
|
+
expect(label.color).to eq details[:color]
|
56
|
+
end
|
57
|
+
|
40
58
|
it 'must not be valid if not given a name' do
|
41
59
|
expect(Label.new('idBoard' => lists_details.first['board_id'])).to_not be_valid
|
42
60
|
end
|
data/spec/list_spec.rb
CHANGED
@@ -53,6 +53,26 @@ module Trello
|
|
53
53
|
expect(list).to_not be_valid
|
54
54
|
end
|
55
55
|
|
56
|
+
it 'initializes all fields from response-like formatted hash' do
|
57
|
+
list_details = lists_details.first
|
58
|
+
list = List.new(list_details)
|
59
|
+
expect(list.id).to eq(list_details['id'])
|
60
|
+
expect(list.name).to eq(list_details['name'])
|
61
|
+
expect(list.closed).to eq(list_details['closed'])
|
62
|
+
expect(list.board_id).to eq(list_details['idBoard'])
|
63
|
+
expect(list.pos).to eq(list_details['pos'])
|
64
|
+
expect(list.source_list_id).to eq(list_details['idListSource'])
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'initializes required fields from options-like formatted hash' do
|
68
|
+
list_details = lists_details[1]
|
69
|
+
list = List.new(list_details)
|
70
|
+
expect(list.name).to eq list_details[:name]
|
71
|
+
expect(list.board_id).to eq list_details[:board_id]
|
72
|
+
expect(list.pos).to eq list_details[:pos]
|
73
|
+
expect(list.source_list_id).to eq list_details[:source_list_id]
|
74
|
+
end
|
75
|
+
|
56
76
|
it 'creates a new record and saves it on Trello', refactor: true do
|
57
77
|
payload = {
|
58
78
|
name: 'Test List',
|
data/spec/spec_helper.rb
CHANGED
@@ -72,6 +72,13 @@ module Helpers
|
|
72
72
|
'idOrganization' => 'abcdef123456789123456789',
|
73
73
|
'url' => 'https://trello.com/board/test/abcdef123456789123456789',
|
74
74
|
'dateLastActivity' => '2012-12-08T18:40:24.314Z'
|
75
|
+
},
|
76
|
+
{
|
77
|
+
name: 'Test',
|
78
|
+
desc: 'This is a test board',
|
79
|
+
closed: false,
|
80
|
+
starred: false,
|
81
|
+
organization_id: 'abcdef123456789123456789'
|
75
82
|
}]
|
76
83
|
end
|
77
84
|
|
@@ -85,13 +92,17 @@ module Helpers
|
|
85
92
|
'name' => 'Test Checklist',
|
86
93
|
'desc' => 'A marvelous little checklist',
|
87
94
|
'closed' => false,
|
88
|
-
'
|
95
|
+
'pos' => 16384,
|
89
96
|
'url' => 'https://trello.com/blah/blah',
|
90
97
|
'idBoard' => 'abcdef123456789123456789',
|
91
98
|
'idCard' => 'abccardid',
|
92
99
|
'idList' => 'abcdef123456789123456789',
|
93
100
|
'idMembers' => ['abcdef123456789123456789'],
|
94
101
|
'checkItems' => { 'id' => 'ghijk987654321' }
|
102
|
+
},
|
103
|
+
{
|
104
|
+
name: 'A marvelous little checklist',
|
105
|
+
card_id: 'abccardid'
|
95
106
|
}]
|
96
107
|
end
|
97
108
|
|
@@ -120,12 +131,21 @@ module Helpers
|
|
120
131
|
|
121
132
|
def lists_details
|
122
133
|
[{
|
123
|
-
'id'
|
124
|
-
'name'
|
125
|
-
'closed'
|
126
|
-
'idBoard'
|
127
|
-
'
|
128
|
-
|
134
|
+
'id' => 'abcdef123456789123456789',
|
135
|
+
'name' => 'To Do',
|
136
|
+
'closed' => false,
|
137
|
+
'idBoard' => 'abcdef123456789123456789',
|
138
|
+
'idListSource' => 'abcdef123456789123456780',
|
139
|
+
'cards' => cards_details,
|
140
|
+
'pos' => 12
|
141
|
+
},
|
142
|
+
{
|
143
|
+
name: 'To Do',
|
144
|
+
board_id: 'abcdef123456789123456789',
|
145
|
+
pos: 12,
|
146
|
+
source_list_id: 'abcdef123456789123456780'
|
147
|
+
}
|
148
|
+
]
|
129
149
|
end
|
130
150
|
|
131
151
|
def lists_payload
|
@@ -152,6 +172,20 @@ module Helpers
|
|
152
172
|
'shortUrl' => 'https://trello.com/c/abcdef12',
|
153
173
|
'pos' => 12,
|
154
174
|
'dateLastActivity' => '2012-12-07T18:40:24.314Z'
|
175
|
+
},
|
176
|
+
{
|
177
|
+
name: 'Do something awesome',
|
178
|
+
list_id: 'abcdef123456789123456789',
|
179
|
+
desc: 'Awesome things are awesome.',
|
180
|
+
member_ids: ['abcdef123456789123456789'],
|
181
|
+
card_labels: [ 'abcdef123456789123456789',
|
182
|
+
'bbcdef123456789123456789',
|
183
|
+
'cbcdef123456789123456789',
|
184
|
+
'dbcdef123456789123456789' ],
|
185
|
+
due: Date.today,
|
186
|
+
pos: 12,
|
187
|
+
source_card_id: 'abcdef1234567891234567890',
|
188
|
+
source_card_properties: 'checklist,members'
|
155
189
|
}]
|
156
190
|
end
|
157
191
|
|
@@ -186,6 +220,31 @@ module Helpers
|
|
186
220
|
JSON.generate(attachments_details)
|
187
221
|
end
|
188
222
|
|
223
|
+
def plugin_data_details
|
224
|
+
[
|
225
|
+
{
|
226
|
+
"id"=>"abcdef123456789123456779",
|
227
|
+
"idPlugin"=>"abcdef123456789123456879",
|
228
|
+
"scope"=>"card",
|
229
|
+
"idModel"=>"abcdef123456789123446879",
|
230
|
+
"value"=>"{\"fields\":{\"plugin_key\":\"plugin_value\"}}",
|
231
|
+
"access"=>"shared"
|
232
|
+
},
|
233
|
+
{
|
234
|
+
"id"=>"abcdef123456789123456879",
|
235
|
+
"idPlugin"=>"abcdef123456789123456779",
|
236
|
+
"scope"=>"card",
|
237
|
+
"idModel"=>"abcdef123456789123446579",
|
238
|
+
"value"=>"{\"fields\":{\"plugin_key\":\"plugin_value\"}}",
|
239
|
+
"access"=>"shared"
|
240
|
+
}
|
241
|
+
]
|
242
|
+
end
|
243
|
+
|
244
|
+
def plugin_data_payload
|
245
|
+
JSON.generate(plugin_data_details)
|
246
|
+
end
|
247
|
+
|
189
248
|
def card_payload
|
190
249
|
JSON.generate(cards_details.first)
|
191
250
|
end
|
@@ -208,7 +267,7 @@ module Helpers
|
|
208
267
|
[{
|
209
268
|
'id' => '4ee2482134a81a757a08af47',
|
210
269
|
'idMemberCreator' => 'abcdef123456789123456789',
|
211
|
-
'data'=> {
|
270
|
+
'data' => {
|
212
271
|
'card' => {
|
213
272
|
'id' => '4ee2482134a81a757a08af45',
|
214
273
|
'name' => 'Bytecode outputter'
|
@@ -242,7 +301,7 @@ module Helpers
|
|
242
301
|
'id' => 'abcdef123456789123456789',
|
243
302
|
'name' => 'Test'
|
244
303
|
},
|
245
|
-
'card'=>{
|
304
|
+
'card' =>{
|
246
305
|
'id' => 'abcdef123456789123456789',
|
247
306
|
'name' => 'Do something awesome'
|
248
307
|
},
|
@@ -322,6 +381,14 @@ module Helpers
|
|
322
381
|
]
|
323
382
|
end
|
324
383
|
|
384
|
+
def label_options
|
385
|
+
{
|
386
|
+
name: 'iOS',
|
387
|
+
board_id: 'abcdef123456789123456789',
|
388
|
+
color: 'yellow'
|
389
|
+
}
|
390
|
+
end
|
391
|
+
|
325
392
|
def label_payload
|
326
393
|
JSON.generate(label_details)
|
327
394
|
end
|
@@ -334,6 +401,11 @@ module Helpers
|
|
334
401
|
'idModel' => '1234',
|
335
402
|
'callbackURL' => 'http://example.org/webhook',
|
336
403
|
'active' => true
|
404
|
+
},
|
405
|
+
{
|
406
|
+
description: 'Test webhook',
|
407
|
+
id_model: '1234',
|
408
|
+
cakkback_url: 'http://example.org/webhook'
|
337
409
|
}
|
338
410
|
]
|
339
411
|
end
|
data/spec/webhook_spec.rb
CHANGED
@@ -38,6 +38,24 @@ module Trello
|
|
38
38
|
expect(webhook).to be_valid
|
39
39
|
end
|
40
40
|
|
41
|
+
it "initializes all fields from response-like formatted hash" do
|
42
|
+
webhook_details = webhooks_details.first
|
43
|
+
webhook = Webhook.new(webhook_details)
|
44
|
+
expect(webhook.id).to eq webhook_details['id']
|
45
|
+
expect(webhook.description).to eq webhook_details['description']
|
46
|
+
expect(webhook.id_model).to eq webhook_details['idModel']
|
47
|
+
expect(webhook.callback_url).to eq webhook_details['callbackURL']
|
48
|
+
expect(webhook.active).to eq webhook_details['active']
|
49
|
+
end
|
50
|
+
|
51
|
+
it "initializes required fields from options-like formatted hash" do
|
52
|
+
webhook_details = webhooks_details[1]
|
53
|
+
webhook = Webhook.new(webhook_details)
|
54
|
+
expect(webhook.description).to eq webhook_details[:description]
|
55
|
+
expect(webhook.id_model).to eq webhook_details[:id_model]
|
56
|
+
expect(webhook.callback_url).to eq webhook_details[:callback_url]
|
57
|
+
end
|
58
|
+
|
41
59
|
it 'creates a new webhook and saves it on Trello', refactor: true do
|
42
60
|
payload = { name: 'Test Card', desc: nil }
|
43
61
|
|
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-trello
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Tregunna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: addressable
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '2.3'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: json
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: oauth
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 0.4.5
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.4.5
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rest-client
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - '>='
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 1.8.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 1.8.0
|
83
83
|
description: A wrapper around the trello.com API.
|
@@ -87,8 +87,6 @@ extensions: []
|
|
87
87
|
extra_rdoc_files:
|
88
88
|
- README.md
|
89
89
|
files:
|
90
|
-
- README.md
|
91
|
-
- lib/trello.rb
|
92
90
|
- lib/trello/action.rb
|
93
91
|
- lib/trello/association.rb
|
94
92
|
- lib/trello/association_proxy.rb
|
@@ -117,8 +115,11 @@ files:
|
|
117
115
|
- lib/trello/net.rb
|
118
116
|
- lib/trello/notification.rb
|
119
117
|
- lib/trello/organization.rb
|
118
|
+
- lib/trello/plugin_datum.rb
|
120
119
|
- lib/trello/token.rb
|
121
120
|
- lib/trello/webhook.rb
|
121
|
+
- lib/trello.rb
|
122
|
+
- README.md
|
122
123
|
- spec/action_spec.rb
|
123
124
|
- spec/array_spec.rb
|
124
125
|
- spec/association_spec.rb
|
@@ -151,22 +152,22 @@ licenses:
|
|
151
152
|
metadata: {}
|
152
153
|
post_install_message:
|
153
154
|
rdoc_options:
|
154
|
-
-
|
155
|
+
- --charset=UTF-8
|
155
156
|
require_paths:
|
156
157
|
- lib
|
157
158
|
required_ruby_version: !ruby/object:Gem::Requirement
|
158
159
|
requirements:
|
159
|
-
- -
|
160
|
+
- - '>='
|
160
161
|
- !ruby/object:Gem::Version
|
161
162
|
version: 2.1.0
|
162
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
164
|
requirements:
|
164
|
-
- -
|
165
|
+
- - '>='
|
165
166
|
- !ruby/object:Gem::Version
|
166
167
|
version: '0'
|
167
168
|
requirements: []
|
168
169
|
rubyforge_project: ruby-trello
|
169
|
-
rubygems_version: 2.
|
170
|
+
rubygems_version: 2.0.14.1
|
170
171
|
signing_key:
|
171
172
|
specification_version: 4
|
172
173
|
summary: A wrapper around the trello.com API.
|