badgeable 0.1.2 → 0.2.0
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/.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: []
|