abhiyerra-refacebook 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2009-04-13
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
data/Manifest.txt ADDED
@@ -0,0 +1,7 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/blah
6
+ lib/blah.rb
7
+ test/test_blah.rb
data/README.txt ADDED
@@ -0,0 +1,60 @@
1
+ = refacebook
2
+
3
+ * http://github.com/abhiyerra/refacebook/
4
+
5
+ == DESCRIPTION:
6
+
7
+ ReFacebook is a facebook library and Sinatra extension.
8
+
9
+ == TODO:
10
+
11
+ * Need to document the code.
12
+ * Need helpers to make life easier.
13
+ * Abstract the session store so it's not reliant on the set and get. Also,
14
+ remove the :store option eventually since that seems like a copout method
15
+ and doesn't add simplicity.
16
+ * Make the api spit out an exception if call returns error.
17
+ * Have a better example application with fbml, api, and all that good stuff.
18
+ * Write unit tests
19
+ * Test with ruby 1.9, remove json dep if 1.9 since json is included.
20
+
21
+
22
+ == SYNOPSIS:
23
+
24
+ To see how to use the library please look at examples/example.rb
25
+
26
+ == REQUIREMENTS:
27
+
28
+ RubyGems
29
+ * json
30
+ * memcache-client
31
+
32
+ == INSTALL:
33
+
34
+ sudo gem sources -a http://gems.github.com
35
+ sudo gem install abhiyerra-refacebook
36
+
37
+ == LICENSE:
38
+
39
+ (The MIT License)
40
+
41
+ Copyright (c) 2009 Abhi Yerra <abhi@traytwo.com>
42
+
43
+ Permission is hereby granted, free of charge, to any person obtaining
44
+ a copy of this software and associated documentation files (the
45
+ 'Software'), to deal in the Software without restriction, including
46
+ without limitation the rights to use, copy, modify, merge, publish,
47
+ distribute, sublicense, and/or sell copies of the Software, and to
48
+ permit persons to whom the Software is furnished to do so, subject to
49
+ the following conditions:
50
+
51
+ The above copyright notice and this permission notice shall be
52
+ included in all copies or substantial portions of the Software.
53
+
54
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
55
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
57
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
58
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
59
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
60
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require './lib/refacebook.rb'
5
+
6
+ begin
7
+ require 'jeweler'
8
+ Jeweler::Tasks.new do |gemspec|
9
+ gemspec.name = "refacebook"
10
+ gemspec.summary = "ReFacebook is a facebook library and Sinatra extension."
11
+ gemspec.email = "abhi@traytwo.com"
12
+ gemspec.homepage = "http://github.com/abhiyerra/refacebook"
13
+ gemspec.description = "ReFacebook is a facebook library and Sinatra extension."
14
+ gemspec.authors = ["Abhi Yerra"]
15
+
16
+ if defined?(JRUBY_VERSION)
17
+ gemspec.add_dependency("json-jruby", [">= 1.1.3"])
18
+ else
19
+ gemspec.add_dependency("json", [">= 1.1.4"])
20
+ end
21
+
22
+ gemspec.add_dependency("memcache-client", [">= 1.7.1"])
23
+ end
24
+ rescue LoadError
25
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
26
+ end
27
+
28
+ # vim: syntax=Ruby
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 3
3
+ :major: 0
4
+ :patch: 3
data/bin/refacebook ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ abort "you need to write me"
@@ -0,0 +1,33 @@
1
+ $:.push('../lib/')
2
+
3
+ require 'rubygems'
4
+ require 'sinatra'
5
+ require 'refacebook'
6
+ require 'refacebook/sinatra'
7
+ require 'memcache'
8
+
9
+ set :port, 3000
10
+
11
+ store = MemCache.new 'localhost:11211'
12
+
13
+ require_facebook(:api_key =>'2a7a86cd4ea39bb7ea4eaabb938acb86',
14
+ :secret_key => '662361041ddcb4b3f7df0f4b092249ee',
15
+ :canvas_url => 'http://apps.facebook.com/traytwo',
16
+ :require_login => true,
17
+ :store => store)
18
+
19
+ get '/' do
20
+ body params.collect {|k,v| "#{k} = #{v}<br/>" }
21
+ end
22
+
23
+ get '/link_from_canvas' do
24
+ body link_from_canvas("in_canvas")
25
+ end
26
+
27
+ get '/in_canvas' do
28
+ if in_canvas?
29
+ body "yes"
30
+ else
31
+ body "no"
32
+ end
33
+ end
data/lib/refacebook.rb ADDED
@@ -0,0 +1,121 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'md5'
4
+ require 'json'
5
+
6
+ module ReFacebook
7
+ VERSION = "0.3.2"
8
+
9
+ APIRestServer = "http://api.facebook.com/restserver.php"
10
+ LoginUrl = "http://www.facebook.com/login.php"
11
+
12
+ class Session
13
+ attr_reader :api_key, :secret, :api
14
+
15
+ attr_accessor :user, :friends, :session_key,
16
+ :expires, :time, :profile_update_time
17
+
18
+ def initialize api_key, secret
19
+ @api_key = api_key
20
+ @secret = secret
21
+ @api = API.new(api_key, secret)
22
+
23
+ %w{user friends session_key expires time profile_update_time}.each do |var|
24
+ instance_variable_set "@#{var}", nil
25
+ end
26
+ end
27
+
28
+ # FIXME: Currently the store is relying on the idea that we have a memcache
29
+ # store. Abstract this so that it uses rack/session/abstract/id.
30
+ def self.create api_key, secret, params, *args
31
+ store = args[0][:store]
32
+ unless store
33
+ # TODO: Exception or error.
34
+ end
35
+
36
+ session = nil
37
+
38
+ if params['fb_sig_session_key']
39
+ # TODO: Maybe we can only reset the items that need to be reset,
40
+ # since I doubt that all of these change all the time.
41
+ session = store.get(params['fb_sig_session_key'])
42
+ session = new(api_key, secret) if session.nil?
43
+
44
+ session.user = params['fb_sig_user']
45
+ session.friends = params['fb_sig_friends'].split(',')
46
+
47
+ session.session_key = params['fb_sig_session_key']
48
+
49
+ session.expires = params['fb_sig_expires']
50
+ session.time = params['fb_sig_time']
51
+
52
+ session.profile_update_time = params['fb_sig_profile_update_time']
53
+
54
+ expiry = session.expires.to_i - session.time.to_i
55
+ store.set(params['fb_sig_session_key'], session, expiry)
56
+ else
57
+ # Just return a session, even if it's not a lasting session.
58
+ session = new(api_key, secret)
59
+ end
60
+
61
+ session
62
+ end
63
+
64
+ def get_login_url *args
65
+ params = {}
66
+ params['v'] = '1.0'
67
+ params['api_key'] = @api_key
68
+ params['next'] = args[0][:next]
69
+
70
+ if args[0][:canvas]
71
+ params['canvas'] = '1'
72
+ end
73
+
74
+ LoginUrl + '?' + params.collect {|k,v| "#{k}=#{v}"}.join('&')
75
+ end
76
+
77
+ def session_key=(session_key)
78
+ @session_key = @api.session_key = session_key
79
+ end
80
+ end
81
+
82
+ class API
83
+ attr_accessor :session_key
84
+
85
+ def initialize api_key, secret
86
+ @api_key = api_key
87
+ @secret = secret
88
+ @session_key = nil
89
+ end
90
+
91
+ def method_missing method, *args
92
+ request = {}
93
+
94
+ args[0].each {|k,v| request[k.to_s] = v } if args[0]
95
+
96
+ request['api_key'] = @api_key
97
+ request['format'] = 'json' unless request['json']
98
+ request['method'] = method.to_s.gsub(/_/, '.')
99
+ request['session_key'] = @session_key if @session
100
+ request['v'] = '1.0' unless request['v']
101
+
102
+ request['sig'] = generate_sig(request.sort)
103
+
104
+ # FIXME: Implement.
105
+ return if request['method'].eql? 'batch.run'
106
+
107
+ req = Net::HTTP.post_form(URI.parse(APIRestServer), request)
108
+ JSON.parse("[#{req.body}]")
109
+ end
110
+
111
+ private
112
+ # args = array of args to the request, not counting sig, formatted in non-urlencoded arg=val pairs
113
+ # sorted_array = alphabetically_sort_array_by_keys(args);
114
+ # request_str = concatenate_in_order(sorted_array);
115
+ # signature = md5(concatenate(request_str, secret))
116
+ def generate_sig args
117
+ request_str = args.collect { |k,v| "#{k}=#{v}" }.join ''
118
+ MD5.hexdigest(request_str.concat(@secret));
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,48 @@
1
+ require 'sinatra/base'
2
+ require 'rack'
3
+ require 'refacebook'
4
+
5
+ module Sinatra
6
+ module ReFacebookHelper
7
+ def in_canvas?
8
+ params["fb_sig_in_canvas"].eql? "1"
9
+ end
10
+
11
+ # Return a url prefixed with the canvas url with a path given as an argument.
12
+ def link_from_canvas(path="")
13
+ path = (path.empty? || path.eql?("/")) ? "" : "/#{path}"
14
+ "#{options.canvas_url}#{path}"
15
+ end
16
+
17
+ def fbml_redirect(url)
18
+ halt "<fb:redirect url=\"#{url}\" />"
19
+ end
20
+ end
21
+
22
+ module ReFacebookRegister
23
+ def require_facebook *args
24
+ settings = args[0]
25
+
26
+ configure do
27
+ set :canvas_url, settings[:canvas_url]
28
+ end
29
+
30
+ before do
31
+ # Passes the request to the correct request method since canvas requests
32
+ # come in as POSTs.
33
+ request.env['REQUEST_METHOD'] = 'GET' if params["fb_sig_in_canvas"].eql? "1" \
34
+ and params["fb_sig_request_method"].eql? "GET"
35
+
36
+ @fbsession = ReFacebook::Session.create(settings[:api_key], settings[:secret_key], params, :store => settings[:store])
37
+
38
+ if settings[:require_login] and !params['fb_sig_session_key']
39
+ fbml_redirect(@fbsession.get_login_url(:next => link_from_canvas(request.fullpath),
40
+ :canvas => true))
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ helpers ReFacebookHelper
47
+ register ReFacebookRegister
48
+ end
@@ -0,0 +1,8 @@
1
+ require "test/unit"
2
+ require "refacebook"
3
+
4
+ class TestRefacebook < Test::Unit::TestCase
5
+ def test_sanity
6
+ flunk "write tests or I will kneecap you"
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: abhiyerra-refacebook
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.3
5
+ platform: ruby
6
+ authors:
7
+ - Abhi Yerra
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-13 00:00:00 -07:00
13
+ default_executable: refacebook
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json-jruby
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.1.3
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: memcache-client
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.7.1
34
+ version:
35
+ description: ReFacebook is a facebook library and Sinatra extension.
36
+ email: abhi@traytwo.com
37
+ executables:
38
+ - refacebook
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README.txt
43
+ files:
44
+ - History.txt
45
+ - Manifest.txt
46
+ - README.txt
47
+ - Rakefile
48
+ - VERSION.yml
49
+ - bin/refacebook
50
+ - examples/example.rb
51
+ - lib/refacebook.rb
52
+ - lib/refacebook/sinatra.rb
53
+ - test/test_refacebook.rb
54
+ has_rdoc: true
55
+ homepage: http://github.com/abhiyerra/refacebook
56
+ post_install_message:
57
+ rdoc_options:
58
+ - --charset=UTF-8
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
73
+ requirements: []
74
+
75
+ rubyforge_project:
76
+ rubygems_version: 1.2.0
77
+ signing_key:
78
+ specification_version: 2
79
+ summary: ReFacebook is a facebook library and Sinatra extension.
80
+ test_files:
81
+ - test/test_refacebook.rb
82
+ - examples/example.rb