ruby-trello 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trello/board.rb +6 -2
- data/lib/trello/card.rb +20 -15
- data/lib/trello/label.rb +84 -2
- data/spec/board_spec.rb +20 -0
- data/spec/card_spec.rb +19 -1
- data/spec/label_spec.rb +142 -0
- data/spec/spec_helper.rb +19 -17
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45ec7bdcb469bf63f80f7291c787a4f4a8ec653f
|
4
|
+
data.tar.gz: cc4a463550cfe8036d1c4e4cef421389dd6535f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdd6a111315be371b94c6c84cd57742faea4519556136b2db601baed79ef46c670afde112408a1668563c4fdd513fc319221b72721b50f0103e240e69c6d5cfd
|
7
|
+
data.tar.gz: 002b5cca51dd9640a148968a685c25da8b7b627c9446c33e6cb87c4eadc800a5566a14aed9a4205931dc90881cc63093548865894dfb9860b3dca3b59ca02c29
|
data/lib/trello/board.rb
CHANGED
@@ -154,8 +154,12 @@ module Trello
|
|
154
154
|
# Returns a reference to the organization this board belongs to.
|
155
155
|
one :organization, path: :organizations, using: :organization_id
|
156
156
|
|
157
|
-
def labels
|
158
|
-
|
157
|
+
def labels names=true
|
158
|
+
if names
|
159
|
+
labels = client.get("/boards/#{id}/labelnames").json_into(LabelName)
|
160
|
+
else
|
161
|
+
labels = client.get("/boards/#{id}/labels").json_into(Label)
|
162
|
+
end
|
159
163
|
MultiAssociation.new(self, labels).proxy
|
160
164
|
end
|
161
165
|
|
data/lib/trello/card.rb
CHANGED
@@ -319,28 +319,33 @@ module Trello
|
|
319
319
|
labels = client.get("/cards/#{id}/labels").json_into(Label)
|
320
320
|
MultiAssociation.new(self, labels).proxy
|
321
321
|
end
|
322
|
-
|
323
|
-
# Label colours
|
324
|
-
def label_colours
|
325
|
-
%w{green yellow orange red purple blue sky lime pink black}
|
326
|
-
end
|
327
322
|
|
328
323
|
# Add a label
|
329
|
-
def add_label(
|
330
|
-
|
331
|
-
|
332
|
-
|
324
|
+
def add_label(value)
|
325
|
+
if value.is_a? String
|
326
|
+
colour = value
|
327
|
+
unless Label.label_colours.include? colour
|
328
|
+
errors.add(:label, "colour '#{colour}' does not exist")
|
329
|
+
return Trello.logger.warn "The label colour '#{colour}' does not exist."
|
330
|
+
end
|
331
|
+
client.post("/cards/#{id}/labels", { value: colour })
|
332
|
+
elsif value.is_a? Label
|
333
|
+
client.post("/cards/#{id}/idLabels", {value: value.id})
|
333
334
|
end
|
334
|
-
client.post("/cards/#{id}/labels", { value: colour })
|
335
335
|
end
|
336
336
|
|
337
337
|
# Remove a label
|
338
|
-
def remove_label(
|
339
|
-
|
340
|
-
|
341
|
-
|
338
|
+
def remove_label(value)
|
339
|
+
if value.is_a? String
|
340
|
+
colour = value
|
341
|
+
unless Label.label_colours.include? colour
|
342
|
+
errors.add(:label, "colour '#{colour}' does not exist")
|
343
|
+
return Trello.logger.warn "The label colour '#{colour}' does not exist." unless Label.label_colours.include? colour
|
344
|
+
end
|
345
|
+
client.delete("/cards/#{id}/labels/#{colour}")
|
346
|
+
elsif value.is_a? Label
|
347
|
+
client.delete("/cards/#{id}/idLabels/#{value.id}")
|
342
348
|
end
|
343
|
-
client.delete("/cards/#{id}/labels/#{colour}")
|
344
349
|
end
|
345
350
|
|
346
351
|
# Add an attachment to this card
|
data/lib/trello/label.rb
CHANGED
@@ -7,18 +7,100 @@ module Trello
|
|
7
7
|
# @!attribute [rw] color
|
8
8
|
# @return [String]
|
9
9
|
class Label < BasicData
|
10
|
-
register_attributes :name, :
|
10
|
+
register_attributes :id, :name, :board_id, :uses,
|
11
|
+
readonly: [ :id, :uses, :board_id ]
|
12
|
+
validates_presence_of :id, :uses, :board_id, :name
|
13
|
+
validates_length_of :name, in: 1..16384
|
14
|
+
|
15
|
+
SYMBOL_TO_STRING = {
|
16
|
+
id: 'id',
|
17
|
+
name: 'name',
|
18
|
+
board_id: 'idBoard',
|
19
|
+
color: 'color',
|
20
|
+
uses: 'uses'
|
21
|
+
}
|
22
|
+
|
23
|
+
class << self
|
24
|
+
# Find a specific card by its id.
|
25
|
+
def find(id, params = {})
|
26
|
+
client.find(:label, id, params)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Create a new card and save it on Trello.
|
30
|
+
def create(options)
|
31
|
+
client.create(:label,
|
32
|
+
'name' => options[:name],
|
33
|
+
'idBoard' => options[:board_id],
|
34
|
+
'color' => options[:color],
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Label colours
|
39
|
+
def label_colours
|
40
|
+
%w{green yellow orange red purple blue sky lime pink black}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
define_attribute_methods [:color]
|
45
|
+
|
46
|
+
def color
|
47
|
+
@attributes[:color]
|
48
|
+
end
|
49
|
+
|
50
|
+
def color= colour
|
51
|
+
unless Label.label_colours.include? colour
|
52
|
+
errors.add(:label, "color '#{colour}' does not exist")
|
53
|
+
return Trello.logger.warn "The label colour '#{colour}' does not exist."
|
54
|
+
end
|
55
|
+
|
56
|
+
self.send(:"color_will_change!") unless colour == @attributes[:color]
|
57
|
+
@attributes[:color] = colour
|
58
|
+
end
|
11
59
|
|
12
60
|
# Update the fields of a label.
|
13
61
|
#
|
14
62
|
# Supply a hash of stringkeyed data retrieved from the Trello API representing
|
15
63
|
# a label.
|
16
64
|
def update_fields(fields)
|
65
|
+
attributes[:id] = fields['id']
|
17
66
|
attributes[:name] = fields['name']
|
18
67
|
attributes[:color] = fields['color']
|
68
|
+
attributes[:board_id] = fields['idBoard']
|
69
|
+
attributes[:uses] = fields['uses']
|
19
70
|
self
|
20
71
|
end
|
21
72
|
|
22
|
-
|
73
|
+
# Returns a reference to the board this label is currently connected.
|
74
|
+
one :board, path: :boards, using: :board_id
|
75
|
+
|
76
|
+
# Saves a record.
|
77
|
+
def save
|
78
|
+
# If we have an id, just update our fields.
|
79
|
+
return update! if id
|
80
|
+
|
81
|
+
client.post("/labels", {
|
82
|
+
name: name,
|
83
|
+
color: color,
|
84
|
+
idBoard: board_id,
|
85
|
+
}).json_into(self)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Update an existing record.
|
89
|
+
# Warning, this updates all fields using values already in memory. If
|
90
|
+
# an external resource has updated these fields, you should refresh!
|
91
|
+
# this object before making your changes, and before updating the record.
|
92
|
+
def update!
|
93
|
+
@previously_changed = changes
|
94
|
+
# extract only new values to build payload
|
95
|
+
payload = Hash[changes.map { |key, values| [SYMBOL_TO_STRING[key.to_sym].to_sym, values[1]] }]
|
96
|
+
@changed_attributes.clear
|
23
97
|
|
98
|
+
client.put("/labels/#{id}", payload)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Delete this card
|
102
|
+
def delete
|
103
|
+
client.delete("/labels/#{id}")
|
104
|
+
end
|
105
|
+
end
|
24
106
|
end
|
data/spec/board_spec.rb
CHANGED
@@ -83,6 +83,26 @@ module Trello
|
|
83
83
|
end
|
84
84
|
|
85
85
|
context "labels" do
|
86
|
+
it "gets the specific labels for the board" do
|
87
|
+
client.stub(:get).with("/boards/abcdef123456789123456789/labels").
|
88
|
+
and_return label_payload
|
89
|
+
labels = board.labels false
|
90
|
+
labels.count.should eq(4)
|
91
|
+
|
92
|
+
|
93
|
+
expect(labels[2].color).to eq('red')
|
94
|
+
expect(labels[2].id).to eq('abcdef123456789123456789')
|
95
|
+
expect(labels[2].board_id).to eq('abcdef123456789123456789')
|
96
|
+
expect(labels[2].name).to eq('deploy')
|
97
|
+
expect(labels[2].uses).to eq(2)
|
98
|
+
|
99
|
+
expect(labels[3].color).to eq('blue')
|
100
|
+
expect(labels[3].id).to eq('abcdef123456789123456789')
|
101
|
+
expect(labels[3].board_id).to eq('abcdef123456789123456789')
|
102
|
+
expect(labels[3].name).to eq('on hold')
|
103
|
+
expect(labels[3].uses).to eq(6)
|
104
|
+
end
|
105
|
+
|
86
106
|
it "gets the specific labels for the board" do
|
87
107
|
client.stub(:get).with("/boards/abcdef123456789123456789/labelnames").
|
88
108
|
and_return label_name_payload
|
data/spec/card_spec.rb
CHANGED
@@ -255,13 +255,19 @@ module Trello
|
|
255
255
|
client.stub(:get).with("/cards/abcdef123456789123456789/labels").
|
256
256
|
and_return label_payload
|
257
257
|
labels = card.labels
|
258
|
-
expect(labels.size).to eq(
|
258
|
+
expect(labels.size).to eq(4)
|
259
259
|
|
260
260
|
expect(labels[0].color).to eq('yellow')
|
261
|
+
expect(labels[0].id).to eq('abcdef123456789123456789')
|
262
|
+
expect(labels[0].board_id).to eq('abcdef123456789123456789')
|
261
263
|
expect(labels[0].name).to eq('iOS')
|
264
|
+
expect(labels[0].uses).to eq(3)
|
262
265
|
|
263
266
|
expect(labels[1].color).to eq('purple')
|
267
|
+
expect(labels[1].id).to eq('abcdef123456789123456789')
|
268
|
+
expect(labels[1].board_id).to eq('abcdef123456789123456789')
|
264
269
|
expect(labels[1].name).to eq('Issue or bug')
|
270
|
+
expect(labels[1].uses).to eq(1)
|
265
271
|
end
|
266
272
|
|
267
273
|
it "can add a label" do
|
@@ -278,6 +284,12 @@ module Trello
|
|
278
284
|
expect(card.errors).to be_empty
|
279
285
|
end
|
280
286
|
|
287
|
+
it "can remove a label instance" do
|
288
|
+
client.should_receive(:delete).once.with("/cards/abcdef123456789123456789/idLabels/abcdef123456789123456789")
|
289
|
+
label = Label.new(label_details.first)
|
290
|
+
card.remove_label(label)
|
291
|
+
end
|
292
|
+
|
281
293
|
it "can add a label of any valid color" do
|
282
294
|
%w(green yellow orange red purple blue sky lime pink black).each do |color|
|
283
295
|
client.stub(:post).with("/cards/abcdef123456789123456789/labels", { :value => color }).
|
@@ -287,6 +299,12 @@ module Trello
|
|
287
299
|
end
|
288
300
|
end
|
289
301
|
|
302
|
+
it "can add a label instance" do
|
303
|
+
client.should_receive(:post).once.with("/cards/abcdef123456789123456789/idLabels", {:value => "abcdef123456789123456789"})
|
304
|
+
label = Label.new(label_details.first)
|
305
|
+
card.add_label label
|
306
|
+
end
|
307
|
+
|
290
308
|
it "throws an error when trying to add a label with an unknown colour" do
|
291
309
|
client.stub(:post).with("/cards/abcdef123456789123456789/labels", { value: 'green' }).
|
292
310
|
and_return "not important"
|
data/spec/label_spec.rb
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Trello
|
4
|
+
describe Label do
|
5
|
+
include Helpers
|
6
|
+
|
7
|
+
let(:label) { client.find(:label, 'abcdef123456789123456789') }
|
8
|
+
let(:client) { Client.new }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
client.stub(:get).with("/labels/abcdef123456789123456789", {}).
|
12
|
+
and_return JSON.generate(label_details.first)
|
13
|
+
end
|
14
|
+
|
15
|
+
context "finding" do
|
16
|
+
let(:client) { Trello.client }
|
17
|
+
|
18
|
+
it "delegates to Trello.client#find" do
|
19
|
+
client.should_receive(:find).with(:label, 'abcdef123456789123456789', {})
|
20
|
+
Label.find('abcdef123456789123456789')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "is equivalent to client#find" do
|
24
|
+
Label.find('abcdef123456789123456789').should eq(label)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "creating" do
|
29
|
+
let(:client) { Trello.client }
|
30
|
+
|
31
|
+
it "creates a new record" do
|
32
|
+
label = Label.new(label_details.first)
|
33
|
+
label.should be_valid
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'must not be valid if not given a name' do
|
37
|
+
label = Label.new('idBoard' => lists_details.first['board_id'])
|
38
|
+
label.should_not be_valid
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'must not be valid if not given a board id' do
|
42
|
+
label = Label.new('name' => lists_details.first['name'])
|
43
|
+
label.should_not be_valid
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'creates a new record and saves it on Trello', refactor: true do
|
47
|
+
payload = {
|
48
|
+
name: 'Test Label',
|
49
|
+
board_id: 'abcdef123456789123456789',
|
50
|
+
}
|
51
|
+
|
52
|
+
result = JSON.generate(cards_details.first.merge(payload.merge(idBoard: boards_details.first['id'])))
|
53
|
+
|
54
|
+
expected_payload = {name: "Test Label", color: nil, idBoard: "abcdef123456789123456789" }
|
55
|
+
|
56
|
+
client.should_receive(:post).with("/labels", expected_payload).and_return result
|
57
|
+
|
58
|
+
label = Label.create(label_details.first.merge(payload.merge(board_id: boards_details.first['id'])))
|
59
|
+
|
60
|
+
label.class.should be Label
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "updating" do
|
65
|
+
it "updating name does a put on the correct resource with the correct value" do
|
66
|
+
expected_new_name = "xxx"
|
67
|
+
|
68
|
+
payload = {
|
69
|
+
name: expected_new_name,
|
70
|
+
}
|
71
|
+
|
72
|
+
client.should_receive(:put).once.with("/labels/abcdef123456789123456789", payload)
|
73
|
+
|
74
|
+
label.name = expected_new_name
|
75
|
+
label.save
|
76
|
+
end
|
77
|
+
|
78
|
+
it "updating color does a put on the correct resource with the correct value" do
|
79
|
+
expected_new_color = "purple"
|
80
|
+
|
81
|
+
payload = {
|
82
|
+
color: expected_new_color,
|
83
|
+
}
|
84
|
+
|
85
|
+
client.should_receive(:put).once.with("/labels/abcdef123456789123456789", payload)
|
86
|
+
|
87
|
+
label.color = expected_new_color
|
88
|
+
label.save
|
89
|
+
end
|
90
|
+
|
91
|
+
it "can update with any valid color" do
|
92
|
+
%w(green yellow orange red purple blue sky lime pink black).each do |color|
|
93
|
+
client.stub(:put).with("/labels/abcdef123456789123456789", {color: color}).
|
94
|
+
and_return "not important"
|
95
|
+
label.color = color
|
96
|
+
label.save
|
97
|
+
expect(label.errors).to be_empty
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it "throws an error when trying to update a label with an unknown colour" do
|
102
|
+
client.stub(:put).with("/labels/abcdef123456789123456789", {}).
|
103
|
+
and_return "not important"
|
104
|
+
label.color = 'mauve'
|
105
|
+
label.save
|
106
|
+
expect(label.errors.full_messages.to_sentence).to eq("Label color 'mauve' does not exist")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "deleting" do
|
111
|
+
it "deletes the label" do
|
112
|
+
client.should_receive(:delete).with("/labels/#{label.id}")
|
113
|
+
label.delete
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context "fields" do
|
118
|
+
it "gets its id" do
|
119
|
+
label.id.should_not be_nil
|
120
|
+
end
|
121
|
+
|
122
|
+
it "gets its name" do
|
123
|
+
label.name.should_not be_nil
|
124
|
+
end
|
125
|
+
|
126
|
+
it "gets its usage" do
|
127
|
+
label.uses.should_not be_nil
|
128
|
+
end
|
129
|
+
|
130
|
+
it "gets its color" do
|
131
|
+
label.color.should_not be_nil
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context "boards" do
|
136
|
+
it "has a board" do
|
137
|
+
client.stub(:get).with("/boards/abcdef123456789123456789", {}).and_return JSON.generate(boards_details.first)
|
138
|
+
label.board.should_not be_nil
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -275,8 +275,10 @@ module Helpers
|
|
275
275
|
|
276
276
|
def label_details
|
277
277
|
[
|
278
|
-
{'color' => 'yellow', 'name' => 'iOS'},
|
279
|
-
{'color' => 'purple', 'name' => 'Issue or bug'}
|
278
|
+
{'color' => 'yellow', 'name' => 'iOS', 'id' => 'abcdef123456789123456789', 'uses' => 3, 'idBoard' => 'abcdef123456789123456789'},
|
279
|
+
{'color' => 'purple', 'name' => 'Issue or bug', 'id' => 'abcdef123456789123456789', 'uses' => 1, 'idBoard' => 'abcdef123456789123456789'},
|
280
|
+
{'color' => 'red', 'name' => 'deploy', 'id' => 'abcdef123456789123456789', 'uses' => 2, 'idBoard' => 'abcdef123456789123456789'},
|
281
|
+
{'color' => 'blue', 'name' => 'on hold', 'id' => 'abcdef123456789123456789', 'uses' => 6, 'idBoard' => 'abcdef123456789123456789'}
|
280
282
|
]
|
281
283
|
end
|
282
284
|
|
@@ -284,21 +286,6 @@ module Helpers
|
|
284
286
|
JSON.generate(label_details)
|
285
287
|
end
|
286
288
|
|
287
|
-
def label_name_details
|
288
|
-
[
|
289
|
-
{'yellow' => 'bug'},
|
290
|
-
{'red' => 'urgent'},
|
291
|
-
{'green' => 'deploy'},
|
292
|
-
{'blue' => 'on hold'},
|
293
|
-
{'orange' => 'new feature'},
|
294
|
-
{'purple' => 'experimental'}
|
295
|
-
]
|
296
|
-
end
|
297
|
-
|
298
|
-
def label_name_payload
|
299
|
-
JSON.generate(label_name_details)
|
300
|
-
end
|
301
|
-
|
302
289
|
def webhooks_details
|
303
290
|
[
|
304
291
|
{
|
@@ -311,6 +298,21 @@ module Helpers
|
|
311
298
|
]
|
312
299
|
end
|
313
300
|
|
301
|
+
def label_name_details
|
302
|
+
[
|
303
|
+
{'yellow' => 'bug'},
|
304
|
+
{'red' => 'urgent'},
|
305
|
+
{'green' => 'deploy'},
|
306
|
+
{'blue' => 'on hold'},
|
307
|
+
{'orange' => 'new feature'},
|
308
|
+
{'purple' => 'experimental'}
|
309
|
+
]
|
310
|
+
end
|
311
|
+
|
312
|
+
def label_name_payload
|
313
|
+
JSON.generate(label_name_details)
|
314
|
+
end
|
315
|
+
|
314
316
|
def webhooks_payload
|
315
317
|
JSON.generate(webhooks_details)
|
316
318
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-trello
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Tregunna
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- spec/integration/integration_test.rb
|
133
133
|
- spec/item_spec.rb
|
134
134
|
- spec/item_state_spec.rb
|
135
|
+
- spec/label_spec.rb
|
135
136
|
- spec/list_spec.rb
|
136
137
|
- spec/member_spec.rb
|
137
138
|
- spec/notification_spec.rb
|
@@ -183,6 +184,7 @@ test_files:
|
|
183
184
|
- spec/integration/integration_test.rb
|
184
185
|
- spec/item_spec.rb
|
185
186
|
- spec/item_state_spec.rb
|
187
|
+
- spec/label_spec.rb
|
186
188
|
- spec/list_spec.rb
|
187
189
|
- spec/member_spec.rb
|
188
190
|
- spec/notification_spec.rb
|