mirror of
				https://github.com/nov/fb_graph2
				synced 2023-03-27 23:22:15 -04:00 
			
		
		
		
	initial commit
This commit is contained in:
		
						commit
						f6aee7496e
					
				
					 17 changed files with 328 additions and 0 deletions
				
			
		
							
								
								
									
										22
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
*.gem
 | 
			
		||||
*.rbc
 | 
			
		||||
.bundle
 | 
			
		||||
.config
 | 
			
		||||
.yardoc
 | 
			
		||||
Gemfile.lock
 | 
			
		||||
InstalledFiles
 | 
			
		||||
_yardoc
 | 
			
		||||
coverage
 | 
			
		||||
doc/
 | 
			
		||||
lib/bundler/man
 | 
			
		||||
pkg
 | 
			
		||||
rdoc
 | 
			
		||||
spec/reports
 | 
			
		||||
test/tmp
 | 
			
		||||
test/version_tmp
 | 
			
		||||
tmp
 | 
			
		||||
*.bundle
 | 
			
		||||
*.so
 | 
			
		||||
*.o
 | 
			
		||||
*.a
 | 
			
		||||
mkmf.log
 | 
			
		||||
							
								
								
									
										4
									
								
								Gemfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Gemfile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
source 'https://rubygems.org'
 | 
			
		||||
 | 
			
		||||
# Specify your gem's dependencies in fb_graph2.gemspec
 | 
			
		||||
gemspec
 | 
			
		||||
							
								
								
									
										22
									
								
								LICENSE.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								LICENSE.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
Copyright (c) 2014 nov matake
 | 
			
		||||
 | 
			
		||||
MIT License
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining
 | 
			
		||||
a copy of this software and associated documentation files (the
 | 
			
		||||
"Software"), to deal in the Software without restriction, including
 | 
			
		||||
without limitation the rights to use, copy, modify, merge, publish,
 | 
			
		||||
distribute, sublicense, and/or sell copies of the Software, and to
 | 
			
		||||
permit persons to whom the Software is furnished to do so, subject to
 | 
			
		||||
the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be
 | 
			
		||||
included in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
			
		||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 | 
			
		||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | 
			
		||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | 
			
		||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										29
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
# FbGraph2
 | 
			
		||||
 | 
			
		||||
TODO: Write a gem description
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
Add this line to your application's Gemfile:
 | 
			
		||||
 | 
			
		||||
    gem 'fb_graph2'
 | 
			
		||||
 | 
			
		||||
And then execute:
 | 
			
		||||
 | 
			
		||||
    $ bundle
 | 
			
		||||
 | 
			
		||||
Or install it yourself as:
 | 
			
		||||
 | 
			
		||||
    $ gem install fb_graph2
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
TODO: Write usage instructions here
 | 
			
		||||
 | 
			
		||||
## Contributing
 | 
			
		||||
 | 
			
		||||
1. Fork it ( https://github.com/[my-github-username]/fb_graph2/fork )
 | 
			
		||||
2. Create your feature branch (`git checkout -b my-new-feature`)
 | 
			
		||||
3. Commit your changes (`git commit -am 'Add some feature'`)
 | 
			
		||||
4. Push to the branch (`git push origin my-new-feature`)
 | 
			
		||||
5. Create a new Pull Request
 | 
			
		||||
							
								
								
									
										18
									
								
								Rakefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Rakefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
require 'bundler/gem_tasks'
 | 
			
		||||
 | 
			
		||||
require 'rspec/core/rake_task'
 | 
			
		||||
RSpec::Core::RakeTask.new(:spec)
 | 
			
		||||
 | 
			
		||||
namespace :coverage do
 | 
			
		||||
  desc 'Open coverage report'
 | 
			
		||||
  task :report do
 | 
			
		||||
    require 'simplecov'
 | 
			
		||||
    `open '#{File.join SimpleCov.coverage_path, 'index.html'}'`
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
task :spec do
 | 
			
		||||
  Rake::Task[:'coverage:report'].invoke unless ENV['TRAVIS_RUBY_VERSION']
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
task :default => :spec
 | 
			
		||||
							
								
								
									
										1
									
								
								VERSION
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								VERSION
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
0.0.1
 | 
			
		||||
							
								
								
									
										23
									
								
								fb_graph2.gemspec
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								fb_graph2.gemspec
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
Gem::Specification.new do |gem|
 | 
			
		||||
  gem.name          = 'fb_graph2'
 | 
			
		||||
  gem.version       = File.read('VERSION').delete("\n\r")
 | 
			
		||||
  gem.authors       = ['nov matake']
 | 
			
		||||
  gem.email         = ['nov@matake.jp']
 | 
			
		||||
  gem.summary       = %q{Facebook Graph API v2.0 Wrapper in Ruby}
 | 
			
		||||
  gem.description   = %q{Facebook Graph API v2.0 Wrapper in Ruby}
 | 
			
		||||
  gem.homepage      = ''
 | 
			
		||||
  gem.license       = 'MIT'
 | 
			
		||||
 | 
			
		||||
  gem.files         = `git ls-files -z`.split("\x0")
 | 
			
		||||
  gem.executables   = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
 | 
			
		||||
  gem.test_files    = gem.files.grep(%r{^(test|gem|features)/})
 | 
			
		||||
  gem.require_paths = ['lib']
 | 
			
		||||
 | 
			
		||||
  gem.add_runtime_dependency 'httpclient', '>= 2.3'
 | 
			
		||||
  gem.add_runtime_dependency 'rack-oauth2', '>= 1.0'
 | 
			
		||||
  gem.add_runtime_dependency 'multi_json'
 | 
			
		||||
  gem.add_runtime_dependency 'activesupport', '>= 4.0'
 | 
			
		||||
  gem.add_development_dependency 'rake'
 | 
			
		||||
  gem.add_development_dependency 'simplecov'
 | 
			
		||||
  gem.add_development_dependency 'rspec', '>= 2'
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										40
									
								
								lib/fb_graph2.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								lib/fb_graph2.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,40 @@
 | 
			
		|||
require 'active_support/all'
 | 
			
		||||
require 'rack/oauth2'
 | 
			
		||||
 | 
			
		||||
module FbGraph2
 | 
			
		||||
  VERSION = File.read(File.join(__dir__, '../VERSION')).delete("\n\r")
 | 
			
		||||
  ROOT_URL = 'https://graph.facebook.com/v2.0'
 | 
			
		||||
 | 
			
		||||
  cattr_accessor :logger, :debugging, :_http_config_
 | 
			
		||||
  self.logger = Logger.new(STDOUT)
 | 
			
		||||
  self.logger.progname = 'FbGraph2'
 | 
			
		||||
 | 
			
		||||
  class << self
 | 
			
		||||
    def debugging?
 | 
			
		||||
      !!self.debugging
 | 
			
		||||
    end
 | 
			
		||||
    def debug!
 | 
			
		||||
      Rack::OAuth2.debug!
 | 
			
		||||
      self.debugging = true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def http_client(access_token = nil)
 | 
			
		||||
      _http_client_ = HTTPClient.new(
 | 
			
		||||
        agent_name: "FbGraph2 (#{VERSION})"
 | 
			
		||||
      )
 | 
			
		||||
      _http_client_.request_filter << RequestFilters::Authenticator.new(access_token) if access_token.present?
 | 
			
		||||
      _http_client_.request_filter << RequestFilters::Debugger.new if self.debugging?
 | 
			
		||||
      _http_config_.try(:call, _http_client_)
 | 
			
		||||
      _http_client_
 | 
			
		||||
    end
 | 
			
		||||
    def http_config(&block)
 | 
			
		||||
      Rack::OAuth2.http_config &block unless Rack::OAuth2.http_config
 | 
			
		||||
      self._http_config_ ||= block
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
require 'fb_graph2/node'
 | 
			
		||||
Dir[File.dirname(__FILE__) + '/fb_graph2/*.rb'].each do |file|
 | 
			
		||||
  require file
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										60
									
								
								lib/fb_graph2/node.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								lib/fb_graph2/node.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
module FbGraph2
 | 
			
		||||
  class Node
 | 
			
		||||
    attr_accessor :id, :access_token, :raw_attributes
 | 
			
		||||
 | 
			
		||||
    def initialize(id, attributes = {})
 | 
			
		||||
      self.id = id
 | 
			
		||||
      self.raw_attributes = attributes
 | 
			
		||||
      self.access_token = attributes[:access_token]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def fetch(params = {}, options = {})
 | 
			
		||||
      self.access_token ||= options[:access_token]
 | 
			
		||||
      _fetched_ = get params, options
 | 
			
		||||
      _fetched_[:access_token] ||= self.access_token
 | 
			
		||||
      self.class.new(_fetched_[:id], _fetched_)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def self.fetch(identifier, options = {})
 | 
			
		||||
      new(identifier).fetch(options)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    protected
 | 
			
		||||
 | 
			
		||||
    def http_client
 | 
			
		||||
      FbGraph2.http_client access_token
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def get(params = {}, options = {})
 | 
			
		||||
      handle_response do
 | 
			
		||||
        http_client.get build_endpoint(options), build_params(params)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def build_endpoint(options = {})
 | 
			
		||||
      File.join([
 | 
			
		||||
        File.join(ROOT_URL, id.to_s),
 | 
			
		||||
        options[:connection],
 | 
			
		||||
        options[:connection_scope]
 | 
			
		||||
      ].compact.collect(&:to_s))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def build_params(params = {})
 | 
			
		||||
      params.present? ? params : nil
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def handle_response
 | 
			
		||||
      response = yield
 | 
			
		||||
      _response_ = MultiJson.load(response.body).with_indifferent_access
 | 
			
		||||
      if (200...300).include?(response.status)
 | 
			
		||||
        _response_
 | 
			
		||||
      else
 | 
			
		||||
        Exception.handle_structured_response(response.status, _response_, response.headers)
 | 
			
		||||
      end
 | 
			
		||||
    rescue MultiJson::DecodeError
 | 
			
		||||
      raise Exception.new(response.status, "Unparsable Response: #{response.body}")
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										3
									
								
								lib/fb_graph2/request_filters.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/fb_graph2/request_filters.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
Dir[File.dirname(__FILE__) + '/request_filters/*.rb'].each do |file|
 | 
			
		||||
  require file
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										17
									
								
								lib/fb_graph2/request_filters/authenticator.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								lib/fb_graph2/request_filters/authenticator.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
module FbGraph2
 | 
			
		||||
  module RequestFilters
 | 
			
		||||
    class Authenticator < Rack::OAuth2::AccessToken::Authenticator
 | 
			
		||||
      def initialize(access_token)
 | 
			
		||||
        _access_token_ = case access_token
 | 
			
		||||
        when Rack::OAuth2::AccessToken
 | 
			
		||||
          access_token
 | 
			
		||||
        else
 | 
			
		||||
          Rack::OAuth2::AccessToken::Bearer.new(
 | 
			
		||||
            access_token: access_token
 | 
			
		||||
          )
 | 
			
		||||
        end
 | 
			
		||||
        super _access_token_
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										23
									
								
								lib/fb_graph2/request_filters/debugger.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								lib/fb_graph2/request_filters/debugger.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
module FbGraph2
 | 
			
		||||
  module RequestFilters
 | 
			
		||||
    class Debugger
 | 
			
		||||
      def filter_request(request)
 | 
			
		||||
        started = "======= [FbGraph2] API REQUEST STARTED ======="
 | 
			
		||||
        log started, request.dump
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def filter_response(request, response)
 | 
			
		||||
        finished = "======= [FbGraph2] API REQUEST FINISHED ======="
 | 
			
		||||
        log '-' * 50, response.dump, finished
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      private
 | 
			
		||||
 | 
			
		||||
      def log(*outputs)
 | 
			
		||||
        outputs.each do |output|
 | 
			
		||||
          FbGraph2.logger.info output
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										7
									
								
								lib/fb_graph2/user.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								lib/fb_graph2/user.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
module FbGraph2
 | 
			
		||||
  class User < Node
 | 
			
		||||
    def self.me(access_token)
 | 
			
		||||
      new(:me, access_token: access_token)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										16
									
								
								spec/fb_graph2/node_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								spec/fb_graph2/node_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
require 'spec_helper'
 | 
			
		||||
 | 
			
		||||
describe FbGraph2::Node do
 | 
			
		||||
  describe '.new' do
 | 
			
		||||
    it 'should support access_token option' do
 | 
			
		||||
      FbGraph2::Node.new(
 | 
			
		||||
        'matake', :access_token => 'access_token'
 | 
			
		||||
      ).access_token.should be_a Rack::OAuth2::AccessToken
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'should store raw attributes' do
 | 
			
		||||
      attributes = {:key => :value}
 | 
			
		||||
      FbGraph2::Node.new(12345, attributes).raw_attributes.should == attributes
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										0
									
								
								spec/fb_graph2/user_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								spec/fb_graph2/user_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										35
									
								
								spec/fb_graph2_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								spec/fb_graph2_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
require 'spec_helper'
 | 
			
		||||
 | 
			
		||||
describe FbGraph2 do
 | 
			
		||||
  subject { FbGraph2 }
 | 
			
		||||
  after { FbGraph2.debugging = false }
 | 
			
		||||
 | 
			
		||||
  its(:logger) { should be_a Logger }
 | 
			
		||||
  its(:debugging?) { should be_false }
 | 
			
		||||
 | 
			
		||||
  describe '.debug!' do
 | 
			
		||||
    before { FbGraph2.debug! }
 | 
			
		||||
    its(:debugging?) { should be_true }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '.http_client' do
 | 
			
		||||
    context 'with http_config' do
 | 
			
		||||
      before do
 | 
			
		||||
        FbGraph2.http_config do |config|
 | 
			
		||||
          config.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
 | 
			
		||||
          config.connect_timeout = 30
 | 
			
		||||
          config.send_timeout    = 40
 | 
			
		||||
          config.receive_timeout = 60
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      it 'should configure Rack::OAuth2 and FbGraph2 http_client' do
 | 
			
		||||
        [Rack::OAuth2, FbGraph2].each do |klass|
 | 
			
		||||
          klass.http_client.ssl_config.verify_mode.should == OpenSSL::SSL::VERIFY_NONE
 | 
			
		||||
          klass.http_client.connect_timeout.should == 30
 | 
			
		||||
          klass.http_client.send_timeout.should    == 40
 | 
			
		||||
          klass.http_client.receive_timeout.should == 60
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										8
									
								
								spec/spec_helper.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								spec/spec_helper.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
require 'simplecov'
 | 
			
		||||
 | 
			
		||||
SimpleCov.start do
 | 
			
		||||
  add_filter 'spec'
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
require 'rspec'
 | 
			
		||||
require 'fb_graph2'
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue