yammer-client 0.1.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.
Files changed (67) hide show
  1. data/.gitignore +29 -0
  2. data/.travis.yml +9 -0
  3. data/.yardopts +10 -0
  4. data/CHANGELOG.md +0 -0
  5. data/Gemfile +13 -0
  6. data/LICENSE.md +20 -0
  7. data/README.md +265 -0
  8. data/Rakefile +12 -0
  9. data/certs/tiabas-public.pem +21 -0
  10. data/lib/yammer.rb +28 -0
  11. data/lib/yammer/api.rb +10 -0
  12. data/lib/yammer/api/autocomplete.rb +25 -0
  13. data/lib/yammer/api/group.rb +78 -0
  14. data/lib/yammer/api/group_membership.rb +32 -0
  15. data/lib/yammer/api/message.rb +196 -0
  16. data/lib/yammer/api/network.rb +21 -0
  17. data/lib/yammer/api/notification.rb +18 -0
  18. data/lib/yammer/api/search.rb +28 -0
  19. data/lib/yammer/api/thread.rb +23 -0
  20. data/lib/yammer/api/topic.rb +21 -0
  21. data/lib/yammer/api/user.rb +156 -0
  22. data/lib/yammer/client.rb +101 -0
  23. data/lib/yammer/configurable.rb +46 -0
  24. data/lib/yammer/error.rb +61 -0
  25. data/lib/yammer/http_connection.rb +184 -0
  26. data/lib/yammer/identity_map.rb +42 -0
  27. data/lib/yammer/model.rb +6 -0
  28. data/lib/yammer/model/base.rb +133 -0
  29. data/lib/yammer/model/group.rb +13 -0
  30. data/lib/yammer/model/group_membership.rb +11 -0
  31. data/lib/yammer/model/message.rb +17 -0
  32. data/lib/yammer/model/message_body.rb +13 -0
  33. data/lib/yammer/model/thread.rb +44 -0
  34. data/lib/yammer/model/user.rb +46 -0
  35. data/lib/yammer/response.rb +43 -0
  36. data/lib/yammer/version.rb +18 -0
  37. data/spec/api/autocomplete_spec.rb +23 -0
  38. data/spec/api/group_membership_spec.rb +30 -0
  39. data/spec/api/group_spec.rb +58 -0
  40. data/spec/api/message_spec.rb +118 -0
  41. data/spec/api/network_spec.rb +23 -0
  42. data/spec/api/notification_spec.rb +23 -0
  43. data/spec/api/search_spec.rb +23 -0
  44. data/spec/api/thread_spec.rb +23 -0
  45. data/spec/api/topic_spec.rb +23 -0
  46. data/spec/api/user_spec.rb +76 -0
  47. data/spec/client_spec.rb +208 -0
  48. data/spec/connection_spec.rb +280 -0
  49. data/spec/error_spec.rb +69 -0
  50. data/spec/fixtures/group.json +1 -0
  51. data/spec/fixtures/message.json +1 -0
  52. data/spec/fixtures/messages_in_thread.json +1 -0
  53. data/spec/fixtures/portal_thread.json +1 -0
  54. data/spec/fixtures/private_thread.json +1 -0
  55. data/spec/fixtures/public_thread.json +1 -0
  56. data/spec/fixtures/user.json +1 -0
  57. data/spec/identity_map_spec.rb +108 -0
  58. data/spec/model/base_spec.rb +155 -0
  59. data/spec/model/group_membership_spec.rb +27 -0
  60. data/spec/model/group_spec.rb +44 -0
  61. data/spec/model/message_spec.rb +45 -0
  62. data/spec/model/thread_spec.rb +66 -0
  63. data/spec/model/user_spec.rb +150 -0
  64. data/spec/response_spec.rb +66 -0
  65. data/spec/spec_helper.rb +42 -0
  66. data/yammer.gemspec +29 -0
  67. metadata +270 -0
@@ -0,0 +1,133 @@
1
+ module Yammer
2
+ module Model
3
+ class Base
4
+
5
+ def self.attr_accessor_deffered(*symbols)
6
+ symbols.each do |key|
7
+ fetchable_keys[key] = true
8
+
9
+ define_method (key.to_s) do
10
+ if self.class.fetchable_keys.has_key?(key) && !@attrs.has_key?(key) && @id
11
+ load!
12
+ end
13
+ instance_variable_get("@#{key}")
14
+ end
15
+
16
+ define_method ("#{key}=") do |value|
17
+ if @attrs.fetch(key, false) && !new_record?
18
+ @modified_attributes[key] = value
19
+ else
20
+ @attrs[key] = value
21
+ end
22
+ instance_variable_set("@#{key}", value)
23
+ end
24
+ end
25
+ end
26
+
27
+ # @!scope class
28
+ def self.fetchable_keys
29
+ @fetchable_keys ||= {}
30
+ return @fetchable_keys
31
+ end
32
+
33
+ # @!scope class
34
+ def self.identity_map
35
+ @identity_map ||= Yammer::IdentityMap.new
36
+ end
37
+
38
+ # @!scope class
39
+ def self.base_name
40
+ word = "#{self.name.split(/::/).last}"
41
+ word.gsub!(/::/, '/')
42
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
43
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
44
+ word.tr!("-", "_")
45
+ word.downcase!
46
+ word
47
+ end
48
+
49
+ # @!scope class
50
+ def self.fetch(id)
51
+ return unless identity_map
52
+ attributes = identity_map.get("#{self.base_name}_#{id}")
53
+ unless attributes
54
+ result = Yammer.send("get_#{self.base_name}", id)
55
+ attributes = result.body || {}
56
+ unless attributes.empty?
57
+ identity_map.put("#{self.base_name}_#{id}", attributes)
58
+ end
59
+ end
60
+ attributes
61
+ end
62
+
63
+ # @!scope class
64
+ def self.get(id)
65
+ new(fetch(id))
66
+ end
67
+
68
+ attr_reader :id, :attrs
69
+
70
+ def initialize(props={})
71
+ @modified_attributes = {}
72
+ @attrs = {}
73
+ @new_record = true
74
+ self.id = props.delete(:id)
75
+ self.update(props)
76
+ end
77
+
78
+ def base_name
79
+ self.class.base_name
80
+ end
81
+
82
+ def new_record?
83
+ @new_record
84
+ end
85
+
86
+ def changes
87
+ @modified_attributes
88
+ end
89
+
90
+ def modified?
91
+ !changes.empty?
92
+ end
93
+
94
+ def load!
95
+ result = self.class.fetch(@id)
96
+ update(result)
97
+ end
98
+ alias_method :reload!, :load!
99
+
100
+ def save
101
+ return self if ((!new_record? && @modified_attributes.empty?) || @attrs.empty?)
102
+ result = if new_record?
103
+ Yammer.send("create_#{self.base_name}", @attrs)
104
+ else
105
+ Yammer.send("update_#{self.base_name}", @id, @modified_attributes)
106
+ end
107
+ @modified_attributes = {}
108
+ self
109
+ end
110
+
111
+ def delete!
112
+ return if new_record?
113
+ result = Yammer.send("delete_#{self.base_name}", @id)
114
+ result.success?
115
+ end
116
+
117
+ private
118
+
119
+ def id=(model_id)
120
+ return if model_id.nil?
121
+ @id = model_id.to_i
122
+ @new_record = false
123
+ end
124
+
125
+ protected
126
+ def update(props={})
127
+ props.each do |key, value|
128
+ send("#{key}=", value)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,13 @@
1
+ module Yammer
2
+ class Group < Yammer::Model::Base
3
+
4
+ attr_accessor_deffered :show_in_directory, :privacy, :description, :creator_type,
5
+ :creator_id, :mugshot_id, :stats, :state, :web_url, :name, :created_at, :type,
6
+ :mugshot_url, :url, :full_name, :mugshot_url_template, :description
7
+
8
+ # @!scope class
9
+ def self.create(params={})
10
+ result = Yammer.create_group(params)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Yammer
2
+ class GroupMembership < Yammer::Model::Base
3
+
4
+ attr_accessor_deffered
5
+
6
+ # @!scope class
7
+ def self.create(id)
8
+ Yammer.create_group_membership(id)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module Yammer
2
+ class Message < Yammer::Model::Base
3
+
4
+ attr_accessor_deffered :direct_message, :privacy, :group_id, :created_at,
5
+ :attachments, :liked_by, :chat_client_sequence, :client_url, :content_excerpt,
6
+ :message_type, :url, :web_url, :network_id, :system_message, :client_type,
7
+ :sender_type, :sender_id, :thread_id, :conversation_id, :replied_to_id, :body
8
+
9
+ attr_reader :replied_to_id
10
+
11
+ # @!scope class
12
+ def self.create(params={})
13
+ Yammer.create_message(params)
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Yammer
2
+ class MessageBody
3
+ attr_reader :urls, :parsed, :rich
4
+ attr_accessor :plain
5
+
6
+ def initialize(opts={})
7
+ @plain = opts.fetch(:plain,'')
8
+ @parsed = opts.fetch(:parsed,'')
9
+ @rich = opts.fetch(:rich,'')
10
+ @urls = opts.fetch(:urls,'')
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,44 @@
1
+ module Yammer
2
+ class Thread < Yammer::Model::Base
3
+
4
+ attr_accessor_deffered :participants, :web_url, :references, :thread_starter_id,
5
+ :type, :privacy, :has_attachments, :attachments_meta, :topics, :url, :attachments,
6
+ :direct_message, :participants_count, :stats
7
+
8
+ def first_reply_id
9
+ stats[:first_reply_id]
10
+ end
11
+
12
+ def first_reply
13
+ @first_reply ||= first_reply_id ? Yammer::Message.new(:id => first_reply_id) : nil
14
+ end
15
+
16
+ def latest_reply_id
17
+ stats[:latest_reply_id]
18
+ end
19
+
20
+ def last_reply
21
+ @latest_reply ||= latest_reply_id ? Yammer::Message.new(:id => latest_reply_id) : nil
22
+ end
23
+
24
+ def people
25
+ @people ||= begin
26
+ @participants.map do |part|
27
+ next unless part[:type] == 'user'
28
+ Yammer::User.new(:id => part[:id])
29
+ end
30
+ end
31
+ @people
32
+ end
33
+
34
+ def messages
35
+ @messages = {}
36
+ result = Yammer.messages_in_thread(self.id)
37
+ msgs = result.body[:messages].each do |message|
38
+ msg = Yammer::Message.new(message)
39
+ @messages["#{msg.id}"] = msg
40
+ end
41
+ @messages
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ module Yammer
2
+ class User < Yammer::Model::Base
3
+
4
+ # @!scope class
5
+ def self.create(email)
6
+ result = Yammer.create_user(:email => email)
7
+ return nil unless result.created?
8
+ id = result.headers['Location'].split('/').last.to_i
9
+ new(:id => id)
10
+ end
11
+
12
+ # @!scope class
13
+ def self.current
14
+ result = Yammer.current_user
15
+ return nil unless result.success?
16
+ new(result.body)
17
+ end
18
+
19
+ attr_accessor_deffered :first_name, :last_name, :full_name, :hire_date, :mugshot, :state,
20
+ :type, :admin, :verified_admin, :expertise, :birth_date, :stats, :show_ask_for_photo, :job_title,
21
+ :web_url, :url, :external_urls, :activated_at, :summary, :department, :previous_companies,
22
+ :follow_general_messages, :schools, :interests, :significant_other, :network_name, :network_id,
23
+ :can_broadcast, :web_preferences, :network_domains, :location, :contact, :kids_names, :guid,
24
+ :name, :mugshot_url, :mugshot_url_template, :settings, :timezone
25
+
26
+ def email
27
+ @email ||= begin
28
+ self.contact[:email_addresses].map do |e|
29
+ e[:address] if e[:type] == 'primary'
30
+ end.first
31
+ end
32
+ end
33
+
34
+ def following
35
+ Yammer.users_followed_by(@id)
36
+ end
37
+
38
+ def followers
39
+ Yammer.users_following(@id)
40
+ end
41
+
42
+ def update!(params)
43
+ Yammer.update_user(@id, params)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,43 @@
1
+ module Yammer
2
+ class Response
3
+
4
+ attr_reader :code, :body, :headers
5
+
6
+ def initialize(response)
7
+ @headers = response.header
8
+ @body = response.body
9
+ @code = response.code.to_i
10
+ end
11
+
12
+ def raw_body
13
+ @body
14
+ end
15
+
16
+ def body
17
+ @parsed_body ||= parse(@body)
18
+ end
19
+
20
+ def empty?
21
+ @body.nil? || @body.strip.empty?
22
+ end
23
+
24
+ def success?
25
+ @code == 200
26
+ end
27
+
28
+ def created?
29
+ @code == 201
30
+ end
31
+
32
+ private
33
+
34
+ def parse(body)
35
+ case body
36
+ when /\A^\s*$\z/, nil
37
+ nil
38
+ else
39
+ MultiJson.load(body, :symbolize_keys => true)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,18 @@
1
+ module Yammer
2
+ class Version
3
+ MAJOR = 0 unless defined? Yammer::MAJOR
4
+ MINOR = 1 unless defined? Yammer::MINOR
5
+ PATCH = 0 unless defined? Yammer::PATCH
6
+ PRE = nil unless defined? Yammer::PRE
7
+
8
+ class << self
9
+
10
+ # @return [String]
11
+ def to_s
12
+ [MAJOR, MINOR, PATCH, PRE].compact.join('.')
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe Yammer::Api::Autocomplete do
4
+
5
+ before :all do
6
+ @client = Yammer::Client.new(
7
+ :site_url => 'https://www.yammer.com',
8
+ :client_id => 'PRbTcg9qjgKsp4jjpm1pw',
9
+ :client_secret => 'Xn7kp7Ly0TCY4GtZWkmSsqGEPg10DmMADyjWkf2U',
10
+ :access_token => 'TolNOFka9Uls2DxahNi78A',
11
+ :connection_client => Yammer::HttpConnection
12
+ )
13
+ end
14
+
15
+ subject { @client }
16
+
17
+ describe '#autocomplete' do
18
+ it 'should fetch autocomplete data' do
19
+ subject.should_receive(:get).with('/api/v1/autocomplete', { :prefix => 'alc' })
20
+ subject.autocomplete({ :prefix => 'alc' })
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe Yammer::Api::GroupMembership do
4
+
5
+ before :all do
6
+ @client = Yammer::Client.new(
7
+ :site_url => 'https://www.yammer.com',
8
+ :client_id => 'PRbTcg9qjgKsp4jjpm1pw',
9
+ :client_secret => 'Xn7kp7Ly0TCY4GtZWkmSsqGEPg10DmMADyjWkf2U',
10
+ :access_token => 'TolNOFka9Uls2DxahNi78A',
11
+ :connection_client => Yammer::HttpConnection
12
+ )
13
+ end
14
+
15
+ subject { @client }
16
+
17
+ describe '#get_group_membership' do
18
+ it 'should fetch a group membership' do
19
+ subject.should_receive(:get).with('/api/v1/group_memberships/1')
20
+ subject.get_group_membership(1)
21
+ end
22
+ end
23
+
24
+ describe '#create_group_membership' do
25
+ it 'should create a group membership' do
26
+ subject.should_receive(:post).with('/api/v1/group_memberships', { :group_id => 2 })
27
+ subject.create_group_membership(2)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe Yammer::Api::Group do
4
+
5
+ before :all do
6
+ @client = Yammer::Client.new(
7
+ :site_url => 'https://www.yammer.com',
8
+ :client_id => 'PRbTcg9qjgKsp4jjpm1pw',
9
+ :client_secret => 'Xn7kp7Ly0TCY4GtZWkmSsqGEPg10DmMADyjWkf2U',
10
+ :access_token => 'TolNOFka9Uls2DxahNi78A',
11
+ :connection_client => Yammer::HttpConnection
12
+ )
13
+ end
14
+
15
+ subject { @client }
16
+
17
+ describe '#all_groups' do
18
+ it 'should fetch all groups in network' do
19
+ subject.should_receive(:get).with('/api/v1/groups', {})
20
+ subject.all_groups
21
+ end
22
+ end
23
+
24
+ describe '#groups_for_user' do
25
+ it 'should fetch all groups for user' do
26
+ subject.should_receive(:get).with('/api/v1/groups/for_user/2')
27
+ subject.groups_for_user(2)
28
+ end
29
+ end
30
+
31
+ describe '#get_group' do
32
+ it 'should fetch a thread' do
33
+ subject.should_receive(:get).with('/api/v1/groups/1')
34
+ subject.get_group(1)
35
+ end
36
+ end
37
+
38
+ describe '#create_group' do
39
+ it 'should fetch a thread' do
40
+ subject.should_receive(:post).with('/api/v1/groups', {
41
+ :name => 'my group',
42
+ :description => 'A test group',
43
+ :private => false
44
+ })
45
+ subject.create_group(:name => 'my group', :description => 'A test group', :private => false)
46
+ end
47
+ end
48
+
49
+ describe '#update_group' do
50
+ it 'should fetch a thread' do
51
+ subject.should_receive(:post).with('/api/v1/groups/2', {
52
+ :name => 'another group',
53
+ :description => 'A modified group description',
54
+ })
55
+ subject.update_group(2, :name => 'another group', :description => 'A modified group description')
56
+ end
57
+ end
58
+ end