klout 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format d
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ rvm: 1.9.2
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'json'
4
+ gem 'xml-simple'
5
+
6
+ group :development do
7
+ gem 'bundler', '~> 1.0.0'
8
+ gem 'fakeweb'
9
+ gem 'guard-rspec'
10
+ gem 'jeweler', '~> 1.6.4'
11
+ gem 'simplecov'
12
+ gem 'rspec'
13
+ end
data/Guardfile ADDED
@@ -0,0 +1,21 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :version => 2 do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+
9
+ # Rails example
10
+ watch(%r{^spec/.+_spec\.rb$})
11
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
12
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
13
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
14
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
15
+ watch('spec/spec_helper.rb') { "spec" }
16
+ watch('config/routes.rb') { "spec/routing" }
17
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
18
+ # Capybara request specs
19
+ watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
20
+ end
21
+
data/README.rdoc ADDED
@@ -0,0 +1,51 @@
1
+ = Klout
2
+
3
+ Klout is a Ruby gem that provides a wrapper for interacting with the {Klout API}[http://developer.klout.com/docs/read/api/API].
4
+
5
+ == Requirements
6
+
7
+ You will need a {Klout API Key}[http://developer.klout.com/member/register] in order to get started.
8
+
9
+ == Installation
10
+
11
+ (sudo) gem install klout
12
+
13
+ == Usage
14
+
15
+ Please refer to the {Klout API Documentation}[http://developer.klout.com/docs/read/api/API] for more information about the API, or follow the examples below:
16
+
17
+ k = Klout::API.new('your_secret_api_key')
18
+
19
+ There are also configuration options:
20
+
21
+ k = Klout::API.new('your_secret_api_key', {:format => 'xml', :secure => true})
22
+
23
+ Once you have created a Klout object, you can interact with the API to find out how much influence certain Twitter users have. You can also pass comma-delimited string of multiple Twitter usernames as well.
24
+
25
+ k.klout('dhh')
26
+ k.klout('dhh, rails')
27
+
28
+ k.show('dhh')
29
+ k.topics('dhh')
30
+
31
+ k.influencer_of('rails')
32
+ k.influenced_by('dhh, rails')
33
+
34
+ == Travis Build Status
35
+
36
+ {<img src="http://travis-ci.org/terra-firma/klout.png" />}[http://travis-ci.org/terra-firma/klout]
37
+
38
+ == Contributing to Klout
39
+
40
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
41
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
42
+ * Fork the project.
43
+ * Start a feature/bugfix branch.
44
+ * Commit and push until you are happy with your contribution.
45
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
46
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
47
+
48
+ == Copyright
49
+
50
+ Copyright (c) 2011 Terra Firma Design & Consulting. See LICENSE.txt for further details.
51
+
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'bundler'
4
+
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "klout"
18
+ gem.homepage = "http://github.com/terra-firma/klout"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Ruby gem for interacting with the Klout API.}
21
+ gem.description = %Q{Ruby gem for interacting with the Klout API.}
22
+ gem.email = "brian@terra-firma-design.com"
23
+ gem.authors = ["Brian Getting"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ task :default => :test
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
+ rdoc.rdoc_dir = 'rdoc'
41
+ rdoc.title = "klout #{version}"
42
+ rdoc.rdoc_files.include('README*')
43
+ rdoc.rdoc_files.include('lib/**/*.rb')
44
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.1
data/klout.gemspec ADDED
@@ -0,0 +1,73 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{klout}
8
+ s.version = "1.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Brian Getting}]
12
+ s.date = %q{2012-02-02}
13
+ s.description = %q{Ruby gem for interacting with the Klout API.}
14
+ s.email = %q{brian@terra-firma-design.com}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".rspec",
20
+ ".travis.yml",
21
+ "Gemfile",
22
+ "Guardfile",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "klout.gemspec",
27
+ "lib/klout.rb",
28
+ "lib/klout/api.rb",
29
+ "spec/klout/fixtures/klout.json",
30
+ "spec/klout/fixtures/klout.xml",
31
+ "spec/klout/klout_spec.rb",
32
+ "spec/spec_helper.rb"
33
+ ]
34
+ s.homepage = %q{http://github.com/terra-firma/klout}
35
+ s.licenses = [%q{MIT}]
36
+ s.require_paths = [%q{lib}]
37
+ s.rubygems_version = %q{1.8.8}
38
+ s.summary = %q{Ruby gem for interacting with the Klout API.}
39
+
40
+ if s.respond_to? :specification_version then
41
+ s.specification_version = 3
42
+
43
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
44
+ s.add_runtime_dependency(%q<json>, [">= 0"])
45
+ s.add_runtime_dependency(%q<xml-simple>, [">= 0"])
46
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
47
+ s.add_development_dependency(%q<fakeweb>, [">= 0"])
48
+ s.add_development_dependency(%q<guard-rspec>, [">= 0"])
49
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
50
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
51
+ s.add_development_dependency(%q<rspec>, [">= 0"])
52
+ else
53
+ s.add_dependency(%q<json>, [">= 0"])
54
+ s.add_dependency(%q<xml-simple>, [">= 0"])
55
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
56
+ s.add_dependency(%q<fakeweb>, [">= 0"])
57
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
58
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
59
+ s.add_dependency(%q<simplecov>, [">= 0"])
60
+ s.add_dependency(%q<rspec>, [">= 0"])
61
+ end
62
+ else
63
+ s.add_dependency(%q<json>, [">= 0"])
64
+ s.add_dependency(%q<xml-simple>, [">= 0"])
65
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
66
+ s.add_dependency(%q<fakeweb>, [">= 0"])
67
+ s.add_dependency(%q<guard-rspec>, [">= 0"])
68
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
69
+ s.add_dependency(%q<simplecov>, [">= 0"])
70
+ s.add_dependency(%q<rspec>, [">= 0"])
71
+ end
72
+ end
73
+
data/lib/klout.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'rubygems'
4
+ require 'json'
5
+ require 'xmlsimple'
6
+
7
+ require 'klout/api'
data/lib/klout/api.rb ADDED
@@ -0,0 +1,57 @@
1
+ module Klout
2
+ class API
3
+ # Blank slate
4
+ instance_methods.each do |m|
5
+ undef_method m unless m.to_s =~ /^__|object_id|method_missing|respond_to?|to_s|inspect/
6
+ end
7
+
8
+ # Initialize
9
+ def initialize(api_key, config = {})
10
+ defaults = {
11
+ :format => 'json',
12
+ :secure => false
13
+ }
14
+ @config = defaults.merge(config).freeze
15
+ @api_key = api_key
16
+ protocol = @config[:secure] ? 'https' : 'http'
17
+ api_base = URI.parse("#{protocol}://api.klout.com/")
18
+ @klout_api = Net::HTTP.new(api_base.host, api_base.port)
19
+ end
20
+
21
+ # Class Methods
22
+ def call(api_method, usernames)
23
+ path = '/1'
24
+ path += '/users' if ['show', 'topics'].include?(api_method.to_s)
25
+ path += '/soi' if ['influenced_by', 'influencer_of'].include?(api_method.to_s)
26
+ path += "/#{api_method}.#{@config[:format]}"
27
+ path += "?key=#{@api_key}"
28
+ path += "&users=#{URI.escape(usernames.gsub(/ /,''))}"
29
+ url = Net::HTTP::Get.new(path)
30
+ response = @klout_api.request(url)
31
+ # TODO: Clean this up when Klout fixes their ambiguous 404 responses.
32
+ raise APIError.new(response.code, response.message) if response.code.to_i > 202
33
+ return nil if response.body == ''
34
+ @config[:format] == 'xml' ? XmlSimple.xml_in(response.body, {'ForceArray' => false}) : JSON.parse(response.body)
35
+ end
36
+
37
+ def method_missing(api_method, *args) # :nodoc:
38
+ call(api_method, *args)
39
+ # TODO: Need Klout to fix their ambiguous 404 responses.
40
+ #rescue Klout::APIError => error
41
+ #super if error.message == "<404> Not Found"
42
+ end
43
+
44
+ def respond_to?(api_method) # :nodoc:
45
+ call(api_method, 'twitter')
46
+ rescue Klout::APIError => error
47
+ error.message == "<404> Not Found" ? false : true
48
+ end
49
+ end
50
+
51
+ class APIError < StandardError
52
+ # Initialize
53
+ def initialize(code, message)
54
+ super "<#{code}> #{message}"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": 200,
3
+ "users": [
4
+ {
5
+ "twitter_screen_name": "sampler",
6
+ "kscore": "30.01"
7
+ },
8
+ {
9
+ "twitter_screen_name": "another",
10
+ "kscore": "60.02"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <users>
3
+ <user>
4
+ <twitter_screen_name>sampler</twitter_screen_name>
5
+ <kscore>30.01</kscore>
6
+ </user>
7
+ <user>
8
+ <twitter_screen_name>another</twitter_screen_name>
9
+ <kscore>60.02</kscore>
10
+ </user>
11
+ </users>
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ module Klout
4
+ describe API do
5
+
6
+ API_URL = "http://api.klout.com/1"
7
+ API_URL_SECURE = "http://api.klout.com:443/1"
8
+
9
+ it "requires an API key" do
10
+ expect {Klout::API.new}.should raise_error(ArgumentError)
11
+ end
12
+
13
+ it "also accepts config options" do
14
+ expect {Klout::API.new(@api_key, {:secure => true})}.should_not raise_error(ArgumentError)
15
+ end
16
+
17
+ it "requires username passed to methods" do
18
+ k = Klout::API.new(@apikey)
19
+ expect {k.klout}.should raise_error(ArgumentError)
20
+ end
21
+
22
+ it "can make a request to the API" do
23
+ FakeWeb.register_uri(:get, "#{API_URL}/klout.json?key=#{@api_key}&users=testuser", :body => @json_response)
24
+ k = Klout::API.new(@api_key)
25
+ k.klout('testuser')['status'].should eq(200)
26
+ end
27
+
28
+ it "can make a secure request to the API" do
29
+ FakeWeb.register_uri(:get, "#{API_URL_SECURE}/klout.json?key=#{@api_key}&users=testuser", :body => @json_response)
30
+ k = Klout::API.new(@api_key, {:secure => true})
31
+ k.klout('testuser')['users'].first['kscore'].should eq("30.01")
32
+ end
33
+
34
+ it "can return XML from the API" do
35
+ FakeWeb.register_uri(:get, "#{API_URL}/klout.xml?key=#{@api_key}&users=testuser", :body => @xml_response)
36
+ k = Klout::API.new(@api_key, {:format => 'xml'})
37
+ k.klout('testuser')['user'].first['kscore'].should eq("30.01")
38
+ end
39
+
40
+ it "injects the 'user' prefix for user requests" do
41
+ FakeWeb.register_uri(:get, "#{API_URL}/users/show.json?key=#{@api_key}&users=testuser", :body => @json_response)
42
+ k = Klout::API.new(@api_key)
43
+ k.show('testuser')['status'].should eq(200)
44
+ end
45
+
46
+ it "injects the 'soi' prefix for influence requests" do
47
+ FakeWeb.register_uri(:get, "#{API_URL}/soi/influenced_by.json?key=#{@api_key}&users=testuser", :body => @json_response)
48
+ k = Klout::API.new(@api_key)
49
+ k.influenced_by('testuser')['status'].should eq(200)
50
+ end
51
+
52
+ it "only responds to methods supported by the Klout API" do
53
+ FakeWeb.register_uri(:get, "#{API_URL}/bogus_method.json?key=#{@api_key}&users=twitter", :status => ["404", "Not Found"])
54
+ k = Klout::API.new(@api_key)
55
+ k.respond_to?("bogus_method").should eq(false)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,13 @@
1
+ require 'fakeweb'
2
+ require 'klout'
3
+
4
+ FakeWeb.allow_net_connect = false
5
+
6
+ RSpec.configure do |config|
7
+ config.before(:each) do
8
+ FakeWeb.clean_registry
9
+ @api_key = 'valid-api-key'
10
+ @json_response = File.read(File.expand_path('spec/klout/fixtures/klout.json'))
11
+ @xml_response = File.read(File.expand_path('spec/klout/fixtures/klout.xml'))
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: klout
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Brian Getting
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-02 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: &2165150660 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2165150660
25
+ - !ruby/object:Gem::Dependency
26
+ name: xml-simple
27
+ requirement: &2165149560 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2165149560
36
+ - !ruby/object:Gem::Dependency
37
+ name: bundler
38
+ requirement: &2165148720 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.0
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2165148720
47
+ - !ruby/object:Gem::Dependency
48
+ name: fakeweb
49
+ requirement: &2165147780 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2165147780
58
+ - !ruby/object:Gem::Dependency
59
+ name: guard-rspec
60
+ requirement: &2165146760 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2165146760
69
+ - !ruby/object:Gem::Dependency
70
+ name: jeweler
71
+ requirement: &2165145780 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 1.6.4
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2165145780
80
+ - !ruby/object:Gem::Dependency
81
+ name: simplecov
82
+ requirement: &2165144920 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2165144920
91
+ - !ruby/object:Gem::Dependency
92
+ name: rspec
93
+ requirement: &2165128940 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2165128940
102
+ description: Ruby gem for interacting with the Klout API.
103
+ email: brian@terra-firma-design.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files:
107
+ - README.rdoc
108
+ files:
109
+ - .rspec
110
+ - .travis.yml
111
+ - Gemfile
112
+ - Guardfile
113
+ - README.rdoc
114
+ - Rakefile
115
+ - VERSION
116
+ - klout.gemspec
117
+ - lib/klout.rb
118
+ - lib/klout/api.rb
119
+ - spec/klout/fixtures/klout.json
120
+ - spec/klout/fixtures/klout.xml
121
+ - spec/klout/klout_spec.rb
122
+ - spec/spec_helper.rb
123
+ homepage: http://github.com/terra-firma/klout
124
+ licenses:
125
+ - MIT
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ segments:
137
+ - 0
138
+ hash: -135046269901848319
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubyforge_project:
147
+ rubygems_version: 1.8.8
148
+ signing_key:
149
+ specification_version: 3
150
+ summary: Ruby gem for interacting with the Klout API.
151
+ test_files: []