facebook-graphclient 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'facebook-graphclient'
3
- s.version = '0.2'
4
- s.date = '2010-05-24'
3
+ s.version = '0.3'
4
+ s.date = '2010-12-12'
5
5
  s.summary = "A simple library for Facebook's new Graph API"
6
6
  s.description = "A bare-bones implementation of Facebook's new Graph API"
7
7
 
@@ -9,6 +9,7 @@ require 'rack'
9
9
 
10
10
  module Facebook
11
11
  GRAPH_URL = 'https://graph.facebook.com'
12
+ API_URL = 'https://api.facebook.com/method/'
12
13
 
13
14
  class GraphClient
14
15
 
@@ -21,14 +22,13 @@ module Facebook
21
22
  @secret = facebook_settings[:secret]
22
23
 
23
24
  @cookie = get_user_cookie facebook_settings[:cookies]
24
-
25
25
  @access_token = facebook_settings[:access_token] || @cookie['access_token']
26
-
27
26
  @session = Patron::Session.new
28
27
  end
29
28
 
30
29
  def get_user_cookie cookies
31
30
  if cookies and cookie = cookies["fbs_#{@app_id}"]
31
+ cookie = cookie[1..-2] if cookie[0..0] == '"'
32
32
  Rack::Utils.parse_nested_query(cookie)
33
33
  else
34
34
  {}
@@ -43,10 +43,10 @@ module Facebook
43
43
  ]
44
44
  end
45
45
 
46
- def api action, method, query_params = nil
46
+ def api action, method, query_params = {}
47
47
  query_params[:access_token] ||= @access_token
48
-
49
48
  query_string = '?' + query_params.map { |k,v| "#{k}=#{v}" }.join("&") unless query_params.empty?
49
+ query_string ||= ''
50
50
 
51
51
  tries = 0
52
52
  begin
@@ -105,7 +105,7 @@ module Facebook
105
105
  def valid?
106
106
  return false if @cookie.nil?
107
107
 
108
- unless @is_valid
108
+ if @is_valid.nil?
109
109
  vars = @cookie.dup
110
110
 
111
111
  good_sig = vars.delete 'sig'
@@ -128,5 +128,65 @@ module Facebook
128
128
  def params
129
129
  valid? ? @params : {}
130
130
  end
131
+
132
+ def rest(method, opts = {})
133
+ if method == 'photos.upload'
134
+ image = opts.delete :image
135
+ end
136
+
137
+ opts = { :api_key => self.api_key,
138
+ :call_id => Time.now.to_f,
139
+ :format => 'JSON',
140
+ :v => '1.0',
141
+ :access_token => @access_token,
142
+ :session_key => %w[ photos.upload ].include?(method) ? nil : params[:session_key],
143
+ :method => method }.merge(opts)
144
+
145
+ args = opts.map{ |k,v|
146
+ next nil unless v
147
+
148
+ "#{k}=" + case v
149
+ when Hash
150
+ Yajl::Encoder.encode(v)
151
+ when Array
152
+ if k == :tags
153
+ Yajl::Encoder.encode(v)
154
+ else
155
+ v.join(',')
156
+ end
157
+ else
158
+ v.to_s
159
+ end
160
+ }.compact.sort
161
+
162
+ sig = Digest::MD5.hexdigest(args.join+self.secret)
163
+
164
+ if method == 'photos.upload'
165
+ data = MimeBoundary
166
+ data += opts.merge(:sig => sig).inject('') do |buf, (key, val)|
167
+ if val
168
+ buf << (MimePart % [key, val])
169
+ else
170
+ buf
171
+ end
172
+ end
173
+ data += MimeImage % ['upload.jpg', 'jpg', image.respond_to?(:read) ? image.read : image]
174
+ else
175
+ data = Array["sig=#{sig}", *args.map{|a| a.gsub('&','%26').gsub('+','%2B') }].join('&')
176
+ end
177
+
178
+ raw_response = @session.post(API_URL + method, data)
179
+
180
+ json = ["false", '', nil].include?(raw_response.body) ? '{}' : raw_response.body
181
+ response = Yajl::Parser.parse(json)
182
+
183
+ if response.is_a?(Hash) and response.has_key?('error_code')
184
+ error = FacebookError.new(response['error_msg'])
185
+ error.data = response
186
+ raise error
187
+ else
188
+ response
189
+ end
190
+ end
131
191
  end
132
192
  end
metadata CHANGED
@@ -1,11 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facebook-graphclient
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 13
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 2
8
- version: "0.2"
8
+ - 3
9
+ version: "0.3"
9
10
  platform: ruby
10
11
  authors:
11
12
  - Jesse Farmer
@@ -13,16 +14,18 @@ autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
15
16
 
16
- date: 2010-05-24 00:00:00 -07:00
17
+ date: 2010-12-12 00:00:00 -08:00
17
18
  default_executable:
18
19
  dependencies:
19
20
  - !ruby/object:Gem::Dependency
20
21
  name: yajl-ruby
21
22
  prerelease: false
22
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
23
25
  requirements:
24
26
  - - ">="
25
27
  - !ruby/object:Gem::Version
28
+ hash: 3
26
29
  segments:
27
30
  - 0
28
31
  version: "0"
@@ -32,9 +35,11 @@ dependencies:
32
35
  name: patron
33
36
  prerelease: false
34
37
  requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
35
39
  requirements:
36
40
  - - ">="
37
41
  - !ruby/object:Gem::Version
42
+ hash: 3
38
43
  segments:
39
44
  - 0
40
45
  version: "0"
@@ -44,9 +49,11 @@ dependencies:
44
49
  name: rack
45
50
  prerelease: false
46
51
  requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
47
53
  requirements:
48
54
  - - ">="
49
55
  - !ruby/object:Gem::Version
56
+ hash: 3
50
57
  segments:
51
58
  - 0
52
59
  version: "0"
@@ -75,23 +82,27 @@ rdoc_options: []
75
82
  require_paths:
76
83
  - lib
77
84
  required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
78
86
  requirements:
79
87
  - - ">="
80
88
  - !ruby/object:Gem::Version
89
+ hash: 3
81
90
  segments:
82
91
  - 0
83
92
  version: "0"
84
93
  required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
85
95
  requirements:
86
96
  - - ">="
87
97
  - !ruby/object:Gem::Version
98
+ hash: 3
88
99
  segments:
89
100
  - 0
90
101
  version: "0"
91
102
  requirements: []
92
103
 
93
104
  rubyforge_project:
94
- rubygems_version: 1.3.6
105
+ rubygems_version: 1.3.7
95
106
  signing_key:
96
107
  specification_version: 3
97
108
  summary: A simple library for Facebook's new Graph API