badgeable 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/features/award_badges.feature +11 -0
- data/features/step_definitions/badging_steps.rb +38 -0
- data/features/support/test_models/review.rb +5 -0
- data/features/support/test_models/user.rb +7 -0
- data/lib/badgeable/award.rb +6 -5
- data/lib/badgeable/config.rb +17 -4
- data/lib/badgeable/subject.rb +1 -1
- data/lib/badgeable/version.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- metadata +6 -3
data/.gitignore
CHANGED
@@ -7,3 +7,14 @@ Feature: Easily award badges to any Ruby class (given enough effort on your part
|
|
7
7
|
Given a Meal awards the "Hog Wild" badge to an Diner after 3 times
|
8
8
|
When a diner creates 3 meals
|
9
9
|
Then the diner should have the "Hog Wild" badge
|
10
|
+
|
11
|
+
Scenario: A user gets a badge when they've completed their profile
|
12
|
+
Given a User gets the "Profile Complete" badge when their profile has been completed
|
13
|
+
When the user has completed their profile
|
14
|
+
Then the user should have the "Profile Complete" badge
|
15
|
+
|
16
|
+
Scenario: A user gets a badge when he's written 10 reviews
|
17
|
+
Given a User gets the "Guppy" badge when they have written 10 reviews
|
18
|
+
When the user has written 10 reviews
|
19
|
+
Then the user should have the "Guppy" badge
|
20
|
+
|
@@ -8,6 +8,27 @@ Given /^a Meal awards the "([^\"]*)" badge to an? Diner after (\d+) times$/ do |
|
|
8
8
|
}
|
9
9
|
end
|
10
10
|
|
11
|
+
Given /^a User gets the "([^\"]*)" badge when their profile has been completed$/ do |badge_name|
|
12
|
+
User.class_eval %Q{
|
13
|
+
badge "#{badge_name}", :after => :save do
|
14
|
+
thing User
|
15
|
+
subject :user
|
16
|
+
conditions do |user|
|
17
|
+
user.profile_completeness == 100
|
18
|
+
end
|
19
|
+
end
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
Given /^a User gets the "([^\"]*)" badge when they have written (\d+) reviews$/ do |badge_name, threshold|
|
24
|
+
User.class_eval %Q{
|
25
|
+
badge "#{badge_name}" do
|
26
|
+
thing Review
|
27
|
+
count #{threshold}
|
28
|
+
end
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
11
32
|
When /^a diner creates (\d+) meals$/ do |num|
|
12
33
|
@diner = Diner.create
|
13
34
|
num.to_i.times do
|
@@ -15,6 +36,23 @@ When /^a diner creates (\d+) meals$/ do |num|
|
|
15
36
|
end
|
16
37
|
end
|
17
38
|
|
39
|
+
When /^the user has completed their profile$/ do
|
40
|
+
@user = User.create
|
41
|
+
@user.profile_completeness = 100
|
42
|
+
@user.save
|
43
|
+
end
|
44
|
+
|
45
|
+
When /^the user has written (\d+) reviews$/ do |num|
|
46
|
+
@user = User.create
|
47
|
+
num.to_i.times do
|
48
|
+
@user.reviews.create
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
18
52
|
Then /^the diner should have the "([^\"]*)" badge$/ do |badge_name|
|
19
53
|
@diner.should have_badge_named(badge_name)
|
20
54
|
end
|
55
|
+
|
56
|
+
Then /^the user should have the "([^\"]*)" badge$/ do |badge_name|
|
57
|
+
@user.should have_badge_named(badge_name)
|
58
|
+
end
|
data/lib/badgeable/award.rb
CHANGED
@@ -27,15 +27,16 @@ module Badgeable
|
|
27
27
|
#
|
28
28
|
# See README for usage examples
|
29
29
|
#
|
30
|
-
def badge(name, &block)
|
30
|
+
def badge(name, options = {}, &block)
|
31
|
+
after_callback = options[:after] || :create
|
31
32
|
config = Badgeable::Config.new
|
32
33
|
config.instance_eval(&block)
|
33
|
-
method_name = name.titleize.gsub(/\s/,
|
34
|
+
method_name = "award_#{name.titleize.gsub(/\s/, '').underscore}_badge".to_sym
|
34
35
|
config.klass.class_eval do
|
35
|
-
set_callback
|
36
|
-
define_method
|
36
|
+
set_callback after_callback, :after, method_name
|
37
|
+
define_method method_name, Proc.new {
|
37
38
|
if config.conditions_array.all? {|p| p.call(self) }
|
38
|
-
|
39
|
+
config.subject_proc.call(self).award_badge(name)
|
39
40
|
end
|
40
41
|
}
|
41
42
|
end
|
data/lib/badgeable/config.rb
CHANGED
@@ -5,15 +5,28 @@ module Badgeable
|
|
5
5
|
attr_accessor :badge_definitions
|
6
6
|
end
|
7
7
|
|
8
|
-
attr_reader :threshold, :klass, :conditions_array, :
|
8
|
+
attr_reader :threshold, :klass, :conditions_array, :subject_proc
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@conditions_array = [Proc.new {true}]
|
12
|
-
|
12
|
+
subject :user
|
13
13
|
end
|
14
14
|
|
15
|
-
def subject(sym)
|
15
|
+
def subject(sym = nil, &block)
|
16
16
|
@subject_name = sym
|
17
|
+
if block_given?
|
18
|
+
@subject_proc = Proc.new {|instance|
|
19
|
+
block.call(instance)
|
20
|
+
}
|
21
|
+
else
|
22
|
+
@subject_proc = Proc.new { |instance|
|
23
|
+
if klass.to_s.underscore.to_sym == @subject_name
|
24
|
+
instance
|
25
|
+
else
|
26
|
+
instance.send(sym)
|
27
|
+
end
|
28
|
+
}
|
29
|
+
end
|
17
30
|
end
|
18
31
|
|
19
32
|
def count(n = 1, &block)
|
@@ -24,7 +37,7 @@ module Badgeable
|
|
24
37
|
else
|
25
38
|
count_proc = Proc.new { |instance|
|
26
39
|
instance.instance_eval %Q{
|
27
|
-
#{klass}.where(:#{subject_name}_id => #{subject_name}.id).count >= #{n}
|
40
|
+
#{klass}.where(:#{@subject_name}_id => #{@subject_name}.id).count >= #{n}
|
28
41
|
}
|
29
42
|
}
|
30
43
|
end
|
data/lib/badgeable/subject.rb
CHANGED
@@ -21,7 +21,7 @@ module Badgeable
|
|
21
21
|
}
|
22
22
|
|
23
23
|
Badgeable::Badge.class_eval %Q{
|
24
|
-
references_many :#{receiver.to_s.tableize}, :inverse_of => :badges, :stored_as => :array
|
24
|
+
references_many :#{receiver.to_s.tableize}, :inverse_of => :badges, :stored_as => :array
|
25
25
|
|
26
26
|
def recipients
|
27
27
|
#{receiver}.where(:badge_ids => id)
|
data/lib/badgeable/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
- 1
|
8
7
|
- 2
|
9
|
-
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Scott Burton
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-28 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -98,6 +98,8 @@ files:
|
|
98
98
|
- features/support/env.rb
|
99
99
|
- features/support/test_models/diner.rb
|
100
100
|
- features/support/test_models/meal.rb
|
101
|
+
- features/support/test_models/review.rb
|
102
|
+
- features/support/test_models/user.rb
|
101
103
|
- lib/badgeable.rb
|
102
104
|
- lib/badgeable/award.rb
|
103
105
|
- lib/badgeable/badge.rb
|
@@ -106,6 +108,7 @@ files:
|
|
106
108
|
- lib/badgeable/railtie.rb
|
107
109
|
- lib/badgeable/subject.rb
|
108
110
|
- lib/badgeable/version.rb
|
111
|
+
- spec/spec_helper.rb
|
109
112
|
has_rdoc: true
|
110
113
|
homepage: http://rubygems.org/gems/badgeable
|
111
114
|
licenses: []
|