ruby-trello 1.2.0 → 1.2.1
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/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
|