badgeville 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -23,6 +23,23 @@ badgeville = Badgeville::Client.new(email, settings)
23
23
  badgeville.log_activity "commented"
24
24
  ```
25
25
 
26
+ * get all logged activities
27
+
28
+ ```ruby
29
+ badgeville.get_activities
30
+ ```
31
+
32
+ * get list of reward definitions
33
+
34
+ ```ruby
35
+ badgeville.reward_definitions
36
+ ```
37
+
38
+ * manually award some reward
39
+ ```ruby
40
+ badgeville.award "Best User"
41
+ ```
42
+
26
43
  Installing
27
44
  ----------
28
45
  1) add to your Gemfile
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -0,0 +1,67 @@
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{badgeville}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Gilad Buchman"]
12
+ s.date = %q{2011-09-06}
13
+ s.description = %q{Client for Badgeville's Core API v2. http://rules.badgeville.com}
14
+ s.extra_rdoc_files = [
15
+ "README.md"
16
+ ]
17
+ s.files = [
18
+ ".document",
19
+ "Gemfile",
20
+ "Gemfile.lock",
21
+ "README.md",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "badgeville.gemspec",
25
+ "examples/log_and_check_status.rb",
26
+ "keys.json.example",
27
+ "lib/badgeville.rb",
28
+ "lib/badgeville/activity.rb",
29
+ "lib/badgeville/reward.rb",
30
+ "spec/badgeville_spec.rb",
31
+ "spec/reward_spec.rb",
32
+ "spec/spec_helper.rb"
33
+ ]
34
+ s.homepage = %q{http://github.com/Keasinc/badgeville}
35
+ s.licenses = ["MIT"]
36
+ s.require_paths = ["lib"]
37
+ s.rubygems_version = %q{1.6.2}
38
+ s.summary = %q{Client for Badgeville's Core 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<rest-client>, [">= 0"])
46
+ s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
47
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
48
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
49
+ s.add_development_dependency(%q<rcov>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<json>, [">= 0"])
52
+ s.add_dependency(%q<rest-client>, [">= 0"])
53
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
54
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
55
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
56
+ s.add_dependency(%q<rcov>, [">= 0"])
57
+ end
58
+ else
59
+ s.add_dependency(%q<json>, [">= 0"])
60
+ s.add_dependency(%q<rest-client>, [">= 0"])
61
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
62
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
64
+ s.add_dependency(%q<rcov>, [">= 0"])
65
+ end
66
+ end
67
+
@@ -4,6 +4,15 @@ require 'badgeville'
4
4
  require 'pp'
5
5
 
6
6
  settings = JSON.parse(File.read('keys.json'))
7
- badgeville = Badgeville::Client.new('4@keas.com', settings)
7
+ badgeville = Badgeville::Client.new('me@example.com', settings)
8
+
9
+ pp badgeville.reward_definitions #all defined definitions for site
8
10
 
9
11
  pp badgeville.log_activity "commented"
12
+
13
+ pp badgeville.log_activity "join_team", :team => "myteam"
14
+
15
+ pp badgeville.get_activities
16
+ pp badgeville.get_rewards #earned for user
17
+
18
+ badgeville.award "Best User Ever"
@@ -1,6 +1,7 @@
1
1
  require 'json'
2
2
  require 'rest_client'
3
3
  require 'badgeville/activity'
4
+ require 'badgeville/reward'
4
5
 
5
6
  module Badgeville
6
7
  TIMEOUT = 1000
@@ -16,6 +17,7 @@ module Badgeville
16
17
  end
17
18
 
18
19
  class Client
20
+ attr_accessor :user, :site, :player_id, :site_id
19
21
 
20
22
  def initialize (email, opts={})
21
23
  # Required Parameters
@@ -31,10 +33,88 @@ module Badgeville
31
33
  params = {
32
34
  "activity[verb]" => activity,
33
35
  }
36
+ opts.inject(params) do |params, entry|
37
+ k, v = entry
38
+ params["activity[#{k.to_s}]"] = v
39
+ params
40
+ end
34
41
  response = make_call(:post, :activities, params)
35
42
  Activity.new(response)
36
43
  end
37
44
 
45
+ def get_activities
46
+ response = make_call(:get, :activities)
47
+ response["data"].inject([]) do |activities, activity_json|
48
+ activities<< Activity.new(activity_json)
49
+ activities
50
+ end
51
+ end
52
+
53
+ def reward_definitions
54
+ unless @reward_definitions
55
+ response = make_call(:get, :reward_definitions)
56
+ @reward_definitions = response["data"].inject([]) do
57
+ |rewards, reward_json|
58
+ rewards<< Reward.new(reward_json)
59
+ rewards
60
+ end
61
+ end
62
+ @reward_definitions
63
+ end
64
+
65
+ def get_rewards
66
+ response = make_call(:get, :rewards)
67
+ response["data"].inject([]) do |rewards, reward_json|
68
+ rewards<< Reward.new(reward_json)
69
+ rewards
70
+ end
71
+ end
72
+
73
+ def award reward_name
74
+ reward = reward_definitions.select do |reward|
75
+ reward.name == reward_name
76
+ end.first
77
+ params = {
78
+ 'reward[player_id]' => player_id,
79
+ 'reward[site_id]' => site_id,
80
+ 'reward[definition_id]' => reward.id,
81
+ }
82
+ make_call(:post, :rewards, params)
83
+ end
84
+
85
+ def set_player
86
+ end_point = "#{@site}/players/#{@user}.json"
87
+ begin
88
+ response = session[end_point].get
89
+ data = response.body
90
+ json = JSON.parse(data)
91
+ json = json["data"]
92
+ @player_id = json["id"]
93
+ @site_id = json["site_id"]
94
+ rescue => e
95
+ if e.respond_to? :response
96
+ data = JSON.parse(e.response)
97
+ raise BadgevilleError.new(e.code, data["error"])
98
+ else
99
+ raise e
100
+ end
101
+ end
102
+ end
103
+
104
+ def site_id
105
+ unless @site_id
106
+ set_player
107
+ end
108
+ @site_id
109
+ end
110
+
111
+ def player_id
112
+ unless @player_id
113
+ set_player
114
+ end
115
+ @player_id
116
+ end
117
+
38
118
  private
39
119
 
40
120
  def valid_response?(obj)
@@ -53,11 +133,18 @@ module Badgeville
53
133
  @session
54
134
  end
55
135
 
56
- def make_call(method, action, params)
136
+ def make_call(method, action, params={})
57
137
  end_point = "#{action.to_s}.json"
58
- params.merge!(:user => @user, :site => @site)
138
+ unless params.keys.any? { |k| k =~ /player_id/ }
139
+ params.merge!(:user => @user, :site => @site)
140
+ end
59
141
  begin
60
- response = session[end_point].send(method, to_query(params))
142
+ case method
143
+ when :get
144
+ response = session[end_point].send(method, :params => params)
145
+ when :post, :put, :delete
146
+ response = session[end_point].send(method, to_query(params))
147
+ end
61
148
  data = response.body
62
149
  json = JSON.parse(data)
63
150
  rescue => e
@@ -5,14 +5,21 @@ module Badgeville
5
5
  class Activity
6
6
  attr_accessor :verb, :player_id, :user_id, :points, :rewards, :created_at, :meta
7
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"])
8
+ def initialize(json=nil)
9
+ if json
10
+ @verb = json.delete("verb")
11
+ @player_id = json.delete("player_id")
12
+ @user_id = json.delete("user_id")
13
+ @points = json.delete("points").to_i
14
+ @created_at = DateTime.parse(json.delete("created_at")).to_time
15
+ @rewards = json.delete("rewards").inject([]) do |rewards, award|
16
+ rewards << Reward.new(award["definition"])
17
+ end
18
+ @meta = json.inject({}) do |meta, entry|
19
+ k,v = entry
20
+ meta[k.to_sym] = v
21
+ meta
22
+ end
16
23
  end
17
24
  end
18
25
  end
@@ -1,7 +1,6 @@
1
1
  module Badgeville
2
2
  class Reward
3
- attr_accessor :name, :hint, :image_url, :active
4
- end
3
+ attr_accessor :name, :hint, :image_url, :active, :earned_at, :id
5
4
 
6
5
  # example:
7
6
  # {
@@ -13,7 +12,7 @@ module Badgeville
13
12
  # "threshold": 2
14
13
  # },
15
14
  # "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",
15
+ # "image_url": "http://s3.amazonaws.com/badgeville-production-reward-definitions/images/original.png?1313733302",
17
16
  # "components": "[{\"command\":\"count\",\"comparator\":{\"$gte\":2},\"config\":{},\"where\":{\"verb\":\"commented\",\"player_id\":\"%player_id\"}}]",
18
17
  # "reward_template": {
19
18
  # "message": ""
@@ -29,10 +28,28 @@ module Badgeville
29
28
  # "site_id": "4e4d5bf5c47eed25a0000e8f",
30
29
  # "active": true
31
30
  # }
32
- def initialize(json)
33
- @name = json["name"]
34
- @active = json["active"]
35
- @hint = json["hint"]
36
- @image_url = json["image_url"]
31
+ def initialize(json=nil)
32
+ if json
33
+ reward_definition = json["definition"]
34
+ reward_definition ? init_from(reward_definition) : init_from(json)
35
+ if json.has_key?('user_id') # it's an earned reward for a specific user
36
+ @earned_at = DateTime.parse(json["created_at"]).to_time
37
+ end
38
+ end
39
+ end
40
+
41
+ def grayscale_url
42
+ @image_url.sub('original.png', 'grayscale.png')
43
+ end
44
+
45
+ private
46
+
47
+ def init_from(json)
48
+ @name = json["name"]
49
+ @active = json["active"]
50
+ @hint = json["hint"]
51
+ @image_url = json["image_url"]
52
+ @id = json["_id"]
53
+ end
37
54
  end
38
55
  end
@@ -9,29 +9,100 @@ describe Badgeville do
9
9
 
10
10
  describe "#log_activity" do
11
11
  before do
12
- action_name = "action"
13
- @result = {"verb" => "commented",
12
+ @action_name = "commented"
13
+ @url = "http://" + Badgeville::HOST + ".*activities.json"
14
+ @result = {"verb" => @action_name,
14
15
  "created_at" => "2011-08-30T12:27:47-07:00",
15
16
  "points" => 0,
16
17
  "player_id" => "4e5d3992c47eed202d00148c",
17
18
  "user_id" => "4e5d3992c47eed202d00148b",
18
19
  "rewards" =>[]
19
20
  }
21
+ @body = "activity[verb]=#{@action_name}"
22
+ @user_data = "&user=#{@user}&site=example.com"
23
+ end
20
24
 
21
- body = "activity[verb]=#{action_name}&user=#{@user}&site=example.com"
22
- url = "http://" + Badgeville::HOST + ".*activities.json"
25
+ context "when no meta data" do
26
+ before do
27
+ @body += @user_data
28
+ stub_http_request(:post, Regexp.new(@url)).with(:body => @body).
29
+ to_return(:body => @result.to_json)
30
+ @activity = @badgeville.log_activity @action_name
31
+ end
23
32
 
24
- stub_http_request(:post, Regexp.new(url)).with(:body => body).
25
- to_return(:body => @result.to_json)
33
+ it "returns an activity object" do
34
+ @activity.is_a? Badgeville::Activity
35
+ end
26
36
 
27
- @activity = @badgeville.log_activity action_name
37
+ it "parses response from activity record api call" do
38
+ @activity.verb.should == "commented"
39
+ @activity.created_at.iso8601.should == @result["created_at"]
40
+ @activity.points.should == 0
41
+ @activity.rewards.should be_empty
42
+ @activity.meta.should be_empty
43
+ end
28
44
  end
29
45
 
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
46
+ context "with meta data" do
47
+ before do
48
+ @team = "myteam"
49
+ @result["team"] = @team
50
+ @body += "&activity[team]=#{@team}" + @user_data
51
+
52
+ stub_http_request(:post, Regexp.new(@url)).with(:body => @body).
53
+ to_return(:body => @result.to_json)
54
+ @activity = @badgeville.log_activity @action_name, :team => @team
55
+ end
56
+
57
+ it "parses the meta data as well" do
58
+ @activity.meta[:team] = @team
59
+ end
35
60
  end
36
61
  end
62
+
63
+ describe "#get_activities" do
64
+ before do
65
+ @url = /http:\/\/#{Badgeville::HOST}.*activities.json.*user=#{@user}.*/
66
+ mock_activities = {
67
+ "data" => [
68
+ {
69
+ "verb" => "join_team",
70
+ "created_at" => "2011-09-01T14:12:13-07:00",
71
+ "rewards" => []
72
+ }
73
+ ]
74
+ }
75
+ stub_http_request(:get, @url).to_return(:body => mock_activities.to_json)
76
+ @activities = @badgeville.get_activities
77
+ end
78
+
79
+ it "should return an array of activities" do
80
+ @activities.class.should be(Array)
81
+ @activities.first.class.should be(Badgeville::Activity)
82
+ end
83
+ end
84
+
85
+ describe "#reward_definitions" do
86
+ before do
87
+ @url = /http:\/\/#{Badgeville::HOST}.*reward_definitions.json.*user=#{@user}.*/
88
+ mock_rewards = {"data" => [{"name" => "Big Bang"}]}
89
+ stub_http_request(:get, @url).to_return(:body => mock_rewards.to_json)
90
+ @rewards = @badgeville.reward_definitions
91
+ end
92
+
93
+ it "should return an array of rewards" do
94
+ @rewards.class.should be(Array)
95
+ @rewards.first.class.should be(Badgeville::Reward)
96
+ end
97
+ end
98
+
99
+ describe "#set_player" do
100
+ before do
101
+ @url = /http:\/\/#{Badgeville::HOST}.*example.com\/players\/#{@user}\.json.*/
102
+ stub_http_request(:get, @url).to_return(:body => {"data" => {"id" => "1", "site_id" => "site"}}.to_json)
103
+ end
104
+
105
+ it {@badgeville.player_id.should == "1"}
106
+ it {@badgeville.site_id.should == "site"}
107
+ end
37
108
  end
@@ -0,0 +1,66 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'json'
3
+
4
+ describe Badgeville::Reward do
5
+ before do
6
+ @parsed_json = JSON.parse('{
7
+ "name": "A Way with Words",
8
+ "active_start_at": null,
9
+ "image_file_name": "9fQ2IU6-0.ftbs4fsoogp3c8fr.png",
10
+ "data": {
11
+ "verb": "commented",
12
+ "threshold": 2
13
+ },
14
+ "created_at": "2011-08-18T22:55:03-07:00",
15
+ "image_url": "http://s3.amazonaws.com/badgeville-production-reward-definitions/images/someid/original.png?1313733302",
16
+ "components": "[{\"command\":\"count\",\"comparator\":{\"$gte\":2},\"config\":{},\"where\":{\"verb\":\"commented\",\"player_id\":\"%player_id\"}}]",
17
+ "reward_template": {
18
+ "message": ""
19
+ },
20
+ "_id": "4e4dfab6c47eed727b005c38",
21
+ "tags": null,
22
+ "id": "4e4dfab6c47eed727b005c38",
23
+ "active_end_at": null,
24
+ "type": "achievement",
25
+ "hint": "Reply to 25 Comments",
26
+ "assignable": false,
27
+ "allow_duplicates": false,
28
+ "site_id": "4e4d5bf5c47eed25a0000e8f",
29
+ "active": true
30
+ }')
31
+ end
32
+
33
+ context "when json is a reward definition" do
34
+ before do
35
+ @reward = Badgeville::Reward.new(@parsed_json)
36
+ end
37
+
38
+ it "initialize based on json" do
39
+ @reward.name.should == "A Way with Words"
40
+ @reward.image_url.should =~ /original.png/
41
+ @reward.active.should be_true
42
+ @reward.id.should == "4e4dfab6c47eed727b005c38"
43
+ end
44
+
45
+ it "has an grayscale image" do
46
+ @reward.grayscale_url.should == @reward.image_url.sub('original','grayscale')
47
+ end
48
+ end
49
+
50
+ context "when json is a reward earned by user" do
51
+ before do
52
+ @parsed_json = {"user_id" => "1",
53
+ "created_at" => "2011-08-18T22:55:03-07:00",
54
+ "definition" => @parsed_json}
55
+ @reward = Badgeville::Reward.new(@parsed_json)
56
+ end
57
+
58
+ it "initialize based on json" do
59
+ @reward.name.should == "A Way with Words"
60
+ @reward.image_url.should =~ /original.png/
61
+ @reward.active.should be_true
62
+ @reward.earned_at.iso8601.should == @parsed_json["created_at"]
63
+ @reward.id.should == "4e4dfab6c47eed727b005c38"
64
+ end
65
+ end
66
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: badgeville
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-30 00:00:00.000000000 -07:00
12
+ date: 2011-09-06 00:00:00.000000000 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json
17
- requirement: &2160484700 !ruby/object:Gem::Requirement
17
+ requirement: &2156516220 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2160484700
25
+ version_requirements: *2156516220
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rest-client
28
- requirement: &2160483340 !ruby/object:Gem::Requirement
28
+ requirement: &2156515140 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2160483340
36
+ version_requirements: *2156515140
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rspec
39
- requirement: &2160482360 !ruby/object:Gem::Requirement
39
+ requirement: &2156514580 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 2.3.0
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2160482360
47
+ version_requirements: *2156514580
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: bundler
50
- requirement: &2160481280 !ruby/object:Gem::Requirement
50
+ requirement: &2156513980 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 1.0.0
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2160481280
58
+ version_requirements: *2156513980
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: jeweler
61
- requirement: &2160480100 !ruby/object:Gem::Requirement
61
+ requirement: &2156512980 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ~>
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: 1.6.4
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2160480100
69
+ version_requirements: *2156512980
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rcov
72
- requirement: &2160479240 !ruby/object:Gem::Requirement
72
+ requirement: &2156511560 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2160479240
80
+ version_requirements: *2156511560
81
81
  description: Client for Badgeville's Core API v2. http://rules.badgeville.com
82
82
  email:
83
83
  executables: []
@@ -91,12 +91,14 @@ files:
91
91
  - README.md
92
92
  - Rakefile
93
93
  - VERSION
94
+ - badgeville.gemspec
94
95
  - examples/log_and_check_status.rb
95
96
  - keys.json.example
96
97
  - lib/badgeville.rb
97
98
  - lib/badgeville/activity.rb
98
99
  - lib/badgeville/reward.rb
99
100
  - spec/badgeville_spec.rb
101
+ - spec/reward_spec.rb
100
102
  - spec/spec_helper.rb
101
103
  has_rdoc: true
102
104
  homepage: http://github.com/Keasinc/badgeville
@@ -114,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
116
  version: '0'
115
117
  segments:
116
118
  - 0
117
- hash: -517773847151955177
119
+ hash: -3222885892070570977
118
120
  required_rubygems_version: !ruby/object:Gem::Requirement
119
121
  none: false
120
122
  requirements: