treasure_hunt 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -2,6 +2,49 @@
2
2
 
3
3
  DSL and models for application User's Reward management.
4
4
 
5
+ == Installation
6
+
7
+ Add to your Gemfile
8
+
9
+ gem 'treasure_hunt'
10
+
11
+ Run generator
12
+
13
+ rails generate treasure_hunt:install
14
+
15
+ Add :points column to your users table
16
+
17
+ rails generate migration AddPointsToUsers points:integer
18
+
19
+ Run migrations
20
+
21
+ rake db:migrate
22
+
23
+ Finally add 'acts_as_treasure_hunter' to your model:
24
+
25
+ class User < ActiveRecord:Base
26
+ acts_as_treasure_hunter
27
+ # ...
28
+ end
29
+
30
+ == Usage
31
+
32
+ Set up your rewards (only once)
33
+
34
+ Reward.create(:name => 'Invite friends', :points => 50, :every => 1.day)
35
+
36
+ Use it!
37
+
38
+ jane = User.find(42)
39
+
40
+ if @jane.can_achieve?(:invite_friends)
41
+ jane.achieve!(:invite_friends)
42
+ jane.reload
43
+ end
44
+
45
+ @points = jane.points
46
+ @time_to_unlock = @jane.time_to_unlock(:invite_friends)
47
+
5
48
  == Contributing to treasure_hunt
6
49
 
7
50
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -4,6 +4,7 @@ class CreateTreasureHuntTables < ActiveRecord::Migration
4
4
  t.references :user
5
5
  t.references :reward
6
6
  t.integer :points
7
+ t.references :targetable, :polymorphic => true
7
8
 
8
9
  t.timestamps
9
10
  end
@@ -5,6 +5,7 @@ module TreasureHunt
5
5
  included do
6
6
  belongs_to :user
7
7
  belongs_to :reward
8
+ belongs_to :targetable, :polymorphic => true
8
9
 
9
10
  validates_associated :user, :reward
10
11
  validates_presence_of :user, :reward
@@ -33,9 +33,9 @@ module TreasureHunt
33
33
  ::Achievement.new(:user => self, :reward => reward).valid?
34
34
  end
35
35
 
36
- def achieve!(reward)
36
+ def achieve!(reward, target=nil)
37
37
  reward = ::Reward.find_by_name(reward.to_s.humanize) if reward.is_a? Symbol
38
- achievement = ::Achievement.create(:reward => reward)
38
+ achievement = ::Achievement.create(:reward => reward, :targetable => target)
39
39
  self.achievements << achievement
40
40
 
41
41
  achievement
@@ -15,6 +15,7 @@ ActiveRecord::Schema.define do
15
15
  t.references :user
16
16
  t.references :reward
17
17
  t.integer :points
18
+ t.references :targetable, :polymorphic => true
18
19
  t.timestamps
19
20
  end
20
21
 
@@ -24,6 +25,10 @@ ActiveRecord::Schema.define do
24
25
  t.integer :every, :default => 0, :null => false
25
26
  t.integer :limit, :default => 1, :null => false
26
27
  end
28
+
29
+ create_table :chosen_answers, :force => true do |t|
30
+ t.integer :answer_id
31
+ end
27
32
  end
28
33
 
29
34
  class User < ActiveRecord::Base
@@ -32,8 +37,13 @@ end
32
37
 
33
38
  class Achievement < ActiveRecord::Base
34
39
  include TreasureHunt::Achievement
40
+
41
+ has_one :chosen_answer, :as => :targetable
35
42
  end
36
43
 
37
44
  class Reward < ActiveRecord::Base
38
45
  include TreasureHunt::Reward
39
46
  end
47
+
48
+ class ChosenAnswer < ActiveRecord::Base
49
+ end
@@ -5,6 +5,7 @@ describe TreasureHunt::Hunter do
5
5
  User.delete_all
6
6
  @jane = User.create(:name => 'Jane')
7
7
  @joe = User.create(:name => 'Joe')
8
+ @chosen_answer = ChosenAnswer.create(:answer_id => 1)
8
9
  end
9
10
 
10
11
  context "when achieved something" do
@@ -19,6 +20,12 @@ describe TreasureHunt::Hunter do
19
20
  @jane.rewards.should =~ [@reward]
20
21
  end
21
22
 
23
+ it "should have target" do
24
+ @jane.achievements.create(:reward => @reward, :targetable => @chosen_answer)
25
+
26
+ @jane.achievements.last.targetable.should == @chosen_answer
27
+ end
28
+
22
29
  it "should receive points" do
23
30
  @jane.achievements.size.should == 0
24
31
  3.times do
@@ -70,6 +77,7 @@ describe TreasureHunt::Hunter do
70
77
  before do
71
78
  Reward.delete_all
72
79
  @invite_friends = Reward.create(:name => 'Invite friends', :points => 50, :every => 1.day)
80
+ @corret_answer = Reward.create(:name => 'Correct answer', :points => 50)
73
81
  end
74
82
 
75
83
  it "should achieve and lock reward" do
@@ -80,5 +88,11 @@ describe TreasureHunt::Hunter do
80
88
  @jane.can_achieve?(:invite_friends).should be_false
81
89
  @jane.time_to_unlock(:invite_friends).should <= 1.day
82
90
  end
91
+
92
+ it "should achieve and log target" do
93
+ @jane.can_achieve?(:correct_answer).should be_true
94
+ @jane.achieve!(:correct_answer, @chosen_answer).should be_persisted
95
+ @jane.achievements.last.targetable.should == @chosen_answer
96
+ end
83
97
  end
84
98
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{treasure_hunt}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Jan Dupal}]
12
- s.date = %q{2011-10-25}
12
+ s.date = %q{2011-12-12}
13
13
  s.description = %q{Allow your application users to start fantastic hunt for big treasure}
14
14
  s.email = %q{dupal.j@gmail.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treasure_hunt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-25 00:00:00.000000000Z
12
+ date: 2011-12-12 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &81187380 !ruby/object:Gem::Requirement
16
+ requirement: &77866510 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *81187380
24
+ version_requirements: *77866510
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: guard
27
- requirement: &81187090 !ruby/object:Gem::Requirement
27
+ requirement: &77866230 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *81187090
35
+ version_requirements: *77866230
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guard-rspec
38
- requirement: &81186550 !ruby/object:Gem::Requirement
38
+ requirement: &77865930 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *81186550
46
+ version_requirements: *77865930
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rb-inotify
49
- requirement: &81185750 !ruby/object:Gem::Requirement
49
+ requirement: &77865650 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *81185750
57
+ version_requirements: *77865650
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: libnotify
60
- requirement: &81185280 !ruby/object:Gem::Requirement
60
+ requirement: &77865360 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *81185280
68
+ version_requirements: *77865360
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &81184960 !ruby/object:Gem::Requirement
71
+ requirement: &77865110 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 2.5.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *81184960
79
+ version_requirements: *77865110
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: generator_spec
82
- requirement: &81184600 !ruby/object:Gem::Requirement
82
+ requirement: &77864850 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *81184600
90
+ version_requirements: *77864850
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: bundler
93
- requirement: &81184290 !ruby/object:Gem::Requirement
93
+ requirement: &77864580 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 1.0.0
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *81184290
101
+ version_requirements: *77864580
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: jeweler
104
- requirement: &81183920 !ruby/object:Gem::Requirement
104
+ requirement: &77864290 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 1.6.4
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *81183920
112
+ version_requirements: *77864290
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rcov
115
- requirement: &81183620 !ruby/object:Gem::Requirement
115
+ requirement: &77863970 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *81183620
123
+ version_requirements: *77863970
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: sqlite3
126
- requirement: &81183340 !ruby/object:Gem::Requirement
126
+ requirement: &77863630 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,7 +131,7 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *81183340
134
+ version_requirements: *77863630
135
135
  description: Allow your application users to start fantastic hunt for big treasure
136
136
  email: dupal.j@gmail.com
137
137
  executables: []
@@ -180,7 +180,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
180
  version: '0'
181
181
  segments:
182
182
  - 0
183
- hash: 997579581
183
+ hash: 797920019
184
184
  required_rubygems_version: !ruby/object:Gem::Requirement
185
185
  none: false
186
186
  requirements: