ruby-trello 0.4.0 → 0.4.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.
- data/README.md +3 -2
- data/lib/trello/action.rb +4 -5
- data/lib/trello/association.rb +11 -0
- data/lib/trello/association_proxy.rb +42 -0
- data/lib/trello/authorization.rb +47 -13
- data/lib/trello/basic_data.rb +34 -4
- data/lib/trello/board.rb +17 -23
- data/lib/trello/card.rb +21 -15
- data/lib/trello/checklist.rb +10 -11
- data/lib/trello/client.rb +2 -0
- data/lib/trello/has_actions.rb +2 -1
- data/lib/trello/item.rb +1 -1
- data/lib/trello/item_state.rb +1 -1
- data/lib/trello/list.rb +9 -12
- data/lib/trello/member.rb +25 -18
- data/lib/trello/multi_association.rb +10 -0
- data/lib/trello/net.rb +4 -2
- data/lib/trello/notification.rb +3 -4
- data/lib/trello/organization.rb +6 -3
- data/lib/trello/string.rb +3 -2
- data/lib/trello/token.rb +24 -0
- data/lib/trello.rb +19 -15
- data/spec/action_spec.rb +1 -1
- data/spec/board_spec.rb +1 -1
- data/spec/card_spec.rb +45 -4
- data/spec/member_spec.rb +11 -7
- data/spec/notification_spec.rb +4 -3
- data/spec/oauth_policy_spec.rb +60 -49
- data/spec/spec_helper.rb +33 -1
- data/spec/token_spec.rb +33 -0
- metadata +40 -23
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Ruby Trello API
|
2
2
|
|
3
|
-
[](http://travis-ci.org/jeremytregunna/ruby-trello)
|
3
|
+
[](http://travis-ci.org/jeremytregunna/ruby-trello) [](https://gemnasium.com/jeremytregunna/ruby-trello.png)
|
4
4
|
|
5
5
|
This library implements the [Trello](http://www.trello.com/) [API](http://trello.com/api).
|
6
6
|
|
@@ -13,7 +13,8 @@ Seriously, [check it out](http://www.trello.com/).
|
|
13
13
|
# gem install ruby-trello
|
14
14
|
```
|
15
15
|
|
16
|
-
Full Disclosure: This library is
|
16
|
+
Full Disclosure: This library is mostly complete, if you do find anything missing or not functioning as you expect it
|
17
|
+
to, please [let us know](https://trello.com/card/spot-a-bug-report-it/4f092b2ee23cb6fe6d1aaabd/17).
|
17
18
|
|
18
19
|
## Special thanks
|
19
20
|
|
data/lib/trello/action.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Trello
|
2
2
|
# Action represents some event that occurred. For instance, when a card is created.
|
3
3
|
class Action < BasicData
|
4
|
-
register_attributes :id, :type, :data, :date, :member_creator_id
|
4
|
+
register_attributes :id, :type, :data, :date, :member_creator_id,
|
5
|
+
:readonly => [ :id, :type, :data, :date, :member_creator_id ]
|
5
6
|
validates_presence_of :id, :type, :date, :member_creator_id
|
6
7
|
|
7
8
|
class << self
|
@@ -19,7 +20,7 @@ module Trello
|
|
19
20
|
attributes[:id] = fields['id']
|
20
21
|
attributes[:type] = fields['type']
|
21
22
|
attributes[:data] = fields['data']
|
22
|
-
attributes[:date] = fields['date']
|
23
|
+
attributes[:date] = Time.iso8601(fields['date'])
|
23
24
|
attributes[:member_creator_id] = fields['idMemberCreator']
|
24
25
|
self
|
25
26
|
end
|
@@ -40,8 +41,6 @@ module Trello
|
|
40
41
|
end
|
41
42
|
|
42
43
|
# Returns the member who created the action.
|
43
|
-
|
44
|
-
Member.find(member_creator_id)
|
45
|
-
end
|
44
|
+
one :member_creator, :via => Member, :using => :member_creator_id
|
46
45
|
end
|
47
46
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
|
3
|
+
module Trello
|
4
|
+
class AssociationProxy
|
5
|
+
alias :proxy_extend :extend
|
6
|
+
|
7
|
+
instance_methods.each { |m| undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to|proxy_/ }
|
8
|
+
|
9
|
+
delegate :owner, :target, :to => :@association
|
10
|
+
delegate :count, :to => :@association
|
11
|
+
|
12
|
+
def initialize(association)
|
13
|
+
@association = association
|
14
|
+
Array(association.options[:extend]).each { |ext| proxy_extend(ext) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def proxy_assocation
|
18
|
+
@association
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing(method, *args, &block)
|
22
|
+
if target.respond_to? method
|
23
|
+
target.send(method, *args, &block)
|
24
|
+
else
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def ===(other)
|
30
|
+
other === target
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_ary
|
34
|
+
proxy_assocation.dup
|
35
|
+
end
|
36
|
+
alias_method :to_a, :to_ary
|
37
|
+
|
38
|
+
def <<(*records)
|
39
|
+
proxy_assocation.concat(records) && self
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/trello/authorization.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'securerandom'
|
2
|
+
require "oauth"
|
2
3
|
|
3
4
|
module Trello
|
4
5
|
module Authorization
|
@@ -32,9 +33,28 @@ module Trello
|
|
32
33
|
|
33
34
|
OAuthCredential = Struct.new "OAuthCredential", :key, :secret
|
34
35
|
|
36
|
+
# Handles the OAuth connectivity to Trello.
|
37
|
+
#
|
38
|
+
# For 2-legged OAuth, do the following:
|
39
|
+
#
|
40
|
+
# OAuthPolicy.consumer_credential = OAuthCredential.new "public_key", "secret"
|
41
|
+
# OAuthPolicy.token = OAuthCredential.new "token_key", nil
|
42
|
+
#
|
43
|
+
# For 3-legged OAuth, do the following:
|
44
|
+
#
|
45
|
+
# OAuthPolicy.consumer_credential = OAuthCredential.new "public_key", "secret"
|
46
|
+
# OAuthPolicy.return_url = "http://your.site.com/path/to/receive/post"
|
47
|
+
# OAuthPolicy.callback = Proc.new do |request_token|
|
48
|
+
# DB.save(request_token.key, request_token.secret)
|
49
|
+
# redirect_to request_token.authorize_url
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# Then, recreate the request token given the request token key and secret you saved earlier,
|
53
|
+
# and the consumer, and pass that RequestToken instance the #get_access_token method, and
|
54
|
+
# store that in OAuthPolicy.token as a OAuthCredential.
|
35
55
|
class OAuthPolicy
|
36
56
|
class << self
|
37
|
-
attr_accessor :consumer_credential, :token
|
57
|
+
attr_accessor :consumer_credential, :token, :return_url, :callback
|
38
58
|
|
39
59
|
def authorize(request)
|
40
60
|
unless consumer_credential
|
@@ -42,26 +62,40 @@ module Trello
|
|
42
62
|
fail "The consumer_credential has not been supplied."
|
43
63
|
end
|
44
64
|
|
45
|
-
|
46
|
-
|
65
|
+
if token
|
66
|
+
request.headers = {"Authorization" => get_auth_header(request.uri, :get)}
|
67
|
+
request
|
68
|
+
else
|
69
|
+
consumer(:return_url => return_url, :callback_method => :postMessage)
|
70
|
+
request_token = consumer.get_request_token
|
71
|
+
callback.call request_token
|
72
|
+
return nil
|
73
|
+
end
|
47
74
|
end
|
48
75
|
|
49
76
|
private
|
50
77
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
78
|
+
def consumer_params(params = {})
|
79
|
+
{
|
80
|
+
:scheme => :header,
|
81
|
+
:scope => 'read,write,account',
|
82
|
+
:http_method => :get,
|
83
|
+
:request_token_path => "https://trello.com/1/OAuthGetRequestToken",
|
84
|
+
:authorize_path => "https://trello.com/1/OAuthAuthorizeToken",
|
85
|
+
:access_token_path => "https://trello.com/1/OAuthGetAccessToken"
|
86
|
+
}.merge!(params)
|
87
|
+
end
|
55
88
|
|
56
|
-
|
89
|
+
def consumer(options = {})
|
90
|
+
@consumer ||= OAuth::Consumer.new(
|
57
91
|
consumer_credential.key,
|
58
92
|
consumer_credential.secret,
|
59
|
-
|
60
|
-
:scheme => :header,
|
61
|
-
:scope => 'read,write,account',
|
62
|
-
:http_method => verb
|
63
|
-
}
|
93
|
+
consumer_params(options)
|
64
94
|
)
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_auth_header(url, verb, options = {})
|
98
|
+
self.token ||= OAuththCredential.new
|
65
99
|
|
66
100
|
request = Net::HTTP::Get.new Addressable::URI.parse(url).to_s
|
67
101
|
|
data/lib/trello/basic_data.rb
CHANGED
@@ -13,6 +13,9 @@ module Trello
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.register_attributes(*names)
|
16
|
+
options = { :readonly => [] }
|
17
|
+
options.merge!(names.pop) if names.last.kind_of? Hash
|
18
|
+
|
16
19
|
# Defines the attribute getter and setters.
|
17
20
|
class_eval do
|
18
21
|
define_method :attributes do
|
@@ -22,16 +25,43 @@ module Trello
|
|
22
25
|
names.each do |key|
|
23
26
|
define_method(:"#{key}") { @attributes[key] }
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
unless options[:readonly].include?(key.to_sym)
|
29
|
+
define_method :"#{key}=" do |val|
|
30
|
+
send(:"#{key}_will_change!") unless val == @attributes[key]
|
31
|
+
@attributes[key] = val
|
32
|
+
end
|
28
33
|
end
|
29
34
|
end
|
35
|
+
|
30
36
|
define_attribute_methods names
|
31
37
|
end
|
32
38
|
end
|
33
39
|
|
34
|
-
|
40
|
+
def self.one(name, opts = {})
|
41
|
+
class_eval do
|
42
|
+
define_method(:"#{name}") do |*args|
|
43
|
+
options = opts.dup
|
44
|
+
klass = options.delete(:via) || Trello.const_get(name.to_s.camelize)
|
45
|
+
ident = options.delete(:using) || :id
|
46
|
+
klass.find(self.send(ident))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.many(name, opts = {})
|
52
|
+
class_eval do
|
53
|
+
define_method(:"#{name}") do |*args|
|
54
|
+
options = opts.dup
|
55
|
+
resource = options.delete(:in) || self.class.to_s.split("::").last.downcase.pluralize
|
56
|
+
klass = options.delete(:via) || Trello.const_get(name.to_s.singularize.camelize)
|
57
|
+
params = options.merge(args[0] || {})
|
58
|
+
resources = Client.get("/#{resource}/#{id}/#{name}", options).json_into(klass)
|
59
|
+
MultiAssociation.new(self, resources).proxy
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
register_attributes :id, :readonly => [ :id ]
|
35
65
|
|
36
66
|
def initialize(fields = {})
|
37
67
|
update_fields(fields)
|
data/lib/trello/board.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module Trello
|
2
|
-
|
3
2
|
class Board < BasicData
|
4
|
-
register_attributes :id, :name, :description, :url, :organization_id
|
3
|
+
register_attributes :id, :name, :description, :closed, :url, :organization_id, :prefs,
|
4
|
+
:readonly => [ :id, :url, :organization_id, :prefs ]
|
5
5
|
validates_presence_of :id, :name
|
6
|
+
validates_length_of :name, :in => 1..16384
|
7
|
+
validates_length_of :description, :maximum => 16384
|
6
8
|
|
7
9
|
include HasActions
|
8
10
|
|
@@ -49,49 +51,41 @@ module Trello
|
|
49
51
|
attributes[:closed] = fields['closed'] if fields.has_key?('closed')
|
50
52
|
attributes[:url] = fields['url'] if fields['url']
|
51
53
|
attributes[:organization_id] = fields['idOrganization'] if fields['idOrganization']
|
52
|
-
|
54
|
+
attributes[:prefs] = fields['prefs'] || {}
|
53
55
|
self
|
54
56
|
end
|
55
57
|
|
56
58
|
def closed?
|
57
|
-
|
59
|
+
attributes[:closed]
|
60
|
+
end
|
61
|
+
|
62
|
+
def has_lists?
|
63
|
+
lists.size > 0
|
58
64
|
end
|
59
65
|
|
60
66
|
# Return all the cards on this board.
|
61
67
|
#
|
62
|
-
#
|
68
|
+
# This method, when called, can take a hash table with a filter key containing any
|
63
69
|
# of the following values:
|
64
70
|
# :filter => [ :none, :open, :closed, :all ] # default :open
|
65
|
-
|
66
|
-
Client.get("/boards/#{id}/cards").json_into(Card)
|
67
|
-
end
|
68
|
-
|
69
|
-
def has_lists?
|
70
|
-
lists.size > 0
|
71
|
-
end
|
71
|
+
many :cards, :filter => :open
|
72
72
|
|
73
73
|
# Returns all the lists on this board.
|
74
74
|
#
|
75
|
-
#
|
75
|
+
# This method, when called, can take a hash table with a filter key containing any
|
76
76
|
# of the following values:
|
77
77
|
# :filter => [ :none, :open, :closed, :all ] # default :open
|
78
|
-
|
79
|
-
Client.get("/boards/#{id}/lists", options).json_into(List)
|
80
|
-
end
|
78
|
+
many :lists, :filter => :open
|
81
79
|
|
82
80
|
# Returns an array of members who are associated with this board.
|
83
81
|
#
|
84
|
-
#
|
82
|
+
# This method, when called, can take a hash table with a filter key containing any
|
85
83
|
# of the following values:
|
86
84
|
# :filter => [ :none, :normal, :owners, :all ] # default :all
|
87
|
-
|
88
|
-
Client.get("/boards/#{id}/members", options).json_into(Member)
|
89
|
-
end
|
85
|
+
many :members, :filter => :all
|
90
86
|
|
91
87
|
# Returns a reference to the organization this board belongs to.
|
92
|
-
|
93
|
-
Organization.find(organization_id)
|
94
|
-
end
|
88
|
+
one :organization, :using => :organization_id
|
95
89
|
|
96
90
|
# :nodoc:
|
97
91
|
def request_prefix
|
data/lib/trello/card.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
module Trello
|
2
2
|
# A Card is a container that can house checklists and comments; it resides inside a List.
|
3
3
|
class Card < BasicData
|
4
|
-
register_attributes :id, :short_id, :name, :description, :closed, :url, :board_id, :member_ids, :list_id
|
4
|
+
register_attributes :id, :short_id, :name, :description, :due, :closed, :url, :board_id, :member_ids, :list_id,
|
5
|
+
:readonly => [ :id, :short_id, :url, :board_id, :member_ids ]
|
5
6
|
validates_presence_of :id, :name, :list_id
|
7
|
+
validates_length_of :name, :in => 1..16384
|
8
|
+
validates_length_of :description, :in => 0..16384
|
6
9
|
|
7
10
|
include HasActions
|
8
11
|
|
@@ -29,6 +32,7 @@ module Trello
|
|
29
32
|
attributes[:short_id] = fields['idShort']
|
30
33
|
attributes[:name] = fields['name']
|
31
34
|
attributes[:description] = fields['desc']
|
35
|
+
attributes[:due] = Time.iso8601(fields['due']) rescue nil
|
32
36
|
attributes[:closed] = fields['closed']
|
33
37
|
attributes[:url] = fields['url']
|
34
38
|
attributes[:board_id] = fields['idBoard']
|
@@ -38,29 +42,24 @@ module Trello
|
|
38
42
|
end
|
39
43
|
|
40
44
|
# Returns a reference to the board this card is part of.
|
41
|
-
|
42
|
-
Board.find(board_id)
|
43
|
-
end
|
45
|
+
one :board, :using => :board_id
|
44
46
|
|
45
47
|
# Returns a list of checklists associated with the card.
|
46
48
|
#
|
47
49
|
# The options hash may have a filter key which can have its value set as any
|
48
50
|
# of the following values:
|
49
51
|
# :filter => [ :none, :all ] # default :all
|
50
|
-
|
51
|
-
Client.get("/cards/#{id}/checklists", options).json_into(Checklist)
|
52
|
-
end
|
52
|
+
many :checklists, :filter => :all
|
53
53
|
|
54
54
|
# Returns a reference to the list this card is currently in.
|
55
|
-
|
56
|
-
List.find(list_id)
|
57
|
-
end
|
55
|
+
one :list, :using => :list_id
|
58
56
|
|
59
57
|
# Returns a list of members who are assigned to this card.
|
60
58
|
def members
|
61
|
-
member_ids.map do |member_id|
|
59
|
+
members = member_ids.map do |member_id|
|
62
60
|
Client.get("/members/#{member_id}").json_into(Member)
|
63
61
|
end
|
62
|
+
MultiAssociation.new(self, members).proxy
|
64
63
|
end
|
65
64
|
|
66
65
|
# Saves a record.
|
@@ -83,14 +82,15 @@ module Trello
|
|
83
82
|
@previously_changed = changes
|
84
83
|
@changed_attributes.clear
|
85
84
|
|
86
|
-
Client.put("/cards/#{
|
85
|
+
Client.put("/cards/#{id}", {
|
87
86
|
:name => name,
|
88
87
|
:desc => description,
|
88
|
+
:due => due && due.utc.iso8601,
|
89
89
|
:closed => closed,
|
90
90
|
:idList => list_id,
|
91
91
|
:idBoard => board_id,
|
92
92
|
:idMembers => member_ids
|
93
|
-
})
|
93
|
+
})
|
94
94
|
end
|
95
95
|
|
96
96
|
# Is the record valid?
|
@@ -112,13 +112,19 @@ module Trello
|
|
112
112
|
|
113
113
|
# Add a label
|
114
114
|
def add_label(colour)
|
115
|
-
|
115
|
+
unless %w{green yellow orange red purple blue}.include? colour
|
116
|
+
errors.add(:label, "colour '#{colour}' does not exist")
|
117
|
+
return Trello.logger.warn "The label colour '#{colour}' does not exist."
|
118
|
+
end
|
116
119
|
Client.post("/cards/#{id}/labels", { :value => colour })
|
117
120
|
end
|
118
121
|
|
119
122
|
# Remove a label
|
120
123
|
def remove_label(colour)
|
121
|
-
|
124
|
+
unless %w{green yellow orange red purple blue}.include? colour
|
125
|
+
errors.add(:label, "colour '#{colour}' does not exist")
|
126
|
+
return Trello.logger.warn "The label colour '#{colour}' does not exist." unless %w{green yellow orange red purple blue}.include? colour
|
127
|
+
end
|
122
128
|
Client.delete("/cards/#{id}/labels/#{colour}")
|
123
129
|
end
|
124
130
|
|
data/lib/trello/checklist.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module Trello
|
2
2
|
# A Checklist holds items which are like a "task" list. Checklists are linked to a card.
|
3
3
|
class Checklist < BasicData
|
4
|
-
register_attributes :id, :name, :description, :closed, :url, :check_items, :board_id, :list_id, :member_ids
|
4
|
+
register_attributes :id, :name, :description, :closed, :url, :check_items, :board_id, :list_id, :member_ids,
|
5
|
+
:readonly => [ :id, :description, :closed, :url, :check_items, :board_id, :list_id, :member_ids ]
|
5
6
|
validates_presence_of :id, :board_id, :list_id
|
7
|
+
validates_length_of :name, :in => 1..16384
|
6
8
|
|
7
9
|
class << self
|
8
10
|
# Locate a specific checklist by its id.
|
@@ -42,13 +44,13 @@ module Trello
|
|
42
44
|
return update! if id
|
43
45
|
|
44
46
|
Client.post("/checklists", {
|
45
|
-
:name
|
46
|
-
:idBoard =>
|
47
|
+
:name => name,
|
48
|
+
:idBoard => board_id
|
47
49
|
}).json_into(self)
|
48
50
|
end
|
49
51
|
|
50
52
|
def update!
|
51
|
-
Client.put("/checklists", { :name =>
|
53
|
+
Client.put("/checklists", { :name => name }).json_into(self)
|
52
54
|
end
|
53
55
|
|
54
56
|
# Return a list of items on the checklist.
|
@@ -59,20 +61,17 @@ module Trello
|
|
59
61
|
end
|
60
62
|
|
61
63
|
# Return a reference to the board the checklist is on.
|
62
|
-
|
63
|
-
Board.find(board_id)
|
64
|
-
end
|
64
|
+
one :board, :using => :board_id
|
65
65
|
|
66
66
|
# Return a reference to the list the checklist is on.
|
67
|
-
|
68
|
-
List.find(list_id)
|
69
|
-
end
|
67
|
+
one :list, :using => :list_id
|
70
68
|
|
71
69
|
# Return a list of members active in this checklist.
|
72
70
|
def members
|
73
|
-
member_ids.map do |member_id|
|
71
|
+
members = member_ids.map do |member_id|
|
74
72
|
Member.find(member_id)
|
75
73
|
end
|
74
|
+
MultiAssociation.new(self, members).proxy
|
76
75
|
end
|
77
76
|
|
78
77
|
# Add an item to the checklist
|
data/lib/trello/client.rb
CHANGED
@@ -30,6 +30,8 @@ module Trello
|
|
30
30
|
request = Request.new name, uri, {}, body
|
31
31
|
response = TInternet.execute AuthPolicy.authorize(request)
|
32
32
|
|
33
|
+
return '' unless response
|
34
|
+
|
33
35
|
if response.code.to_i == 401 && response.body =~ /expired token/
|
34
36
|
Trello.logger.error("[401 #{name.to_s.upcase} #{uri}]: Your access token has expired.")
|
35
37
|
raise InvalidAccessToken, response.body
|
data/lib/trello/has_actions.rb
CHANGED
@@ -2,7 +2,8 @@ module Trello
|
|
2
2
|
module HasActions
|
3
3
|
# Returns a list of the actions associated with this object.
|
4
4
|
def actions(options = {})
|
5
|
-
Client.get("#{request_prefix}/actions", { :filter => :all }.merge(options)).json_into(Action)
|
5
|
+
actions = Client.get("#{request_prefix}/actions", { :filter => :all }.merge(options)).json_into(Action)
|
6
|
+
MultiAssociation.new(self, actions).proxy
|
6
7
|
end
|
7
8
|
end
|
8
9
|
end
|
data/lib/trello/item.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Trello
|
2
2
|
# An Item is a basic task that can be checked off and marked as completed.
|
3
3
|
class Item < BasicData
|
4
|
-
register_attributes :id, :name, :type
|
4
|
+
register_attributes :id, :name, :type, :readonly => [ :id, :name, :type ]
|
5
5
|
validates_presence_of :id, :type
|
6
6
|
|
7
7
|
# Updates the fields of an item.
|
data/lib/trello/item_state.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Trello
|
2
2
|
# Represents the state of an item.
|
3
3
|
class ItemState < BasicData
|
4
|
-
register_attributes :id, :state, :item_id
|
4
|
+
register_attributes :id, :state, :item_id, :readonly => [ :id, :state, :item_id ]
|
5
5
|
validates_presence_of :id, :item_id
|
6
6
|
|
7
7
|
# Update the fields of an item state.
|
data/lib/trello/list.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Trello
|
2
2
|
# A List is a container which holds cards. Lists are items on a board.
|
3
3
|
class List < BasicData
|
4
|
-
register_attributes :id, :name, :closed, :board_id
|
4
|
+
register_attributes :id, :name, :closed, :board_id, :readonly => [ :id, :board_id ]
|
5
5
|
validates_presence_of :id, :name, :board_id
|
6
|
+
validates_length_of :name, :in => 1..16384
|
6
7
|
|
7
8
|
include HasActions
|
8
9
|
|
@@ -34,16 +35,16 @@ module Trello
|
|
34
35
|
return update! if id
|
35
36
|
|
36
37
|
Client.post("/lists", {
|
37
|
-
:name =>
|
38
|
-
:closed =>
|
39
|
-
:idBoard =>
|
38
|
+
:name => name,
|
39
|
+
:closed => closed || false,
|
40
|
+
:idBoard => board_id
|
40
41
|
}).json_into(self)
|
41
42
|
end
|
42
43
|
|
43
44
|
def update!
|
44
45
|
Client.put("/lists", {
|
45
|
-
:name =>
|
46
|
-
:closed =>
|
46
|
+
:name => name,
|
47
|
+
:closed => closed
|
47
48
|
}).json_into(self)
|
48
49
|
end
|
49
50
|
|
@@ -53,18 +54,14 @@ module Trello
|
|
53
54
|
end
|
54
55
|
|
55
56
|
# Return the board the list is connected to.
|
56
|
-
|
57
|
-
Board.find(board_id)
|
58
|
-
end
|
57
|
+
one :board, :using => :board_id
|
59
58
|
|
60
59
|
# Returns all the cards on this list.
|
61
60
|
#
|
62
61
|
# The options hash may have a filter key which can have its value set as any
|
63
62
|
# of the following values:
|
64
63
|
# :filter => [ :none, :open, :closed, :all ] # default :open
|
65
|
-
|
66
|
-
Client.get("/lists/#{id}/cards", options).json_into(Card)
|
67
|
-
end
|
64
|
+
many :cards, :filter => :open
|
68
65
|
|
69
66
|
# :nodoc:
|
70
67
|
def request_prefix
|
data/lib/trello/member.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module Trello
|
2
2
|
# A Member is a user of the Trello service.
|
3
3
|
class Member < BasicData
|
4
|
-
register_attributes :id, :username, :full_name, :avatar_id, :bio, :url
|
4
|
+
register_attributes :id, :username, :full_name, :avatar_id, :bio, :url, :readonly => [ :id, :username, :avatar_id, :url ]
|
5
5
|
validates_presence_of :id, :username
|
6
|
+
validates_length_of :full_name, :minimum => 4
|
7
|
+
validates_length_of :bio, :maximum => 16384
|
6
8
|
|
7
9
|
include HasActions
|
8
10
|
|
@@ -41,46 +43,51 @@ module Trello
|
|
41
43
|
|
42
44
|
# Returns a list of the boards a member is a part of.
|
43
45
|
#
|
44
|
-
#
|
46
|
+
# This method, when called, can take a hash table with a filter key containing any
|
45
47
|
# of the following values:
|
46
48
|
# :filter => [ :none, :members, :organization, :public, :open, :closed, :all ] # default: :all
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
# i.e.,
|
50
|
+
# me.boards(:filter => :closed) # retrieves all closed boards
|
51
|
+
many :boards, :filter => :all
|
50
52
|
|
51
53
|
# Returns a list of cards the member is assigned to.
|
52
54
|
#
|
53
|
-
#
|
55
|
+
# This method, when called, can take a hash table with a filter key containing any
|
54
56
|
# of the following values:
|
55
57
|
# :filter => [ :none, :open, :closed, :all ] # default :open
|
56
|
-
|
57
|
-
|
58
|
-
|
58
|
+
# i.e.,
|
59
|
+
# me.cards(:filter => :closed) # retrieves all closed cards
|
60
|
+
many :cards, :filter => :open
|
59
61
|
|
60
62
|
# Returns a list of the organizations this member is a part of.
|
61
63
|
#
|
62
|
-
#
|
64
|
+
# This method, when called, can take a hash table with a filter key containing any
|
63
65
|
# of the following values:
|
64
66
|
# :filter => [ :none, :members, :public, :all ] # default: all
|
65
|
-
|
66
|
-
|
67
|
-
|
67
|
+
# i.e.,
|
68
|
+
# me.organizations(:filter => :public) # retrieves all public organizations
|
69
|
+
many :organizations, :filter => :all
|
68
70
|
|
69
71
|
# Returns a list of notifications for the user
|
70
|
-
|
71
|
-
Client.get("/members/#{username}/notifications").json_into(Notification)
|
72
|
-
end
|
72
|
+
many :notifications
|
73
73
|
|
74
74
|
def save
|
75
75
|
@previously_changed = changes
|
76
76
|
@changed_attributes.clear
|
77
77
|
|
78
|
-
|
78
|
+
return update! if id
|
79
|
+
end
|
80
|
+
|
81
|
+
def update!
|
82
|
+
Client.put(request_prefix, {
|
83
|
+
:displayName => full_name,
|
84
|
+
:bio => bio
|
85
|
+
}).json_into(self)
|
79
86
|
end
|
80
87
|
|
81
88
|
# :nodoc:
|
82
89
|
def request_prefix
|
83
|
-
"/members/#{
|
90
|
+
"/members/#{id}"
|
84
91
|
end
|
85
92
|
end
|
86
93
|
end
|