ruby-trello 1.2.1 → 1.3.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 +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
|