badgeville 0.0.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/.document +5 -0
- data/Gemfile +19 -0
- data/Gemfile.lock +40 -0
- data/README.md +35 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/examples/log_and_check_status.rb +9 -0
- data/keys.json.example +7 -0
- data/lib/badgeville.rb +77 -0
- data/lib/badgeville/activity.rb +19 -0
- data/lib/badgeville/reward.rb +38 -0
- data/spec/badgeville_spec.rb +37 -0
- data/spec/spec_helper.rb +13 -0
- metadata +130 -0
data/.document
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
# Please keep me alphabetized!
|
4
|
+
gem 'json'
|
5
|
+
gem 'rest-client'
|
6
|
+
# Please keep me alphabetized!
|
7
|
+
|
8
|
+
# Add dependencies to develop your gem here.
|
9
|
+
# Include everything needed to run rake, tests, features, etc.
|
10
|
+
group :development do
|
11
|
+
gem "rspec", "~> 2.3.0"
|
12
|
+
gem "bundler", "~> 1.0.0"
|
13
|
+
gem "jeweler", "~> 1.6.4"
|
14
|
+
gem "rcov", ">= 0"
|
15
|
+
end
|
16
|
+
|
17
|
+
group :test do
|
18
|
+
gem "webmock"
|
19
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.2.6)
|
5
|
+
crack (0.1.8)
|
6
|
+
diff-lcs (1.1.2)
|
7
|
+
git (1.2.5)
|
8
|
+
jeweler (1.6.4)
|
9
|
+
bundler (~> 1.0)
|
10
|
+
git (>= 1.2.5)
|
11
|
+
rake
|
12
|
+
json (1.5.3)
|
13
|
+
mime-types (1.16)
|
14
|
+
rake (0.8.7)
|
15
|
+
rcov (0.9.9)
|
16
|
+
rest-client (1.6.1)
|
17
|
+
mime-types (>= 1.16)
|
18
|
+
rspec (2.3.0)
|
19
|
+
rspec-core (~> 2.3.0)
|
20
|
+
rspec-expectations (~> 2.3.0)
|
21
|
+
rspec-mocks (~> 2.3.0)
|
22
|
+
rspec-core (2.3.1)
|
23
|
+
rspec-expectations (2.3.0)
|
24
|
+
diff-lcs (~> 1.1.2)
|
25
|
+
rspec-mocks (2.3.0)
|
26
|
+
webmock (1.6.4)
|
27
|
+
addressable (~> 2.2, > 2.2.5)
|
28
|
+
crack (>= 0.1.7)
|
29
|
+
|
30
|
+
PLATFORMS
|
31
|
+
ruby
|
32
|
+
|
33
|
+
DEPENDENCIES
|
34
|
+
bundler (~> 1.0.0)
|
35
|
+
jeweler (~> 1.6.4)
|
36
|
+
json
|
37
|
+
rcov
|
38
|
+
rest-client
|
39
|
+
rspec (~> 2.3.0)
|
40
|
+
webmock
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
Nitro API
|
2
|
+
============
|
3
|
+
|
4
|
+
Client for Badgeville API http://rules.badgeville.com/
|
5
|
+
|
6
|
+
(not complete)
|
7
|
+
|
8
|
+
Usage
|
9
|
+
--------
|
10
|
+
First, checkout the examples folder. TL;DR:
|
11
|
+
|
12
|
+
* create connection object with your api_key, and secret.
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
require 'badgeville'
|
16
|
+
settings = JSON.parse(File.read('keys.json.example'))
|
17
|
+
badgeville = Badgeville::Client.new(email, settings)
|
18
|
+
```
|
19
|
+
|
20
|
+
* log actions
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
badgeville.log_activity "commented"
|
24
|
+
```
|
25
|
+
|
26
|
+
Installing
|
27
|
+
----------
|
28
|
+
1) add to your Gemfile
|
29
|
+
|
30
|
+
```
|
31
|
+
gem 'badgeville'
|
32
|
+
```
|
33
|
+
|
34
|
+
2) Create a keys.json file with your api_key and secret (see keys.json.example file)
|
35
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
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 = "badgeville"
|
18
|
+
gem.homepage = "http://github.com/Keasinc/badgeville"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = "Client for Badgeville's Core API"
|
21
|
+
gem.description = "Client for Badgeville's Core API v2. http://rules.badgeville.com"
|
22
|
+
gem.authors = ["Gilad Buchman"]
|
23
|
+
# dependencies defined in Gemfile
|
24
|
+
end
|
25
|
+
Jeweler::RubygemsDotOrgTasks.new
|
26
|
+
|
27
|
+
require 'rspec/core'
|
28
|
+
require 'rspec/core/rake_task'
|
29
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
30
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
31
|
+
end
|
32
|
+
|
33
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
34
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
35
|
+
spec.rcov = true
|
36
|
+
end
|
37
|
+
|
38
|
+
task :default => :spec
|
39
|
+
|
40
|
+
require 'rake/rdoctask'
|
41
|
+
Rake::RDocTask.new do |rdoc|
|
42
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
43
|
+
|
44
|
+
rdoc.rdoc_dir = 'rdoc'
|
45
|
+
rdoc.title = "badgeville #{version}"
|
46
|
+
rdoc.rdoc_files.include('README*')
|
47
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
48
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/keys.json.example
ADDED
data/lib/badgeville.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'rest_client'
|
3
|
+
require 'badgeville/activity'
|
4
|
+
|
5
|
+
module Badgeville
|
6
|
+
TIMEOUT = 1000
|
7
|
+
HOST = "sandbox.v2.badgeville.com"
|
8
|
+
PROTOCOL = "http"
|
9
|
+
|
10
|
+
class BadgevilleError < StandardError
|
11
|
+
attr_accessor :code
|
12
|
+
|
13
|
+
def initialize (err_code=nil)
|
14
|
+
@code = err_code
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Client
|
19
|
+
|
20
|
+
def initialize (email, opts={})
|
21
|
+
# Required Parameters
|
22
|
+
@site = opts['site']
|
23
|
+
@private_key = opts['private_key']
|
24
|
+
@public_key = opts['public_key']
|
25
|
+
@host = opts['host'] || HOST
|
26
|
+
@protocol = opts['protocol'] || PROTOCOL
|
27
|
+
@user = email
|
28
|
+
end
|
29
|
+
|
30
|
+
def log_activity(activity, opts={})
|
31
|
+
params = {
|
32
|
+
"activity[verb]" => activity,
|
33
|
+
}
|
34
|
+
response = make_call(:post, :activities, params)
|
35
|
+
Activity.new(response)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def valid_response?(obj)
|
41
|
+
obj.is_a?(Array) || obj.is_a?(Hash)
|
42
|
+
end
|
43
|
+
|
44
|
+
def ensure_array(items)
|
45
|
+
items.is_a?(Array) ? items : [items]
|
46
|
+
end
|
47
|
+
|
48
|
+
def session
|
49
|
+
if @session.nil?
|
50
|
+
base_url = "#{@protocol}://#{@host}/api/berlin/#{@private_key}"
|
51
|
+
@session = RestClient::Resource.new base_url
|
52
|
+
end
|
53
|
+
@session
|
54
|
+
end
|
55
|
+
|
56
|
+
def make_call(method, action, params)
|
57
|
+
end_point = "#{action.to_s}.json"
|
58
|
+
params.merge!(:user => @user, :site => @site)
|
59
|
+
begin
|
60
|
+
response = session[end_point].send(method, to_query(params))
|
61
|
+
data = response.body
|
62
|
+
json = JSON.parse(data)
|
63
|
+
rescue => e
|
64
|
+
if e.respond_to? :response
|
65
|
+
data = JSON.parse(e.response)
|
66
|
+
raise BadgevilleError.new(e.code, data["error"])
|
67
|
+
else
|
68
|
+
raise e
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_query params
|
74
|
+
URI.escape(params.map { |k,v| "#{k.to_s}=#{v.to_s}" }.join("&"))
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'badgeville/reward'
|
3
|
+
|
4
|
+
module Badgeville
|
5
|
+
class Activity
|
6
|
+
attr_accessor :verb, :player_id, :user_id, :points, :rewards, :created_at, :meta
|
7
|
+
|
8
|
+
def initialize(json)
|
9
|
+
@verb = json.delete("verb")
|
10
|
+
@player_id = json.delete("player_id")
|
11
|
+
@user_id = json.delete("user_id")
|
12
|
+
@points = json.delete("points").to_i
|
13
|
+
@created_at = DateTime.parse(json.delete("created_at")).to_time
|
14
|
+
@rewards = json.delete("rewards").inject([]) do |rewards, award|
|
15
|
+
rewards << Reward.new(award["definition"])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Badgeville
|
2
|
+
class Reward
|
3
|
+
attr_accessor :name, :hint, :image_url, :active
|
4
|
+
end
|
5
|
+
|
6
|
+
# example:
|
7
|
+
# {
|
8
|
+
# "name": "A Way with Words",
|
9
|
+
# "active_start_at": null,
|
10
|
+
# "image_file_name": "9fQ2IU6-0.ftbs4fsoogp3c8fr.png",
|
11
|
+
# "data": {
|
12
|
+
# "verb": "commented",
|
13
|
+
# "threshold": 2
|
14
|
+
# },
|
15
|
+
# "created_at": "2011-08-18T22:55:03-07:00",
|
16
|
+
# "image_url": "http://s3.amazonaws.com/badgeville-production-reward-definitions/images/4e4dfab6c47eed727b005c38/original.png?1313733302",
|
17
|
+
# "components": "[{\"command\":\"count\",\"comparator\":{\"$gte\":2},\"config\":{},\"where\":{\"verb\":\"commented\",\"player_id\":\"%player_id\"}}]",
|
18
|
+
# "reward_template": {
|
19
|
+
# "message": ""
|
20
|
+
# },
|
21
|
+
# "_id": "4e4dfab6c47eed727b005c38",
|
22
|
+
# "tags": null,
|
23
|
+
# "id": "4e4dfab6c47eed727b005c38",
|
24
|
+
# "active_end_at": null,
|
25
|
+
# "type": "achievement",
|
26
|
+
# "hint": "Reply to 25 Comments",
|
27
|
+
# "assignable": false,
|
28
|
+
# "allow_duplicates": false,
|
29
|
+
# "site_id": "4e4d5bf5c47eed25a0000e8f",
|
30
|
+
# "active": true
|
31
|
+
# }
|
32
|
+
def initialize(json)
|
33
|
+
@name = json["name"]
|
34
|
+
@active = json["active"]
|
35
|
+
@hint = json["hint"]
|
36
|
+
@image_url = json["image_url"]
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Badgeville do
|
4
|
+
before do
|
5
|
+
@user = "user"
|
6
|
+
@badgeville = Badgeville::Client.new @user, 'private_key' => "api_key",
|
7
|
+
'site' => 'example.com'
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#log_activity" do
|
11
|
+
before do
|
12
|
+
action_name = "action"
|
13
|
+
@result = {"verb" => "commented",
|
14
|
+
"created_at" => "2011-08-30T12:27:47-07:00",
|
15
|
+
"points" => 0,
|
16
|
+
"player_id" => "4e5d3992c47eed202d00148c",
|
17
|
+
"user_id" => "4e5d3992c47eed202d00148b",
|
18
|
+
"rewards" =>[]
|
19
|
+
}
|
20
|
+
|
21
|
+
body = "activity[verb]=#{action_name}&user=#{@user}&site=example.com"
|
22
|
+
url = "http://" + Badgeville::HOST + ".*activities.json"
|
23
|
+
|
24
|
+
stub_http_request(:post, Regexp.new(url)).with(:body => body).
|
25
|
+
to_return(:body => @result.to_json)
|
26
|
+
|
27
|
+
@activity = @badgeville.log_activity action_name
|
28
|
+
end
|
29
|
+
|
30
|
+
it "parses response from activity record api call" do
|
31
|
+
@activity.verb.should == "commented"
|
32
|
+
@activity.created_at.iso8601.should == @result["created_at"]
|
33
|
+
@activity.points.should == 0
|
34
|
+
@activity.rewards.should be_empty
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'rspec'
|
4
|
+
require 'badgeville'
|
5
|
+
require 'webmock/rspec'
|
6
|
+
|
7
|
+
# Requires supporting files with custom matchers and macros, etc,
|
8
|
+
# in ./support/ and its subdirectories.
|
9
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: badgeville
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Gilad Buchman
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-08-30 00:00:00.000000000 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json
|
17
|
+
requirement: &2160484700 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2160484700
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rest-client
|
28
|
+
requirement: &2160483340 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *2160483340
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
requirement: &2160482360 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.3.0
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2160482360
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: bundler
|
50
|
+
requirement: &2160481280 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.0.0
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2160481280
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: jeweler
|
61
|
+
requirement: &2160480100 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.6.4
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *2160480100
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rcov
|
72
|
+
requirement: &2160479240 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *2160479240
|
81
|
+
description: Client for Badgeville's Core API v2. http://rules.badgeville.com
|
82
|
+
email:
|
83
|
+
executables: []
|
84
|
+
extensions: []
|
85
|
+
extra_rdoc_files:
|
86
|
+
- README.md
|
87
|
+
files:
|
88
|
+
- .document
|
89
|
+
- Gemfile
|
90
|
+
- Gemfile.lock
|
91
|
+
- README.md
|
92
|
+
- Rakefile
|
93
|
+
- VERSION
|
94
|
+
- examples/log_and_check_status.rb
|
95
|
+
- keys.json.example
|
96
|
+
- lib/badgeville.rb
|
97
|
+
- lib/badgeville/activity.rb
|
98
|
+
- lib/badgeville/reward.rb
|
99
|
+
- spec/badgeville_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
has_rdoc: true
|
102
|
+
homepage: http://github.com/Keasinc/badgeville
|
103
|
+
licenses:
|
104
|
+
- MIT
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
hash: -517773847151955177
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 1.6.2
|
127
|
+
signing_key:
|
128
|
+
specification_version: 3
|
129
|
+
summary: Client for Badgeville's Core API
|
130
|
+
test_files: []
|