refacebook 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ === 0.4.0 / 2009-04-13
2
+
3
+ * Cleaned up abstraction between memcache store and the refacebook class.
4
+
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,55 @@
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
+ gemspec.rubyforge_project = "refacebook"
16
+
17
+ if defined?(JRUBY_VERSION)
18
+ gemspec.add_dependency("json-jruby", [">= 1.1.3"])
19
+ else
20
+ gemspec.add_dependency("json", [">= 1.1.4"])
21
+ end
22
+
23
+ gemspec.add_dependency("memcache-client", [">= 1.7.1"])
24
+ end
25
+ rescue LoadError
26
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
27
+ end
28
+
29
+ begin
30
+ require 'rake/contrib/sshpublisher'
31
+ namespace :rubyforge do
32
+
33
+ desc "Release gem and RDoc documentation to RubyForge"
34
+ task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
35
+
36
+ namespace :release do
37
+ desc "Publish RDoc to RubyForge."
38
+ task :docs => [:rdoc] do
39
+ config = YAML.load(
40
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
41
+ )
42
+
43
+ host = "#{config['username']}@rubyforge.org"
44
+ remote_dir = "/var/www/gforge-projects/the-perfect-gem/"
45
+ local_dir = 'rdoc'
46
+
47
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
48
+ end
49
+ end
50
+ end
51
+ rescue LoadError
52
+ puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
53
+ end
54
+
55
+ # vim: syntax=Ruby
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 4
3
+ :major: 0
4
+ :patch: 1
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
@@ -0,0 +1,58 @@
1
+ require 'sinatra/base'
2
+ require 'refacebook'
3
+
4
+ module Sinatra
5
+ module ReFacebookHelper
6
+ def in_canvas?
7
+ params["fb_sig_in_canvas"].eql? "1"
8
+ end
9
+
10
+ # Return a url prefixed with the canvas url with a path given as an argument.
11
+ def link_from_canvas(path="")
12
+ path = (path.empty? || path.eql?("/")) ? "" : "/#{path}"
13
+ "#{options.canvas_url}#{path}"
14
+ end
15
+
16
+ def fbml_redirect(url)
17
+ halt "<fb:redirect url=\"#{url}\" />"
18
+ end
19
+ end
20
+
21
+ module ReFacebookRegister
22
+ def require_facebook *args
23
+ settings = args[0]
24
+
25
+ configure do
26
+ set :canvas_url, settings[:canvas_url]
27
+ end
28
+
29
+ before do
30
+ # Passes the request to the correct request method since canvas requests
31
+ # come in as POSTs.
32
+ if params["fb_sig_in_canvas"].eql? "1" and params["fb_sig_request_method"].eql? "GET"
33
+ request.env['REQUEST_METHOD'] = 'GET'
34
+ end
35
+
36
+ if params['fb_sig_session_key']
37
+ @fbsession = settings[:store].get(params['fb_sig_session_key'])
38
+ @fbsession = ReFacebook::Session.new(settings[:api_key], settings[:secret_key]) unless @fbsession
39
+ @fbsession.update_session_params(params)
40
+
41
+ expiry = @fbsession.expires.to_i - @fbsession.time.to_i
42
+ settings[:store].set(params['fb_sig_session_key'], @fbsession, expiry)
43
+ else
44
+ # Just return a session, even if it's not a lasting session.
45
+ @fbsession = ReFacebook::Session.new(settings[:api_key], settings[:secret_key])
46
+ end
47
+
48
+ if settings[:require_login] and !params['fb_sig_session_key']
49
+ fbml_redirect(@fbsession.get_login_url(:next => link_from_canvas(request.fullpath),
50
+ :canvas => true))
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ helpers ReFacebookHelper
57
+ register ReFacebookRegister
58
+ end
data/lib/refacebook.rb ADDED
@@ -0,0 +1,96 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'md5'
4
+ require 'json'
5
+
6
+ # ReFacebook the main store for a facebook session.
7
+ module ReFacebook
8
+ APIRestServer = "http://api.facebook.com/restserver.php"
9
+ LoginUrl = "http://www.facebook.com/login.php"
10
+
11
+ class Session
12
+ attr_reader :api_key, :secret, :api
13
+
14
+ attr_accessor :user, :friends, :session_key,
15
+ :expires, :time, :profile_update_time
16
+
17
+ def initialize api_key, secret
18
+ @api_key = api_key
19
+ @secret = secret
20
+ @api = API.new(api_key, secret)
21
+
22
+ %w{user friends session_key expires time profile_update_time}.each do |var|
23
+ instance_variable_set "@#{var}", nil
24
+ end
25
+ end
26
+
27
+ def update_session_params params
28
+ @user = params['fb_sig_user']
29
+ @friends = params['fb_sig_friends'].split(',')
30
+
31
+ @session_key = params['fb_sig_session_key']
32
+
33
+ @expires = params['fb_sig_expires']
34
+ @time = params['fb_sig_time']
35
+
36
+ @profile_update_time = params['fb_sig_profile_update_time']
37
+ end
38
+
39
+ def get_login_url *args
40
+ params = {}
41
+ params['v'] = '1.0'
42
+ params['api_key'] = @api_key
43
+ params['next'] = args[0][:next]
44
+
45
+ if args[0][:canvas]
46
+ params['canvas'] = '1'
47
+ end
48
+
49
+ LoginUrl + '?' + params.collect {|k,v| "#{k}=#{v}"}.join('&')
50
+ end
51
+
52
+ def session_key=(session_key)
53
+ @session_key = @api.session_key = session_key
54
+ end
55
+ end
56
+
57
+ class API
58
+ attr_accessor :session_key
59
+
60
+ def initialize api_key, secret
61
+ @api_key = api_key
62
+ @secret = secret
63
+ @session_key = nil
64
+ end
65
+
66
+ def method_missing method, *args
67
+ request = {}
68
+
69
+ args[0].each {|k,v| request[k.to_s] = v } if args[0]
70
+
71
+ request['api_key'] = @api_key
72
+ request['format'] = 'json' unless request['json']
73
+ request['method'] = method.to_s.gsub(/_/, '.')
74
+ request['session_key'] = @session_key if @session
75
+ request['v'] = '1.0' unless request['v']
76
+
77
+ request['sig'] = generate_sig(request.sort)
78
+
79
+ # FIXME: Implement.
80
+ return if request['method'].eql? 'batch.run'
81
+
82
+ req = Net::HTTP.post_form(URI.parse(APIRestServer), request)
83
+ JSON.parse("[#{req.body}]")
84
+ end
85
+
86
+ private
87
+ # args = array of args to the request, not counting sig, formatted in non-urlencoded arg=val pairs
88
+ # sorted_array = alphabetically_sort_array_by_keys(args);
89
+ # request_str = concatenate_in_order(sorted_array);
90
+ # signature = md5(concatenate(request_str, secret))
91
+ def generate_sig args
92
+ request_str = args.collect { |k,v| "#{k}=#{v}" }.join ''
93
+ MD5.hexdigest(request_str.concat(@secret));
94
+ end
95
+ end
96
+ 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
+ required_ruby_version: !ruby/object:Gem::Requirement
3
+ requirements:
4
+ - - '>='
5
+ - !ruby/object:Gem::Version
6
+ version: "0"
7
+ version:
8
+ email: abhi@traytwo.com
9
+ cert_chain: []
10
+
11
+ summary: ReFacebook is a facebook library and Sinatra extension.
12
+ post_install_message:
13
+ extra_rdoc_files:
14
+ - README.txt
15
+ homepage: http://github.com/abhiyerra/refacebook
16
+ signing_key:
17
+ name: refacebook
18
+ rdoc_options:
19
+ - --charset=UTF-8
20
+ autorequire:
21
+ rubyforge_project: refacebook
22
+ executables:
23
+ - refacebook
24
+ description: ReFacebook is a facebook library and Sinatra extension.
25
+ specification_version: 2
26
+ default_executable: refacebook
27
+ files:
28
+ - History.txt
29
+ - Manifest.txt
30
+ - README.txt
31
+ - Rakefile
32
+ - VERSION.yml
33
+ - bin/refacebook
34
+ - examples/example.rb
35
+ - lib/refacebook.rb
36
+ - lib/refacebook/sinatra.rb
37
+ - test/test_refacebook.rb
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: "0"
43
+ version:
44
+ extensions: []
45
+
46
+ rubygems_version: 1.3.1
47
+ requirements: []
48
+
49
+ authors:
50
+ - Abhi Yerra
51
+ date: 2009-04-13 00:00:00 Z
52
+ platform: ruby
53
+ test_files:
54
+ - test/test_refacebook.rb
55
+ - examples/example.rb
56
+ version: !ruby/object:Gem::Version
57
+ version: 0.4.1
58
+ require_paths:
59
+ - lib
60
+ dependencies:
61
+ - !ruby/object:Gem::Dependency
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: 1.1.3
67
+ version:
68
+ type: :runtime
69
+ version_requirement:
70
+ name: json-jruby
71
+ - !ruby/object:Gem::Dependency
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.7.1
77
+ version:
78
+ type: :runtime
79
+ version_requirement:
80
+ name: memcache-client
81
+ bindir: bin
82
+ has_rdoc: true