refacebook 0.4.1

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.
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