ruby-trello 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -5
- data/lib/trello/board.rb +6 -8
- data/lib/trello/card.rb +14 -28
- data/lib/trello/checklist.rb +14 -0
- data/lib/trello/item.rb +4 -0
- data/lib/trello/label.rb +3 -3
- data/lib/trello/list.rb +13 -3
- data/lib/trello/organization.rb +14 -7
- data/spec/action_spec.rb +67 -31
- data/spec/array_spec.rb +1 -1
- data/spec/association_spec.rb +11 -7
- data/spec/basic_auth_policy_spec.rb +4 -4
- data/spec/board_spec.rb +169 -92
- data/spec/card_spec.rb +232 -119
- data/spec/checklist_spec.rb +109 -16
- data/spec/client_spec.rb +83 -45
- data/spec/configuration_spec.rb +24 -43
- data/spec/hash_spec.rb +5 -1
- data/spec/item_spec.rb +27 -9
- data/spec/label_spec.rb +52 -27
- data/spec/list_spec.rb +86 -29
- data/spec/member_spec.rb +62 -40
- data/spec/notification_spec.rb +57 -22
- data/spec/oauth_policy_spec.rb +45 -24
- data/spec/organization_spec.rb +16 -8
- data/spec/spec_helper.rb +28 -3
- data/spec/string_spec.rb +11 -8
- data/spec/token_spec.rb +31 -11
- data/spec/trello_spec.rb +20 -23
- data/spec/webhook_spec.rb +24 -9
- metadata +4 -6
- data/spec/item_state_spec.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 129649aadb5faffaa3dd64361d4eeffc6f46dd8d
|
4
|
+
data.tar.gz: 2ec4ff6b8555542d5006e24557c776cf28aca1fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b3388b34a9830bf26cb48a705b45bb0e67a8c4314108b2013a389cf71ae607aba2a7bdde48cdf8a095f126c01eacf545f15177cc39a3e3c99b59d46a2086071
|
7
|
+
data.tar.gz: 7c5dc7a800406537edbbaab5f79eab36f11f73e84137562125775b8173896887d0762ecc3fb27f101e70d5ddb360e5a6ba9c35af8913a32d62f4c80bacbdfa56
|
data/README.md
CHANGED
@@ -24,7 +24,7 @@ illustrate that future versions may include ruby 1.9.3+ specific features.
|
|
24
24
|
|
25
25
|
## Configuration
|
26
26
|
|
27
|
-
Basic authorization:
|
27
|
+
####Basic authorization:
|
28
28
|
|
29
29
|
1. Get your API keys from [trello.com/app-key](https://trello.com/app-key).
|
30
30
|
2. Visit the URL [trello.com/1/authorize], with the following GET parameters:
|
@@ -32,8 +32,9 @@ Basic authorization:
|
|
32
32
|
- `response_type`: "token"
|
33
33
|
- `expiration`: "never" if you don't want your token to ever expire. If you leave this blank,
|
34
34
|
your generated token will expire after 30 days.
|
35
|
+
- `scope`: "read,write" (optional) by default the API key will only give read access. You must set the scope to "read,write" if you would like ruby-trello to have permissions to create and delete.
|
35
36
|
- The URL will look like this:
|
36
|
-
`https://trello.com/1/authorize?key=YOURAPIKEY&response_type=token&expiration=never`
|
37
|
+
`https://trello.com/1/authorize?key=YOURAPIKEY&response_type=token&expiration=never&scope=read,write`
|
37
38
|
3. You should see a page asking you to authorize your Trello application. Click "allow" and you should see a second page with a long alphanumeric string. This is your member token.
|
38
39
|
|
39
40
|
```ruby
|
@@ -45,7 +46,7 @@ Trello.configure do |config|
|
|
45
46
|
end
|
46
47
|
```
|
47
48
|
|
48
|
-
2-legged OAuth authorization
|
49
|
+
####2-legged OAuth authorization
|
49
50
|
|
50
51
|
```ruby
|
51
52
|
Trello.configure do |config|
|
@@ -56,7 +57,7 @@ Trello.configure do |config|
|
|
56
57
|
end
|
57
58
|
```
|
58
59
|
|
59
|
-
3-legged OAuth authorization
|
60
|
+
####3-legged OAuth authorization
|
60
61
|
|
61
62
|
```ruby
|
62
63
|
Trello.configure do |config|
|
@@ -123,6 +124,6 @@ of refactoring and functionality to be deserving of a beer and this special than
|
|
123
124
|
|
124
125
|
Several ways you can contribute. Documentation, code, tests, feature requests, bug reports.
|
125
126
|
|
126
|
-
|
127
|
+
If you submit a pull request that's accepted, you'll be given commit access to this repository.
|
127
128
|
|
128
129
|
Please see the `CONTRIBUTING.md` file for more information.
|
data/lib/trello/board.rb
CHANGED
@@ -18,7 +18,7 @@ module Trello
|
|
18
18
|
# @return [Hash] A 24-character hex string
|
19
19
|
class Board < BasicData
|
20
20
|
register_attributes :id, :name, :description, :closed, :starred, :url, :organization_id, :prefs,
|
21
|
-
readonly: [ :id, :url
|
21
|
+
readonly: [ :id, :url ]
|
22
22
|
validates_presence_of :id, :name
|
23
23
|
validates_length_of :name, in: 1..16384
|
24
24
|
validates_length_of :description, maximum: 16384
|
@@ -154,13 +154,11 @@ 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
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
end
|
163
|
-
MultiAssociation.new(self, labels).proxy
|
157
|
+
many :labels
|
158
|
+
|
159
|
+
def label_names
|
160
|
+
label_names = client.get("/boards/#{id}/labelnames").json_into(LabelName)
|
161
|
+
MultiAssociation.new(self, label_names).proxy
|
164
162
|
end
|
165
163
|
|
166
164
|
# :nodoc:
|
data/lib/trello/card.rb
CHANGED
@@ -177,7 +177,8 @@ module Trello
|
|
177
177
|
MultiAssociation.new(self, states).proxy
|
178
178
|
end
|
179
179
|
|
180
|
-
|
180
|
+
many :labels
|
181
|
+
|
181
182
|
# Returns a reference to the list this card is currently in.
|
182
183
|
one :list, path: :lists, using: :list_id
|
183
184
|
|
@@ -207,7 +208,8 @@ module Trello
|
|
207
208
|
idList: list_id,
|
208
209
|
idMembers: member_ids,
|
209
210
|
labels: card_labels,
|
210
|
-
pos: pos
|
211
|
+
pos: pos,
|
212
|
+
due: due
|
211
213
|
}).json_into(self)
|
212
214
|
end
|
213
215
|
|
@@ -313,39 +315,23 @@ module Trello
|
|
313
315
|
def remove_member(member)
|
314
316
|
client.delete("/cards/#{id}/members/#{member.id}")
|
315
317
|
end
|
316
|
-
|
317
|
-
# Retrieve a list of labels
|
318
|
-
def labels
|
319
|
-
labels = client.get("/cards/#{id}/labels").json_into(Label)
|
320
|
-
MultiAssociation.new(self, labels).proxy
|
321
|
-
end
|
322
318
|
|
323
319
|
# Add a label
|
324
|
-
def add_label(
|
325
|
-
|
326
|
-
|
327
|
-
|
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})
|
320
|
+
def add_label(label)
|
321
|
+
unless label.valid?
|
322
|
+
errors.add(:label, "is not valid.")
|
323
|
+
return Trello.logger.warn "Label is not valid." unless label.valid?
|
334
324
|
end
|
325
|
+
client.post("/cards/#{id}/idLabels", {value: label.id})
|
335
326
|
end
|
336
327
|
|
337
328
|
# Remove a label
|
338
|
-
def remove_label(
|
339
|
-
|
340
|
-
|
341
|
-
|
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
|
329
|
+
def remove_label(label)
|
330
|
+
unless label.valid?
|
331
|
+
errors.add(:label, "is not valid.")
|
332
|
+
return Trello.logger.warn "Label is not valid." unless label.valid?
|
344
333
|
end
|
345
|
-
client.delete("/cards/#{id}/
|
346
|
-
elsif value.is_a? Label
|
347
|
-
client.delete("/cards/#{id}/idLabels/#{value.id}")
|
348
|
-
end
|
334
|
+
client.delete("/cards/#{id}/idLabels/#{label.id}")
|
349
335
|
end
|
350
336
|
|
351
337
|
# Add an attachment to this card
|
data/lib/trello/checklist.rb
CHANGED
@@ -112,5 +112,19 @@ module Trello
|
|
112
112
|
def delete
|
113
113
|
client.delete("/checklists/#{id}")
|
114
114
|
end
|
115
|
+
|
116
|
+
# Copy a checklist (i.e., same attributes, items, etc.)
|
117
|
+
def copy
|
118
|
+
checklist_copy = self.class.create(name: self.name, board_id: self.board_id)
|
119
|
+
copy_items_to(checklist_copy)
|
120
|
+
return checklist_copy
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
def copy_items_to(another_checklist)
|
125
|
+
items.each do |item|
|
126
|
+
another_checklist.add_item(item.name, item.complete?)
|
127
|
+
end
|
128
|
+
end
|
115
129
|
end
|
116
130
|
end
|
data/lib/trello/item.rb
CHANGED
data/lib/trello/label.rb
CHANGED
@@ -11,7 +11,7 @@ module Trello
|
|
11
11
|
readonly: [ :id, :uses, :board_id ]
|
12
12
|
validates_presence_of :id, :uses, :board_id, :name
|
13
13
|
validates_length_of :name, in: 1..16384
|
14
|
-
|
14
|
+
|
15
15
|
SYMBOL_TO_STRING = {
|
16
16
|
id: 'id',
|
17
17
|
name: 'name',
|
@@ -26,7 +26,7 @@ module Trello
|
|
26
26
|
client.find(:label, id, params)
|
27
27
|
end
|
28
28
|
|
29
|
-
# Create a new
|
29
|
+
# Create a new label and save it on Trello.
|
30
30
|
def create(options)
|
31
31
|
client.create(:label,
|
32
32
|
'name' => options[:name],
|
@@ -98,7 +98,7 @@ module Trello
|
|
98
98
|
client.put("/labels/#{id}", payload)
|
99
99
|
end
|
100
100
|
|
101
|
-
# Delete this
|
101
|
+
# Delete this label
|
102
102
|
def delete
|
103
103
|
client.delete("/labels/#{id}")
|
104
104
|
end
|
data/lib/trello/list.rb
CHANGED
@@ -30,7 +30,8 @@ module Trello
|
|
30
30
|
def create(options)
|
31
31
|
client.create(:list,
|
32
32
|
'name' => options[:name],
|
33
|
-
'idBoard' => options[:board_id]
|
33
|
+
'idBoard' => options[:board_id],
|
34
|
+
'pos' => options[:pos])
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
@@ -53,14 +54,16 @@ module Trello
|
|
53
54
|
client.post("/lists", {
|
54
55
|
name: name,
|
55
56
|
closed: closed || false,
|
56
|
-
idBoard: board_id
|
57
|
+
idBoard: board_id,
|
58
|
+
pos: pos
|
57
59
|
}).json_into(self)
|
58
60
|
end
|
59
61
|
|
60
62
|
def update!
|
61
63
|
client.put("/lists/#{id}", {
|
62
64
|
name: name,
|
63
|
-
closed: closed
|
65
|
+
closed: closed,
|
66
|
+
pos: pos
|
64
67
|
})
|
65
68
|
end
|
66
69
|
|
@@ -88,6 +91,13 @@ module Trello
|
|
88
91
|
# :filter => [ :none, :open, :closed, :all ] # default :open
|
89
92
|
many :cards, filter: :open
|
90
93
|
|
94
|
+
def move_all_cards(other_list)
|
95
|
+
client.post("/lists/#{id}/moveAllCards", {
|
96
|
+
idBoard: other_list.board_id,
|
97
|
+
idList: other_list.id
|
98
|
+
})
|
99
|
+
end
|
100
|
+
|
91
101
|
# :nodoc:
|
92
102
|
def request_prefix
|
93
103
|
"/lists/#{id}"
|
data/lib/trello/organization.rb
CHANGED
@@ -12,8 +12,10 @@ module Trello
|
|
12
12
|
# @!attribute [r] url
|
13
13
|
# @return [String]
|
14
14
|
class Organization < BasicData
|
15
|
-
register_attributes :id, :name, :display_name, :description, :url,
|
16
|
-
|
15
|
+
register_attributes :id, :name, :display_name, :description, :url, :invited,
|
16
|
+
:website, :logo_hash, :billable_member_count, :active_billable_member_count,
|
17
|
+
readonly: [ :id, :name, :display_name, :description, :url, :invited,
|
18
|
+
:website, :logo_hash, :billable_member_count, :active_billable_member_count ]
|
17
19
|
validates_presence_of :id, :name
|
18
20
|
|
19
21
|
include HasActions
|
@@ -30,11 +32,16 @@ module Trello
|
|
30
32
|
# Supply a hash of string keyed data retrieved from the Trello API representing
|
31
33
|
# an Organization.
|
32
34
|
def update_fields(fields)
|
33
|
-
attributes[:id]
|
34
|
-
attributes[:name]
|
35
|
-
attributes[:display_name]
|
36
|
-
attributes[:description]
|
37
|
-
attributes[:url]
|
35
|
+
attributes[:id] = fields['id']
|
36
|
+
attributes[:name] = fields['name']
|
37
|
+
attributes[:display_name] = fields['displayName']
|
38
|
+
attributes[:description] = fields['desc']
|
39
|
+
attributes[:url] = fields['url']
|
40
|
+
attributes[:invited] = fields['invited']
|
41
|
+
attributes[:website] = fields['website']
|
42
|
+
attributes[:logo_hash] = fields['logoHash']
|
43
|
+
attributes[:billable_member_count] = fields['billableMemberCount']
|
44
|
+
attributes[:active_billable_member_count] = fields['activeBillableMemberCount']
|
38
45
|
self
|
39
46
|
end
|
40
47
|
|
data/spec/action_spec.rb
CHANGED
@@ -4,33 +4,44 @@ module Trello
|
|
4
4
|
describe Action do
|
5
5
|
include Helpers
|
6
6
|
|
7
|
-
let(:
|
8
|
-
let(:
|
9
|
-
|
10
|
-
before
|
11
|
-
client
|
12
|
-
|
7
|
+
let(:client) { Client.new }
|
8
|
+
let(:action) { client.find(:action, '4ee2482134a81a757a08af47') }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(client)
|
12
|
+
.to receive(:get)
|
13
|
+
.with('/actions/4ee2482134a81a757a08af47', {})
|
14
|
+
.and_return JSON.generate(actions_details.first)
|
13
15
|
end
|
14
16
|
|
15
17
|
context 'finding' do
|
16
18
|
let(:client) { Trello.client }
|
17
19
|
|
18
20
|
it 'delegates to Trello.client#find' do
|
19
|
-
client
|
21
|
+
expect(client)
|
22
|
+
.to receive(:find)
|
23
|
+
.with(:action, '4ee2482134a81a757a08af47', {})
|
24
|
+
|
20
25
|
Action.find('4ee2482134a81a757a08af47')
|
21
26
|
end
|
22
27
|
|
23
|
-
it
|
24
|
-
Action.find('4ee2482134a81a757a08af47').
|
28
|
+
it do
|
29
|
+
expect(Action.find('4ee2482134a81a757a08af47')).to eq(action)
|
25
30
|
end
|
26
31
|
end
|
27
32
|
|
28
33
|
context 'search' do
|
29
34
|
let(:client) { Trello.client }
|
35
|
+
let(:payload) { JSON.generate({ "cards" => cards_details }) }
|
36
|
+
|
37
|
+
it "searches and get back a card object" do
|
38
|
+
expect(client)
|
39
|
+
.to receive(:get)
|
40
|
+
.with("/search/", { query: "something"})
|
41
|
+
.and_return payload
|
30
42
|
|
31
|
-
|
32
|
-
|
33
|
-
Action.search("something").should eq({ "cards" => cards_details.jsoned_into(Card) })
|
43
|
+
expect(Action.search("something"))
|
44
|
+
.to eq({ "cards" => cards_details.jsoned_into(Card) })
|
34
45
|
end
|
35
46
|
end
|
36
47
|
|
@@ -38,54 +49,79 @@ module Trello
|
|
38
49
|
let(:detail) { actions_details.first }
|
39
50
|
|
40
51
|
it 'gets its id' do
|
41
|
-
action.id.
|
52
|
+
expect(action.id).to eq detail['id']
|
42
53
|
end
|
43
54
|
|
44
55
|
it 'gets its type' do
|
45
|
-
action.type.
|
56
|
+
expect(action.type).to eq detail['type']
|
46
57
|
end
|
47
58
|
|
48
59
|
it 'has the same data' do
|
49
|
-
action.data.
|
60
|
+
expect(action.data).to eq detail['data']
|
50
61
|
end
|
51
62
|
|
52
63
|
it 'gets the date' do
|
53
|
-
action.date.utc.iso8601.
|
64
|
+
expect(action.date.utc.iso8601).to eq detail['date']
|
54
65
|
end
|
55
66
|
end
|
56
67
|
|
57
68
|
context 'boards' do
|
58
|
-
|
59
|
-
|
60
|
-
|
69
|
+
let(:payload) { JSON.generate(boards_details.first) }
|
70
|
+
|
71
|
+
before do
|
72
|
+
allow(client)
|
73
|
+
.to receive(:get)
|
74
|
+
.with('/actions/4ee2482134a81a757a08af47/board')
|
75
|
+
.and_return payload
|
76
|
+
end
|
61
77
|
|
62
|
-
|
78
|
+
it 'has a board' do
|
79
|
+
expect(action.board).to_not be_nil
|
63
80
|
end
|
64
81
|
end
|
65
82
|
|
83
|
+
|
66
84
|
context 'card' do
|
67
|
-
|
68
|
-
|
69
|
-
|
85
|
+
let(:payload) { JSON.generate(cards_details.first) }
|
86
|
+
|
87
|
+
before do
|
88
|
+
allow(client)
|
89
|
+
.to receive(:get)
|
90
|
+
.with('/actions/4ee2482134a81a757a08af47/card')
|
91
|
+
.and_return payload
|
92
|
+
end
|
70
93
|
|
71
|
-
|
94
|
+
it 'has a card' do
|
95
|
+
expect(action.card).to_not be_nil
|
72
96
|
end
|
73
97
|
end
|
74
98
|
|
75
99
|
context 'list' do
|
76
|
-
|
77
|
-
|
78
|
-
|
100
|
+
let(:payload) { JSON.generate(lists_details.first) }
|
101
|
+
|
102
|
+
before do
|
103
|
+
allow(client)
|
104
|
+
.to receive(:get)
|
105
|
+
.with('/actions/4ee2482134a81a757a08af47/list')
|
106
|
+
.and_return payload
|
107
|
+
end
|
79
108
|
|
80
|
-
|
109
|
+
it 'has a list of lists' do
|
110
|
+
expect(action.list).to_not be_nil
|
81
111
|
end
|
82
112
|
end
|
83
113
|
|
84
114
|
context 'member creator' do
|
85
|
-
it 'knows its member creator' do
|
86
|
-
client.stub(:get).with('/members/abcdef123456789123456789', {}).and_return user_payload
|
87
115
|
|
88
|
-
|
116
|
+
before do
|
117
|
+
allow(client)
|
118
|
+
.to receive(:get)
|
119
|
+
.with('/members/abcdef123456789123456789', {})
|
120
|
+
.and_return user_payload
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'knows its member creator' do
|
124
|
+
expect(action.member_creator).to_not be_nil
|
89
125
|
end
|
90
126
|
end
|
91
127
|
end
|