Simplified Buzz sample app
authorJennifer Murphy <mimming@google.com>
Wed, 7 Sep 2011 01:48:29 +0000 (18:48 -0700)
committerJennifer Murphy <mimming@google.com>
Wed, 7 Sep 2011 01:48:29 +0000 (18:48 -0700)
Added README for Buzz sample app

examples/README [new file with mode: 0644]
examples/buzz.rb

diff --git a/examples/README b/examples/README
new file mode 100644 (file)
index 0000000..db5f569
--- /dev/null
@@ -0,0 +1,58 @@
+# Buzz Ruby Sample #
+This is a simple starter project written in Ruby which provides a minimal
+example of Buzz integration within a Sinatra web application.
+
+Once you've run the starter project and played with the features it provides,
+this starter project provides a great place to start your experimentation into
+the API.
+
+## Prerequisites ##
+Please make sure that all of these are installed before you try to run the
+sample.
+
+- Ruby 1.8.7+
+- Ruby Gems 1.3.7+
+- Are you on a Mac? If so, be sure you have XCode 3.2+
+- A few gems (run 'sudo gem install <gem name>' to install)
+-- sinatra
+-- httpadapter
+-- extlib
+-- dm-sqlite-adapter
+-- google-api-ruby-client
+
+## Setup Authentication ##
+
+This API uses OAuth 2.0. Learn more about Google APIs and OAuth 2.0 here:
+http://code.google.com/apis/accounts/docs/OAuth2.html
+
+Or, if you'd like to dive right in, follow these steps.
+ - Visit https://code.google.com/apis/console/ to register your application.
+ - From the "Project Home" screen, activate access to "Buzz API".
+ - Click on "API Access" in the left column
+ - Click the button labeled "Create an OAuth2 client ID"
+ - Give your application a name and click "Next"
+ - Select "Web Application" as the "Application type"
+ - Under "Your Site or Hostname" select http:// as the protocol and enter
+   "localhost" for the domain name
+ - click "Create client ID"
+
+Edit the buzz.rb file and enter the values for the following properties that 
+you retrieved from the API Console:
+
+ - oauth_client_id
+ - oauth_client_secret
+
+Or, include them in the command line as the first two arguments.
+
+## Running the Sample ##
+
+I'm assuming you've checked out the code and are reading this from a local
+directory. If not check out the code to a local directory.
+
+1. Start up the embedded Sinatra web server
+
+  $ ruby buzz.rb
+
+2. Open your web browser and see your activities! Go to http://localhost:4567/
+
+3. Be inspired and start hacking an amazing new web app!
index 631136a38e733c95378bbbd9d5954c572270c19c..bea6ff12006f44c240b7ee6a89f6a2b32f978663 100644 (file)
 $:.unshift('lib')
+#####!/usr/bin/ruby1.8
+
+# Copyright:: Copyright 2011 Google Inc.
+# License:: All Rights Reserved.
+# Original Author:: Bob Aman
+# Maintainer:: Daniel Dobson (mailto:wolff@google.com)
+# Maintainer:: Jenny Murphy (mailto:mimming@google.com)
+
 require 'rubygems'
 require 'sinatra'
-require 'datamapper'
 require 'google/api_client'
+require 'httpadapter/adapters/net_http'
+require 'pp'
 
 use Rack::Session::Pool, :expire_after => 86400 # 1 day
 
-# Set up our token store
-DataMapper.setup(:default, 'sqlite::memory:')
-class TokenPair
-  include DataMapper::Resource
+# Configuration
+# See README for getting API id and secret
+
+if (ARGV.size < 2)
+  set :oauth_client_id, 'oauth_client_id'
+  set :oauth_client_secret, 'oauth_client_secret'
+
+  if (settings.oauth_client_id == 'oauth_client_id')
+    puts 'See README for getting API id and secret.  Server terminated.'
+    exit(0)
+  end
+else
+  set :oauth_client_id, ARGV[0]
+  set :oauth_client_secret, ARGV[1]
+end
 
-  property :id, Serial
-  property :refresh_token, String
-  property :access_token, String
-  property :expires_in, Integer
-  property :issued_at, Integer
+# Configuration that you probably don't have to change
+set :oauth_scopes, 'https://www.googleapis.com/auth/buzz'
+
+class TokenPair
+  @refresh_token
+  @access_token
+  @expires_in
+  @issued_at
 
   def update_token!(object)
-    self.refresh_token = object.refresh_token
-    self.access_token = object.access_token
-    self.expires_in = object.expires_in
-    self.issued_at = object.issued_at
+    @refresh_token = object.refresh_token
+    @access_token = object.access_token
+    @expires_in = object.expires_in
+    @issued_at = object.issued_at
   end
 
   def to_hash
     return {
-      :refresh_token => refresh_token,
-      :access_token => access_token,
-      :expires_in => expires_in,
-      :issued_at => Time.at(issued_at)
+      :refresh_token => @refresh_token,
+      :access_token => @access_token,
+      :expires_in => @expires_in,
+      :issued_at => Time.at(@issued_at)
     }
   end
 end
-TokenPair.auto_migrate!
 
+# At the beginning of any request, make sure the OAuth token is available.
+# If it's not available, kick off the OAuth 2 flow to authorize.
 before do
-  @client = Google::APIClient.new
-  @client.authorization.client_id = '245083617981.apps.googleusercontent.com'
-  @client.authorization.client_secret = 'pYelZCRjSa+iMezYENVScXFk'
-  @client.authorization.scope = 'https://www.googleapis.com/auth/buzz'
+  @client = Google::APIClient.new(
+    :authorization => :oauth_2,
+    :host => 'www.googleapis.com',
+    :http_adapter => HTTPAdapter::NetHTTPAdapter.new
+  )
+
+  @client.authorization.client_id = settings.oauth_client_id
+  @client.authorization.client_secret = settings.oauth_client_secret
+  @client.authorization.scope = settings.oauth_scopes
   @client.authorization.redirect_uri = to('/oauth2callback')
   @client.authorization.code = params[:code] if params[:code]
-  if session[:token_id]
+  if session[:token]
     # Load the access token here if it's available
-    token_pair = TokenPair.get(session[:token_id])
-    @client.authorization.update_token!(token_pair.to_hash)
-  end
-  if @client.authorization.refresh_token && @client.authorization.expired?
-    @client.authorization.fetch_access_token!
+    @client.authorization.update_token!(session[:token].to_hash)
   end
+
   @buzz = @client.discovered_api('buzz')
   unless @client.authorization.access_token || request.path_info =~ /^\/oauth2/
     redirect to('/oauth2authorize')
   end
 end
 
+# Part of the OAuth flow
 get '/oauth2authorize' do
-  redirect @client.authorization.authorization_uri.to_s, 303
+  <<OUT
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <title>Google Ruby API Buzz Sample</title>
+</head>
+<body>
+<header><h1>Google Ruby API Buzz Sample</h1></header>
+<div class="box">
+<a class='login' href='#{@client.authorization.authorization_uri.to_s}'>Connect Me!</a>
+</div>
+</body>
+</html>
+OUT
 end
 
+# Part of the OAuth flow
 get '/oauth2callback' do
   @client.authorization.fetch_access_token!
-  # Persist the token here
-  token_pair = if session[:token_id]
-    TokenPair.get(session[:token_id])
-  else
-    TokenPair.new
+  unless session[:token]
+    token_pair = TokenPair.new
+    token_pair.update_token!(@client.authorization)
+    # Persist the token here
+    session[:token] = token_pair
   end
-  token_pair.update_token!(@client.authorization)
-  token_pair.save()
-  session[:token_id] = token_pair.id
   redirect to('/')
 end
 
+# The method you're probably actually interested in. This one lists a page of your
+# most recent activities
 get '/' do
-  result = @client.execute(
+  response = @client.execute(
     @buzz.activities.list,
-    {'userId' => '@me', 'scope' => '@consumption', 'alt'=> 'json'}
+    'userId' => '@me', 'scope' => '@consumption', 'alt'=> 'json'
   )
-  status, _, _ = result.response
-  [status, {'Content-Type' => 'application/json'}, JSON.generate(result.data)]
+  status, headers, body = response
+  [status, {'Content-Type' => 'application/json'}, body]
 end