badgeville 0.0.1 → 0.0.2

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/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: