yam 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dfcfc553032f8390dc3e9152712c014c2e2121e3
4
- data.tar.gz: 542b4d2bc6af453b05f4be934e4cb30616562354
3
+ metadata.gz: 2374b08700b4fa2d18344496c086d0b8480107da
4
+ data.tar.gz: 6720b27fa642e2697352f125ee27a9005cae2a9f
5
5
  SHA512:
6
- metadata.gz: c067db8b3bb4ccd6b0841826218620127c5b806771589dc446415960be20cc999cfee10c51750653cda64034fd70a527394eb111ae0103629bbf01c0d76421f0
7
- data.tar.gz: 450d9ec398c7f513cdd1d8b612f63ee06ac6327a1dafd2d4efb239b5c0dcf16489f7d064224d4c741c3b0aefe0a95897c5caf11e03a485bb1e28c43e0b0e6ac2
6
+ metadata.gz: a6f739f3511bcc24e9254a444ddc5ee27b35c08dfd1029e34565664a36a7004e390bfe37bf6a13cf3a064fffe2f3c4291985c9c5ca2504bc2082c276bf85e0d9
7
+ data.tar.gz: bc52ae55b4c8fbec4b6652fee1287c3826e9123bb00ffe46e93d106f0b6187d15eb5c7f1e3864804d3388a1041ab45621ab7236d2cb8fad58f83a1cb93046b5c
checksums.yaml.gz.sig CHANGED
Binary file
data/.travis.yml CHANGED
@@ -3,8 +3,7 @@ rvm:
3
3
  - 2.0.0
4
4
  - 1.9.3
5
5
  - 1.9.2
6
- - 1.8.7
7
- - ree
6
+
8
7
  branches:
9
8
  only:
10
9
  - master
data/CHANGELOG.md CHANGED
@@ -1,7 +1,13 @@
1
+ 1.1.0
2
+ ====================================
3
+ - added support for activity api
4
+ - added support for liking and unliking messages
5
+ - small improvements to documentation
6
+
1
7
  1.0.0
2
8
  ====================================
3
9
  - Customized fork of yammer-client (https://github.com/tiabas/yammer-client)
4
10
 
5
11
  0.0.6
6
12
  ====================================
7
- - Alpha
13
+ - Alpha
data/README.md CHANGED
@@ -239,8 +239,8 @@ The object model is an abstraction that makes it easy to manipulate the JSON dat
239
239
 
240
240
 
241
241
  ```ruby
242
- u = Yammer::User.current
243
- #> <Yammer::User:0x007f9f4b0c39c8>
242
+ u = Yammer::Resources::User.current
243
+ #> <Yammer::Resources::User:0x007f9f4b0c39c8>
244
244
 
245
245
  u.full_name
246
246
  #> 'Kevin Mutyaba'
@@ -254,7 +254,7 @@ The object model is an abstraction that makes it easy to manipulate the JSON dat
254
254
  - *fetch a thread with a given id*
255
255
 
256
256
  ```ruby
257
- t = Yammer::Thread.get(3)
257
+ t = Yammer::Resources::Thread.get(3)
258
258
  ```
259
259
 
260
260
  View the participants in the thread
@@ -268,27 +268,26 @@ The object model is an abstraction that makes it easy to manipulate the JSON dat
268
268
 
269
269
  ```ruby
270
270
  peepl = t.people
271
- #> [#<Yammer::User:0x007f9f4c086630 @modified_attributes={}, @attrs={}, @new_record=false, @id=18>, #<Yammer::User:0x007f9f4c086568 @modified_attributes={}, @attrs={}, @new_record=false, @id=64>]
271
+ #> [#<Yammer::Resources::User:0x007f9f4c086630 @modified_attributes={}, @attrs={}, @new_record=false, @id=18>, #<Yammer::Resources::User:0x007f9f4c086568 @modified_attributes={}, @attrs={}, @new_record=false, @id=64>]
272
272
  ```
273
273
 
274
274
  Object models are lazyly loaded. Calling an accessor on a model will hydrate it
275
275
 
276
276
  ```ruby
277
277
  peepl[0]
278
- #> #<Yammer::User:0x007f9f4c086568 @modified_attributes={}, @attrs={}, @new_record=false, @id=18>
278
+ #> #<Yammer::Resources::User:0x007f9f4c086568 @modified_attributes={}, @attrs={}, @new_record=false, @id=18>
279
279
 
280
280
  peepl[0].permalink
281
281
  #> 'thekev'
282
282
 
283
283
  peepl[0]
284
- #=> #<Yammer::User:0x007f9f4c086568 @modified_attributes={}, @attrs={:last_name=>"Mutyaba", :network_id=>1, :first_name=>"Kevin", :id => 18, :permalink=>"thekev" }, @network_id=1, @first_name="Kev", @full_name="Tiaba", @permalink="thekev", @id=18 >
284
+ #=> #<Yammer::Resources::User:0x007f9f4c086568 @modified_attributes={}, @attrs={:last_name=>"Mutyaba", :network_id=>1, :first_name=>"Kevin", :id => 18, :permalink=>"thekev" }, @network_id=1, @first_name="Kev", @full_name="Tiaba", @permalink="thekev", @id=18 >
285
285
  ```
286
286
 
287
287
  ## Supported Ruby Versions
288
288
  This library aims to support and is [tested against][travis] the following Ruby
289
289
  version:
290
290
 
291
- * Ruby 1.8.7
292
291
  * Ruby 1.9.2
293
292
  * Ruby 1.9.3
294
293
  * Ruby 2.0.0
@@ -17,84 +17,84 @@ require 'multi_json'
17
17
  require 'addressable/uri'
18
18
 
19
19
  module Yammer
20
- class HttpAdapter
20
+ class HttpAdapter
21
21
 
22
- def self.log=(output)
23
- RestClient.log = output
24
- end
22
+ def self.log=(output)
23
+ RestClient.log = output
24
+ end
25
25
 
26
- attr_reader :site_url, :connection_options
26
+ attr_reader :site_url, :connection_options
27
27
 
28
- def initialize(site_url, opts={})
29
- unless site_url =~ /^https?/
30
- raise ArgumentError, "site_url must include either http or https scheme"
31
- end
32
- @site_url = site_url
33
- @connection_options = opts
28
+ def initialize(site_url, opts={})
29
+ unless site_url =~ /^https?/
30
+ raise ArgumentError, "site_url must include either http or https scheme"
34
31
  end
32
+ @site_url = site_url
33
+ @connection_options = opts
34
+ end
35
35
 
36
- # set the url to be used for creating an http connection
37
- # @param url [string]
38
- def site_url=(url)
39
- @site_url = url
40
- @host = nil
41
- @scheme = nil
42
- end
36
+ # set the url to be used for creating an http connection
37
+ # @param url [string]
38
+ def site_url=(url)
39
+ @site_url = url
40
+ @host = nil
41
+ @scheme = nil
42
+ end
43
43
 
44
- def host
45
- @host ||= parsed_url.host
46
- end
44
+ def host
45
+ @host ||= parsed_url.host
46
+ end
47
47
 
48
- def scheme
49
- @scheme ||= parsed_url.scheme
50
- end
48
+ def scheme
49
+ @scheme ||= parsed_url.scheme
50
+ end
51
51
 
52
- def absolute_url(path='')
53
- "#{@site_url}#{path}"
54
- end
52
+ def absolute_url(path='')
53
+ "#{@site_url}#{path}"
54
+ end
55
55
 
56
- def connection_options=(opts)
57
- raise ArgumentError, 'expected Hash' unless opts.is_a?(Hash)
58
- @connection_options = opts
59
- end
56
+ def connection_options=(opts)
57
+ raise ArgumentError, 'expected Hash' unless opts.is_a?(Hash)
58
+ @connection_options = opts
59
+ end
60
60
 
61
- def send_request(method, path, opts={})
62
- begin
63
- params = opts.fetch(:params, {})
64
-
65
- req_opts = self.connection_options.merge({
66
- :method => method,
67
- :headers => opts.fetch(:headers, {})
68
- })
69
-
70
- case method
71
- when :get, :delete
72
- query = Addressable::URI.form_encode(params)
73
- normalized_path = query.empty? ? path : [path, query].join("?")
74
- req_opts[:url] = absolute_url(normalized_path)
75
- when :post, :put
76
- req_opts[:payload] = params
77
- req_opts[:url] = absolute_url(path)
78
- else
79
- raise "Unsupported HTTP method, #{method}"
80
- end
81
-
82
- resp = RestClient::Request.execute(req_opts)
83
-
84
- result = Yammer::ApiResponse.new(resp.headers, resp.body, resp.code)
85
- rescue => e
86
- if e.is_a?(RestClient::ExceptionWithResponse)
87
- e.response
88
- else
89
- raise e
90
- end
61
+ def send_request(method, path, opts={})
62
+ begin
63
+ params = opts.fetch(:params, {})
64
+
65
+ req_opts = self.connection_options.merge({
66
+ :method => method,
67
+ :headers => opts.fetch(:headers, {})
68
+ })
69
+
70
+ case method
71
+ when :get, :delete
72
+ query = Addressable::URI.form_encode(params)
73
+ normalized_path = query.empty? ? path : [path, query].join("?")
74
+ req_opts[:url] = absolute_url(normalized_path)
75
+ when :post, :put
76
+ req_opts[:payload] = params
77
+ req_opts[:url] = absolute_url(path)
78
+ else
79
+ raise "Unsupported HTTP method, #{method}"
91
80
  end
92
- end
93
81
 
94
- private
95
- def parsed_url
96
- Addressable::URI.parse(@site_url)
82
+ resp = RestClient::Request.execute(req_opts)
83
+
84
+ result = Yammer::ApiResponse.new(resp.headers, resp.body, resp.code)
85
+ rescue => e
86
+ if e.is_a?(RestClient::ExceptionWithResponse)
87
+ e.response
88
+ else
89
+ raise e
90
+ end
97
91
  end
92
+ end
98
93
 
94
+ private
95
+ def parsed_url
96
+ Addressable::URI.parse(@site_url)
99
97
  end
98
+
99
+ end
100
100
  end
@@ -0,0 +1,210 @@
1
+ # Copyright (c) Microsoft Corporation
2
+ # All rights reserved.
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR
8
+ # CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
9
+ # WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE,
10
+ # FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ # See the Apache Version 2.0 License for specific language governing
13
+ # permissions and limitations under the License.
14
+
15
+ module Yammer
16
+ module Resources
17
+ class Base
18
+ class << self
19
+ include ApiHandler
20
+
21
+ # Returns the non-qualified class name
22
+ # @!scope class
23
+ def base_name
24
+ @base_name ||= begin
25
+ word = "#{name.split(/::/).last}"
26
+ word.gsub!(/::/, '/')
27
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
28
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
29
+ word.tr!("-", "_")
30
+ word.downcase!
31
+ word
32
+ end
33
+ end
34
+
35
+ # Fetches JSON reprsentation for object model with provided `id`
36
+ # and returns a model instance with attributes
37
+ # @return [Yammer::Base]
38
+ # @param id [Integer]
39
+ # @!scope class
40
+ def get(id)
41
+ attrs = fetch(id)
42
+ attrs ? new(attrs) : nil
43
+ end
44
+
45
+
46
+ # @!scope class
47
+ def fetch(id)
48
+ return unless identity_map
49
+ attributes = identity_map.get("#{base_name}_#{id}")
50
+ unless attributes
51
+ result = api_handler.send("get_#{base_name}", id)
52
+ attributes = result.empty? ? nil : result.body
53
+ unless attributes.empty?
54
+ identity_map.put("#{base_name}_#{id}", attributes)
55
+ end
56
+ end
57
+ attributes
58
+ end
59
+
60
+ # @!scope class
61
+ def identity_map
62
+ @identity_map ||= Yammer::Resources::IdentityMap.new
63
+ end
64
+
65
+ # Returns a hash of all attributes that are meant to trigger an HTTP request
66
+ # @!scope class
67
+ def model_attributes
68
+ @model_attributes ||= {}
69
+ end
70
+
71
+ protected
72
+
73
+ def attr_accessor_deffered(*symbols)
74
+ symbols.each do |key|
75
+ # track attributes that should trigger a fetch
76
+ model_attributes[key] = false
77
+
78
+ # getter
79
+ define_method(key.to_s) do
80
+ load_deferred_attribute!(key)
81
+ instance_variable_get("@#{key}")
82
+ end
83
+
84
+ # setter
85
+ define_method("#{key}=") do |value|
86
+ load_deferred_attribute!(key)
87
+ if persisted? && loaded?
88
+ @modified_attributes[key] = value
89
+ else
90
+ @attrs[key] = value
91
+ end
92
+ instance_variable_set("@#{key}", value)
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ attr_reader :id, :attrs
99
+
100
+ def initialize(props={})
101
+ @klass = self.class
102
+ @modified_attributes = {}
103
+ @new_record = true
104
+ @loaded = false
105
+ @attrs = props
106
+ self.id = @attrs.delete(:id)
107
+ self.update(@attrs)
108
+
109
+ yield self if block_given?
110
+ end
111
+
112
+ def api_handler
113
+ @klass.api_handler
114
+ end
115
+
116
+ def base_name
117
+ @klass.base_name
118
+ end
119
+
120
+ def new_record?
121
+ @new_record
122
+ end
123
+
124
+ def persisted?
125
+ !new_record?
126
+ end
127
+
128
+ def changes
129
+ @modified_attributes
130
+ end
131
+
132
+ def modified?
133
+ !changes.empty?
134
+ end
135
+
136
+ def loaded?
137
+ @loaded
138
+ end
139
+
140
+ def load!
141
+ @attrs = @klass.fetch(@id)
142
+ @loaded = true
143
+ update(@attrs)
144
+ self
145
+ end
146
+
147
+ def reload!
148
+ reset!
149
+ load!
150
+ end
151
+
152
+ def save
153
+ return self if ((persisted? && @modified_attributes.empty?) || @attrs.empty?)
154
+
155
+ result = if new_record?
156
+ api_handler.send("create_#{base_name}", @attrs)
157
+ else
158
+ api_handler.send("update_#{base_name}", @id, @modified_attributes)
159
+ end
160
+ @modified_attributes = {}
161
+ self
162
+ end
163
+
164
+ def delete!
165
+ return if new_record?
166
+ result = api_handler.send("delete_#{base_name}", @id)
167
+ result.success?
168
+ end
169
+
170
+ private
171
+
172
+ def id=(model_id)
173
+ return if model_id.nil?
174
+ @id = model_id.to_i
175
+ @new_record = false
176
+ end
177
+
178
+ # clear the entire class
179
+ def reset!
180
+ @modified_attributes = {}
181
+ @attrs = {}
182
+ @new_record = true
183
+ @loaded = false
184
+ end
185
+
186
+ protected
187
+ # loads model
188
+ def load_deferred_attribute!(key)
189
+ if @attrs.empty? && persisted? && !loaded?
190
+ load!
191
+ if !@attrs.has_key?(key)
192
+ raise "The key: #{key} appears not to be supported for model: #{self.base_name} \n #{@attrs.keys.inspect}"
193
+ end
194
+ end
195
+ end
196
+
197
+ # set all fetchable attributes
198
+ def update(attrs={})
199
+ attrs.each do |key, value|
200
+ send("#{key}=", value)
201
+ end
202
+ if persisted? && !loaded?
203
+ @loaded = @klass.model_attributes.keys.inject(true) do |result, key|
204
+ result && @attrs.has_key?(key)
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
@@ -13,15 +13,17 @@
13
13
  # permissions and limitations under the License.
14
14
 
15
15
  module Yammer
16
- class Group < Yammer::Base
16
+ module Resources
17
+ class Group < Yammer::Resources::Base
17
18
 
18
- attr_accessor_deffered :show_in_directory, :privacy, :description, :creator_type,
19
- :creator_id, :mugshot_id, :stats, :state, :web_url, :name, :created_at, :type,
20
- :mugshot_url, :url, :full_name, :mugshot_url_template, :description
19
+ attr_accessor_deffered :show_in_directory, :privacy, :description, :creator_type,
20
+ :creator_id, :mugshot_id, :stats, :state, :web_url, :name, :created_at, :type,
21
+ :mugshot_url, :url, :full_name, :mugshot_url_template, :description
21
22
 
22
- # @!scope class
23
- def self.create(params={})
24
- api_handler.create_group(params)
23
+ # @!scope class
24
+ def self.create(params={})
25
+ api_handler.create_group(params)
26
+ end
25
27
  end
26
28
  end
27
29
  end
@@ -13,13 +13,15 @@
13
13
  # permissions and limitations under the License.
14
14
 
15
15
  module Yammer
16
- class GroupMembership < Yammer::Base
16
+ module Resources
17
+ class GroupMembership < Yammer::Resources::Base
17
18
 
18
- attr_accessor_deffered
19
+ attr_accessor_deffered
19
20
 
20
- # @!scope class
21
- def self.create(id)
22
- api_handler.create_group_membership(id)
21
+ # @!scope class
22
+ def self.create(id)
23
+ api_handler.create_group_membership(id)
24
+ end
23
25
  end
24
26
  end
25
27
  end
@@ -0,0 +1,58 @@
1
+ # Copyright (c) Microsoft Corporation
2
+ # All rights reserved.
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR
8
+ # CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
9
+ # WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE,
10
+ # FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ # See the Apache Version 2.0 License for specific language governing
13
+ # permissions and limitations under the License.
14
+
15
+ module Yammer
16
+ module Resources
17
+ class IdentityMap
18
+
19
+ class InvalidKeyError < StandardError; end
20
+
21
+ def initialize
22
+ @map = {}
23
+ @size = 0
24
+ end
25
+
26
+ # @note retrives key from identity map
27
+ # @return [Hash]
28
+ # @param key [string]
29
+ # @param default [Hash]
30
+ def get(key, default=nil)
31
+ @map["#{key}"] || default
32
+ end
33
+
34
+ # @note inserts a hash of attributes into identity map
35
+ # @return [Hash]
36
+ # @param key [string]
37
+ # @param value [Hash]
38
+ def put(key, value)
39
+ if key.nil? || key.empty?
40
+ raise InvalidKeyError.new
41
+ end
42
+ @map["#{key}"] = value
43
+ end
44
+
45
+ # @note returns the current size of identity map
46
+ # @return [Integer]
47
+ def size
48
+ @map.keys.count
49
+ end
50
+
51
+ # clears the entire identity map
52
+ # @return [Hash]
53
+ def purge!
54
+ @map = {}
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) Microsoft Corporation
2
+ # All rights reserved.
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR
8
+ # CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
9
+ # WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE,
10
+ # FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ # See the Apache Version 2.0 License for specific language governing
13
+ # permissions and limitations under the License.
14
+
15
+ module Yammer
16
+ module Resources
17
+ class Message < Yammer::Resources::Base
18
+
19
+ attr_accessor_deffered :direct_message, :privacy, :group_id, :created_at,
20
+ :attachments, :liked_by, :chat_client_sequence, :client_url, :content_excerpt,
21
+ :message_type, :url, :web_url, :network_id, :system_message, :client_type,
22
+ :sender_type, :sender_id, :thread_id, :conversation_id, :replied_to_id, :body
23
+
24
+ attr_reader :replied_to_id
25
+
26
+ # Creates a new message
27
+ # @!scope class
28
+ def self.create(body, params={})
29
+ api_handler.create_message(body, params)
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -13,20 +13,17 @@
13
13
  # permissions and limitations under the License.
14
14
 
15
15
  module Yammer
16
- class Message < Yammer::Base
16
+ module Models
17
+ class MessageBody
18
+ attr_reader :urls, :parsed, :rich
19
+ attr_accessor :plain
17
20
 
18
- attr_accessor_deffered :direct_message, :privacy, :group_id, :created_at,
19
- :attachments, :liked_by, :chat_client_sequence, :client_url, :content_excerpt,
20
- :message_type, :url, :web_url, :network_id, :system_message, :client_type,
21
- :sender_type, :sender_id, :thread_id, :conversation_id, :replied_to_id, :body
22
-
23
- attr_reader :replied_to_id
24
-
25
- # Creates a new message
26
- # @!scope class
27
- def self.create(body, params={})
28
- api_handler.create_message(body, params)
21
+ def initialize(opts={})
22
+ @plain = opts.fetch(:plain,'')
23
+ @parsed = opts.fetch(:parsed,'')
24
+ @rich = opts.fetch(:rich,'')
25
+ @urls = opts.fetch(:urls,'')
26
+ end
29
27
  end
30
-
31
28
  end
32
29
  end
@@ -0,0 +1,60 @@
1
+ # Copyright (c) Microsoft Corporation
2
+ # All rights reserved.
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR
8
+ # CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
9
+ # WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE,
10
+ # FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ # See the Apache Version 2.0 License for specific language governing
13
+ # permissions and limitations under the License.
14
+
15
+ module Yammer
16
+ module Resources
17
+ class Thread < Yammer::Resources::Base
18
+
19
+ attr_accessor_deffered :participants, :web_url, :references, :thread_starter_id,
20
+ :type, :privacy, :has_attachments, :attachments_meta, :topics, :url, :attachments,
21
+ :direct_message, :participants_count, :stats
22
+
23
+ def first_reply_id
24
+ stats[:first_reply_id]
25
+ end
26
+
27
+ def first_reply
28
+ @first_reply ||= first_reply_id ? Yammer::Resources::Message.new(:id => first_reply_id) : nil
29
+ end
30
+
31
+ def latest_reply_id
32
+ stats[:latest_reply_id]
33
+ end
34
+
35
+ def last_reply
36
+ @latest_reply ||= latest_reply_id ? Yammer::Resources::Message.new(:id => latest_reply_id) : nil
37
+ end
38
+
39
+ def people
40
+ @people ||= begin
41
+ @participants.map do |part|
42
+ next unless part[:type] == 'user'
43
+ Yammer::Resources::User.new(:id => part[:id])
44
+ end
45
+ end
46
+ @people
47
+ end
48
+
49
+ def messages
50
+ @messages = {}
51
+ result = api_handler.messages_in_thread(self.id)
52
+ msgs = result.body[:messages].each do |message|
53
+ msg = Yammer::Resources::Message.new(message)
54
+ @messages["#{msg.id}"] = msg
55
+ end
56
+ @messages
57
+ end
58
+ end
59
+ end
60
+ end